From 5f46b4feaec1f8ff2b2f1a26c3c91acb3b3bfe7f Mon Sep 17 00:00:00 2001 From: Sebastian Kupke Date: Tue, 30 Jul 2019 16:56:29 +0200 Subject: [PATCH 01/30] Working on stacked buttons. --- .prettierrc | 3 +- dist/iwmlib.js | 1087 +--- dist/iwmlib.pixi.js | 4602 ++++++++--------- doc/out/AbstractPopup.html | 2 +- doc/out/Badge.html | 2 +- doc/out/BlurFilter.html | 2 +- doc/out/Button.html | 2 +- doc/out/ButtonGroup.html | 114 +- doc/out/DeepZoomImage.html | 2 +- doc/out/DeepZoomInfo.html | 2 +- doc/out/Flippable.html | 2 +- doc/out/FontInfo.html | 2 +- doc/out/Hypenate.html | 2 +- doc/out/InteractivePopup.html | 2 +- ...beledGraphics.exports.LabeledGraphics.html | 2 +- doc/out/LabeledGraphics.html | 2 +- doc/out/List.html | 2 +- doc/out/Message.html | 2 +- doc/out/MessageInteractivePopup.html | 2 +- doc/out/MessageMessageInteractivePopup.html | 2 +- doc/out/Modal.html | 2 +- doc/out/ModalInteractivePopup.html | 2 +- doc/out/ModalModalInteractivePopup.html | 2 +- doc/out/PIXIApp.html | 2 +- doc/out/Popup.html | 2 +- doc/out/PopupInteractivePopup.html | 2 +- doc/out/PopupMenu.html | 2 +- doc/out/PopupMenuPopupInteractivePopup.html | 2 +- ...pupMenuPopupMenuPopupInteractivePopup.html | 2 +- ...nuPopupMenuPopupPopupInteractivePopup.html | 2 +- .../PopupMenuPopupPopupInteractivePopup.html | 2 +- doc/out/PopupPopupInteractivePopup.html | 2 +- doc/out/Progress.html | 2 +- doc/out/Scrollview.html | 2 +- doc/out/Slider.html | 2 +- doc/out/Switch.html | 2 +- doc/out/TextLabel.TextLabel.html | 2 +- doc/out/Theme.html | 2 +- doc/out/ThemeDark.html | 2 +- doc/out/ThemeLight.html | 2 +- doc/out/ThemeRed.html | 2 +- doc/out/TileQuadNode.html | 2 +- doc/out/Tooltip.html | 2 +- doc/out/UITest.html | 2 +- doc/out/Volatile.html | 2 +- doc/out/global.html | 2 +- doc/out/index.html | 2 +- doc/out/pixi_abstractpopup.js.html | 2 +- doc/out/pixi_app.js.html | 2 +- doc/out/pixi_badge.js.html | 2 +- doc/out/pixi_blurfilter.js.html | 2 +- doc/out/pixi_button.js.html | 2 +- doc/out/pixi_buttongroup.js.html | 5 +- doc/out/pixi_deepzoom_image.js.html | 2 +- doc/out/pixi_flippable.js.html | 2 +- doc/out/pixi_labeledgraphics.js.html | 2 +- doc/out/pixi_list.js.html | 2 +- doc/out/pixi_message.js.html | 2 +- doc/out/pixi_modal.js.html | 2 +- doc/out/pixi_popup.js.html | 2 +- doc/out/pixi_popupmenu.js.html | 2 +- doc/out/pixi_progress.js.html | 2 +- doc/out/pixi_scrollview.js.html | 2 +- doc/out/pixi_slider.js.html | 2 +- doc/out/pixi_switch.js.html | 2 +- doc/out/pixi_theme.js.html | 2 +- doc/out/pixi_tooltip.js.html | 2 +- doc/out/pixi_volatile.js.html | 2 +- doc/out/uitest.js.html | 2 +- lib/bootstrap.js | 14 +- lib/bundle.js | 10 +- lib/capabilities.js | 20 +- lib/card/card.js | 176 +- lib/card/highlight.js | 36 +- lib/card/plugin.js | 73 +- lib/card/scatter.js | 24 +- lib/card/wrapper.js | 18 +- lib/doctest.js | 22 +- lib/events.js | 16 +- lib/flippable.js | 46 +- lib/frames.js | 34 +- lib/interaction.js | 189 +- lib/logging.js | 6 +- lib/pixi/abstractpopup.js | 39 +- lib/pixi/app.js | 80 +- lib/pixi/badge.js | 14 +- lib/pixi/blurfilter.js | 25 +- lib/pixi/button.js | 121 +- lib/pixi/buttongroup.html | 68 +- lib/pixi/buttongroup.js | 298 +- lib/pixi/flipeffect.js | 22 +- lib/pixi/flippable.js | 47 +- lib/pixi/labeledgraphics.js | 33 +- lib/pixi/list.js | 40 +- lib/pixi/message.js | 6 +- lib/pixi/modal.js | 5 +- lib/pixi/popover.js | 13 +- lib/pixi/popup.js | 36 +- lib/pixi/popupmenu.js | 5 +- lib/pixi/progress.js | 38 +- lib/pixi/scatter.js | 44 +- lib/pixi/scrollbox.js | 89 +- lib/pixi/slider.js | 56 +- lib/pixi/stylus.js | 31 +- lib/pixi/switch.js | 71 +- lib/pixi/test.js | 24 +- lib/pixi/theme.js | 3 +- lib/pixi/timeline.js | 87 +- lib/popup.js | 50 +- lib/popupmenu.js | 36 +- lib/scatter.js | 101 +- lib/uitest.js | 145 +- lib/utils.js | 65 +- package-lock.json | 90 +- package.json | 6 +- 115 files changed, 3277 insertions(+), 5134 deletions(-) diff --git a/.prettierrc b/.prettierrc index abd7e04..2d84bde 100644 --- a/.prettierrc +++ b/.prettierrc @@ -2,5 +2,6 @@ "singleQuote": true, "jsxSingleQuote": true, "tabWidth": 4, - "semi": false + "semi": false, + "printWidth": 120 } diff --git a/dist/iwmlib.js b/dist/iwmlib.js index b000db8..ba4243b 100644 --- a/dist/iwmlib.js +++ b/dist/iwmlib.js @@ -124,32 +124,21 @@ static expect(expr, value) { if (this.pprint(expr) != this.pprint(value)) { //throw new Error("got `" + expr + "` but expected `" + value + "`.") - throw new Error( - 'got `' + - this.pprint(expr) + - '` but expected `' + - this.pprint(value) + - '`.' - ) + throw new Error('got `' + this.pprint(expr) + '` but expected `' + this.pprint(value) + '`.') } } static expectError(error, message) { let index = error.toString().indexOf(message); if (index < 0) { - throw new Error( - 'got `' + message + '` but expected `' + error + '`.' - ) + throw new Error('got `' + message + '` but expected `' + error + '`.') } } static expectLog(...messages) { // if (!docTestLogMessages.equals(messages)) { docTestLogMessages.forEach((msg, i) => { - if (msg != messages[i]) - throw new Error( - 'Unexpected log message: `' + messages[i] + '`.' - ) + if (msg != messages[i]) throw new Error('Unexpected log message: `' + messages[i] + '`.') }); // throw new Error('Uups') //} @@ -198,10 +187,7 @@ let lines = text.value.split('\n'); let better = []; for (let line of lines) { - if ( - replaceExpect && - line.trim().startsWith('Doctest.expect(') - ) { + if (replaceExpect && line.trim().startsWith('Doctest.expect(')) { line = line.replace(/Doctest\.expect\(/, '>>> ').trim(); if (line.endsWith(')') || line.endsWith(',')) { line = line.slice(0, -1); @@ -406,8 +392,7 @@ // be this is a bug or a security feature. Workaround: we introduce // a mouseDownSubstitute attribute that can be assigned to cloned // events after instantiation. - if (Reflect.has(event, 'mouseDownSubstitute')) - return event.mouseDownSubstitute + if (Reflect.has(event, 'mouseDownSubstitute')) return event.mouseDownSubstitute return event.buttons || event.which } @@ -442,15 +427,7 @@ for (let i = 0; i < targets.length; i++) { let t = targets[i]; let touchTarget = document.elementFromPoint(t.pageX, t.pageY); - let touch = new Touch( - undefined, - touchTarget, - t.identifier, - t.pageX, - t.pageY, - t.screenX, - t.screenY - ); + let touch = new Touch(undefined, touchTarget, t.identifier, t.pageX, t.pageY, t.screenX, t.screenY); touches.push(touch); } return new TouchList(...touches) @@ -534,8 +511,7 @@ let result = event.type; let selector = this.selector(event.target); result += ' selector: ' + selector; - if (event.target != document.querySelector(selector)) - console.log('Cannot resolve', selector); + if (event.target != document.querySelector(selector)) console.log('Cannot resolve', selector); let keys = ['layerX', 'layerY', 'pageX', 'pageY', 'clientX', 'clientY']; for (let key of keys) { try { @@ -688,7 +664,7 @@ } } - /* globals WebKitPoint */ + /* globals */ /** Tests whether an object is empty * @param {Object} obj - the object to be tested @@ -755,9 +731,7 @@ } static startYearRange(date) { - return new Date( - Date.UTC(date.getFullYear() - 1, 11, 31, 23, 59, 59, 999) - ) + return new Date(Date.UTC(date.getFullYear() - 1, 11, 31, 23, 59, 59, 999)) } static endYearRange(date) { @@ -777,11 +751,7 @@ } static nextDay(date) { - return this.create( - date.getFullYear(), - date.getMonth(), - date.getDate() + 1 - ) + return this.create(date.getFullYear(), date.getMonth(), date.getDate() + 1) } static nextHour(date) { @@ -1284,15 +1254,9 @@ */ draw(context, { lineWidth = 2, stroke = '#000000', fill = null } = {}) { context.beginPath(); - context.moveTo( - this.points[0].x + this.center.x, - this.points[0].y + this.center.y - ); + context.moveTo(this.points[0].x + this.center.x, this.points[0].y + this.center.y); for (let i = 1; i < this.points.length; i++) { - context.lineTo( - this.points[i].x + this.center.x, - this.points[i].y + this.center.y - ); + context.lineTo(this.points[i].x + this.center.x, this.points[i].y + this.center.y); } context.closePath(); context.lineWidth = lineWidth; @@ -1349,10 +1313,7 @@ for (i = 0, j = nvert - 1; i < nvert; j = i++) { if ( verty[i] > testy != verty[j] > testy && - testx < - ((vertx[j] - vertx[i]) * (testy - verty[i])) / - (verty[j] - verty[i]) + - vertx[i] + testx < ((vertx[j] - vertx[i]) * (testy - verty[i])) / (verty[j] - verty[i]) + vertx[i] ) c = !c; } @@ -1386,12 +1347,8 @@ for (side = 0; side < this.getNumberOfSides(); side++) { /* get the axis that we will project onto */ if (side == 0) { - axis.x = - this.points[this.getNumberOfSides() - 1].y - - this.points[0].y; - axis.y = - this.points[0].x - - this.points[this.getNumberOfSides() - 1].x; + axis.x = this.points[this.getNumberOfSides() - 1].y - this.points[0].y; + axis.y = this.points[0].x - this.points[this.getNumberOfSides() - 1].x; } else { axis.x = this.points[side - 1].y - this.points[side].y; axis.y = this.points[side].x - this.points[side - 1].x; @@ -1415,8 +1372,7 @@ maxA += tmp; /* project polygon B onto axis to determine the min/max */ - minB = maxB = - other.points[0].x * axis.x + other.points[0].y * axis.y; + minB = maxB = other.points[0].x * axis.x + other.points[0].y * axis.y; for (i = 1; i < other.getNumberOfSides(); i++) { tmp = other.points[i].x * axis.x + other.points[i].y * axis.y; if (tmp > maxB) maxB = tmp; @@ -1443,12 +1399,8 @@ for (side = 0; side < other.getNumberOfSides(); side++) { /* get the axis that we will project onto */ if (side == 0) { - axis.x = - other.points[other.getNumberOfSides() - 1].y - - other.points[0].y; - axis.y = - other.points[0].x - - other.points[other.getNumberOfSides() - 1].x; + axis.x = other.points[other.getNumberOfSides() - 1].y - other.points[0].y; + axis.y = other.points[0].x - other.points[other.getNumberOfSides() - 1].x; } else { axis.x = other.points[side - 1].y - other.points[side].y; axis.y = other.points[side].x - other.points[side - 1].x; @@ -1472,8 +1424,7 @@ maxA += tmp; /* project polygon B onto axis to determine the min/max */ - minB = maxB = - other.points[0].x * axis.x + other.points[0].y * axis.y; + minB = maxB = other.points[0].x * axis.x + other.points[0].y * axis.y; for (i = 1; i < other.getNumberOfSides(); i++) { tmp = other.points[i].x * axis.x + other.points[i].y * axis.y; if (tmp > maxB) maxB = tmp; @@ -1530,12 +1481,7 @@ * @memberof Rect */ static contains(rect, point) { - return ( - point.x > rect.left && - point.x < rect.x + rect.right && - point.y > rect.top && - point.y < rect.bottom - ) + return point.x > rect.left && point.x < rect.x + rect.right && point.y > rect.top && point.y < rect.bottom } /** @@ -1615,8 +1561,7 @@ * @access private */ __push(value) { - let removed = - this.buffer.length === this.bufferMaxSize ? this.buffer.shift() : 0; + let removed = this.buffer.length === this.bufferMaxSize ? this.buffer.shift() : 0; this.buffer.push(value); return removed @@ -1720,11 +1665,7 @@ } } - static setup({ - log = console.log, - warn = console.warn, - error = console.error - } = {}) { + static setup({ log = console.log, warn = console.warn, error = console.error } = {}) { logHandlers.log = log; logHandlers.warn = warn; logHandlers.error = error; @@ -1931,10 +1872,10 @@ delta() { let prev = []; let curr = []; - let cm = { x: 0, y: 0}; - let pm = { x: 0, y: 0}; + let cm = { x: 0, y: 0 }; + let pm = { x: 0, y: 0 }; let count = 0; - for(let key of this.current.keys()) { + for (let key of this.current.keys()) { if (this.previous.has(key)) { let p = this.previous.get(key); let c = this.current.get(key); @@ -1953,7 +1894,7 @@ let scaled = 0; let alpha = 0; let zoom = 1; - for(let i=0; i t1 + this.longPressTime; if (tookLong) { @@ -2235,10 +2144,7 @@ this.unregisterTap(key); } } - if ( - this.tapTimestamps.has(key) && - performance.now() > this.tapTimestamps.get(key) + this.tapDuration - ) { + if (this.tapTimestamps.has(key) && performance.now() > this.tapTimestamps.get(key) + this.tapDuration) { //console.log("tap too long") this.unregisterTap(key); } @@ -2263,11 +2169,7 @@ isLongPress(key) { let ended = this.ended.get(key); let start = this.start.get(key); - if ( - start && - ended && - Points$1.distance(ended, start) < this.tapDistance - ) { + if (start && ended && Points$1.distance(ended, start) < this.tapDistance) { let t1 = this.timestamps.get(key); let tookLong = performance.now() > t1 + this.longPressTime; if (tookLong) { @@ -2334,9 +2236,7 @@ setupInteraction() { if (this.debug) { - let error = this.targetInterface.implementationError( - this.target.constructor - ); + let error = this.targetInterface.implementationError(this.target.constructor); if (error != null) { throw new Error('Expected IInteractionTarget: ' + error) } @@ -2374,16 +2274,11 @@ element.addEventListener( 'pointermove', e => { - if (this.debug) - console.log('pointermove', e.pointerId, e.pointerType); + if (this.debug) console.log('pointermove', e.pointerId, e.pointerType); - if ( - e.pointerType == 'touch' || - (e.pointerType == 'mouse' && Events.isPointerDown(e)) - ) { + if (e.pointerType == 'touch' || (e.pointerType == 'mouse' && Events.isPointerDown(e))) { // this.capture(e) && - if (this.debug) - console.log('pointermove captured', e.pointerId); + if (this.debug) console.log('pointermove captured', e.pointerId); this.onMove(e); } }, @@ -2392,8 +2287,7 @@ element.addEventListener( 'pointerup', e => { - if (this.debug) - console.log('pointerup', e.pointerId, e.pointerType); + if (this.debug) console.log('pointerup', e.pointerId, e.pointerType); this.onEnd(e); if (this.capturePointerEvents) { try { @@ -2408,11 +2302,9 @@ element.addEventListener( 'pointercancel', e => { - if (this.debug) - console.log('pointercancel', e.pointerId, e.pointerType); + if (this.debug) console.log('pointercancel', e.pointerId, e.pointerType); this.onEnd(e); - if (this.capturePointerEvents) - element.releasePointerCapture(e.pointerId); + if (this.capturePointerEvents) element.releasePointerCapture(e.pointerId); }, useCapture ); @@ -2421,12 +2313,7 @@ element.addEventListener( 'pointerleave', e => { - if (this.debug) - console.log( - 'pointerleave', - e.pointerId, - e.pointerType - ); + if (this.debug) console.log('pointerleave', e.pointerId, e.pointerType); if (e.target == element) this.onEnd(e); }, useCapture @@ -2437,12 +2324,7 @@ element.addEventListener( 'pointerout', e => { - if (this.debug) - console.log( - 'pointerout', - e.pointerId, - e.pointerType - ); + if (this.debug) console.log('pointerout', e.pointerId, e.pointerType); if (e.target == element) this.onEnd(e); }, useCapture @@ -2453,13 +2335,7 @@ window.addEventListener( 'pointerout', e => { - if (this.debug) - console.log( - 'pointerout', - e.pointerId, - e.pointerType, - e.target - ); + if (this.debug) console.log('pointerout', e.pointerId, e.pointerType, e.target); if (e.target == element) { this.onEnd(e); } @@ -2472,8 +2348,7 @@ element.addEventListener( 'touchstart', e => { - if (this.debug) - console.log('touchstart', this.touchPoints(e)); + if (this.debug) console.log('touchstart', this.touchPoints(e)); if (this.capture(e)) { for (let touch of e.changedTouches) { this.onStart(touch); @@ -2485,8 +2360,7 @@ element.addEventListener( 'touchmove', e => { - if (this.debug) - console.log('touchmove', this.touchPoints(e), e); + if (this.debug) console.log('touchmove', this.touchPoints(e), e); for (let touch of e.changedTouches) { this.onMove(touch); } @@ -2509,12 +2383,7 @@ element.addEventListener( 'touchcancel', e => { - if (this.debug) - console.log( - 'touchcancel', - e.targetTouches.length, - e.changedTouches.length - ); + if (this.debug) console.log('touchcancel', e.targetTouches.length, e.changedTouches.length); for (let touch of e.changedTouches) { this.onEnd(touch); } @@ -2563,9 +2432,7 @@ e => { if (e.target == element) { this.onEnd(e); - console.warn( - "Shouldn't happen: mouseout ends interaction" - ); + console.warn("Shouldn't happen: mouseout ends interaction"); } }, useCapture @@ -2606,16 +2473,8 @@ } setupMouseWheelInteraction() { - this.mouseWheelElement.addEventListener( - 'mousewheel', - this.onMouseWheel.bind(this), - true - ); - this.mouseWheelElement.addEventListener( - 'DOMMouseScroll', - this.onMouseWheel.bind(this), - true - ); + this.mouseWheelElement.addEventListener('mousewheel', this.onMouseWheel.bind(this), true); + this.mouseWheelElement.addEventListener('DOMMouseScroll', this.onMouseWheel.bind(this), true); } onMouseWheel(event) { @@ -2677,10 +2536,7 @@ break } case 'Touch': { - let id = - event.touchType === 'stylus' - ? 'stylus' - : event.identifier.toString(); + let id = event.touchType === 'stylus' ? 'stylus' : event.identifier.toString(); result[id] = this.getPosition(event); break } @@ -2730,10 +2586,7 @@ let point = extracted[key]; let updated = this.interaction.update(key, point); if (updated) { - console.warn( - "new pointer in updateInteraction shouldn't happen", - key - ); + console.warn("new pointer in updateInteraction shouldn't happen", key); this.interactionStarted(event, key, point); } } @@ -2865,11 +2718,7 @@ onEnd(event) { let extracted = this.extractPoint(event, 'changedTouches'); this.endInteraction(event, extracted); - let mapped = this.interaction.mapInteraction( - extracted, - ['ended'], - this.mapPositionToPoint.bind(this) - ); + let mapped = this.interaction.mapInteraction(extracted, ['ended'], this.mapPositionToPoint.bind(this)); for (let [target, interaction] of mapped.entries()) { target.onEnd(event, interaction); } @@ -2903,10 +2752,7 @@ // convert to array types = Array.isArray(types) ? types : types.split(/\s/); - if ( - elements instanceof NodeList || - elements instanceof HTMLCollection - ) { + if (elements instanceof NodeList || elements instanceof HTMLCollection) { elements = Array.from(elements); } elements = Array.isArray(elements) ? elements : [elements]; @@ -2915,9 +2761,7 @@ const type = types[i].toLowerCase(); // list of hammer events - const useHammer = /^(tap|doubletap|press|pan|swipe|pinch|rotate).*$/.test( - type - ); + const useHammer = /^(tap|doubletap|press|pan|swipe|pinch|rotate).*$/.test(type); // if it is a hammer event if (useHammer) { @@ -2932,33 +2776,15 @@ // recognizers if (type.startsWith('pan')) { - hammer - .get('pan') - .set( - Object.assign( - { direction: Hammer.DIRECTION_ALL }, - opts - ) - ); + hammer.get('pan').set(Object.assign({ direction: Hammer.DIRECTION_ALL }, opts)); } else if (type.startsWith('pinch')) { - hammer - .get('pinch') - .set(Object.assign({ enable: true }, opts)); + hammer.get('pinch').set(Object.assign({ enable: true }, opts)); } else if (type.startsWith('press')) { hammer.get('press').set(opts); } else if (type.startsWith('rotate')) { - hammer - .get('rotate') - .set(Object.assign({ enable: true }, opts)); + hammer.get('rotate').set(Object.assign({ enable: true }, opts)); } else if (type.startsWith('swipe')) { - hammer - .get('swipe') - .set( - Object.assign( - { direction: Hammer.DIRECTION_ALL }, - opts - ) - ); + hammer.get('swipe').set(Object.assign({ direction: Hammer.DIRECTION_ALL }, opts)); } else if (type.startsWith('tap')) { hammer.get('tap').set(opts); } @@ -3029,20 +2855,12 @@ */ static get isElectron() { // Renderer process - if ( - typeof window !== 'undefined' && - typeof window.process === 'object' && - window.process.type === 'renderer' - ) { + if (typeof window !== 'undefined' && typeof window.process === 'object' && window.process.type === 'renderer') { return true } // Main process - if ( - typeof process !== 'undefined' && - typeof process.versions === 'object' && - !!process.versions.electron - ) { + if (typeof process !== 'undefined' && typeof process.versions === 'object' && !!process.versions.electron) { return true } @@ -3110,9 +2928,7 @@ class CapabilitiesTests { static testConfirm() { let bool = confirm('Please confirm'); - document.getElementById('demo').innerHTML = bool - ? 'Confirmed' - : 'Not confirmed'; + document.getElementById('demo').innerHTML = bool ? 'Confirmed' : 'Not confirmed'; } static testPrompt() { @@ -3133,9 +2949,7 @@ } static testMultiTouchTable() { - let value = - 'Is the device a multi-touch table? ' + - Capabilities.isMultiTouchTable; + let value = 'Is the device a multi-touch table? ' + Capabilities.isMultiTouchTable; multi_touch_table.innerHTML = value; } @@ -3205,14 +3019,7 @@ class ScatterEvent extends BaseEvent { constructor( target, - { - translate = { x: 0, y: 0 }, - scale = null, - rotate = 0, - about = null, - fast = false, - type = null - } = {} + { translate = { x: 0, y: 0 }, scale = null, rotate = 0, about = null, fast = false, type = null } = {} ) { super('scatterTransformed', { target: target }); this.translate = translate; @@ -3225,13 +3032,7 @@ toString() { return ( - "Event('scatterTransformed', scale: " + - this.scale + - ' about: ' + - this.about.x + - ', ' + - this.about.y + - ')' + "Event('scatterTransformed', scale: " + this.scale + ' about: ' + this.about.x + ', ' + this.about.y + ')' ) } } @@ -3251,13 +3052,7 @@ } toString() { - return ( - 'Event(scatterResized width: ' + - this.width + - 'height: ' + - this.height + - ')' - ) + return 'Event(scatterResized width: ' + this.width + 'height: ' + this.height + ')' } } @@ -3532,6 +3327,13 @@ close() { if (this.onClose) { this.onClose.forEach(callback => callback(this)); + + /** + Removes self from container when it's closed. + */ + if (this.container) { + this.container.remove(this); + } } } @@ -3665,10 +3467,7 @@ _checkAutoClose() { if (this.scaleAutoClose) - if ( - this.scale < - this.minScale + this.scaleCloseThreshold - this.scaleCloseBuffer - ) { + if (this.scale < this.minScale + this.scaleCloseThreshold - this.scaleCloseBuffer) { this.zoom(this.minScale, { animate: 0.2, onComplete: this.close.bind(this) @@ -3723,17 +3522,7 @@ this.move(delta, { animate: animate }); } - zoom( - scale, - { - animate = 0, - about = null, - delay = 0, - x = null, - y = null, - onComplete = null - } = {} - ) { + zoom(scale, { animate = 0, about = null, delay = 0, x = null, y = null, onComplete = null } = {}) { let anchor = about || this.center; if (scale != this.scale) { if (animate > 0) { @@ -3784,15 +3573,9 @@ let origin = this.rotationOrigin; let beta = Points$1.angle(origin, anchor); let distance = Points$1.distance(origin, anchor); - let { scale: newScale, zoom: thresholdedZoom } = this.calculateScale( - zoom - ); + let { scale: newScale, zoom: thresholdedZoom } = this.calculateScale(zoom); - let newOrigin = Points$1.arc( - anchor, - beta + rotate, - distance * thresholdedZoom - ); + let newOrigin = Points$1.arc(anchor, beta + rotate, distance * thresholdedZoom); let extra = Points$1.subtract(newOrigin, origin); let offset = Points$1.subtract(anchor, origin); this._move(offset); @@ -3855,10 +3638,8 @@ } calculateScaleTransparency() { - let transparency = - (this.scale - this.minScale) / this.scaleCloseThreshold; - transparency = - transparency > 1 ? 1 : transparency < 0 ? 0 : transparency; + let transparency = (this.scale - this.minScale) / this.scaleCloseThreshold; + transparency = transparency > 1 ? 1 : transparency < 0 ? 0 : transparency; return transparency } @@ -3916,8 +3697,7 @@ if (this.scaleAutoClose) { if (this.scale <= this.minScale + this.scaleCloseThreshold) { - if (this.scaleAutoCloseTimeout) - clearTimeout(this.scaleAutoCloseTimeout); + if (this.scaleAutoCloseTimeout) clearTimeout(this.scaleAutoCloseTimeout); this.scaleAutoCloseTimeout = setTimeout(() => { this._checkAutoClose(); }, 600); @@ -4080,13 +3860,7 @@ */ constructor( element, - { - stopEvents = 'auto', - claimEvents = true, - useCapture = true, - touchAction = 'none', - debugCanvas = null - } = {} + { stopEvents = 'auto', claimEvents = true, useCapture = true, touchAction = 'none', debugCanvas = null } = {} ) { this.onCapture = null; this.element = element; @@ -4097,11 +3871,7 @@ movement of scatter objects, the touchmove event has to be bound again. */ if (Capabilities.isSafari) { - document.addEventListener( - 'touchmove', - event => this.preventPinch(event), - false - ); + document.addEventListener('touchmove', event => this.preventPinch(event), false); stopEvents = false; } else { stopEvents = true; @@ -4137,14 +3907,7 @@ for (let [key, point] of current.entries()) { let local = point; context.beginPath(); - context.arc( - local.x * resolution, - local.y * resolution, - radius, - 0, - 2 * Math.PI, - false - ); + context.arc(local.x * resolution, local.y * resolution, radius, 0, 2 * Math.PI, false); context.fill(); context.stroke(); } @@ -4160,6 +3923,22 @@ } } + /** + * Removes an element from the scatter. + * + * @param {Scatter} scatter - Element to remove. + * @memberof DOMScatterContainer + */ + remove(scatter) { + this.scatter.delete(scatter.element); + } + + /** + * Adds an element to the ScatterContainer. + * + * @param {Scatter} scatter - Element to add to the ScatterContainer. + * @memberof DOMScatterContainer + */ add(scatter) { this.scatter.set(scatter.element, scatter); } @@ -4200,10 +3979,7 @@ ***/ let found = document.elementFromPoint(global.x, global.y); for (let target of this.scatter.values()) { - if ( - target.interactive && - this.isDescendant(target.element, found) - ) { + if (target.interactive && this.isDescendant(target.element, found)) { if (this.stopEvents) Events.stop(event); if (this.claimEvents) event.claimedByScatter = target; return target @@ -4634,10 +4410,8 @@ let resizeH = -r * Math.sin(Angle.degree2radian(phiCorrected)); if ( - (this.element.offsetWidth + resizeW) / this.scale > - (this.width * 0.5) / this.scale && - (this.element.offsetHeight + resizeH) / this.scale > - (this.height * 0.3) / this.scale + (this.element.offsetWidth + resizeW) / this.scale > (this.width * 0.5) / this.scale && + (this.element.offsetHeight + resizeH) / this.scale > (this.height * 0.3) / this.scale ) TweenLite.to(this.element, 0, { width: this.element.offsetWidth + resizeW / this.scale, @@ -4934,28 +4708,22 @@ frontLoaded(loader) { return new Promise((resolve, reject) => { - let scatter = new DOMScatter$1( - this.cardWrapper, - this.domScatterContainer, - { - x: loader.x, - y: loader.y, - startScale: loader.scale, - scale: loader.scale, - maxScale: loader.maxScale, - minScale: loader.minScale, - width: loader.wantedWidth, - height: loader.wantedHeight, - rotation: loader.rotation, - translatable: this.translatable, - scalable: this.scalable, - rotatable: this.rotatable, - overdoScaling: this.overdoScaling, - tapDelegate: this.tapDelegateFactory - ? this.tapDelegateFactory(this.cardWrapper) - : null - } - ); + let scatter = new DOMScatter$1(this.cardWrapper, this.domScatterContainer, { + x: loader.x, + y: loader.y, + startScale: loader.scale, + scale: loader.scale, + maxScale: loader.maxScale, + minScale: loader.minScale, + width: loader.wantedWidth, + height: loader.wantedHeight, + rotation: loader.rotation, + translatable: this.translatable, + scalable: this.scalable, + rotatable: this.rotatable, + overdoScaling: this.overdoScaling, + tapDelegate: this.tapDelegateFactory ? this.tapDelegateFactory(this.cardWrapper) : null + }); if (this.center) { scatter.centerAt(this.center); @@ -4972,9 +4740,7 @@ //Remove callback if (scatter.onTransform) { - let callbackIdx = scatter.onTransform.indexOf( - removeOnMinScale - ); + let callbackIdx = scatter.onTransform.indexOf(removeOnMinScale); scatter.onTransform.splice(callbackIdx, 1); } } @@ -5248,9 +5014,7 @@ this.flipped = !this.flipped; let targetY = this.flipped ? 180 : 0; - let targetZ = this.flipped - ? this.startAngle + this.targetRotation(this.startAngle) - : this.startAngle; + let targetZ = this.flipped ? this.startAngle + this.targetRotation(this.startAngle) : this.startAngle; let targetScale = this.flipped ? this.wantedScale : this.startScale; let w = this.flipped ? this.wantedWidth : this.startWidth; let h = this.flipped ? this.wantedHeight : this.startHeight; @@ -5610,8 +5374,7 @@ img.ondrag = e => { e.preventDefault(); - let target = - this.element.querySelector('iframe') || this.element; + let target = this.element.querySelector('iframe') || this.element; let delta = { x: e.clientX - this.currentPos.x, y: e.clientY - this.currentPos.y @@ -5713,10 +5476,7 @@ if (images.length > 0) { let count = 0; for (let image of images) { - if ( - !image.complete && - !image.src.startsWith('data:') - ) { + if (!image.complete && !image.src.startsWith('data:')) { total += 1; console.log('image not complete', image.src); image.onload = e => { @@ -5828,8 +5588,7 @@ target.ondragstart = e => { this.currentPos = { x: e.clientX, y: e.clientY }; var img = document.createElement('img'); - img.src = - 'data:image/gifbase64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'; + img.src = 'data:image/gifbase64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'; e.dataTransfer.setDragImage(img, 0, 0); }; target.ondrag = e => { @@ -5879,8 +5638,7 @@ layout() {} remove() { - if (this.parent.contains(this.element)) - this.parent.removeChild(this.element); + if (this.parent.contains(this.element)) this.parent.removeChild(this.element); this.unregister(this.context); } @@ -6035,36 +5793,30 @@ //if targetBoundingBox is set, popup is placed next to the rectangle if (this.targetBoundingBox) { let bbTop = this.targetBoundingBox.y; - let bbBottom = - this.targetBoundingBox.y + this.targetBoundingBox.height; + let bbBottom = this.targetBoundingBox.y + this.targetBoundingBox.height; let bbLeft = this.targetBoundingBox.x; - let bbRight = - this.targetBoundingBox.x + this.targetBoundingBox.width; + let bbRight = this.targetBoundingBox.x + this.targetBoundingBox.width; //console.log("place popup with bb set:", x, y, bbTop, bbBottom, bbLeft, bbRight) switch (notchPosition) { case 'bottomLeft': case 'bottomRight': case 'bottomCenter': y = bbTop; - if (!this.useEventPosWithBoundingBox) - x = (bbLeft + bbRight) / 2; + if (!this.useEventPosWithBoundingBox) x = (bbLeft + bbRight) / 2; break case 'topLeft': case 'topRight': case 'topCenter': y = bbBottom; - if (!this.useEventPosWithBoundingBox) - x = (bbLeft + bbRight) / 2; + if (!this.useEventPosWithBoundingBox) x = (bbLeft + bbRight) / 2; break case 'centerRight': x = bbLeft; - if (!this.useEventPosWithBoundingBox) - y = (bbTop + bbBottom) / 2; + if (!this.useEventPosWithBoundingBox) y = (bbTop + bbBottom) / 2; break case 'centerLeft': x = bbRight; - if (!this.useEventPosWithBoundingBox) - y = (bbTop + bbBottom) / 2; + if (!this.useEventPosWithBoundingBox) y = (bbTop + bbBottom) / 2; break default: break @@ -6208,8 +5960,7 @@ boxShadow: '0 12px 15px rgba(0, 0, 0, 0.1)', bottom: -this.notchSize + 'px', position: 'absolute', - borderTop: - this.notchSize + 'px solid ' + this.backgroundColor, + borderTop: this.notchSize + 'px solid ' + this.backgroundColor, borderRight: this.notchSize + 'px solid transparent', borderLeft: this.notchSize + 'px solid transparent', borderBottom: 0 @@ -6237,8 +5988,7 @@ left, top: -this.notchSize + 'px', position: 'absolute', - borderBottom: - this.notchSize + 'px solid ' + this.backgroundColor, + borderBottom: this.notchSize + 'px solid ' + this.backgroundColor, borderRight: this.notchSize + 'px solid transparent', borderLeft: this.notchSize + 'px solid transparent', borderTop: 0 @@ -6275,16 +6025,13 @@ let top = size.height / 2 - this.notchSize; if (notchPosition.endsWith('Left')) { left = -this.notchSize * 2 + 'px'; - borderRight = - this.notchSize + 'px solid ' + this.backgroundColor; - this.element.style.boxShadow = - '15px 10px 15px rgba(0, 0, 0, 0.3)'; + borderRight = this.notchSize + 'px solid ' + this.backgroundColor; + this.element.style.boxShadow = '15px 10px 15px rgba(0, 0, 0, 0.3)'; } if (notchPosition.endsWith('Right')) { left = size.width + 'px'; borderLeft = this.notchSize + 'px solid ' + this.backgroundColor; - this.element.style.boxShadow = - '15px 5px 15px rgba(0, 0, 0, 0.3)'; + this.element.style.boxShadow = '15px 5px 15px rgba(0, 0, 0, 0.3)'; } top = Math.round(top) + 'px'; @@ -6341,8 +6088,7 @@ onMove = null } = {} ) { - let notchPosition = - switchPos && point.y < 50 ? 'topCenter' : 'bottomCenter'; + let notchPosition = switchPos && point.y < 50 ? 'topCenter' : 'bottomCenter'; let popup = new Popup$1({ parent, context, @@ -6633,8 +6379,7 @@ return } console.log('open', point); - let notchPosition = - point.y < 50 && switchPos ? 'topCenter' : 'bottomCenter'; + let notchPosition = point.y < 50 && switchPos ? 'topCenter' : 'bottomCenter'; let popup = new PopupMenu({ parent, fontSize, @@ -6657,21 +6402,9 @@ if (this.eventOutside(e)) this.closePopup(context); }; if (autoClose) { - context.addEventListener( - 'mousedown', - popup.closeEventListener, - true - ); - context.addEventListener( - 'touchstart', - popup.closeEventListener, - true - ); - context.addEventListener( - 'pointerdown', - popup.closeEventListener, - true - ); + context.addEventListener('mousedown', popup.closeEventListener, true); + context.addEventListener('touchstart', popup.closeEventListener, true); + context.addEventListener('pointerdown', popup.closeEventListener, true); } } @@ -6686,18 +6419,9 @@ let registered = Poppable.get(context); if (registered) { registered.close(); - context.removeEventListener( - 'mousedown', - registered.closeEventListener - ); - context.removeEventListener( - 'touchstart', - registered.closeEventListener - ); - context.removeEventListener( - 'pointerdown', - registered.closeEventListener - ); + context.removeEventListener('mousedown', registered.closeEventListener); + context.removeEventListener('touchstart', registered.closeEventListener); + context.removeEventListener('pointerdown', registered.closeEventListener); } } } @@ -6760,15 +6484,7 @@ let point = pointMap.get(key); let p = Points$1.fromPageToNode(this.frame, point); let touchTarget = doc.elementFromPoint(p.x, p.y); - let touch = new Touch( - undefined, - touchTarget, - key, - p.x, - p.y, - p.x, - p.y - ); + let touch = new Touch(undefined, touchTarget, key, p.x, p.y, p.x, p.y); touches.push(touch); } return new TouchList(...touches) @@ -6803,12 +6519,7 @@ this.target.dispatchEvent(touchEvent); } - simulateTouchEventSafari( - type, - point, - pointMap, - touchEventKey = 'targetTouches' - ) { + simulateTouchEventSafari(type, point, pointMap, touchEventKey = 'targetTouches') { let p = Points$1.fromPageToNode(this.frame, point); let data = { view: this.frame.contentWindow, @@ -6832,9 +6543,7 @@ } isMouseLikeEvent(event) { - return ( - event.type.startsWith('mouse') || event.type.startsWith('pointer') - ) + return event.type.startsWith('mouse') || event.type.startsWith('pointer') } onStart(event, interaction) { @@ -6843,11 +6552,7 @@ if (this.isMouseLikeEvent(event)) { this.simulateMouseEvent('mousedown', point); } else { - this.simulateTouchEvent( - 'touchstart', - point, - interaction.current - ); + this.simulateTouchEvent('touchstart', point, interaction.current); return } } @@ -6871,12 +6576,7 @@ if (this.isMouseLikeEvent(event)) { this.simulateMouseEvent('mouseend', point); } else { - this.simulateTouchEvent( - 'touchend', - point, - interaction.ended, - 'changedTouches' - ); + this.simulateTouchEvent('touchend', point, interaction.ended, 'changedTouches'); return } } @@ -7091,9 +6791,7 @@ if (opts.eventType) { opts.eventTypes = opts.eventType; } - opts.eventTypes = Array.isArray(opts.eventTypes) - ? opts.eventTypes - : [opts.eventTypes]; + opts.eventTypes = Array.isArray(opts.eventTypes) ? opts.eventTypes : [opts.eventTypes]; // timeline //-------------------- @@ -7131,14 +6829,8 @@ if (opts.eventTypes[0]) { // create and dispatch event //-------------------- - const eventStart = Event$1.create( - elem, - coords, - opts.eventTypes[0], - eventOpts - ); - if (this.opts.debug) - console.log('dispatch event', eventStart); + const eventStart = Event$1.create(elem, coords, opts.eventTypes[0], eventOpts); + if (this.opts.debug) console.log('dispatch event', eventStart); elem.dispatchEvent(eventStart); // onStart @@ -7150,14 +6842,8 @@ // create and dispatch event //-------------------- - const eventComplete = Event$1.create( - elem, - coords, - opts.eventTypes[1], - eventOpts - ); - if (this.opts.debug) - console.log('dispatch event', eventComplete); + const eventComplete = Event$1.create(elem, coords, opts.eventTypes[1], eventOpts); + if (this.opts.debug) console.log('dispatch event', eventComplete); elem.dispatchEvent(eventComplete); // onComplete @@ -7250,14 +6936,8 @@ onStart: () => { // create and dispatch event //-------------------- - const event = Event$1.create( - elem, - from, - opts.eventTypes[0], - eventOpts - ); - if (this.opts.debug) - console.log('dispatch event', event); + const event = Event$1.create(elem, from, opts.eventTypes[0], eventOpts); + if (this.opts.debug) console.log('dispatch event', event); elem.dispatchEvent(event); // onStart @@ -7269,14 +6949,8 @@ onUpdate: () => { // create and dispatch event //-------------------- - const event = Event$1.create( - elem, - from, - opts.eventTypes[1], - eventOpts - ); - if (this.opts.debug) - console.log('dispatch event', event); + const event = Event$1.create(elem, from, opts.eventTypes[1], eventOpts); + if (this.opts.debug) console.log('dispatch event', event); elem.dispatchEvent(event); // onUpdate @@ -7288,14 +6962,8 @@ onComplete: () => { // create and dispatch event //-------------------- - const event = Event$1.create( - elem, - from, - opts.eventTypes[2], - eventOpts - ); - if (this.opts.debug) - console.log('dispatch event', event); + const event = Event$1.create(elem, from, opts.eventTypes[2], eventOpts); + if (this.opts.debug) console.log('dispatch event', event); elem.dispatchEvent(event); // onComplete @@ -7444,66 +7112,39 @@ onStart: () => { // create and dispatch event //-------------------- - const event = Event$1.create( - elem, - from, - opts.eventTypes[0], - eventOpts - ); - if (this.opts.debug) - console.log('dispatch event', event); + const event = Event$1.create(elem, from, opts.eventTypes[0], eventOpts); + if (this.opts.debug) console.log('dispatch event', event); elem.dispatchEvent(event); // onStart //-------------------- - if ( - opts.onStart && - (opts.doubleCallbacks || key === 0) - ) { + if (opts.onStart && (opts.doubleCallbacks || key === 0)) { opts.onStart.call(this, event); } }, onUpdate: () => { // create and dispatch event //-------------------- - const event = Event$1.create( - elem, - from, - opts.eventTypes[1], - eventOpts - ); - if (this.opts.debug) - console.log('dispatch event', event); + const event = Event$1.create(elem, from, opts.eventTypes[1], eventOpts); + if (this.opts.debug) console.log('dispatch event', event); elem.dispatchEvent(event); // onUpdate //-------------------- - if ( - opts.onUpdate && - (opts.doubleCallbacks || key === 0) - ) { + if (opts.onUpdate && (opts.doubleCallbacks || key === 0)) { opts.onUpdate.call(this, event); } }, onComplete: () => { // create and dispatch event //-------------------- - const event = Event$1.create( - elem, - from, - opts.eventTypes[2], - eventOpts - ); - if (this.opts.debug) - console.log('dispatch event', event); + const event = Event$1.create(elem, from, opts.eventTypes[2], eventOpts); + if (this.opts.debug) console.log('dispatch event', event); elem.dispatchEvent(event); // onComplete //-------------------- - if ( - opts.onComplete && - (opts.doubleCallbacks || key === 0) - ) { + if (opts.onComplete && (opts.doubleCallbacks || key === 0)) { opts.onComplete.call(this, event); } } @@ -7615,9 +7256,7 @@ 'No execution time was specified for this action, and a default interval was not set in the class constructor!' ) } - timelinePosition = - Math.max(...this._timelinePositions) + - (this.opts.defaultInterval || 1); + timelinePosition = Math.max(...this._timelinePositions) + (this.opts.defaultInterval || 1); } if (opts === null) { @@ -7692,12 +7331,8 @@ * @return {HTMLElement|string} element - The HTML element on which the event is to be executed, e.g. button, document, h2, canvas, etc. or an selector string. If a selector has been specified, it is evaluated immediately before the event is called using the querySelector method. */ static extractElement(context, element) { - const cont = Util.isFrame(context) - ? context.contentDocument - : context.document; - const elem = Util.isString(element) - ? cont.querySelector(element) - : element; + const cont = Util.isFrame(context) ? context.contentDocument : context.document; + const elem = Util.isString(element) ? cont.querySelector(element) : element; return elem } @@ -7753,9 +7388,7 @@ type: 'thru' }; } else { - opts.bezier.values = opts.bezier.values.map(it => - Util.extractPosition(it) - ); + opts.bezier.values = opts.bezier.values.map(it => Util.extractPosition(it)); bezier = opts.bezier; } @@ -7891,16 +7524,9 @@ * @param {string} type - The type of the event, see https://developer.mozilla.org/de/docs/Web/Events * @param {object} opts - An options object. Every paramter of the event object can be overridden, see e.g. https://developer.mozilla.org/de/docs/Web/API/MouseEvent for all the properties. */ - static create( - target, - position = { x: 0, y: 0 }, - type = 'pointerup', - opts = {} - ) { + static create(target, position = { x: 0, y: 0 }, type = 'pointerup', opts = {}) { const rect = - typeof target.getBoundingClientRect === 'function' - ? target.getBoundingClientRect() - : { x: 0, y: 0 }; + typeof target.getBoundingClientRect === 'function' ? target.getBoundingClientRect() : { x: 0, y: 0 }; // EventInit const eventOpts = { @@ -7959,25 +7585,12 @@ if (type.startsWith('pointer')) { return new PointerEvent( type, - Object.assign( - {}, - eventOpts, - uiEventOpts, - mouseEventOpts, - pointerEventOpts, - opts - ) + Object.assign({}, eventOpts, uiEventOpts, mouseEventOpts, pointerEventOpts, opts) ) } else if (type.startsWith('touch')) { - return new TouchEvent( - type, - Object.assign({}, eventOpts, uiEventOpts, touchEventOpts, opts) - ) + return new TouchEvent(type, Object.assign({}, eventOpts, uiEventOpts, touchEventOpts, opts)) } else { - return new MouseEvent( - type, - Object.assign({}, eventOpts, uiEventOpts, mouseEventOpts, opts) - ) + return new MouseEvent(type, Object.assign({}, eventOpts, uiEventOpts, mouseEventOpts, opts)) } } } @@ -7995,8 +7608,7 @@ console.log('Setup Card...', modules); context.modules = []; modules.forEach(module => { - if (module.apply(context)) - context.modules.push(module.constructor.name); + if (module.apply(context)) context.modules.push(module.constructor.name); }); } @@ -8101,10 +7713,7 @@ event.stopPropagation(); if (callStack) callStack.call(that, ...args); else { - console.error( - 'Could not call callback function ' + attributeVal, - ...args - ); + console.error('Could not call callback function ' + attributeVal, ...args); } }); } @@ -8131,9 +7740,7 @@ /<\s*(a|video|img|image|circle)\s(.*?)(xlink:href|href|src)\s*=\s*["'](\..*?)["']\s*(.*?)>/g, function(data) { let path = that._getRelativePath(arguments[4]); - const tag = `<${arguments[1]} ${arguments[2]} ${ - arguments[3] - }="${path}" ${arguments[5]}>`; + const tag = `<${arguments[1]} ${arguments[2]} ${arguments[3]}="${path}" ${arguments[5]}>`; /* if (that.debug) */ console.log('Adjusted: ', tag); return tag } @@ -8290,16 +7897,13 @@ //Test if meanwhile another popup was registered... this._getPopup(context) || // Or if an highlight was loaded, if the highlight already was closed. - (highlight !== null && - !this._isHighlightActive(context, highlight)) + (highlight !== null && !this._isHighlightActive(context, highlight)) ) { //.. if so remove the create popup instantly. popup.remove(); } else { // Otherwise set the popup regularly. - let popupParagraphs = popup.element.querySelectorAll( - '.popupContent > *' - ); + let popupParagraphs = popup.element.querySelectorAll('.popupContent > *'); // Remove a design error of naming two adjacent elements popup. // Todo: fix this properly and remove this code. @@ -8350,8 +7954,7 @@ * @memberof Card */ static _createPopup(context, position, content, options = {}) { - if (this.debug) - console.log('Create Popup.', context, position, content, options); + if (this.debug) console.log('Create Popup.', context, position, content, options); let popup = new Popup( Object.assign( { @@ -8444,9 +8047,7 @@ node = event.target; } if (local == null) { - let globalClick = event.center - ? event.center - : { x: event.x, y: event.y }; + let globalClick = event.center ? event.center : { x: event.x, y: event.y }; local = Points.fromPageToNode(context, globalClick); } if (this.debug) console.log('loadPopup', event); @@ -8479,17 +8080,11 @@ // Extract the body from the Popup site. let parser = new DOMParser(); - let popupPage = parser.parseFromString( - xhr.responseText, - 'text/html' - ); + let popupPage = parser.parseFromString(xhr.responseText, 'text/html'); //Fix the relative path of loaded images in the popup. popupPage.querySelectorAll('img').forEach(node => { - node.setAttribute( - 'src', - that._getRelativePath(node.getAttribute('src')) - ); + node.setAttribute('src', that._getRelativePath(node.getAttribute('src'))); }); let html = popupPage.body.innerHTML; /** @@ -8511,18 +8106,10 @@ Card._cleanup(context); if (!isSame) { - Card._activateCorrespondingHighlights( - context, - node, - parentArticle - ); + Card._activateCorrespondingHighlights(context, node, parentArticle); let callback = (popup, callback) => { - if (this.debug) - console.log( - 'Close popup (Editable = ' + editable + ').', - popup - ); + if (this.debug) console.log('Close popup (Editable = ' + editable + ').', popup); if (editable) { let isDirty = mainController.askSaveNode(); if (isDirty) @@ -8558,8 +8145,7 @@ }; //console.log("onreadystatechange", editable) if (editable) { - if (this.debug) - console.log('pushController', src, popup.insertedNode); + if (this.debug) console.log('pushController', src, popup.insertedNode); mainController.pushController(popup.insertedNode, src); } }; @@ -8589,10 +8175,7 @@ } if (correspondingHighlights.length > 0) { for (let highlight of correspondingHighlights) { - if ( - highlight.parentNode && - highlight.parentNode.nodeName.toLowerCase() == 'g' - ) { + if (highlight.parentNode && highlight.parentNode.nodeName.toLowerCase() == 'g') { Highlight.openHighlight(highlight, { animation: Card.highlightAnimation }); @@ -8691,10 +8274,7 @@ let matrix = node.getCTM(); let point = svgPoint.matrixTransform(matrix); - let global = Points.fromNodeToPage( - node.closest('div'), - point - ); + let global = Points.fromNodeToPage(node.closest('div'), point); let local = Points.fromPageToNode(context, global); let overlay = document.createElement('div'); @@ -8740,16 +8320,12 @@ xhr.onreadystatechange = () => { if (xhr.readyState == 4) { if (xhr.status == 200 || xhr.status == 0) { - let html = this.postProcessResponseText( - xhr.responseText - ); + let html = this.postProcessResponseText(xhr.responseText); let selector = Card.popupHtmlSelector; let content = { html: html.body.innerHTML, selector }; resolve(content); } else { - reject( - ` Popup request failed (Code: ${xhr.status}): Could not load resource: ${src}` - ); + reject(` Popup request failed (Code: ${xhr.status}): Could not load resource: ${src}`); } } }; @@ -8764,8 +8340,7 @@ let editable = Card.isEditable(); if (editable) { - if (node.classList.contains('zoomable-icon')) - this._openZoomable(event); + if (node.classList.contains('zoomable-icon')) this._openZoomable(event); return } this._openZoomable(event); @@ -8814,10 +8389,7 @@ globalBottomRight = Points.fromNodeToPage(zoomable, globalBottomRight); let globalFigurePos = Points.fromNodeToPage(zoomable, { x: 0, y: 0 }); let localFigurePos = Points.fromPageToNode(wrapper, globalFigurePos); - let relativeBottomRight = Points.fromPageToNode( - zoomable, - globalBottomRight - ); + let relativeBottomRight = Points.fromPageToNode(zoomable, globalBottomRight); let width = relativeBottomRight.x + @@ -8931,12 +8503,8 @@ }); let zoomedFigStyle = window.getComputedStyle(zoomedFig); - let borderX = - parseFloat(zoomedFigStyle.borderLeftWidth) + - parseFloat(zoomedFigStyle.borderRightWidth); - let borderY = - parseFloat(zoomedFigStyle.borderBottomWidth) + - parseFloat(zoomedFigStyle.borderTopWidth); + let borderX = parseFloat(zoomedFigStyle.borderLeftWidth) + parseFloat(zoomedFigStyle.borderRightWidth); + let borderY = parseFloat(zoomedFigStyle.borderBottomWidth) + parseFloat(zoomedFigStyle.borderTopWidth); const scaleFactor = 2; const transformOrigin = 'bottom right'; @@ -8988,14 +8556,7 @@ .to(zoomCaption, this.animation.fade, { autoAlpha: 1 }); - } else - this._openZoomableEditorBehaviour( - wrapper, - img, - zoomable, - zoomedFig, - current - ); + } else this._openZoomableEditorBehaviour(wrapper, img, zoomable, zoomedFig, current); } /** @@ -9028,13 +8589,7 @@ return parent.querySelector('.icon') } - static _openZoomableEditorBehaviour( - wrapper, - img, - zoomable, - zoomedFig, - current - ) { + static _openZoomableEditorBehaviour(wrapper, img, zoomable, zoomedFig, current) { let zoomContainer = document.createElement('div'); let zoomIcon = zoomable.querySelector('.zoom-icon'); zoomContainer.style.position = 'relative'; @@ -9128,8 +8683,7 @@ * @memberof Card */ static closeZoomable(context, zoomable, zoomedFig) { - if (this.debug) - console.log('Close Zoomable', context, zoomable, zoomedFig); + if (this.debug) console.log('Close Zoomable', context, zoomable, zoomedFig); if (zoomable) { this._unsetZoomable(context); @@ -9180,13 +8734,7 @@ * @param {*} src - The src of the expanded element * @param {*} callback - A callback that is called when the expanded element is closed */ - static expandIndexCard( - card, - html, - tagName = 'article', - src = null, - callback = null - ) { + static expandIndexCard(card, html, tagName = 'article', src = null, callback = null) { let editable = Card.isEditable(); let context = this.getContext(card); @@ -9219,10 +8767,7 @@ let globalPreviewRect = Card._getGlobalRect(card); let globalIndexCardRect = Card._getGlobalRect(indexbox); - let localOrigin = Points.fromPageToNode( - indexbox, - Rect.getPosition(globalPreviewRect) - ); + let localOrigin = Points.fromPageToNode(indexbox, Rect.getPosition(globalPreviewRect)); let scaleX = globalPreviewRect.width / globalIndexCardRect.width; let scaleY = globalPreviewRect.height / globalIndexCardRect.height; @@ -9293,15 +8838,12 @@ let cardName = strparts[strparts.length - 1]; strparts = card.className.split(' '); let cardType = strparts[1]; - let msg = - 'Card: ' + cardID + ': openTopic: ' + cardType + ', ' + cardName; + let msg = 'Card: ' + cardID + ': openTopic: ' + cardType + ', ' + cardName; console.log('Logging:', msg); Logging.log(msg); } - let desiredBorderBottomWidth = parseInt( - window.getComputedStyle(titlebar).borderBottomWidth - ); + let desiredBorderBottomWidth = parseInt(window.getComputedStyle(titlebar).borderBottomWidth); TweenLite.to(clone, Card.animation.articleTransition, { x: -padding, y: -padding, @@ -9322,8 +8864,7 @@ }); // Retain the border at same visual thickness. - titlebar.style.borderBottomWidth = - desiredBorderBottomWidth / transform.scaleY + 'px'; + titlebar.style.borderBottomWidth = desiredBorderBottomWidth / transform.scaleY + 'px'; } }); @@ -9346,13 +8887,7 @@ let cardName = strparts[strparts.length - 1]; strparts = card.className.split(' '); let cardType = strparts[1]; - let msg = - 'Card: ' + - cardID + - ': closeTopic: ' + - cardType + - ', ' + - cardName; + let msg = 'Card: ' + cardID + ': closeTopic: ' + cardType + ', ' + cardName; console.log('Logging:', msg); Logging.log(msg); } @@ -9419,8 +8954,7 @@ }); // Retain the border at same visual thickness. - titlebar.style.borderBottomWidth = - desiredBorderBottomWidth / transform.scaleY + 'px'; + titlebar.style.borderBottomWidth = desiredBorderBottomWidth / transform.scaleY + 'px'; } }); }; @@ -9430,9 +8964,7 @@ if (iconClone == null) { iconClone = clone.querySelector('.cardicon'); - console.warn( - "Legacy selector. Change it to 'card-icon' and find a more suitable name." - ); + console.warn("Legacy selector. Change it to 'card-icon' and find a more suitable name."); } if (iconClone.tagName == 'img') { @@ -9440,11 +8972,7 @@ } //console.log("ICON: ", iconClone) iconClone.classList.remove('info'); - iconClone.classList.add( - 'close', - 'view-button', - 'transparent-background' - ); + iconClone.classList.add('close', 'view-button', 'transparent-background'); // We append the icon clone to the subcard-content. // Then it's always on the content and not on the background @@ -9541,13 +9069,7 @@ // card.insertAdjacentElement('afterbegin', article) // TweenLite.set(article, { autoAlpha: 0 }) - Card.expandIndexCard( - card, - parsedHTML, - 'article', - relativeSource, - saveCallback - ); + Card.expandIndexCard(card, parsedHTML, 'article', relativeSource, saveCallback); } }; xhr.onerror = () => { @@ -9584,9 +9106,7 @@ let dom = child.closest('.info-card'); if (!dom) { dom = child.querySelector('.wrapper'); - console.warn( - "Change the 'wrapper' class to 'info-card' it's more suitable." - ); + console.warn("Change the 'wrapper' class to 'info-card' it's more suitable."); } return dom // (dom == null) ? document.body : dom } @@ -9734,9 +9254,7 @@ if (indexbox != null) { // column != null || let links = Array.from(indexbox.getElementsByTagName('a')); - let globalClick = event.center - ? event.center - : { x: event.x, y: event.y }; + let globalClick = event.center ? event.center : { x: event.x, y: event.y }; let localClick = Points.fromPageToNode(indexbox, globalClick); let linkRects = links.map(link => { @@ -9771,16 +9289,9 @@ let closestLinkIndex = distances.indexOf(Math.min(...distances)); let closestLink = links[closestLinkIndex]; - console.log( - 'finding closest links', - closestLink, - closestLink.getClientRects() - ); + console.log('finding closest links', closestLink, closestLink.getClientRects()); - if ( - distances[closestLinkIndex] < 44 && - closestLink.getAttribute('href') - ) { + if (distances[closestLinkIndex] < 44 && closestLink.getAttribute('href')) { // Adapt context and local position let context = this.getContext(closestLink); let local = Points.fromPageToNode(context, globalClick); @@ -9941,10 +9452,7 @@ /* eslint-disable no-console */ class CardWrapper extends Object { - constructor( - domNode, - { triggerSVGClicks = true, allowClickDistance = 44 } = {} - ) { + constructor(domNode, { triggerSVGClicks = true, allowClickDistance = 44 } = {}) { super(); this.domNode = domNode; this.triggerSVGClicks = triggerSVGClicks; @@ -9993,7 +9501,7 @@ isClickable(node) { if (node == null) return false - // console.log("isClickable", node, this.isClickPrevented(node)) + // console.log("isClickable", node, this.isClickPrevented(node)) if (this.isClickPrevented(node)) { return false } @@ -10035,9 +9543,7 @@ nearestActive(event) { let element = this.domNode; let activeNodes = this.activeNodes(); - let globalClick = event.center - ? event.center - : { x: event.x, y: event.y }; + let globalClick = event.center ? event.center : { x: event.x, y: event.y }; let localClick = Points$1.fromPageToNode(element, globalClick); let clickRects = activeNodes.map(link => { @@ -10090,7 +9596,7 @@ } nodeTapped(node, event) { - console.log("nodeTapped", node, this.isClickable(node)); + console.log('nodeTapped', node, this.isClickable(node)); if (this.isClickable(node)) { this.simulateClick(node, event); return true @@ -10101,7 +9607,7 @@ return true } for (let [selector, handler] of this.tapHandler.entries()) { - console.log("nodeTapped", selector); + console.log('nodeTapped', selector); for (let obj of this.domNode.querySelectorAll(selector)) { if (node == obj) { handler(event, node); @@ -10113,10 +9619,9 @@ } tap(event, calledBy = 'unknown') { - if (event.isTrusted) { let node = this.nearestActive(event); - console.log("tap", node); + console.log('tap', node); this.nodeTapped(node, event); /* let node = document.elementFromPoint(event.clientX, event.clientY) @@ -10137,7 +9642,6 @@ } /* eslint-disable no-console */ - /* global TweenLite */ let _HighlightEnabled = true; let _CircleIds = 0; @@ -10199,10 +9703,7 @@ if (circle.classList.length == 0) { circle.removeAttribute('class'); } - if ( - circle.hasAttribute('id') && - circle.getAttribute('id').startsWith('@@') - ) { + if (circle.hasAttribute('id') && circle.getAttribute('id').startsWith('@@')) { circle.removeAttribute('id'); } circle.removeAttribute('data-svg-origin'); @@ -10217,10 +9718,7 @@ } } - static expand( - obj, - { scale = 2, duration = 3, stroke = 2, onComplete = null } = {} - ) { + static expand(obj, { scale = 2, duration = 3, stroke = 2, onComplete = null } = {}) { if (obj == null) return //console.log("expand") obj.classList.add('zooming'); @@ -10305,9 +9803,7 @@ this.shrink(maskImage, { stroke }); return } - let circles = Array.from(circleGroup.children).filter( - e => e.tagName == 'circle' - ); + let circles = Array.from(circleGroup.children).filter(e => e.tagName == 'circle'); for (let c of circles) { //console.log("shrinking all circles") this.shrink(c, { stroke }); @@ -10327,10 +9823,7 @@ return false } - static openHighlight( - target, - { animation = 0.5, scale = 2, onExpanded = null } = {} - ) { + static openHighlight(target, { animation = 0.5, scale = 2, onExpanded = null } = {}) { if (Highlight$1._isExpanded(target)) { console.log('Target is already expanded!'); return @@ -10344,10 +9837,7 @@ let image = parent.querySelector(imageId); if (image) { this._bringToFront(image); - } else - console.error( - 'Could not find corresponding image element.' - ); + } else console.error('Could not find corresponding image element.'); } else console.log('Element was no parent:', target); } this._bringToFront(target); @@ -10356,14 +9846,14 @@ return } let image = svgRoot.querySelector('image'); - + // eslint-disable-next-line no-unused-vars let [mask, maskImage] = Highlight$1._getSVGMask(target, { svgRoot, image }); let center = Highlight$1._calculateCenterRelativeTo(target, image); - console.log("_calculateCenterRelativeTo", center); + console.log('_calculateCenterRelativeTo', center); TweenLite.set(maskImage, { transformOrigin: `${center.x} ${center.y}` }); @@ -10379,7 +9869,7 @@ } static toggleHighlight(node) { - console.log("toggleHighlight", Highlight$1._isExpanded(node)); + console.log('toggleHighlight', Highlight$1._isExpanded(node)); if (Highlight$1._isExpanded(node)) { Highlight$1.closeHighlight(node); } else { @@ -10392,12 +9882,7 @@ if (target && parent) { parent.removeChild(target); parent.appendChild(target); - } else - console.error( - 'Could not bring to front. Either no target or no parent.', - target, - parent - ); + } else console.error('Could not bring to front. Either no target or no parent.', target, parent); } static _getSVGMask(circle, { svgRoot = null, image = null } = {}) { @@ -10432,10 +9917,7 @@ * @returns * @memberof Highlight */ - static _createSVGMask( - element, - { svgRoot = null, image = null, id = null } = {} - ) { + static _createSVGMask(element, { svgRoot = null, image = null, id = null } = {}) { // We can fetch these values here, but it's more efficient to // simply pass them in, as it's likely they were already retrieved beforehand. if (svgRoot == null) svgRoot = element.closest('svg'); @@ -10506,18 +9988,8 @@ return target.classList.contains(Highlight$1.expandedClass) } - static _setExpanded(target) { - target.classList.add(Highlight$1.expandedClass); - } - - static _notExpanded(target) { - target.classList.remove(Highlight$1.expandedClass); - } - static closeHighlight(target, { animation = 0.5 } = {}) { - - Highlight$1._notExpanded(target); - + target.classList.remove(Highlight$1.expandedClass); // eslint-disable-next-line no-unused-vars let [mask, maskImage] = Highlight$1._getSVGMask(target); console.log('Close Highlight', maskImage); @@ -10615,11 +10087,7 @@ * @returns * @memberof Card */ - static createCardScatter( - html, - scatterContainer, - { basePath = './', modules = [] } = {} - ) { + static createCardScatter(html, scatterContainer, { basePath = './', modules = [] } = {}) { let element = document.createElement('div'); scatterContainer.element.appendChild(element); @@ -10646,11 +10114,7 @@ * @returns * @memberof CardScatter */ - static loadAndCreateScatterCard( - scatterContainer, - item, - { basePath = '../', modules = [], onClose = null } = {} - ) { + static loadAndCreateScatterCard(scatterContainer, item, { basePath = '../', modules = [], onClose = null } = {}) { console.log(basePath); return new Promise((resolve, reject) => { let url = basePath + '/' + item + '/index.html'; @@ -10658,14 +10122,10 @@ this.loadHTML(url) .then(html => { console.log('Received', html); - let element = this.createCardScatter( - html, - scatterContainer, - { - basePath, - modules - } - ); + let element = this.createCardScatter(html, scatterContainer, { + basePath, + modules + }); if (onClose) this.addOnCloseListener(element, onClose); resolve(element); }) @@ -10740,10 +10200,7 @@ } _getVerificationFunctions(context) { - return [ - this._verifyContext.bind(this, context), - this._verifyRequirements.bind(this, context) - ] + return [this._verifyContext.bind(this, context), this._verifyRequirements.bind(this, context)] } _verifyContext(context) { @@ -10831,11 +10288,7 @@ constructor( wrapperSelector, overlaySelector = null, - { - zoomAnimationDuration = 0.4, - fadeAnimationDuration = 0.4, - interactionType = 'tap' - } = {} + { zoomAnimationDuration = 0.4, fadeAnimationDuration = 0.4, interactionType = 'tap' } = {} ) { super(); this.wrapperSelector = wrapperSelector; @@ -10852,14 +10305,7 @@ _getVerificationFunctions(context) { let arr = super._getVerificationFunctions(context); - let funcs = [ - this._verifyElementsExist.bind( - this, - context, - this.wrapperSelector, - this.overlaySelector - ) - ]; + let funcs = [this._verifyElementsExist.bind(this, context, this.wrapperSelector, this.overlaySelector)]; return arr.concat(funcs) } @@ -10944,9 +10390,7 @@ * The minor side should not exceed the height of the context window. */ const maxMinorSize = - context.offsetHeight - - 2 * parseInt(headerStlye.paddingTop) - - 2 * parseInt(headerStlye.marginTop); + context.offsetHeight - 2 * parseInt(headerStlye.paddingTop) - 2 * parseInt(headerStlye.marginTop); const max = { width: context.offsetWidth * maxFillRatio, @@ -10976,10 +10420,7 @@ // const minorImageSize = getImageSize(minorSide) let ratio = getImageSize(minorSide) / getImageSize(majorSide); - let size = - majorImageSize > max[majorSide.name] - ? max[majorSide.name] - : majorImageSize; + let size = majorImageSize > max[majorSide.name] ? max[majorSide.name] : majorImageSize; if (size * ratio > maxMinorSize) { size = maxMinorSize / ratio; @@ -10990,10 +10431,7 @@ height: 0 }; - let position = Points.fromPageToNode( - context, - Points.fromNodeToPage(source, { x: 0, y: 0 }) - ); + let position = Points.fromPageToNode(context, Points.fromNodeToPage(source, { x: 0, y: 0 })); let targetOffset = { x: 0, @@ -11004,13 +10442,9 @@ targetDimensions[minorSide.name] = size * ratio; targetOffset[majorSide.axis] = - (context['offset' + capitalize(majorSide.name)] - - targetDimensions[majorSide.name]) / - 2; + (context['offset' + capitalize(majorSide.name)] - targetDimensions[majorSide.name]) / 2; targetOffset[minorSide.axis] = - (context['offset' + capitalize(minorSide.name)] - - targetDimensions[minorSide.name]) / - 2; + (context['offset' + capitalize(minorSide.name)] - targetDimensions[minorSide.name]) / 2; overlay.appendChild(imageWrapper); @@ -11050,18 +10484,14 @@ } getBorderHeight(style) { - const borderWidth = - parseInt(style.borderTopWidth) + parseInt(style.borderBottomWidth); - const padding = - parseInt(style.paddingTop) + parseInt(style.paddingBottom); + const borderWidth = parseInt(style.borderTopWidth) + parseInt(style.borderBottomWidth); + const padding = parseInt(style.paddingTop) + parseInt(style.paddingBottom); return parseInt(style.width) + borderWidth + padding } getBorderWidth(style) { - const borderWidth = - parseInt(style.borderLeftWidth) + parseInt(style.borderRightWidth); - const padding = - parseInt(style.paddingLeft) + parseInt(style.paddingRight); + const borderWidth = parseInt(style.borderLeftWidth) + parseInt(style.borderRightWidth); + const padding = parseInt(style.paddingLeft) + parseInt(style.paddingRight); return parseInt(style.width) + borderWidth + padding } @@ -11096,16 +10526,12 @@ _doesParentExist(context, parent) { if (parent == null) return true let valid = context.querySelector(parent) != null; - if (!valid) - console.error('Could not find parent on context.', context, parent); + if (!valid) console.error('Could not find parent on context.', context, parent); return valid } append(context) { - parent = - this.parent == null - ? context - : context.querySelector(this.parent).appendChild(container); + parent = this.parent == null ? context : context.querySelector(this.parent).appendChild(container); let container = document.createElement('div'); container.className = this.className; parent.appendChild(container); @@ -11205,15 +10631,8 @@ utterance.onboundary = () => { console.log('onboundary', node.innerText); - if ( - this.currentText.substring(0, 5) != - node.innerText.substring(0, 5) - ) { - console.log( - 'text for speech synth changed!', - this.currentText, - node.innerText - ); + if (this.currentText.substring(0, 5) != node.innerText.substring(0, 5)) { + console.log('text for speech synth changed!', this.currentText, node.innerText); this._stop(); } }; diff --git a/dist/iwmlib.pixi.js b/dist/iwmlib.pixi.js index 96f3428..5a7432c 100644 --- a/dist/iwmlib.pixi.js +++ b/dist/iwmlib.pixi.js @@ -83,8 +83,7 @@ * is used for large actived text. */ constructor(opts = {}) { - const colorPrimary = - opts.primaryColor != null ? opts.primaryColor : 0x5ec7f8; // blue + const colorPrimary = opts.primaryColor != null ? opts.primaryColor : 0x5ec7f8; // blue const color1 = opts.color1 != null ? opts.color1 : 0x282828; // black const color2 = opts.color2 != null ? opts.color2 : 0xf6f6f6; // white @@ -418,10 +417,7 @@ //----------------- if (this.opts.background) { this.background.clear(); - this.background.beginFill( - this.opts.backgroundFill, - this.opts.backgroundFillAlpha - ); + this.background.beginFill(this.opts.backgroundFill, this.opts.backgroundFillAlpha); this.background.drawRect(0, 0, width, height); this.background.endFill(); } @@ -465,20 +461,10 @@ const wantedWidth = this.opts.width || width - 2 * this.opts.margin; const wantedHeight = this.opts.height; - this.bar.lineStyle( - this.opts.strokeWidth, - this.opts.stroke, - this.opts.strokeAlpha - ); + this.bar.lineStyle(this.opts.strokeWidth, this.opts.stroke, this.opts.strokeAlpha); this.bar.beginFill(this.opts.fill, this.opts.fillAlpha); if (this.radius > 1) { - this.bar.drawRoundedRect( - 0, - 0, - wantedWidth, - wantedHeight, - this.radius - ); + this.bar.drawRoundedRect(0, 0, wantedWidth, wantedHeight, this.radius); } else { this.bar.drawRect(0, 0, wantedWidth, wantedHeight); } @@ -502,24 +488,11 @@ const barActiveWidth = (wantedWidth * this._progress) / 100; - this.barActive.lineStyle( - this.opts.strokeActiveWidth, - this.opts.strokeActive, - this.opts.strokeActiveAlpha - ); - this.barActive.beginFill( - this.opts.fillActive, - this.opts.fillActiveAlpha - ); + this.barActive.lineStyle(this.opts.strokeActiveWidth, this.opts.strokeActive, this.opts.strokeActiveAlpha); + this.barActive.beginFill(this.opts.fillActive, this.opts.fillActiveAlpha); if (barActiveWidth > 0) { if (this.radius > 1) { - this.barActive.drawRoundedRect( - 0, - 0, - barActiveWidth, - wantedHeight, - this.radius - ); + this.barActive.drawRoundedRect(0, 0, barActiveWidth, wantedHeight, this.radius); } else { this.barActive.drawRect(0, 0, barActiveWidth, wantedHeight); } @@ -674,12 +647,10 @@ if (this.opts.maxWidth) { this.headerStyle.wordWrap = true; - this.headerStyle.wordWrapWidth = - this.opts.maxWidth - 2 * this.opts.padding; + this.headerStyle.wordWrapWidth = this.opts.maxWidth - 2 * this.opts.padding; this.textStyle.wordWrap = true; - this.textStyle.wordWrapWidth = - this.opts.maxWidth - 2 * this.opts.padding; + this.textStyle.wordWrapWidth = this.opts.maxWidth - 2 * this.opts.padding; } this.alpha = 0; @@ -722,10 +693,7 @@ if (this.opts.header instanceof PIXI.Text) { header = this.opts.header; } else if (typeof this.opts.header === 'number') { - header = new PIXI.Text( - this.opts.header.toString(), - this.headerStyle - ); + header = new PIXI.Text(this.opts.header.toString(), this.headerStyle); } else { header = new PIXI.Text(this.opts.header, this.headerStyle); } @@ -752,10 +720,7 @@ if (typeof this.opts.content === 'string') { content = new PIXI.Text(this.opts.content, this.textStyle); } else if (typeof this.opts.content === 'number') { - content = new PIXI.Text( - this.opts.content.toString(), - this.textStyle - ); + content = new PIXI.Text(this.opts.content.toString(), this.textStyle); } else { content = this.opts.content; } @@ -826,31 +791,16 @@ * @return {AbstractPopup} A reference to the popup for chaining. */ draw() { - const square = - Math.round(this.wantedWidth) === Math.round(this.wantedHeight); + const square = Math.round(this.wantedWidth) === Math.round(this.wantedHeight); const diameter = Math.round(this.opts.radius * 2); this.clear(); - this.lineStyle( - this.opts.strokeWidth, - this.opts.stroke, - this.opts.strokeAlpha - ); + this.lineStyle(this.opts.strokeWidth, this.opts.stroke, this.opts.strokeAlpha); this.beginFill(this.opts.fill, this.opts.fillAlpha); if (square && diameter === this.wantedWidth) { - this.drawCircle( - this.wantedWidth / 2, - this.wantedHeight / 2, - this.opts.radius - ); + this.drawCircle(this.wantedWidth / 2, this.wantedHeight / 2, this.opts.radius); } else { - this.drawRoundedRect( - 0, - 0, - this.wantedWidth, - this.wantedHeight, - this.opts.radius - ); + this.drawRoundedRect(0, 0, this.wantedWidth, this.wantedHeight, this.opts.radius); } this.endFill(); @@ -1201,11 +1151,7 @@ content: this.opts.tooltip }); } else { - this.opts.tooltip = Object.assign( - {}, - { object: this }, - this.opts.tooltip - ); + this.opts.tooltip = Object.assign({}, { object: this }, this.opts.tooltip); this.tooltip = new Tooltip(this.opts.tooltip); } } @@ -1222,12 +1168,8 @@ layout() { super.layout(); - this.content.x = - this.width / 2 - this.content.width / 2 - this.opts.strokeWidth / 2; - this.content.y = - this.height / 2 - - this.content.height / 2 - - this.opts.strokeWidth / 2; + this.content.x = this.width / 2 - this.content.width / 2 - this.opts.strokeWidth / 2; + this.content.y = this.height / 2 - this.content.height / 2 - this.opts.strokeWidth / 2; return this } @@ -1273,8 +1215,7 @@ // be this is a bug or a security feature. Workaround: we introduce // a mouseDownSubstitute attribute that can be assigned to cloned // events after instantiation. - if (Reflect.has(event, 'mouseDownSubstitute')) - return event.mouseDownSubstitute + if (Reflect.has(event, 'mouseDownSubstitute')) return event.mouseDownSubstitute return event.buttons || event.which } @@ -1309,15 +1250,7 @@ for (let i = 0; i < targets.length; i++) { let t = targets[i]; let touchTarget = document.elementFromPoint(t.pageX, t.pageY); - let touch = new Touch( - undefined, - touchTarget, - t.identifier, - t.pageX, - t.pageY, - t.screenX, - t.screenY - ); + let touch = new Touch(undefined, touchTarget, t.identifier, t.pageX, t.pageY, t.screenX, t.screenY); touches.push(touch); } return new TouchList(...touches) @@ -1401,8 +1334,7 @@ let result = event.type; let selector = this.selector(event.target); result += ' selector: ' + selector; - if (event.target != document.querySelector(selector)) - console.log('Cannot resolve', selector); + if (event.target != document.querySelector(selector)) console.log('Cannot resolve', selector); let keys = ['layerX', 'layerY', 'pageX', 'pageY', 'clientX', 'clientY']; for (let key of keys) { try { @@ -1490,1671 +1422,7 @@ Events$1.simulated = []; Events$1.simulationRunning = false; - /* global PIXI TweenLite */ - - /** - * Callback for the button action. - * - * @callback actionCallback - * @param {object} event - The event object. - * @param {Button} button - A reference to the button (also this refers to the button). - */ - - /** - * Callback for the button beforeAction. - * - * @callback beforeActionCallback - * @param {object} event - The event object. - * @param {Button} button - A reference to the button (also this refers to the button). - */ - - /** - * Callback for the button afterAction. - * - * @callback afterActionCallback - * @param {object} event - The event object. - * @param {Button} button - A reference to the button (also this refers to the button). - */ - - /** - * Class that represents a PixiJS Button. - * - * @example - * // Create the button - * const button = new Button({ - * label: 'My Button', - * action: () => console.log('Button was clicked') - * }) - * - * // Add the button to a DisplayObject - * app.scene.addChild(button) - * - * @class - * @extends PIXI.Container - * @see {@link http://pixijs.download/dev/docs/PIXI.Container.html|PIXI.Container} - * @see {@link https://www.iwm-tuebingen.de/iwmbrowser/lib/pixi/button.html|DocTest} - */ - class Button extends PIXI.Container { - /** - * Creates an instance of a Button. - * - * @constructor - * @param {object} [opts] - An options object to specify to style and behaviour of the button. - * @param {number} [opts.id=auto generated] - The id of the button. - * @param {string} [opts.label] - The label of the button. - * @param {number} [opts.x=0] - The x position of the button. Can be also set after creation with button.x = 0. - * @param {number} [opts.y=0] - The y position of the button. Can be also set after creation with button.y = 0. - * @param {string|Theme} [opts.theme=dark] - The theme to use for this button. Possible values are dark, light, red - * or a Theme object. - * @param {number} [opts.minWidth=44] - The minimum width of the button. - * @param {number} [opts.minHeight=44] - The minimum height of the button. - * @param {number} [opts.padding=Theme.padding] - The inner spacing (distance from icon and/or label) to the border. - * @param {string|PIXI.DisplayObject} [opts.icon] - The icon of the button. Can be a predefined one, an URL or an PIXI.DisplayObject. - * @param {string|PIXI.DisplayObject} [opts.iconActive=icon] - The icon of the button when activated. Can be a predefined one, an URL or an PIXI.DisplayObject. - * @param {string} [opts.iconPosition=left] - The position of the icon in relation to the label. Can be left or right. - * @param {number} [opts.iconColor=Theme.iconColor] - The color of the icon (set by the tint property) as a hex value. - * @param {number} [opts.iconColorActive=Theme.iconColorActive] - The color of the icon when activated. - * @param {number} [opts.fill=Theme.fill] - The color of the button background as a hex value. - * @param {number} [opts.fillAlpha=Theme.fillAlpha] - The alpha value of the background. - * @param {number} [opts.fillActive=Theme.fillActive] - The color of the button background when activated. - * @param {number} [opts.fillActiveAlpha=Theme.fillActiveAlpha] - The alpha value of the background when activated. - * @param {number} [opts.stroke=Theme.stroke] - The color of the border as a hex value. - * @param {number} [opts.strokeWidth=Theme.strokeWidth] - The width of the border in pixel. - * @param {number} [opts.strokeAlpha=Theme.strokeAlpha] - The alpha value of the border. - * @param {number} [opts.strokeActive=Theme.strokeActive] - The color of the border when activated. - * @param {number} [opts.strokeActiveWidth=Theme.strokeActiveWidth] - The width of the border in pixel when activated. - * @param {number} [opts.strokeActiveAlpha=Theme.strokeActiveAlpha] - The alpha value of the border when activated. - * @param {object} [opts.textStyle=Theme.textStyle] - A textstyle object for the styling of the label. See PIXI.TextStyle - * for possible options. - * @param {number} [opts.textStyleActive=Theme.textStyleActive] - A textstyle object for the styling of the label when the - * button is activated. See PIXI.TextStyle for possible options. - * @param {string} [opts.style=default] - A shortcut for styling options. Possible values are default, link. - * @param {number} [opts.radius=Theme.radius] - The radius of the four corners of the button (which is a rounded rectangle). - * @param {boolean} [opts.disabled=false] - Is the button disabled? When disabled, the button has a lower alpha value - * and cannot be clicked (interactive is set to false). - * @param {boolean} [opts.active=false] - Is the button initially active? - * @param {actionCallback} [opts.action] - Executed when the button was triggered (by pointerup). - * @param {beforeActionCallback} [opts.beforeAction] - Executed before the main action is triggered. - * @param {afterActionCallback} [opts.afterAction] - Executed after the main action was triggered. - * @param {string} [opts.type=default] - The type of the button. Can be default or checkbox. When the type is - * checkbox, the active state is toggled automatically. - * @param {string} [opts.align=center] - The horizontal position of the label and the icon. Possible values are - * left, center and right. Only affects the style when the minWidth is bigger than the width of the icon and label. - * @param {string} [opts.verticalAlign=middle] - The vertical position of the label and the icon. Possible values are - * top, middle and button. Only affects the style when the minHeight is bigger than the height of the icon and label. - * @param {string|object} [opts.tooltip] - A string for the label of the tooltip or an object to configure the tooltip - * to display. - * @param {string|object} [opts.badge] - A string for the label of the badge or an object to configure the badge to display. - * If the parameter is an object, all badge options can be set plus the following: - * @param {string} [opts.badge.align=right] - The horizontal alignment of the badge. Possible values: left, center, right - * @param {string} [opts.badge.verticalAlign=top] - The vertical alignment of the badge. Possible values: top, middle, bottom - * @param {number} [opts.badge.offsetLeft=0] - The horizontal shift of the badge. - * @param {number} [opts.badge.offsetTop=0] - The vertical shift of the badge. - * @param {boolean} [opts.visible=true] - Is the button initially visible (property visible)? - */ - constructor(opts = {}) { - super(); - - const theme = Theme.fromString(opts.theme); - this.theme = theme; - - this.opts = Object.assign( - {}, - { - id: PIXI.utils.uid(), - label: null, - x: 0, - y: 0, - minWidth: 44, - minHeight: 44, - padding: theme.padding, - icon: undefined, - iconActive: undefined, - iconPosition: 'left', - iconColor: theme.iconColor, - iconColorActive: theme.iconColorActive, - fill: theme.fill, - fillAlpha: theme.fillAlpha, - fillActive: theme.fillActive, - fillActiveAlpha: theme.fillActiveAlpha, - stroke: theme.stroke, - strokeWidth: theme.strokeWidth, - strokeAlpha: theme.strokeAlpha, - strokeActive: theme.strokeActive, - strokeActiveWidth: theme.strokeActiveWidth, - strokeActiveAlpha: theme.strokeActiveAlpha, - textStyle: theme.textStyle, - textStyleActive: theme.textStyleActive, - style: 'default', - radius: theme.radius, - disabled: false, - active: false, - action: null, - beforeAction: null, - afterAction: null, - type: 'default', - align: 'center', - verticalAlign: 'middle', - tooltip: null, - badge: null, - visible: true - }, - opts - ); - - this.id = this.opts.id; - - if ( - typeof this.opts.icon === 'undefined' && - typeof this.opts.iconActive !== 'undefined' - ) { - this.opts.icon = this.opts.iconActive; - } else if ( - typeof this.opts.icon !== 'undefined' && - typeof this.opts.iconActive === 'undefined' - ) { - this.opts.iconActive = this.opts.icon; - } - - if (this.opts.style === 'link') { - Object.assign(this.opts, { - strokeAlpha: 0, - strokeActiveAlpha: 0, - fillAlpha: 0, - fillActiveAlpha: 0 - }); - } - - this._active = null; - this._disabled = null; - - this.iconInactive = null; - this.iconActive = null; - this.text = null; - - this.button = null; - this.content = null; - - this.tooltip = null; - this.badge = null; - - this.visible = this.opts.visible; - - // setup - //----------------- - this.setup(); - } - - /** - * Captures an event to inform InteractionMapper about processed events. - * - * @param {event|PIXI.InteractionEvent} event - The PIXI event to capture. - */ - capture(event) { - Events$1.capturedBy(event.data.originalEvent, this); - } - - /** - * Creates children and instantiates everything. - * - * @private - * @return {Button} A reference to the button for chaining. - */ - setup() { - // Button - //----------------- - let button = new PIXI.Graphics(); - this.button = button; - this.addChild(button); - - // Content - //----------------- - let content = new PIXI.Container(); - this.content = content; - this.addChild(content); - - // Text - //----------------- - if (this.opts.label) { - this.text = new PIXI.Text(this.opts.label, this.opts.textStyle); - } - - // Icon - //----------------- - if (this.opts.icon) { - this.iconInactive = this.loadIcon( - this.opts.icon, - this.opts.iconColor - ); - } - - if (this.opts.iconActive) { - this.iconActive = this.loadIcon( - this.opts.iconActive, - this.opts.iconColorActive - ); - } - - // interaction - //----------------- - this.button.on('pointerover', e => { - this.capture(e); - TweenLite.to([this.button, this.content], this.theme.fast, { - alpha: 0.83, - overwrite: 'none' - }); - }); - - this.button.on('pointermove', e => { - this.capture(e); - }); - - this.button.on('pointerout', e => { - this.capture(e); - TweenLite.to([this.button, this.content], this.theme.fast, { - alpha: 1, - overwrite: 'none' - }); - }); - - // eslint-disable-next-line no-unused-vars - this.button.on('pointerdown', e => { - //this.capture(e) - TweenLite.to([this.button, this.content], this.theme.fast, { - alpha: 0.7, - overwrite: 'none' - }); - }); - - this.button.on('pointerup', e => { - this.capture(e); - if (this.opts.beforeAction) { - this.opts.beforeAction.call(this, e, this); - } - - if (this.opts.action) { - this.opts.action.call(this, e, this); - } - - TweenLite.to([this.button, this.content], this.theme.fast, { - alpha: 0.83, - overwrite: 'none' - }); - - if (this.opts.type === 'checkbox') { - this.active = !this.active; - } - - if (this.opts.afterAction) { - this.opts.afterAction.call(this, e, this); - } - }); - - // disabled - //----------------- - this.disabled = this.opts.disabled; - - // active - //----------------- - this.active = this.opts.active; // calls .layout() - - // tooltip - //----------------- - if (this.opts.tooltip) { - if (typeof this.opts.tooltip === 'string') { - this.tooltip = new Tooltip({ - object: this, - content: this.opts.tooltip - }); - } else { - this.opts.tooltip = Object.assign( - {}, - { object: this }, - this.opts.tooltip - ); - this.tooltip = new Tooltip(this.opts.tooltip); - } - } - - // badge - //----------------- - if (this.opts.badge) { - let opts = Object.assign( - {}, - { - align: 'right', - verticalAlign: 'top', - offsetLeft: 0, - offsetTop: 0 - } - ); - if (typeof this.opts.badge === 'string') { - opts = Object.assign(opts, { content: this.opts.badge }); - } else { - opts = Object.assign(opts, this.opts.badge); - } - - const badge = new Badge(opts); - - switch (opts.align) { - case 'left': - badge.x = this.x - badge.width / 2 + opts.offsetLeft; - break - case 'center': - badge.x = - this.x + - this.width / 2 - - badge.width / 2 + - opts.offsetLeft; - break - case 'right': - badge.x = - this.x + this.width - badge.width / 2 + opts.offsetLeft; - } - - switch (opts.verticalAlign) { - case 'top': - badge.y = this.y - badge.height / 2 + opts.offsetTop; - break - case 'middle': - badge.y = - this.y + - this.height / 2 - - badge.height / 2 + - opts.offsetTop; - break - case 'bottom': - badge.y = - this.y + this.height - badge.height / 2 + opts.offsetTop; - } - - this.addChild(badge); - - this.badge = badge; - } - - // set position - //----------------- - this.position.set(this.opts.x, this.opts.y); - - return this - } - - /** - * Should be called to refresh the layout of the button. Can be used after resizing. - * - * @return {Button} A reference to the button for chaining. - */ - layout() { - // Clear content - //----------------- - this.removeChild(this.content); - this.content = new PIXI.Container(); - this.addChild(this.content); - - // Set the icon - //----------------- - let icon = null; - - if (!this.active && this.iconInactive) { - icon = this.iconInactive; - } else if (this.active && this.iconActive) { - icon = this.iconActive; - } - - // Set the text - //----------------- - if (this.text) { - this.text.position.set(0, 0); - } - - // Width and Height - //----------------- - let width = 0; - if (icon && this.text) { - width = icon.width + this.text.width + 3 * this.opts.padding; - } else if (icon) { - width = icon.width + 2 * this.opts.padding; - } else if (this.text) { - width = this.text.width + 2 * this.opts.padding; - } - - if (width < this.opts.minWidth) { - width = this.opts.minWidth; - } - - let height = 0; - if (icon) { - height = icon.height + 2 * this.opts.padding; - } else if (this.text) { - height = this.text.height + 2 * this.opts.padding; - } - - if (height < this.opts.minHeight) { - height = this.opts.minHeight; - } - - this._width = width; - this._height = height; - - // Position icon and text - //----------------- - if (icon && this.text) { - if (this.opts.iconPosition === 'right') { - icon.x = this.text.width + this.opts.padding; - } else { - this.text.x = icon.width + this.opts.padding; - } - this.content.addChild(icon, this.text); - } else if (icon) { - this.content.addChild(icon); - } else if (this.text) { - this.content.addChild(this.text); - } - - this.layoutInnerContent(); - this.layoutContent(); - - this.icon = icon; - - // draw - //----------------- - this.draw(); - - return this - } - - /** - * Calculates the positions of the content children (icon and/or text). - * - * @private - * @return {Button} A reference to the button for chaining. - */ - layoutInnerContent() { - for (let child of this.content.children) { - switch (this.opts.verticalAlign) { - case 'top': - child.y = 0; - break - case 'middle': - child.y = this.content.height / 2 - child.height / 2; - break - case 'bottom': - child.y = this.content.height - child.height; - break - } - } - - return this - } - - /** - * Sets the horizontal and vertical position of the content. - * Uses the option keys "align" and "verticalAlign". - * - * @private - * @return {Button} A reference to the button for chaining. - */ - layoutContent() { - switch (this.opts.align) { - case 'left': - this.content.x = this.opts.padding; - break - case 'center': - this.content.x = (this._width - this.content.width) / 2; - break - case 'right': - this.content.x = - this._width - this.opts.padding - this.content.width; - break - } - - switch (this.opts.verticalAlign) { - case 'top': - this.content.y = this.opts.padding; - break - case 'middle': - this.content.y = (this._height - this.content.height) / 2; - break - case 'bottom': - this.content.y = - this._height - this.opts.padding - this.content.height; - break - } - - return this - } - - /** - * Draws the canvas. - * - * @private - * @return {Button} A reference to the button for chaining. - */ - draw() { - this.button.clear(); - if (this.active) { - this.button.lineStyle( - this.opts.strokeActiveWidth, - this.opts.strokeActive, - this.opts.strokeActiveAlpha - ); - this.button.beginFill( - this.opts.fillActive, - this.opts.fillActiveAlpha - ); - } else { - this.button.lineStyle( - this.opts.strokeWidth, - this.opts.stroke, - this.opts.strokeAlpha - ); - this.button.beginFill(this.opts.fill, this.opts.fillAlpha); - } - this.button.drawRoundedRect( - 0, - 0, - this._width, - this._height, - this.opts.radius - ); - this.button.endFill(); - - return this - } - - /** - * Gets or sets the active state. - * - * @member {boolean} - */ - get active() { - return this._active - } - set active(value) { - this._active = value; - - if (this._active) { - if (this.text) { - this.text.style = this.opts.textStyleActive; - } - } else { - if (this.text) { - this.text.style = this.opts.textStyle; - } - } - - this.layout(); - } - - /** - * Gets or sets the disabled state. When disabled, the button cannot be clicked. - * - * @member {boolean} - */ - get disabled() { - return this._disabled - } - set disabled(value) { - this._disabled = value; - - if (this._disabled) { - this.button.interactive = false; - this.button.buttonMode = false; - this.button.alpha = 0.5; - if (this.icon) { - this.icon.alpha = 0.5; - } - if (this.text) { - this.text.alpha = 0.5; - } - } else { - this.button.interactive = true; - this.button.buttonMode = true; - this.button.alpha = 1; - if (this.icon) { - this.icon.alpha = 1; - } - if (this.text) { - this.text.alpha = 1; - } - } - } - - /** - * Shows the button (sets his alpha values to 1). - * - * @return {Button} A reference to the button for chaining. - */ - show() { - this.opts.strokeAlpha = 1; - this.opts.strokeActiveAlpha = 1; - this.opts.fillAlpha = 1; - this.opts.fillActiveAlpha = 1; - - this.layout(); - - return this - } - - /** - * Hides the button (sets his alpha values to 0). - * - * @return {Button} A reference to the button for chaining. - */ - hide() { - this.opts.strokeAlpha = 0; - this.opts.strokeActiveAlpha = 0; - this.opts.fillAlpha = 0; - this.opts.fillActiveAlpha = 0; - - this.layout(); - - return this - } - - /** - * Loads an icon - * - * @private - * @param {string|PIXI.DisplayObject} icon - The icon to load. - * @param {number} color - The color of the icon (if not an PIXI.DisplayObject). - * @return {PIXI.DisplayObject} Return the icon as an PIXI.DisplayObject. - */ - loadIcon(icon, color) { - let displayObject = null; - - if (icon instanceof PIXI.DisplayObject) { - displayObject = icon; - } else { - let size = 17; - if (this.text) { - size = this.text.height; - } else if (this.opts.minHeight) { - size = this.opts.minHeight - 2 * this.opts.padding; - } - - const url = Button.iconIsUrl(icon) - ? icon - : `../../assets/icons/${icon}.png`; - const iconTexture = PIXI.Texture.fromImage(url, true); - - const sprite = new PIXI.Sprite(iconTexture); - sprite.tint = color; - sprite.width = size; - sprite.height = size; - - displayObject = sprite; - } - - return displayObject - } - - /** - * Tests if an icon string is an url. - * - * @private - * @static - * @param {string} url - The url to test. - * @return {boolean} true if the url is an url to an image. - */ - static iconIsUrl(url) { - return /\.(png|svg|gif|jpg|jpeg|tif|tiff)$/i.test(url) - } - - /** - * Gets or sets the color of the current icon (no matter how the status is). Changing the color, changes - * the tint property of the icon sprite. - * - * @member {number} - */ - get iconColor() { - return this.icon ? this.icon.tint : null - } - set iconColor(value) { - if (this.icon) { - this.icon.tint = value; - } - } - } - - /** - * Class that represents a PixiJS ButtonGroup. - * - * @example - * // Create the button group - * const buttonGroup = new ButtonGroup({ - * buttons: [ - * {label: 'Button 1', action: event => console.log(event)}, - * {label: 'Button 2', action: event => console.log(event)}, - * {label: 'Button 3', action: event => console.log(event)} - * ], - * minWidth: 100 - * }) - * - * // Add the button group to a DisplayObject - * app.scene.addChild(buttonGroup) - * - * @class - * @extends PIXI.Graphics - * @see {@link http://pixijs.download/dev/docs/PIXI.Graphics.html|PIXI.Graphics} - * @see {@link https://www.iwm-tuebingen.de/iwmbrowser/lib/pixi/buttongroup.html|DocTest} - */ - class ButtonGroup extends PIXI.Graphics { - /** - * Creates an instance of a ButtonGroup. - * - * @constructor - * @param {object} [opts] - An options object to specify to style and behaviour of the button group. - * @param {number} [opts.id=auto generated] - The id of the button group. - * @param {number} [opts.x=0] - The x position of the button group. Can be also set after creation with buttonGroup.x = 0. - * @param {number} [opts.y=0] - The y position of the button group. Can be also set after creation with buttonGroup.y = 0. - * @param {object[]} [opts.buttons=[]] - An array of the buttons of the button group. One item of the array (one object) - * can have exactly the same properties as an Button object when instantiating a Button. If a property of the button group - * conflicts with a property of a button object, the value from the button object will be used. - * @param {string|Theme=} [opts.theme=dark] - The theme to use for this button group. Possible values are dark, light, red - * or a Theme object. - * @param {number} [opts.minWidth=44] - Button: The minimum width of one button. - * @param {number} [opts.minHeight=44] - Button: The minimum height of one button. - * @param {number} [opts.padding=Theme.padding] - Button: The inner spacing (distance from icon and/or label) the the border. - * @param {number} [opts.margin=Theme.margin] - The outer spacing (distance from one button to the previous/next button). - * @param {string} [opts.iconPosition=left] - Button: The position of the icon in relation to the label. Can be left or right. - * @param {number} [opts.iconColor=Theme.iconColor] - Button: The color of the icon (set by the tint property) as a hex value. - * @param {number} [opts.iconColorActive=Theme.iconColorActive] - Button: The color of the icon when activated. - * @param {number} [opts.fill=Theme.fill] - Button: The color of the button background as a hex value. - * @param {number} [opts.fillAlpha=Theme.fillAlpha] - Button: The alpha value of the background. - * @param {number} [opts.fillActive=Theme.fillActive] - Button: The color of the button background when activated. - * @param {number} [opts.fillActiveAlpha=Theme.fillActiveAlpha] - Button: The alpha value of the background when activated. - * @param {number} [opts.stroke=Theme.stroke] - Button: The color of the border as a hex value. - * @param {number} [opts.strokeWidth=Theme.strokeWidth] - Button: The width of the border in pixel. - * @param {number} [opts.strokeAlpha=Theme.strokeAlpha] - Button: The alpha value of the border. - * @param {number} [opts.strokeActive=Theme.strokeActive] - Button: The color of the border when activated. - * @param {number} [opts.strokeActiveWidth=Theme.strokeActiveWidth] - Button: The width of the border in pixel when activated. - * @param {number} [opts.strokeActiveAlpha=Theme.strokeActiveAlpha] - Button: The alpha value of the border when activated. - * @param {object} [opts.textStyle=Theme.textStyle] - Button: A textstyle object for the styling of the label. See PIXI.TextStyle - * for possible options. - * @param {number} [opts.textStyleActive=Theme.textStyleActive] - Button: A textstyle object for the styling of the label when the - * button is activated. See PIXI.TextStyle for possible options. - * @param {string} [opts.style=default] - A shortcut for styling options. Possible values are default, link. - * @param {number} [opts.radius=Theme.radius] - Button: The radius of the four corners of the button (which is a rounded rectangle). - * @param {boolean} [opts.disabled=false] - Is the button group disabled? When disabled, the button group has a lower alpha value - * and cannot be clicked (interactive of every button is set to false). - * @param {string} [opts.type=default] - The type of the button group. Can be default, checkbox or radio. When the type is - * checkbox, the active state is toggled for each button automatically. When the type is radio, only one button can - * be activated at the same time. - * @param {string} [opts.orientation=horizontal] - The orientation of the button group. Can be horizontal or vertical. - * @param {string} [opts.align=center] - Button: The horizontal position of the label and the icon. Possible values are - * left, center and right. Only affects the style when the minWidth is bigger than the width of the icon and label. - * @param {string} [opts.verticalAlign=middle] - Button: The vertical position of the label and the icon. Possible values are - * top, middle and bottom. Only affects the style when the minHeight is bigger than the height of the icon and label. - * @param {boolean} [opts.visible=true] - Is the button group initially visible (property visible)? - */ - constructor(opts = {}) { - super(); - - const theme = Theme.fromString(opts.theme); - this.theme = theme; - - this.opts = Object.assign( - {}, - { - id: PIXI.utils.uid(), - x: 0, - y: 0, - buttons: [], - minWidth: 44, - minHeight: 44, - padding: theme.padding, - margin: theme.margin, - iconPosition: 'left', // left, right - iconColor: theme.iconColor, - iconColorActive: theme.iconColorActive, - fill: theme.fill, - fillAlpha: theme.fillAlpha, - fillActive: theme.fillActive, - fillActiveAlpha: theme.fillActiveAlpha, - stroke: theme.stroke, - strokeWidth: theme.strokeWidth, - strokeAlpha: theme.strokeAlpha, - strokeActive: theme.strokeActive, - strokeActiveWidth: theme.strokeActiveWidth, - strokeActiveAlpha: theme.strokeActiveAlpha, - textStyle: theme.textStyle, - textStyleActive: theme.textStyleActive, - style: 'default', - radius: theme.radius, - disabled: null, - type: 'default', // default, checkbox, radio - orientation: 'horizontal', - align: 'center', // left, center, right - verticalAlign: 'middle', // top, middle, bottom - visible: true - }, - opts - ); - - this.buttons = []; - - this._disabled = null; - - this.visible = this.opts.visible; - - // setup - //----------------- - this.setup(); - - // layout - //----------------- - this.layout(); - } - - /** - * Creates children and instantiates everything. - * - * @private - * @return {ButtonGroup} A reference to the button group for chaining. - */ - setup() { - // Buttons - //----------------- - let position = 0; - - for (let it of this.opts.buttons) { - delete it.x; - delete it.y; - - if (this.opts.orientation === 'horizontal') { - it.x = position; - } else { - it.y = position; - } - - it.theme = it.theme || this.opts.theme; - it.minWidth = it.minWidth || this.opts.minWidth; - it.minHeight = it.minHeight || this.opts.minHeight; - it.padding = it.padding || this.opts.padding; - it.iconPosition = it.iconPosition || this.opts.iconPosition; - it.iconColor = it.iconColor || this.opts.iconColor; - it.iconColorActive = it.iconColorActive || this.opts.iconColorActive; - it.fill = it.fill || this.opts.fill; - it.fillAlpha = it.fillAlpha || this.opts.fillAlpha; - it.fillActive = it.fillActive || this.opts.fillActive; - it.fillActiveAlpha = it.fillActiveAlpha || this.opts.fillActiveAlpha; - it.stroke = it.stroke || this.opts.stroke; - it.strokeWidth = - it.strokeWidth != null ? it.strokeWidth : this.opts.strokeWidth; - it.strokeAlpha = - it.strokeAlpha != null ? it.strokeAlpha : this.opts.strokeAlpha; - it.strokeActive = it.strokeActive || this.opts.strokeActive; - it.strokeActiveWidth = - it.strokeActiveWidth != null - ? it.strokeActiveWidth - : this.opts.strokeActiveWidth; - it.strokeActiveAlpha = - it.strokeActiveAlpha != null - ? it.strokeActiveAlpha - : this.opts.strokeActiveAlpha; - it.textStyle = it.textStyle || this.opts.textStyle; - it.textStyleActive = it.textStyleActive || this.opts.textStyleActive; - it.style = it.style || this.opts.style; - it.radius = it.radius != null ? it.radius : this.opts.radius; - if (!it.type) { - switch (this.opts.type) { - case 'checkbox': - it.type = this.opts.type; - break - default: - it.type = 'default'; - break - } - } - //it.type = it.type || this.opts.type || 'default' - it.align = it.align || this.opts.align; - it.verticalAlign = it.verticalAlign || this.opts.verticalAlign; - it.afterAction = (event, button) => { - if ( - this.opts.type === 'radio' && - button.opts.type === 'default' - ) { - this.buttons.forEach(it => { - if (it.opts.type === 'default') { - it.active = false; - } - }); - - if (button.opts.type === 'default') { - button.active = true; - } - } - }; - - if (it.tooltip) { - if (typeof it.tooltip === 'string') { - it.tooltip = { content: it.tooltip, container: this }; - } else { - it.tooltip = Object.assign( - {}, - { container: this }, - it.tooltip - ); - } - } - - let button = new Button(it); - - this.addChild(button); - this.buttons.push(button); - - position += - (this.opts.orientation === 'horizontal' - ? button.width - : button.height) + this.opts.margin; - } - - if (this.opts.orientation === 'vertical') { - const maxWidth = this.getMaxButtonWidth(); - - this.buttons.forEach(it => { - it.opts.minWidth = maxWidth; - it.layout(); - }); - } - - // disabled - //----------------- - if (this.opts.disabled != null) { - this.disabled = this.opts.disabled; - } - - return this - } - - /** - * Should be called to refresh the layout of the button group. Can be used after resizing. - * - * @return {ButtonGroup} A reference to the button group for chaining. - */ - layout() { - // set position - //----------------- - this.position.set(this.opts.x, this.opts.y); - - // draw - //----------------- - this.draw(); - - return this - } - - /** - * Draws the canvas. - * - * @private - * @return {ButtonGroup} A reference to the button group for chaining. - */ - draw() { - if (this.opts.margin === 0) { - this.buttons.forEach(it => it.hide()); - - this.clear(); - this.lineStyle( - this.opts.strokeWidth, - this.opts.stroke, - this.opts.strokeAlpha - ); - this.beginFill(this.opts.fill, this.opts.fillAlpha); - this.drawRoundedRect( - 0, - 0, - this.width, - this.height, - this.opts.radius - ); - - // Draw borders - this.lineStyle( - this.opts.strokeWidth, - this.opts.stroke, - this.opts.strokeAlpha / 2 - ); - - this.buttons.forEach((it, i) => { - if (i > 0) { - this.moveTo(it.x, it.y); - - if (this.opts.orientation === 'horizontal') { - this.lineTo(it.x, it.height); - } else { - this.lineTo(it.width, it.y); - } - } - }); - - this.endFill(); - } - - return this - } - - /** - * Gets or sets the disabled state. When disabled, no button of the button group can be clicked. - * - * @member {boolean} - */ - get disabled() { - return this._disabled - } - - set disabled(value) { - this._disabled = value; - - this.buttons.forEach(it => (it.disabled = value)); - } - - /** - * Searches all buttons of the button group and returns the maximum width of one button. - * - * @private - * @return {number} The maximum with of a button of the button group. - */ - getMaxButtonWidth() { - let widths = this.buttons.map(it => it.width); - - return Math.max(...widths) - } - - /** - * Shows the button group (sets his alpha value to 1). - * - * @return {ButtonGroup} A reference to the button group for chaining. - */ - show() { - this.alpha = 1; - - return this - } - - /** - * Hides the button group (sets his alpha value to 0). - * - * @return {ButtonGroup} A reference to the button group for chaining. - */ - hide() { - this.alpha = 0; - - return this - } - } - - /** - * Class that represents a PixiJS InteractivePopup. - * The class is used for various other Popup-like classes - * like Popup, Message... - * - * @class - * @abstract - * @extends AbstractPopup - */ - class InteractivePopup extends AbstractPopup { - /** - * Creates an instance of an InteractivePopup (only for internal use). - * - * @constructor - * @param {object} [opts] - An options object to specify to style and behaviour of the popup. - * @param {boolean} [opts.closeOnPopup=false] - Should the popup be closed when the user clicks on the popup? - * @param {boolean} [opts.closeButton=true] - Should a close button be displayed on the upper right corner? - * @param {object} [opts.button] - A Button object to be display on the lower right corner. - * @param {object} [opts.buttonGroup] - A ButtonGroup object to be displayed on the lower right corner. - */ - constructor(opts = {}) { - opts = Object.assign( - {}, - { - closeOnPopup: false, - closeButton: true, - button: null, - buttonGroup: null - }, - opts - ); - - super(opts); - - this._closeButton = null; - this._buttons = null; - - // padding - this.smallPadding = this.opts.padding / 2; - - // setup - //----------------- - this.setup(); - - // layout - //----------------- - this.layout(); - } - - /** - * Creates the framework and instantiates everything. - * - * @private - * @return {AbstractPopup} A reference to the popup for chaining. - */ - setup() { - super.setup(); - - // interaction - //----------------- - this.on('pointerup', e => { - if (this.opts.closeOnPopup) { - this.hide(); - } else { - e.stopPropagation(); - } - }); - - // closeButton - //----------------- - if (this.opts.closeButton) { - let closeButton = PIXI.Sprite.fromImage( - '../../assets/icons/close.png', - true - ); - closeButton.width = this.headerStyle.fontSize; - closeButton.height = closeButton.width; - closeButton.tint = this.theme.color2; - // This is needed, because the closeButton belongs to the content. The popup must resize with the closeButton. - if (this._header) { - closeButton.x = this._header.width + this.innerPadding; - } else if (this._content) { - closeButton.x = this._content.width + this.innerPadding; - } - - closeButton.interactive = true; - closeButton.buttonMode = true; - closeButton.on('pointerdown', e => { - this.hide(); - }); - - this._closeButton = closeButton; - this.addChild(closeButton); - - // maxWidth is set and a closeButton should be displayed - //----------------- - if (this.opts.maxWidth) { - const wordWrapWidth = - this.opts.maxWidth - - 2 * this.opts.padding - - this.smallPadding - - this._closeButton.width; - if (this._header) { - this.headerStyle.wordWrapWidth = wordWrapWidth; - } else if (this._content) { - this.textStyle.wordWrapWidth = wordWrapWidth; - } - } - } - - // buttons - //----------------- - if (this.opts.button || this.opts.buttonGroup) { - if (this.opts.button) { - this._buttons = new Button( - Object.assign( - { textStyle: this.theme.textStyleSmall }, - this.opts.button - ) - ); - } else { - this._buttons = new ButtonGroup( - Object.assign( - { textStyle: this.theme.textStyleSmall }, - this.opts.buttonGroup - ) - ); - } - this.addChild(this._buttons); - - this._buttons.y = this.innerPadding + this.sy; - } - - return this - } - - /** - * Should be called to refresh the layout of the popup. Can be used after resizing. - * - * @return {AbstractPopup} A reference to the popup for chaining. - */ - layout() { - super.layout(); - - // closeButton - //----------------- - if (this.opts.closeButton) { - this._closeButton.x = - this.wantedWidth - this.smallPadding - this._closeButton.width; - this._closeButton.y = this.smallPadding; - } - - // buttons - //----------------- - if (this._buttons) { - this._buttons.x = - this.wantedWidth - this.opts.padding - this._buttons.width; - this._buttons.y = - this.wantedHeight - this.opts.padding - this._buttons.height; - } - - return this - } - - /** - * Calculates the size of the children of the AbstractPopup. - * Cannot use getBounds() because it is not updated when children - * are removed. - * - * @private - * @override - * @returns {object} An JavaScript object width the keys width and height. - */ - getInnerSize() { - let size = super.getInnerSize(); - - if (this._closeButton) { - size.width += this.smallPadding + this._closeButton.width; - } - - if (this._buttons) { - size.width = Math.max( - size.width, - this._buttons.x + this._buttons.width - ); - size.height += this.innerPadding + this._buttons.height; - } - - return size - } - } - - /** - * Class that represents a PixiJS Popup. - * - * @example - * // Create the popup - * const popup = new Popup({ - * header: 'Goethe', - * content: 'Man kann die Erfahrung nicht früh genug machen, wie entbehrlich man in der Welt ist.' - * }) - * - * // Add the popup to a DisplayObject - * app.scene.addChild(popup) - * - * @class - * @extends InteractivePopup - * @see {@link https://www.iwm-tuebingen.de/iwmbrowser/lib/pixi/popup.html|DocTest} - */ - class Popup extends InteractivePopup { - /** - * Creates an instance of a Popup. - * - * @constructor - * @param {object} [opts] - An options object to specify to style and behaviour of the popup. - * @param {boolean} [opts.closeButton=false] - Should a close button be displayed on the upper right corner? - * @param {number} [opts.minWidth=0] - The minimum width of the popup. - * @param {number} [opts.minHeight=0] - The minimum height of the popup. - */ - constructor(opts = {}) { - opts = Object.assign( - {}, - { - closeButton: false, - minWidth: 0, - minHeight: 0 - }, - opts - ); - - super(opts); - } - } - - /** - * Class that represents a PixiJS Modal. - * - * @example - * // Create the button and the modal when clicked - * const button = new Button({ - * label: 'Show Modal', - * action: e => { - * const modal = new Modal({ - * app: app, - * header: 'This is the header', - * content: 'This is the text.' - * }) - * app.scene.addChild(modal) - * } - * }) - * - * // Add the button to a DisplayObject - * app.scene.addChild(button) - * - * @class - * @extends PIXI.Container - * @extends InteractivePopup - * @see {@link http://pixijs.download/dev/docs/PIXI.Container.html|PIXI.Container} - * @see {@link https://www.iwm-tuebingen.de/iwmbrowser/lib/pixi/modal.html|DocTest} - */ - class Modal extends PIXI.Container { - /** - * Creates an instance of a Modal. - * - * @constructor - * @param {object} [opts] - An options object to specify to style and behaviour of the modal. - * @param {number} [opts.id=auto generated] - The id of the modal. - * @param {PIXIApp} [opts.app=window.app] - The app where the modal belongs to. - * @param {number} [opts.backgroundFill=Theme.background] - The color of the background. - * @param {number} [opts.backgroundFillAlpha=0.6] - The opacity of the background. - * @param {boolean} [opts.closeOnBackground=true] - Should the modal be closed when the user clicks the - * background? - * @param {boolean} [opts.visible=true] - Is the modal initially visible (property visible)? - */ - constructor(opts = {}) { - super(); - - const theme = Theme.fromString(opts.theme); - this.theme = theme; - - this.opts = Object.assign( - {}, - { - id: PIXI.utils.uid(), - app: window.app, - backgroundFill: theme.background, - backgroundFillAlpha: 0.6, - closeOnBackground: true, - visible: true - }, - opts - ); - - this.id = this.opts.id; - - this.background = null; - this.popup = null; - - this.alpha = 0; - this.visible = this.opts.visible; - - // setup - //----------------- - this.setup(); - - // layout - //----------------- - this.layout(); - } - - /** - * Creates children and instantiates everything. - * - * @private - * @return {Modal} A reference to the modal for chaining. - */ - setup() { - // interaction - //----------------- - this.interactive = true; - this.on('added', e => { - if (this.visible) { - this.show(); - } - }); - - // background - //----------------- - let background = new PIXI.Graphics(); - this.background = background; - this.addChild(this.background); - - if (this.opts.closeOnBackground) { - background.interactive = true; - background.on('pointerup', e => { - this.hide(); - }); - } - - // popup - //----------------- - const popupOpts = Object.assign({}, this.opts, { - visible: true, - onHidden: () => { - this.hide(); - } - }); - let popup = new InteractivePopup(popupOpts); - this.popup = popup; - this.addChild(popup); - popup.show(); - - return this - } - - /** - * Should be called to refresh the layout of the modal. Can be used after resizing. - * - * @return {Modal} A reference to the modal for chaining. - */ - layout() { - const width = this.opts.app.size.width; - const height = this.opts.app.size.height; - - // background - //----------------- - this.background.clear(); - this.background.beginFill( - this.opts.backgroundFill, - this.opts.backgroundFillAlpha - ); - this.background.drawRect(0, 0, width, height); - this.background.endFill(); - - // position - this.popup.x = width / 2 - this.popup.width / 2; - this.popup.y = height / 2 - this.popup.height / 2; - - return this - } - - /** - * Shows the modal (sets his alpha values to 1). - * - * @return {Modal} A reference to the modal for chaining. - */ - show() { - TweenLite.to(this, this.theme.fast, { - alpha: 1, - onStart: () => (this.visible = true) - }); - - return this - } - - /** - * Hides the modal (sets his alpha values to 0). - * - * @return {Modal} A reference to the modal for chaining. - */ - hide() { - TweenLite.to(this, this.theme.fast, { - alpha: 0, - onComplete: () => (this.visible = false) - }); - - return this - } - - /** - * Sets or gets the header. The getter always returns a PIXI.Text object. The setter can receive - * a string or a PIXI.Text object. - * - * @member {string|PIXI.Text} - */ - get header() { - return this.popup.header - } - set header(value) { - this.opts.header = value; - this.background.destroy(); - this.popup.destroy(); - this.setup().layout(); - } - - /** - * Sets or gets the content. The getter always returns an PIXI.DisplayObject. The setter can receive - * a string or a PIXI.DisplayObject. - * - * @member {string|PIXI.DisplayObject} - */ - get content() { - return this.popup.content - } - set content(value) { - this.opts.content = value; - this.background.destroy(); - this.popup.destroy(); - this.setup().layout(); - } - } - - /** - * Class that represents a Message. A message pops up and disappears after a specific amount of time. - * - * @example - * // Create the PixiJS App - * const app = new PIXIApp({ - * view: canvas, - * width: 900, - * height: 250 - * }).setup().run() - * - * // Create a button - * let button = new Button({ - * label: 'Click me', - * action: e => { - * const message = new Message({ - * app: app, - * header: 'Header', - * content: 'Text.' - * }) - * app.scene.addChild(message) - * } - * }) - * - * // Add the button to the scene - * app.scene.addChild(button) - * - * @class - * @extends InteractivePopup - * @see {@link https://www.iwm-tuebingen.de/iwmbrowser/lib/pixi/message.html|DocTest} - */ - class Message extends InteractivePopup { - /** - * Creates an instance of a Message. - * - * @constructor - * @param {object} [opts] - An options object to specify to style and behaviour of the message. - * @param {PIXIApp} [opts.app=window.app] - The PIXIApp where this message belongs to. - * @param {boolean} [opts.closeButton=false] - Should a close button be displayed in the upper right corner? - * @param {number} [opts.minWidth=280] - The minimum width of the message box. Automatically expands with the content. - * @param {number} [opts.minHeight=100] - The minimum height of the message box. Automatically expands with the content. - * @param {number} [opts.margin=Theme.margin] - The outer spacing of the message box. - * @param {string} [opts.align=right] - The horizontal position of the message box relative to the app. Possible - * values are left, center, right. - * @param {string} [opts.verticalAlign=top] - The vertical position of the message box relative to the app. Possible - * values are top, middle, bottom. - * @param {number} [opts.duration=5] - The duration in seconds when the message box should disappear. - * @param {boolean} [opts.autoClose=true] - Should the message box be closed automatically? - * @param {number} [opts.closeDuration=Theme.fast] - The duration in seconds of the closing of the message box. - */ - constructor(opts = {}) { - const theme = Theme.fromString(opts.theme); - - opts = Object.assign( - {}, - { - app: window.app, - closeButton: false, - minWidth: 280, - minHeight: 100, - margin: theme.margin, - align: 'right', // left, center, right - verticalAlign: 'top', // top, middle, bottom - duration: 5, - autoClose: true, - closeDuration: theme.fast - }, - opts - ); - - super(opts); - } - - /** - * Relayouts the position of the message box. - * - * @return {Message} Returns the message box for chaining. - */ - layout() { - super.layout(); - - // horizontal - switch (this.opts.align) { - case 'left': - this.x = this.opts.margin; - break - case 'center': - this.x = this.opts.app.size.width / 2 - this.width / 2; - break - case 'right': - this.x = - this.opts.app.size.width - this.opts.margin - this.width; - break - } - - // vertical - switch (this.opts.verticalAlign) { - case 'top': - this.y = this.opts.margin; - break - case 'middle': - this.y = this.opts.app.size.height / 2 - this.height / 2; - break - case 'bottom': - this.y = - this.opts.app.size.height - this.opts.margin - this.height; - break - } - } - - /** - * Shows the message box. - * - * @private - */ - show() { - super.show(); - - if (this.opts.autoClose) { - window.setTimeout(() => { - this.hide(); - }, this.opts.duration * 1000); - } - } - } - - /* globals WebKitPoint */ + /* globals */ /** Tests whether an object is empty * @param {Object} obj - the object to be tested @@ -3213,9 +1481,7 @@ } static startYearRange(date) { - return new Date( - Date.UTC(date.getFullYear() - 1, 11, 31, 23, 59, 59, 999) - ) + return new Date(Date.UTC(date.getFullYear() - 1, 11, 31, 23, 59, 59, 999)) } static endYearRange(date) { @@ -3235,11 +1501,7 @@ } static nextDay(date) { - return this.create( - date.getFullYear(), - date.getMonth(), - date.getDate() + 1 - ) + return this.create(date.getFullYear(), date.getMonth(), date.getDate() + 1) } static nextHour(date) { @@ -3677,15 +1939,9 @@ */ draw(context, { lineWidth = 2, stroke = '#000000', fill = null } = {}) { context.beginPath(); - context.moveTo( - this.points[0].x + this.center.x, - this.points[0].y + this.center.y - ); + context.moveTo(this.points[0].x + this.center.x, this.points[0].y + this.center.y); for (let i = 1; i < this.points.length; i++) { - context.lineTo( - this.points[i].x + this.center.x, - this.points[i].y + this.center.y - ); + context.lineTo(this.points[i].x + this.center.x, this.points[i].y + this.center.y); } context.closePath(); context.lineWidth = lineWidth; @@ -3742,10 +1998,7 @@ for (i = 0, j = nvert - 1; i < nvert; j = i++) { if ( verty[i] > testy != verty[j] > testy && - testx < - ((vertx[j] - vertx[i]) * (testy - verty[i])) / - (verty[j] - verty[i]) + - vertx[i] + testx < ((vertx[j] - vertx[i]) * (testy - verty[i])) / (verty[j] - verty[i]) + vertx[i] ) c = !c; } @@ -3779,12 +2032,8 @@ for (side = 0; side < this.getNumberOfSides(); side++) { /* get the axis that we will project onto */ if (side == 0) { - axis.x = - this.points[this.getNumberOfSides() - 1].y - - this.points[0].y; - axis.y = - this.points[0].x - - this.points[this.getNumberOfSides() - 1].x; + axis.x = this.points[this.getNumberOfSides() - 1].y - this.points[0].y; + axis.y = this.points[0].x - this.points[this.getNumberOfSides() - 1].x; } else { axis.x = this.points[side - 1].y - this.points[side].y; axis.y = this.points[side].x - this.points[side - 1].x; @@ -3808,8 +2057,7 @@ maxA += tmp; /* project polygon B onto axis to determine the min/max */ - minB = maxB = - other.points[0].x * axis.x + other.points[0].y * axis.y; + minB = maxB = other.points[0].x * axis.x + other.points[0].y * axis.y; for (i = 1; i < other.getNumberOfSides(); i++) { tmp = other.points[i].x * axis.x + other.points[i].y * axis.y; if (tmp > maxB) maxB = tmp; @@ -3836,12 +2084,8 @@ for (side = 0; side < other.getNumberOfSides(); side++) { /* get the axis that we will project onto */ if (side == 0) { - axis.x = - other.points[other.getNumberOfSides() - 1].y - - other.points[0].y; - axis.y = - other.points[0].x - - other.points[other.getNumberOfSides() - 1].x; + axis.x = other.points[other.getNumberOfSides() - 1].y - other.points[0].y; + axis.y = other.points[0].x - other.points[other.getNumberOfSides() - 1].x; } else { axis.x = other.points[side - 1].y - other.points[side].y; axis.y = other.points[side].x - other.points[side - 1].x; @@ -3865,8 +2109,7 @@ maxA += tmp; /* project polygon B onto axis to determine the min/max */ - minB = maxB = - other.points[0].x * axis.x + other.points[0].y * axis.y; + minB = maxB = other.points[0].x * axis.x + other.points[0].y * axis.y; for (i = 1; i < other.getNumberOfSides(); i++) { tmp = other.points[i].x * axis.x + other.points[i].y * axis.y; if (tmp > maxB) maxB = tmp; @@ -3947,8 +2190,7 @@ * @access private */ __push(value) { - let removed = - this.buffer.length === this.bufferMaxSize ? this.buffer.shift() : 0; + let removed = this.buffer.length === this.bufferMaxSize ? this.buffer.shift() : 0; this.buffer.push(value); return removed @@ -3991,6 +2233,1804 @@ } } + /* global */ + + /** + * Callback for the button action. + * + * @callback actionCallback + * @param {object} event - The event object. + * @param {Button} button - A reference to the button (also this refers to the button). + */ + + /** + * Callback for the button beforeAction. + * + * @callback beforeActionCallback + * @param {object} event - The event object. + * @param {Button} button - A reference to the button (also this refers to the button). + */ + + /** + * Callback for the button afterAction. + * + * @callback afterActionCallback + * @param {object} event - The event object. + * @param {Button} button - A reference to the button (also this refers to the button). + */ + + /** + * Class that represents a PixiJS Button. + * + * @example + * // Create the button + * const button = new Button({ + * label: 'My Button', + * action: () => console.log('Button was clicked') + * }) + * + * // Add the button to a DisplayObject + * app.scene.addChild(button) + * + * @class + * @extends PIXI.Container + * @see {@link http://pixijs.download/dev/docs/PIXI.Container.html|PIXI.Container} + * @see {@link https://www.iwm-tuebingen.de/iwmbrowser/lib/pixi/button.html|DocTest} + */ + class Button extends PIXI.Container { + /** + * Creates an instance of a Button. + * + * @constructor + * @param {object} [opts] - An options object to specify to style and behaviour of the button. + * @param {number} [opts.id=auto generated] - The id of the button. + * @param {string} [opts.label] - The label of the button. + * @param {number} [opts.x=0] - The x position of the button. Can be also set after creation with button.x = 0. + * @param {number} [opts.y=0] - The y position of the button. Can be also set after creation with button.y = 0. + * @param {string|Theme} [opts.theme=dark] - The theme to use for this button. Possible values are dark, light, red + * or a Theme object. + * @param {number} [opts.minWidth=44] - The minimum width of the button. + * @param {number} [opts.minHeight=44] - The minimum height of the button. + * @param {number} [opts.padding=Theme.padding] - The inner spacing (distance from icon and/or label) to the border. + * @param {string|PIXI.DisplayObject} [opts.icon] - The icon of the button. Can be a predefined one, an URL or an PIXI.DisplayObject. + * @param {string|PIXI.DisplayObject} [opts.iconActive=icon] - The icon of the button when activated. Can be a predefined one, an URL or an PIXI.DisplayObject. + * @param {string} [opts.iconPosition=left] - The position of the icon in relation to the label. Can be left or right. + * @param {number} [opts.iconColor=Theme.iconColor] - The color of the icon (set by the tint property) as a hex value. + * @param {number} [opts.iconColorActive=Theme.iconColorActive] - The color of the icon when activated. + * @param {number} [opts.fill=Theme.fill] - The color of the button background as a hex value. + * @param {number} [opts.fillAlpha=Theme.fillAlpha] - The alpha value of the background. + * @param {number} [opts.fillActive=Theme.fillActive] - The color of the button background when activated. + * @param {number} [opts.fillActiveAlpha=Theme.fillActiveAlpha] - The alpha value of the background when activated. + * @param {number} [opts.stroke=Theme.stroke] - The color of the border as a hex value. + * @param {number} [opts.strokeWidth=Theme.strokeWidth] - The width of the border in pixel. + * @param {number} [opts.strokeAlpha=Theme.strokeAlpha] - The alpha value of the border. + * @param {number} [opts.strokeActive=Theme.strokeActive] - The color of the border when activated. + * @param {number} [opts.strokeActiveWidth=Theme.strokeActiveWidth] - The width of the border in pixel when activated. + * @param {number} [opts.strokeActiveAlpha=Theme.strokeActiveAlpha] - The alpha value of the border when activated. + * @param {object} [opts.textStyle=Theme.textStyle] - A textstyle object for the styling of the label. See PIXI.TextStyle + * for possible options. + * @param {number} [opts.textStyleActive=Theme.textStyleActive] - A textstyle object for the styling of the label when the + * button is activated. See PIXI.TextStyle for possible options. + * @param {string} [opts.style=default] - A shortcut for styling options. Possible values are default, link. + * @param {number} [opts.radius=Theme.radius] - The radius of the four corners of the button (which is a rounded rectangle). + * @param {boolean} [opts.disabled=false] - Is the button disabled? When disabled, the button has a lower alpha value + * and cannot be clicked (interactive is set to false). + * @param {boolean} [opts.active=false] - Is the button initially active? + * @param {actionCallback} [opts.action] - Executed when the button was triggered (by pointerup). + * @param {beforeActionCallback} [opts.beforeAction] - Executed before the main action is triggered. + * @param {afterActionCallback} [opts.afterAction] - Executed after the main action was triggered. + * @param {string} [opts.type=default] - The type of the button. Can be default or checkbox. When the type is + * checkbox, the active state is toggled automatically. + * @param {string} [opts.align=center] - The horizontal position of the label and the icon. Possible values are + * left, center and right. Only affects the style when the minWidth is bigger than the width of the icon and label. + * @param {string} [opts.verticalAlign=middle] - The vertical position of the label and the icon. Possible values are + * top, middle and button. Only affects the style when the minHeight is bigger than the height of the icon and label. + * @param {string|object} [opts.tooltip] - A string for the label of the tooltip or an object to configure the tooltip + * to display. + * @param {string|object} [opts.badge] - A string for the label of the badge or an object to configure the badge to display. + * If the parameter is an object, all badge options can be set plus the following: + * @param {string} [opts.badge.align=right] - The horizontal alignment of the badge. Possible values: left, center, right + * @param {string} [opts.badge.verticalAlign=top] - The vertical alignment of the badge. Possible values: top, middle, bottom + * @param {number} [opts.badge.offsetLeft=0] - The horizontal shift of the badge. + * @param {number} [opts.badge.offsetTop=0] - The vertical shift of the badge. + * @param {boolean} [opts.visible=true] - Is the button initially visible (property visible)? + */ + constructor(opts = {}) { + super(); + + const theme = Theme.fromString(opts.theme); + this.theme = theme; + + this.opts = Object.assign( + {}, + { + id: PIXI.utils.uid(), + label: null, + x: 0, + y: 0, + minWidth: 44, + minHeight: 44, + padding: theme.padding, + icon: undefined, + iconActive: undefined, + iconPosition: 'left', + iconColor: theme.iconColor, + iconColorActive: theme.iconColorActive, + fill: theme.fill, + fillAlpha: theme.fillAlpha, + fillActive: theme.fillActive, + fillActiveAlpha: theme.fillActiveAlpha, + stroke: theme.stroke, + strokeWidth: theme.strokeWidth, + strokeAlpha: theme.strokeAlpha, + strokeActive: theme.strokeActive, + strokeActiveWidth: theme.strokeActiveWidth, + strokeActiveAlpha: theme.strokeActiveAlpha, + textStyle: theme.textStyle, + textStyleActive: theme.textStyleActive, + style: 'default', + radius: theme.radius, + disabled: false, + active: false, + action: null, + beforeAction: null, + afterAction: null, + type: 'default', + align: 'center', + verticalAlign: 'middle', + tooltip: null, + badge: null, + visible: true + }, + opts + ); + + this.id = this.opts.id; + + if (typeof this.opts.icon === 'undefined' && typeof this.opts.iconActive !== 'undefined') { + this.opts.icon = this.opts.iconActive; + } else if (typeof this.opts.icon !== 'undefined' && typeof this.opts.iconActive === 'undefined') { + this.opts.iconActive = this.opts.icon; + } + + if (this.opts.style === 'link') { + Object.assign(this.opts, { + strokeAlpha: 0, + strokeActiveAlpha: 0, + fillAlpha: 0, + fillActiveAlpha: 0 + }); + } + + this._active = null; + this._disabled = null; + + this.__start = { x: null, y: null }; + + this.iconInactive = null; + this.iconActive = null; + this.text = null; + + this.button = null; + this.content = null; + + this.tooltip = null; + this.badge = null; + + this.visible = this.opts.visible; + + // setup + //----------------- + this.setup(); + } + + /** + * Captures an event to inform InteractionMapper about processed events. + * + * @param {event|PIXI.InteractionEvent} event - The PIXI event to capture. + */ + capture(event) { + Events$1.capturedBy(event.data.originalEvent, this); + } + + /** + * Creates children and instantiates everything. + * + * @private + * @return {Button} A reference to the button for chaining. + */ + setup() { + // Button + //----------------- + let button = new PIXI.Graphics(); + this.button = button; + this.addChild(button); + + // Content + //----------------- + let content = new PIXI.Container(); + this.content = content; + this.addChild(content); + + // Text + //----------------- + if (this.opts.label) { + this.text = new PIXI.Text(this.opts.label, this.opts.textStyle); + } + + // Icon + //----------------- + if (this.opts.icon) { + this.iconInactive = this.loadIcon(this.opts.icon, this.opts.iconColor); + } + + if (this.opts.iconActive) { + this.iconActive = this.loadIcon(this.opts.iconActive, this.opts.iconColorActive); + } + + // interaction + //----------------- + this.button.on('pointerover', e => { + this.capture(e); + TweenLite.to([this.button, this.content], this.theme.fast, { + alpha: 0.83, + overwrite: 'none' + }); + }); + + this.button.on('pointermove', e => { + this.capture(e); + }); + + this.button.on('pointerout', e => { + this.capture(e); + TweenLite.to([this.button, this.content], this.theme.fast, { + alpha: 1, + overwrite: 'none' + }); + }); + + // eslint-disable-next-line no-unused-vars + this.button.on('pointerdown', e => { + //this.capture(e) + this.__start.x = e.data.global.x; + this.__start.y = e.data.global.y; + TweenLite.to([this.button, this.content], this.theme.fast, { + alpha: 0.7, + overwrite: 'none' + }); + }); + + this.button.on('pointerup', e => { + this.capture(e); + + const distance = Points.distance(e.data.global, this.__start); + + if (distance < 5) { + if (this.opts.beforeAction) { + this.opts.beforeAction.call(this, e, this); + } + + if (this.opts.action) { + this.opts.action.call(this, e, this); + } + + TweenLite.to([this.button, this.content], this.theme.fast, { + alpha: 0.83, + overwrite: 'none' + }); + + if (this.opts.type === 'checkbox') { + this.active = !this.active; + } + + if (this.opts.afterAction) { + this.opts.afterAction.call(this, e, this); + } + } + }); + + // disabled + //----------------- + this.disabled = this.opts.disabled; + + // active + //----------------- + this.active = this.opts.active; // calls .layout() + + // tooltip + //----------------- + if (this.opts.tooltip) { + if (typeof this.opts.tooltip === 'string') { + this.tooltip = new Tooltip({ + object: this, + content: this.opts.tooltip + }); + } else { + this.opts.tooltip = Object.assign({}, { object: this }, this.opts.tooltip); + this.tooltip = new Tooltip(this.opts.tooltip); + } + } + + // badge + //----------------- + if (this.opts.badge) { + let opts = Object.assign( + {}, + { + align: 'right', + verticalAlign: 'top', + offsetLeft: 0, + offsetTop: 0 + } + ); + if (typeof this.opts.badge === 'string') { + opts = Object.assign(opts, { content: this.opts.badge }); + } else { + opts = Object.assign(opts, this.opts.badge); + } + + const badge = new Badge(opts); + + switch (opts.align) { + case 'left': + badge.x = this.x - badge.width / 2 + opts.offsetLeft; + break + case 'center': + badge.x = this.x + this.width / 2 - badge.width / 2 + opts.offsetLeft; + break + case 'right': + badge.x = this.x + this.width - badge.width / 2 + opts.offsetLeft; + } + + switch (opts.verticalAlign) { + case 'top': + badge.y = this.y - badge.height / 2 + opts.offsetTop; + break + case 'middle': + badge.y = this.y + this.height / 2 - badge.height / 2 + opts.offsetTop; + break + case 'bottom': + badge.y = this.y + this.height - badge.height / 2 + opts.offsetTop; + } + + this.addChild(badge); + + this.badge = badge; + } + + // set position + //----------------- + this.position.set(this.opts.x, this.opts.y); + + return this + } + + /** + * Should be called to refresh the layout of the button. Can be used after resizing. + * + * @return {Button} A reference to the button for chaining. + */ + layout() { + // Clear content + //----------------- + this.removeChild(this.content); + this.content = new PIXI.Container(); + this.addChild(this.content); + + // Set the icon + //----------------- + let icon = null; + + if (!this.active && this.iconInactive) { + icon = this.iconInactive; + } else if (this.active && this.iconActive) { + icon = this.iconActive; + } + + // Set the text + //----------------- + if (this.text) { + this.text.position.set(0, 0); + } + + // Width and Height + //----------------- + let width = 0; + if (icon && this.text) { + width = icon.width + this.text.width + 3 * this.opts.padding; + } else if (icon) { + width = icon.width + 2 * this.opts.padding; + } else if (this.text) { + width = this.text.width + 2 * this.opts.padding; + } + + if (width < this.opts.minWidth) { + width = this.opts.minWidth; + } + + let height = 0; + if (icon) { + height = icon.height + 2 * this.opts.padding; + } else if (this.text) { + height = this.text.height + 2 * this.opts.padding; + } + + if (height < this.opts.minHeight) { + height = this.opts.minHeight; + } + + this._width = width; + this._height = height; + + // Position icon and text + //----------------- + if (icon && this.text) { + if (this.opts.iconPosition === 'right') { + icon.x = this.text.width + this.opts.padding; + } else { + this.text.x = icon.width + this.opts.padding; + } + this.content.addChild(icon, this.text); + } else if (icon) { + this.content.addChild(icon); + } else if (this.text) { + this.content.addChild(this.text); + } + + this.layoutInnerContent(); + this.layoutContent(); + + this.icon = icon; + + // draw + //----------------- + this.draw(); + + return this + } + + /** + * Calculates the positions of the content children (icon and/or text). + * + * @private + * @return {Button} A reference to the button for chaining. + */ + layoutInnerContent() { + for (let child of this.content.children) { + switch (this.opts.verticalAlign) { + case 'top': + child.y = 0; + break + case 'middle': + child.y = this.content.height / 2 - child.height / 2; + break + case 'bottom': + child.y = this.content.height - child.height; + break + } + } + + return this + } + + /** + * Sets the horizontal and vertical position of the content. + * Uses the option keys "align" and "verticalAlign". + * + * @private + * @return {Button} A reference to the button for chaining. + */ + layoutContent() { + switch (this.opts.align) { + case 'left': + this.content.x = this.opts.padding; + break + case 'center': + this.content.x = (this._width - this.content.width) / 2; + break + case 'right': + this.content.x = this._width - this.opts.padding - this.content.width; + break + } + + switch (this.opts.verticalAlign) { + case 'top': + this.content.y = this.opts.padding; + break + case 'middle': + this.content.y = (this._height - this.content.height) / 2; + break + case 'bottom': + this.content.y = this._height - this.opts.padding - this.content.height; + break + } + + return this + } + + /** + * Draws the canvas. + * + * @private + * @return {Button} A reference to the button for chaining. + */ + draw() { + this.button.clear(); + if (this.active) { + this.button.lineStyle(this.opts.strokeActiveWidth, this.opts.strokeActive, this.opts.strokeActiveAlpha); + this.button.beginFill(this.opts.fillActive, this.opts.fillActiveAlpha); + } else { + this.button.lineStyle(this.opts.strokeWidth, this.opts.stroke, this.opts.strokeAlpha); + this.button.beginFill(this.opts.fill, this.opts.fillAlpha); + } + this.button.drawRoundedRect(0, 0, this._width, this._height, this.opts.radius); + this.button.endFill(); + + return this + } + + /** + * Gets or sets the active state. + * + * @member {boolean} + */ + get active() { + return this._active + } + set active(value) { + this._active = value; + + if (this._active) { + if (this.text) { + this.text.style = this.opts.textStyleActive; + } + } else { + if (this.text) { + this.text.style = this.opts.textStyle; + } + } + + this.layout(); + } + + /** + * Gets or sets the disabled state. When disabled, the button cannot be clicked. + * + * @member {boolean} + */ + get disabled() { + return this._disabled + } + set disabled(value) { + this._disabled = value; + + if (this._disabled) { + this.button.interactive = false; + this.button.buttonMode = false; + this.button.alpha = 0.5; + if (this.icon) { + this.icon.alpha = 0.5; + } + if (this.text) { + this.text.alpha = 0.5; + } + } else { + this.button.interactive = true; + this.button.buttonMode = true; + this.button.alpha = 1; + if (this.icon) { + this.icon.alpha = 1; + } + if (this.text) { + this.text.alpha = 1; + } + } + } + + /** + * Shows the button (sets his alpha values to 1). + * + * @return {Button} A reference to the button for chaining. + */ + show() { + this.opts.strokeAlpha = 1; + this.opts.strokeActiveAlpha = 1; + this.opts.fillAlpha = 1; + this.opts.fillActiveAlpha = 1; + + this.layout(); + + return this + } + + /** + * Hides the button (sets his alpha values to 0). + * + * @return {Button} A reference to the button for chaining. + */ + hide() { + this.opts.strokeAlpha = 0; + this.opts.strokeActiveAlpha = 0; + this.opts.fillAlpha = 0; + this.opts.fillActiveAlpha = 0; + + this.layout(); + + return this + } + + /** + * Loads an icon + * + * @private + * @param {string|PIXI.DisplayObject} icon - The icon to load. + * @param {number} color - The color of the icon (if not an PIXI.DisplayObject). + * @return {PIXI.DisplayObject} Return the icon as an PIXI.DisplayObject. + */ + loadIcon(icon, color) { + let displayObject = null; + + if (icon instanceof PIXI.DisplayObject) { + displayObject = icon; + } else { + let size = 17; + if (this.text) { + size = this.text.height; + } else if (this.opts.minHeight) { + size = this.opts.minHeight - 2 * this.opts.padding; + } + + const url = Button.iconIsUrl(icon) ? icon : `../../assets/icons/${icon}.png`; + const iconTexture = PIXI.Texture.fromImage(url, true); + + const sprite = new PIXI.Sprite(iconTexture); + sprite.tint = color; + sprite.width = size; + sprite.height = size; + + displayObject = sprite; + } + + return displayObject + } + + /** + * Tests if an icon string is an url. + * + * @private + * @static + * @param {string} url - The url to test. + * @return {boolean} true if the url is an url to an image. + */ + static iconIsUrl(url) { + return /\.(png|svg|gif|jpg|jpeg|tif|tiff)$/i.test(url) + } + + /** + * Gets or sets the color of the current icon (no matter how the status is). Changing the color, changes + * the tint property of the icon sprite. + * + * @member {number} + */ + get iconColor() { + return this.icon ? this.icon.tint : null + } + set iconColor(value) { + if (this.icon) { + this.icon.tint = value; + } + } + } + + /* globals ThrowPropsPlugin, Strong */ + + /** + * Class that represents a PixiJS ButtonGroup. + * + * @example + * // Create the button group + * const buttonGroup = new ButtonGroup({ + * buttons: [ + * {label: 'Button 1', action: event => console.log(event)}, + * {label: 'Button 2', action: event => console.log(event)}, + * {label: 'Button 3', action: event => console.log(event)} + * ], + * minWidth: 100 + * }) + * + * // Add the button group to a DisplayObject + * app.scene.addChild(buttonGroup) + * + * @class + * @extends PIXI.Graphics + * @see {@link http://pixijs.download/dev/docs/PIXI.Graphics.html|PIXI.Graphics} + * @see {@link https://www.iwm-tuebingen.de/iwmbrowser/lib/pixi/buttongroup.html|DocTest} + */ + class ButtonGroup extends PIXI.Container { + /** + * Creates an instance of a ButtonGroup. + * + * @constructor + * @param {object} [opts] - An options object to specify to style and behaviour of the button group. + * @param {number} [opts.id=auto generated] - The id of the button group. + * @param {number} [opts.x=0] - The x position of the button group. Can be also set after creation with buttonGroup.x = 0. + * @param {number} [opts.y=0] - The y position of the button group. Can be also set after creation with buttonGroup.y = 0. + * @param {object[]} [opts.buttons=[]] - An array of the buttons of the button group. One item of the array (one object) + * can have exactly the same properties as an Button object when instantiating a Button. If a property of the button group + * conflicts with a property of a button object, the value from the button object will be used. + * @param {string|Theme=} [opts.theme=dark] - The theme to use for this button group. Possible values are dark, light, red + * or a Theme object. + * @param {number} [opts.minWidth=44] - Button: The minimum width of one button. + * @param {number} [opts.minHeight=44] - Button: The minimum height of one button. + * @param {number} [opts.maxWidth] - The maximum width of the button group. Only used if stacked is true and the orientation is horizontal. + * @param {number} [opts.maxHeight] - The maximum height of the button group. Only used if stacked is true and the orientation is vertical. + * @param {boolean} [opts.stacked=false] - If set to true, the buttons of the button group gets stacked if they are broader or higher than the maximum permitted width or height, depending on orientation. + * @param {PIXI.Application} [opts.app] - The PixiJS Application. Must be set if you want to use the mousewheel to scroll your button group. + * @param {number} [opts.padding=Theme.padding] - Button: The inner spacing (distance from icon and/or label) the the border. + * @param {number} [opts.margin=Theme.margin] - The outer spacing (distance from one button to the previous/next button). + * @param {string} [opts.iconPosition=left] - Button: The position of the icon in relation to the label. Can be left or right. + * @param {number} [opts.iconColor=Theme.iconColor] - Button: The color of the icon (set by the tint property) as a hex value. + * @param {number} [opts.iconColorActive=Theme.iconColorActive] - Button: The color of the icon when activated. + * @param {number} [opts.fill=Theme.fill] - Button: The color of the button background as a hex value. + * @param {number} [opts.fillAlpha=Theme.fillAlpha] - Button: The alpha value of the background. + * @param {number} [opts.fillActive=Theme.fillActive] - Button: The color of the button background when activated. + * @param {number} [opts.fillActiveAlpha=Theme.fillActiveAlpha] - Button: The alpha value of the background when activated. + * @param {number} [opts.stroke=Theme.stroke] - Button: The color of the border as a hex value. + * @param {number} [opts.strokeWidth=Theme.strokeWidth] - Button: The width of the border in pixel. + * @param {number} [opts.strokeAlpha=Theme.strokeAlpha] - Button: The alpha value of the border. + * @param {number} [opts.strokeActive=Theme.strokeActive] - Button: The color of the border when activated. + * @param {number} [opts.strokeActiveWidth=Theme.strokeActiveWidth] - Button: The width of the border in pixel when activated. + * @param {number} [opts.strokeActiveAlpha=Theme.strokeActiveAlpha] - Button: The alpha value of the border when activated. + * @param {object} [opts.textStyle=Theme.textStyle] - Button: A textstyle object for the styling of the label. See PIXI.TextStyle + * for possible options. + * @param {number} [opts.textStyleActive=Theme.textStyleActive] - Button: A textstyle object for the styling of the label when the + * button is activated. See PIXI.TextStyle for possible options. + * @param {string} [opts.style=default] - A shortcut for styling options. Possible values are default, link. + * @param {number} [opts.radius=Theme.radius] - Button: The radius of the four corners of the button (which is a rounded rectangle). + * @param {boolean} [opts.disabled=false] - Is the button group disabled? When disabled, the button group has a lower alpha value + * and cannot be clicked (interactive of every button is set to false). + * @param {string} [opts.type=default] - The type of the button group. Can be default, checkbox or radio. When the type is + * checkbox, the active state is toggled for each button automatically. When the type is radio, only one button can + * be activated at the same time. + * @param {string} [opts.orientation=horizontal] - The orientation of the button group. Can be horizontal or vertical. + * @param {string} [opts.align=center] - Button: The horizontal position of the label and the icon. Possible values are + * left, center and right. Only affects the style when the minWidth is bigger than the width of the icon and label. + * @param {string} [opts.verticalAlign=middle] - Button: The vertical position of the label and the icon. Possible values are + * top, middle and bottom. Only affects the style when the minHeight is bigger than the height of the icon and label. + * @param {boolean} [opts.visible=true] - Is the button group initially visible (property visible)? + */ + constructor(opts = {}) { + super(); + + const theme = Theme.fromString(opts.theme); + this.theme = theme; + + this.opts = Object.assign( + {}, + { + id: PIXI.utils.uid(), + x: 0, + y: 0, + buttons: [], + minWidth: 44, + minHeight: 44, + maxWidth: null, + maxHeight: null, + stacked: false, + app: null, + padding: theme.padding, + margin: theme.margin, + iconPosition: 'left', // left, right + iconColor: theme.iconColor, + iconColorActive: theme.iconColorActive, + fill: theme.fill, + fillAlpha: theme.fillAlpha, + fillActive: theme.fillActive, + fillActiveAlpha: theme.fillActiveAlpha, + stroke: theme.stroke, + strokeWidth: theme.strokeWidth, + strokeAlpha: theme.strokeAlpha, + strokeActive: theme.strokeActive, + strokeActiveWidth: theme.strokeActiveWidth, + strokeActiveAlpha: theme.strokeActiveAlpha, + textStyle: theme.textStyle, + textStyleActive: theme.textStyleActive, + style: 'default', + radius: theme.radius, + disabled: null, + type: 'default', // default, checkbox, radio + orientation: 'horizontal', + align: 'center', // left, center, right + verticalAlign: 'middle', // top, middle, bottom + visible: true + }, + opts + ); + + this.buttons = []; + + this._disabled = null; + this.__dragging = false; + + this.visible = this.opts.visible; + + // setup + //----------------- + this.setup(); + + // layout + //----------------- + this.layout(); + } + + /** + * Creates children and instantiates everything. + * + * @private + * @return {ButtonGroup} A reference to the button group for chaining. + */ + setup() { + // inner container + //-------------------- + const container = new PIXI.Graphics(); + this.addChild(container); + this.container = container; + + // Buttons + //----------------- + let position = 0; + + for (let it of this.opts.buttons) { + delete it.x; + delete it.y; + + if (this.opts.orientation === 'horizontal') { + it.x = position; + } else { + it.y = position; + } + + it.theme = it.theme || this.opts.theme; + it.minWidth = it.minWidth || this.opts.minWidth; + it.minHeight = it.minHeight || this.opts.minHeight; + it.padding = it.padding || this.opts.padding; + it.iconPosition = it.iconPosition || this.opts.iconPosition; + it.iconColor = it.iconColor || this.opts.iconColor; + it.iconColorActive = it.iconColorActive || this.opts.iconColorActive; + it.fill = it.fill || this.opts.fill; + it.fillAlpha = it.fillAlpha || this.opts.fillAlpha; + it.fillActive = it.fillActive || this.opts.fillActive; + it.fillActiveAlpha = it.fillActiveAlpha || this.opts.fillActiveAlpha; + it.stroke = it.stroke || this.opts.stroke; + it.strokeWidth = it.strokeWidth != null ? it.strokeWidth : this.opts.strokeWidth; + it.strokeAlpha = it.strokeAlpha != null ? it.strokeAlpha : this.opts.strokeAlpha; + it.strokeActive = it.strokeActive || this.opts.strokeActive; + it.strokeActiveWidth = it.strokeActiveWidth != null ? it.strokeActiveWidth : this.opts.strokeActiveWidth; + it.strokeActiveAlpha = it.strokeActiveAlpha != null ? it.strokeActiveAlpha : this.opts.strokeActiveAlpha; + it.textStyle = it.textStyle || this.opts.textStyle; + it.textStyleActive = it.textStyleActive || this.opts.textStyleActive; + it.style = it.style || this.opts.style; + it.radius = it.radius != null ? it.radius : this.opts.radius; + if (!it.type) { + switch (this.opts.type) { + case 'checkbox': + it.type = this.opts.type; + break + default: + it.type = 'default'; + break + } + } + //it.type = it.type || this.opts.type || 'default' + it.align = it.align || this.opts.align; + it.verticalAlign = it.verticalAlign || this.opts.verticalAlign; + it.afterAction = (event, button) => { + if (this.opts.type === 'radio' && button.opts.type === 'default') { + this.buttons.forEach(it => { + if (it.opts.type === 'default') { + it.active = false; + } + }); + + if (button.opts.type === 'default') { + button.active = true; + } + } + }; + + if (it.tooltip) { + if (typeof it.tooltip === 'string') { + it.tooltip = { content: it.tooltip, container: this }; + } else { + it.tooltip = Object.assign({}, { container: this }, it.tooltip); + } + } + + let button = new Button(it); + + this.container.addChild(button); + this.buttons.push(button); + + button.__originalPosition = { + x: button.x, + y: button.y + }; + + position += (this.opts.orientation === 'horizontal' ? button.width : button.height) + this.opts.margin; + } + + if (this.opts.orientation === 'vertical') { + const maxWidth = this.getMaxButtonWidth(); + + this.buttons.forEach(it => { + it.opts.minWidth = maxWidth; + it.layout(); + }); + } + + // disabled + //----------------- + if (this.opts.disabled != null) { + this.disabled = this.opts.disabled; + } + + // interaction + //-------------------- + if (this.opts.stacked) { + this.interactive = true; + this.on('pointerdown', this.onStart.bind(this)); + this.on('pointermove', this.onMove.bind(this)); + this.on('pointerup', this.onEnd.bind(this)); + this.on('pointercancel', this.onEnd.bind(this)); + this.on('pointerout', this.onEnd.bind(this)); + this.on('pointerupoutside', this.onEnd.bind(this)); + this.on('scroll', this.onScroll.bind(this)); + + // mousewheel + //-------------------- + if (this.opts.app) { + const app = this.opts.app; + app.view.addEventListener('mousewheel', event => { + const bounds = this.getBounds(); + const x = event.clientX - app.view.getBoundingClientRect().left; + const y = event.clientY - app.view.getBoundingClientRect().top; + if (bounds.contains(x, y)) { + event.preventDefault(); + this.emit('scroll', event); + } + }); + } + + const background = new PIXI.Graphics(); + background.beginFill(0x000000, 0); + background.drawRect(0, 0, this.width, this.height); + background.endFill(); + this.addChildAt(background, 0); + + this.__initWidth = this.container.width; + this.__deltaWidth = this.container.width - this.opts.maxWidth; + } + + return this + } + + /** + * Should be called to refresh the layout of the button group. Can be used after resizing. + * + * @return {ButtonGroup} A reference to the button group for chaining. + */ + layout() { + // set position + //----------------- + this.position.set(this.opts.x, this.opts.y); + + // draw + //----------------- + this.draw(); + + // stacked + //----------------- + if (this.opts.stacked) { + this.stack(); + } + + return this + } + + /** + * Draws the canvas. + * + * @private + * @return {ButtonGroup} A reference to the button group for chaining. + */ + draw() { + if (this.opts.margin === 0) { + this.buttons.forEach(it => it.hide()); + + this.container.clear(); + this.container.lineStyle(this.opts.strokeWidth, this.opts.stroke, this.opts.strokeAlpha); + this.container.beginFill(this.opts.fill, this.opts.fillAlpha); + this.container.drawRoundedRect(0, 0, this.width, this.height, this.opts.radius); + + // Draw borders + this.container.lineStyle(this.opts.strokeWidth, this.opts.stroke, this.opts.strokeAlpha / 2); + + this.buttons.forEach((it, i) => { + if (i > 0) { + this.container.moveTo(it.x, it.y); + + if (this.opts.orientation === 'horizontal') { + this.container.lineTo(it.x, it.height); + } else { + this.container.lineTo(it.width, it.y); + } + } + }); + + this.container.endFill(); + } + + return this + } + + /** + * Gets or sets the disabled state. When disabled, no button of the button group can be clicked. + * + * @member {boolean} + */ + get disabled() { + return this._disabled + } + + set disabled(value) { + this._disabled = value; + + this.buttons.forEach(it => (it.disabled = value)); + } + + /** + * Searches all buttons of the button group and returns the maximum width of one button. + * + * @private + * @return {number} The maximum with of a button of the button group. + */ + getMaxButtonWidth() { + let widths = this.buttons.map(it => it.width); + + return Math.max(...widths) + } + + /** + * Shows the button group (sets his alpha value to 1). + * + * @return {ButtonGroup} A reference to the button group for chaining. + */ + show() { + this.alpha = 1; + + return this + } + + /** + * Hides the button group (sets his alpha value to 0). + * + * @return {ButtonGroup} A reference to the button group for chaining. + */ + hide() { + this.alpha = 0; + + return this + } + + /** + * + * @private + * @param {*} event + */ + onStart(event) { + this.__dragging = true; + + this.capture(event); + + this.__delta = { + x: this.container.position.x - event.data.global.x, + y: this.container.position.y - event.data.global.y + }; + + TweenLite.killTweensOf(this.container.position, { x: true, y: true }); + if (typeof ThrowPropsPlugin != 'undefined') { + ThrowPropsPlugin.track(this.container.position, 'x,y'); + } + } + + /** + * + * @private + * @param {*} event + */ + onMove(event) { + if (this.__dragging) { + this.capture(event); + + if (this.opts.orientation === 'horizontal') { + this.container.position.x = event.data.global.x + this.__delta.x; + } else { + this.container.position.y = event.data.global.y + this.__delta.y; + } + + if (this.opts.stacked) { + this.stack(); + } + } + } + + /** + * + * @private + * @param {*} event + */ + onEnd(event) { + if (this.__dragging) { + this.__dragging = false; + + this.capture(event); + + if (typeof ThrowPropsPlugin != 'undefined') { + const throwProps = { x: { velocity: 'auto' }, y: { velocity: 'auto' } }; + + if (this.opts.orientation === 'horizontal') { + const distanceToLeft = this.container.x; + const distanceToRight = this.opts.maxWidth - this.container.x - this.__initWidth; + if (distanceToLeft > 0 && distanceToLeft > distanceToRight) { + throwProps.x.end = 0; + } else if (distanceToRight > 0 && distanceToRight > distanceToLeft) { + throwProps.x.end = this.opts.maxWidth - this.__initWidth; + } + } else { + const distanceToTop = this.container.y; + const distanceToBottom = this.opts.maxHeight - this.container.y - this.container.height; + if (distanceToTop > 0 && distanceToTop > distanceToBottom) { + throwProps.y.end = 0; + } else if (distanceToBottom > 0 && distanceToBottom > distanceToTop) { + throwProps.y.end = this.opts.maxHeight - this.container.height; + } + } + + ThrowPropsPlugin.to( + this.container.position, + { + throwProps, + ease: Strong.easeOut, + onUpdate: () => this.stack(), + onComplete: () => ThrowPropsPlugin.untrack(this.container.position) + }, + 0.8, + 0.4 + ); + } + } + } + + /** + * + * @private + * @param {*} event + */ + onScroll(event) { + this.capture(event); + + if (this.opts.orientation === 'horizontal') { + this.container.position.x -= event.deltaX; + if (this.container.position.x > 0) { + this.container.position.x = 0; + } else if (this.container.position.x + this.__initWidth < this.opts.maxWidth) { + this.container.position.x = this.opts.maxWidth - this.__initWidth; + } + } else { + this.container.position.y -= event.deltaY; + if (this.container.position.y > 0) { + this.container.position.y = 0; + } else if (this.container.position.y + this.container.height < this.opts.maxHeight) { + this.container.position.y = this.opts.maxHeight - this.container.height; + } + } + + if (this.opts.stacked) { + this.stack(); + } + } + + /** + * Captures an event to inform InteractionMapper about processed events. + * + * @param {event|PIXI.InteractionEvent} event - The PIXI event to capture. + */ + capture(event) { + const originalEvent = event.data && event.data.originalEvent ? event.data.originalEvent : event; + Events$1.capturedBy(originalEvent, this); + } + + /** + * + */ + stack() { + this.buttons.forEach((it, index) => { + if (it.__originalPosition.x + this.container.x < 0) { + // left border + it.x = -this.container.x; + } else if (it.__originalPosition.x + it.width > Math.abs(this.container.x) + this.opts.maxWidth) { + // right border + it.x = Math.abs(this.container.x) + this.opts.maxWidth - it.width; + } else { + it.x = it.__originalPosition.x; + } + }); + + this.buttons.sort((a, b) => { + const delta = Math.abs(this.container.x) + this.opts.maxWidth / 2; + const distanceA = Math.abs(a.x - delta); + const distanceB = Math.abs(b.x - delta); + if (distanceA > distanceB) { + return -1 + } else if (distanceB > distanceA) { + return 1 + } else { + return 0 + } + }); + + this.buttons.forEach(it => { + const parent = it.parent; + parent.removeChild(it); + parent.addChild(it); + }); + } + } + + /** + * Class that represents a PixiJS InteractivePopup. + * The class is used for various other Popup-like classes + * like Popup, Message... + * + * @class + * @abstract + * @extends AbstractPopup + */ + class InteractivePopup extends AbstractPopup { + /** + * Creates an instance of an InteractivePopup (only for internal use). + * + * @constructor + * @param {object} [opts] - An options object to specify to style and behaviour of the popup. + * @param {boolean} [opts.closeOnPopup=false] - Should the popup be closed when the user clicks on the popup? + * @param {boolean} [opts.closeButton=true] - Should a close button be displayed on the upper right corner? + * @param {object} [opts.button] - A Button object to be display on the lower right corner. + * @param {object} [opts.buttonGroup] - A ButtonGroup object to be displayed on the lower right corner. + */ + constructor(opts = {}) { + opts = Object.assign( + {}, + { + closeOnPopup: false, + closeButton: true, + button: null, + buttonGroup: null + }, + opts + ); + + super(opts); + + this._closeButton = null; + this._buttons = null; + + // padding + this.smallPadding = this.opts.padding / 2; + + // setup + //----------------- + this.setup(); + + // layout + //----------------- + this.layout(); + } + + /** + * Creates the framework and instantiates everything. + * + * @private + * @return {AbstractPopup} A reference to the popup for chaining. + */ + setup() { + super.setup(); + + // interaction + //----------------- + this.on('pointerup', e => { + if (this.opts.closeOnPopup) { + this.hide(); + } else { + e.stopPropagation(); + } + }); + + // closeButton + //----------------- + if (this.opts.closeButton) { + let closeButton = PIXI.Sprite.fromImage('../../assets/icons/close.png', true); + closeButton.width = this.headerStyle.fontSize; + closeButton.height = closeButton.width; + closeButton.tint = this.theme.color2; + // This is needed, because the closeButton belongs to the content. The popup must resize with the closeButton. + if (this._header) { + closeButton.x = this._header.width + this.innerPadding; + } else if (this._content) { + closeButton.x = this._content.width + this.innerPadding; + } + + closeButton.interactive = true; + closeButton.buttonMode = true; + closeButton.on('pointerdown', e => { + this.hide(); + }); + + this._closeButton = closeButton; + this.addChild(closeButton); + + // maxWidth is set and a closeButton should be displayed + //----------------- + if (this.opts.maxWidth) { + const wordWrapWidth = + this.opts.maxWidth - 2 * this.opts.padding - this.smallPadding - this._closeButton.width; + if (this._header) { + this.headerStyle.wordWrapWidth = wordWrapWidth; + } else if (this._content) { + this.textStyle.wordWrapWidth = wordWrapWidth; + } + } + } + + // buttons + //----------------- + if (this.opts.button || this.opts.buttonGroup) { + if (this.opts.button) { + this._buttons = new Button(Object.assign({ textStyle: this.theme.textStyleSmall }, this.opts.button)); + } else { + this._buttons = new ButtonGroup( + Object.assign({ textStyle: this.theme.textStyleSmall }, this.opts.buttonGroup) + ); + } + this.addChild(this._buttons); + + this._buttons.y = this.innerPadding + this.sy; + } + + return this + } + + /** + * Should be called to refresh the layout of the popup. Can be used after resizing. + * + * @return {AbstractPopup} A reference to the popup for chaining. + */ + layout() { + super.layout(); + + // closeButton + //----------------- + if (this.opts.closeButton) { + this._closeButton.x = this.wantedWidth - this.smallPadding - this._closeButton.width; + this._closeButton.y = this.smallPadding; + } + + // buttons + //----------------- + if (this._buttons) { + this._buttons.x = this.wantedWidth - this.opts.padding - this._buttons.width; + this._buttons.y = this.wantedHeight - this.opts.padding - this._buttons.height; + } + + return this + } + + /** + * Calculates the size of the children of the AbstractPopup. + * Cannot use getBounds() because it is not updated when children + * are removed. + * + * @private + * @override + * @returns {object} An JavaScript object width the keys width and height. + */ + getInnerSize() { + let size = super.getInnerSize(); + + if (this._closeButton) { + size.width += this.smallPadding + this._closeButton.width; + } + + if (this._buttons) { + size.width = Math.max(size.width, this._buttons.x + this._buttons.width); + size.height += this.innerPadding + this._buttons.height; + } + + return size + } + } + + /** + * Class that represents a PixiJS Popup. + * + * @example + * // Create the popup + * const popup = new Popup({ + * header: 'Goethe', + * content: 'Man kann die Erfahrung nicht früh genug machen, wie entbehrlich man in der Welt ist.' + * }) + * + * // Add the popup to a DisplayObject + * app.scene.addChild(popup) + * + * @class + * @extends InteractivePopup + * @see {@link https://www.iwm-tuebingen.de/iwmbrowser/lib/pixi/popup.html|DocTest} + */ + class Popup extends InteractivePopup { + /** + * Creates an instance of a Popup. + * + * @constructor + * @param {object} [opts] - An options object to specify to style and behaviour of the popup. + * @param {boolean} [opts.closeButton=false] - Should a close button be displayed on the upper right corner? + * @param {number} [opts.minWidth=0] - The minimum width of the popup. + * @param {number} [opts.minHeight=0] - The minimum height of the popup. + */ + constructor(opts = {}) { + opts = Object.assign( + {}, + { + closeButton: false, + minWidth: 0, + minHeight: 0 + }, + opts + ); + + super(opts); + } + } + + /** + * Class that represents a PixiJS Modal. + * + * @example + * // Create the button and the modal when clicked + * const button = new Button({ + * label: 'Show Modal', + * action: e => { + * const modal = new Modal({ + * app: app, + * header: 'This is the header', + * content: 'This is the text.' + * }) + * app.scene.addChild(modal) + * } + * }) + * + * // Add the button to a DisplayObject + * app.scene.addChild(button) + * + * @class + * @extends PIXI.Container + * @extends InteractivePopup + * @see {@link http://pixijs.download/dev/docs/PIXI.Container.html|PIXI.Container} + * @see {@link https://www.iwm-tuebingen.de/iwmbrowser/lib/pixi/modal.html|DocTest} + */ + class Modal extends PIXI.Container { + /** + * Creates an instance of a Modal. + * + * @constructor + * @param {object} [opts] - An options object to specify to style and behaviour of the modal. + * @param {number} [opts.id=auto generated] - The id of the modal. + * @param {PIXIApp} [opts.app=window.app] - The app where the modal belongs to. + * @param {number} [opts.backgroundFill=Theme.background] - The color of the background. + * @param {number} [opts.backgroundFillAlpha=0.6] - The opacity of the background. + * @param {boolean} [opts.closeOnBackground=true] - Should the modal be closed when the user clicks the + * background? + * @param {boolean} [opts.visible=true] - Is the modal initially visible (property visible)? + */ + constructor(opts = {}) { + super(); + + const theme = Theme.fromString(opts.theme); + this.theme = theme; + + this.opts = Object.assign( + {}, + { + id: PIXI.utils.uid(), + app: window.app, + backgroundFill: theme.background, + backgroundFillAlpha: 0.6, + closeOnBackground: true, + visible: true + }, + opts + ); + + this.id = this.opts.id; + + this.background = null; + this.popup = null; + + this.alpha = 0; + this.visible = this.opts.visible; + + // setup + //----------------- + this.setup(); + + // layout + //----------------- + this.layout(); + } + + /** + * Creates children and instantiates everything. + * + * @private + * @return {Modal} A reference to the modal for chaining. + */ + setup() { + // interaction + //----------------- + this.interactive = true; + this.on('added', e => { + if (this.visible) { + this.show(); + } + }); + + // background + //----------------- + let background = new PIXI.Graphics(); + this.background = background; + this.addChild(this.background); + + if (this.opts.closeOnBackground) { + background.interactive = true; + background.on('pointerup', e => { + this.hide(); + }); + } + + // popup + //----------------- + const popupOpts = Object.assign({}, this.opts, { + visible: true, + onHidden: () => { + this.hide(); + } + }); + let popup = new InteractivePopup(popupOpts); + this.popup = popup; + this.addChild(popup); + popup.show(); + + return this + } + + /** + * Should be called to refresh the layout of the modal. Can be used after resizing. + * + * @return {Modal} A reference to the modal for chaining. + */ + layout() { + const width = this.opts.app.size.width; + const height = this.opts.app.size.height; + + // background + //----------------- + this.background.clear(); + this.background.beginFill(this.opts.backgroundFill, this.opts.backgroundFillAlpha); + this.background.drawRect(0, 0, width, height); + this.background.endFill(); + + // position + this.popup.x = width / 2 - this.popup.width / 2; + this.popup.y = height / 2 - this.popup.height / 2; + + return this + } + + /** + * Shows the modal (sets his alpha values to 1). + * + * @return {Modal} A reference to the modal for chaining. + */ + show() { + TweenLite.to(this, this.theme.fast, { + alpha: 1, + onStart: () => (this.visible = true) + }); + + return this + } + + /** + * Hides the modal (sets his alpha values to 0). + * + * @return {Modal} A reference to the modal for chaining. + */ + hide() { + TweenLite.to(this, this.theme.fast, { + alpha: 0, + onComplete: () => (this.visible = false) + }); + + return this + } + + /** + * Sets or gets the header. The getter always returns a PIXI.Text object. The setter can receive + * a string or a PIXI.Text object. + * + * @member {string|PIXI.Text} + */ + get header() { + return this.popup.header + } + set header(value) { + this.opts.header = value; + this.background.destroy(); + this.popup.destroy(); + this.setup().layout(); + } + + /** + * Sets or gets the content. The getter always returns an PIXI.DisplayObject. The setter can receive + * a string or a PIXI.DisplayObject. + * + * @member {string|PIXI.DisplayObject} + */ + get content() { + return this.popup.content + } + set content(value) { + this.opts.content = value; + this.background.destroy(); + this.popup.destroy(); + this.setup().layout(); + } + } + + /** + * Class that represents a Message. A message pops up and disappears after a specific amount of time. + * + * @example + * // Create the PixiJS App + * const app = new PIXIApp({ + * view: canvas, + * width: 900, + * height: 250 + * }).setup().run() + * + * // Create a button + * let button = new Button({ + * label: 'Click me', + * action: e => { + * const message = new Message({ + * app: app, + * header: 'Header', + * content: 'Text.' + * }) + * app.scene.addChild(message) + * } + * }) + * + * // Add the button to the scene + * app.scene.addChild(button) + * + * @class + * @extends InteractivePopup + * @see {@link https://www.iwm-tuebingen.de/iwmbrowser/lib/pixi/message.html|DocTest} + */ + class Message extends InteractivePopup { + /** + * Creates an instance of a Message. + * + * @constructor + * @param {object} [opts] - An options object to specify to style and behaviour of the message. + * @param {PIXIApp} [opts.app=window.app] - The PIXIApp where this message belongs to. + * @param {boolean} [opts.closeButton=false] - Should a close button be displayed in the upper right corner? + * @param {number} [opts.minWidth=280] - The minimum width of the message box. Automatically expands with the content. + * @param {number} [opts.minHeight=100] - The minimum height of the message box. Automatically expands with the content. + * @param {number} [opts.margin=Theme.margin] - The outer spacing of the message box. + * @param {string} [opts.align=right] - The horizontal position of the message box relative to the app. Possible + * values are left, center, right. + * @param {string} [opts.verticalAlign=top] - The vertical position of the message box relative to the app. Possible + * values are top, middle, bottom. + * @param {number} [opts.duration=5] - The duration in seconds when the message box should disappear. + * @param {boolean} [opts.autoClose=true] - Should the message box be closed automatically? + * @param {number} [opts.closeDuration=Theme.fast] - The duration in seconds of the closing of the message box. + */ + constructor(opts = {}) { + const theme = Theme.fromString(opts.theme); + + opts = Object.assign( + {}, + { + app: window.app, + closeButton: false, + minWidth: 280, + minHeight: 100, + margin: theme.margin, + align: 'right', // left, center, right + verticalAlign: 'top', // top, middle, bottom + duration: 5, + autoClose: true, + closeDuration: theme.fast + }, + opts + ); + + super(opts); + } + + /** + * Relayouts the position of the message box. + * + * @return {Message} Returns the message box for chaining. + */ + layout() { + super.layout(); + + // horizontal + switch (this.opts.align) { + case 'left': + this.x = this.opts.margin; + break + case 'center': + this.x = this.opts.app.size.width / 2 - this.width / 2; + break + case 'right': + this.x = this.opts.app.size.width - this.opts.margin - this.width; + break + } + + // vertical + switch (this.opts.verticalAlign) { + case 'top': + this.y = this.opts.margin; + break + case 'middle': + this.y = this.opts.app.size.height / 2 - this.height / 2; + break + case 'bottom': + this.y = this.opts.app.size.height - this.opts.margin - this.height; + break + } + } + + /** + * Shows the message box. + * + * @private + */ + show() { + super.show(); + + if (this.opts.autoClose) { + window.setTimeout(() => { + this.hide(); + }, this.opts.duration * 1000); + } + } + } + /* global apollo, subscriptions, gql */ /** @@ -4015,10 +4055,7 @@ let dy = 0; let canvas = this.renderer.view; let context = canvas.getContext('webgl'); - if ( - context.drawingBufferWidth < canvas.width || - context.drawingBufferHeight < canvas.height - ) { + if (context.drawingBufferWidth < canvas.width || context.drawingBufferHeight < canvas.height) { extendWidth = context.drawingBufferWidth / canvas.width; extendHeight = context.drawingBufferHeight / canvas.height; //dx = wantedWidth - context.drawingBufferWidth @@ -4130,10 +4167,7 @@ console.log('App is in fullScreen mode or autoResize mode'); const resizeDebounced = debounce(event => this.resize(event), 50); window.addEventListener('resize', resizeDebounced); - document.body.addEventListener( - 'orientationchange', - this.checkOrientation.bind(this) - ); + document.body.addEventListener('orientationchange', this.checkOrientation.bind(this)); } if (monkeyPatchMapping) { console.log('Using monkey patched coordinate mapping'); @@ -4164,18 +4198,12 @@ uri: '/graphql' }); - const wsClient = new subscriptions.SubscriptionClient( - `wss://${location.hostname}/subscriptions`, - { - reconnect: true, - connectionParams: {} - } - ); + const wsClient = new subscriptions.SubscriptionClient(`wss://${location.hostname}/subscriptions`, { + reconnect: true, + connectionParams: {} + }); - const networkInterfaceWithSubscriptions = subscriptions.addGraphQLSubscriptions( - networkInterface, - wsClient - ); + const networkInterfaceWithSubscriptions = subscriptions.addGraphQLSubscriptions(networkInterface, wsClient); this.apolloClient = new apollo.ApolloClient({ networkInterface: networkInterfaceWithSubscriptions @@ -4311,10 +4339,7 @@ * @param {number} [opts.height=window.innerHeight] - The height of the app to resize to. * @return {PIXIApp} - Returns the PIXIApp for chaining. */ - resize( - event, - { width = window.innerWidth, height = window.innerHeight } = {} - ) { + resize(event, { width = window.innerWidth, height = window.innerHeight } = {}) { this.width = width; this.height = height; this.expandRenderer(); @@ -4335,8 +4360,7 @@ monkeyPatchPixiMapping() { if (this.originalMapPositionToPoint === null) { let interactionManager = this.renderer.plugins.interaction; - this.originalMapPositionToPoint = - interactionManager.mapPositionToPoint; + this.originalMapPositionToPoint = interactionManager.mapPositionToPoint; interactionManager.mapPositionToPoint = (point, x, y) => { return this.fixedMapPositionToPoint(point, x, y) }; @@ -4365,8 +4389,7 @@ if ( context !== null && - (context.drawingBufferWidth < canvas.width || - context.drawingBufferHeight < canvas.height) + (context.drawingBufferWidth < canvas.width || context.drawingBufferHeight < canvas.height) ) { extendWidth = context.drawingBufferWidth / canvas.width; extendHeight = context.drawingBufferHeight / canvas.height; @@ -4375,12 +4398,7 @@ } x *= extendWidth; y *= extendHeight; - return this.originalMapPositionToPoint.call( - interactionManager, - local, - x, - y + dy - ) + return this.originalMapPositionToPoint.call(interactionManager, local, x, y + dy) } /** @@ -4431,9 +4449,7 @@ * @return {Modal} Returns the Modal object. */ modal(opts = {}) { - let modal = new Modal( - Object.assign({ theme: this.theme }, opts, { app: this }) - ); + let modal = new Modal(Object.assign({ theme: this.theme }, opts, { app: this })); this.scene.addChild(modal); return modal @@ -4446,9 +4462,7 @@ * @return {Message} Returns the Message object. */ message(opts = {}) { - let message = new Message( - Object.assign({ theme: this.theme }, opts, { app: this }) - ); + let message = new Message(Object.assign({ theme: this.theme }, opts, { app: this })); this.scene.addChild(message); return message @@ -4467,11 +4481,7 @@ * @param {boolean} [opts.progress=false] - Should a progress bar display the loading status? * @return {PIXIApp} The PIXIApp object for chaining. */ - loadSprites( - resources, - loaded = null, - { resolutionDependent = true, progress = false } = {} - ) { + loadSprites(resources, loaded = null, { resolutionDependent = true, progress = false } = {}) { this.loadTextures( resources, textures => { @@ -4504,11 +4514,7 @@ * @param {boolean} [opts.progress=false] - Should a progress bar display the loading status? * @return {PIXIApp} The PIXIApp object for chaining. */ - loadTextures( - resources, - loaded = null, - { resolutionDependent = true, progress = false } = {} - ) { + loadTextures(resources, loaded = null, { resolutionDependent = true, progress = false } = {}) { if (!Array.isArray(resources)) { resources = [resources]; } @@ -4521,16 +4527,10 @@ let resolution = Math.round(this.renderer.resolution); switch (resolution) { case 2: - loader.add( - resource, - resource.replace(/\.([^.]*)$/, '@2x.$1') - ); + loader.add(resource, resource.replace(/\.([^.]*)$/, '@2x.$1')); break case 3: - loader.add( - resource, - resource.replace(/\.([^.]*)$/, '@3x.$1') - ); + loader.add(resource, resource.replace(/\.([^.]*)$/, '@3x.$1')); break default: loader.add(resource); @@ -4695,11 +4695,7 @@ pixiGlobal.x *= resolution; pixiGlobal.y *= resolution; // console.log("app.convertPointFromNodeToPage", pixiGlobal) - return window.convertPointFromNodeToPage( - app.view, - pixiGlobal.x, - pixiGlobal.y - ) + return window.convertPointFromNodeToPage(app.view, pixiGlobal.x, pixiGlobal.y) } } @@ -4832,9 +4828,7 @@ return this.tiltShiftXFilter.shape } set shape(value) { - this.tiltShiftXFilter.shape = this.tiltShiftYFilter.shape = this.normalize( - value - ); + this.tiltShiftXFilter.shape = this.tiltShiftYFilter.shape = this.normalize(value); } /** @@ -4953,12 +4947,7 @@ this.uniforms.circle = [shape.x, shape.y, shape.r]; } else { this.uniforms.shape = 2; - this.uniforms.rectangle = [ - shape.x, - shape.y, - shape.x + shape.width, - shape.y + shape.height - ]; + this.uniforms.rectangle = [shape.x, shape.y, shape.x + shape.width, shape.y + shape.height]; } this.uniforms.blur = blur; this.uniforms.delta = new PIXI.Point(0, 0); @@ -4992,12 +4981,7 @@ return new PIXI.Circle(circle[0], circle[1], circle[2]) } else { const rectangle = this.uniforms.rectangle; - return new PIXI.Rectangle( - rectangle[0], - rectangle[1], - rectangle[2], - rectangle[3] - ) + return new PIXI.Rectangle(rectangle[0], rectangle[1], rectangle[2], rectangle[3]) } } set shape(value) { @@ -5006,12 +4990,7 @@ this.uniforms.circle = [value.x, value.y, value.r]; } else { this.uniforms.shape = 2; - this.uniforms.rectangle = [ - value.x, - value.y, - value.x + value.width, - value.y + value.height - ]; + this.uniforms.rectangle = [value.x, value.y, value.x + value.width, value.y + value.height]; } } } @@ -5141,11 +5120,7 @@ } } - static setup({ - log = console.log, - warn = console.warn, - error = console.error - } = {}) { + static setup({ log = console.log, warn = console.warn, error = console.error } = {}) { logHandlers.log = log; logHandlers.warn = warn; logHandlers.error = error; @@ -5352,10 +5327,10 @@ delta() { let prev = []; let curr = []; - let cm = { x: 0, y: 0}; - let pm = { x: 0, y: 0}; + let cm = { x: 0, y: 0 }; + let pm = { x: 0, y: 0 }; let count = 0; - for(let key of this.current.keys()) { + for (let key of this.current.keys()) { if (this.previous.has(key)) { let p = this.previous.get(key); let c = this.current.get(key); @@ -5374,7 +5349,7 @@ let scaled = 0; let alpha = 0; let zoom = 1; - for(let i=0; i t1 + this.longPressTime; if (tookLong) { @@ -5656,10 +5599,7 @@ this.unregisterTap(key); } } - if ( - this.tapTimestamps.has(key) && - performance.now() > this.tapTimestamps.get(key) + this.tapDuration - ) { + if (this.tapTimestamps.has(key) && performance.now() > this.tapTimestamps.get(key) + this.tapDuration) { //console.log("tap too long") this.unregisterTap(key); } @@ -5684,11 +5624,7 @@ isLongPress(key) { let ended = this.ended.get(key); let start = this.start.get(key); - if ( - start && - ended && - Points.distance(ended, start) < this.tapDistance - ) { + if (start && ended && Points.distance(ended, start) < this.tapDistance) { let t1 = this.timestamps.get(key); let tookLong = performance.now() > t1 + this.longPressTime; if (tookLong) { @@ -5755,9 +5691,7 @@ setupInteraction() { if (this.debug) { - let error = this.targetInterface.implementationError( - this.target.constructor - ); + let error = this.targetInterface.implementationError(this.target.constructor); if (error != null) { throw new Error('Expected IInteractionTarget: ' + error) } @@ -5795,16 +5729,11 @@ element.addEventListener( 'pointermove', e => { - if (this.debug) - console.log('pointermove', e.pointerId, e.pointerType); + if (this.debug) console.log('pointermove', e.pointerId, e.pointerType); - if ( - e.pointerType == 'touch' || - (e.pointerType == 'mouse' && Events$1.isPointerDown(e)) - ) { + if (e.pointerType == 'touch' || (e.pointerType == 'mouse' && Events$1.isPointerDown(e))) { // this.capture(e) && - if (this.debug) - console.log('pointermove captured', e.pointerId); + if (this.debug) console.log('pointermove captured', e.pointerId); this.onMove(e); } }, @@ -5813,8 +5742,7 @@ element.addEventListener( 'pointerup', e => { - if (this.debug) - console.log('pointerup', e.pointerId, e.pointerType); + if (this.debug) console.log('pointerup', e.pointerId, e.pointerType); this.onEnd(e); if (this.capturePointerEvents) { try { @@ -5829,11 +5757,9 @@ element.addEventListener( 'pointercancel', e => { - if (this.debug) - console.log('pointercancel', e.pointerId, e.pointerType); + if (this.debug) console.log('pointercancel', e.pointerId, e.pointerType); this.onEnd(e); - if (this.capturePointerEvents) - element.releasePointerCapture(e.pointerId); + if (this.capturePointerEvents) element.releasePointerCapture(e.pointerId); }, useCapture ); @@ -5842,12 +5768,7 @@ element.addEventListener( 'pointerleave', e => { - if (this.debug) - console.log( - 'pointerleave', - e.pointerId, - e.pointerType - ); + if (this.debug) console.log('pointerleave', e.pointerId, e.pointerType); if (e.target == element) this.onEnd(e); }, useCapture @@ -5858,12 +5779,7 @@ element.addEventListener( 'pointerout', e => { - if (this.debug) - console.log( - 'pointerout', - e.pointerId, - e.pointerType - ); + if (this.debug) console.log('pointerout', e.pointerId, e.pointerType); if (e.target == element) this.onEnd(e); }, useCapture @@ -5874,13 +5790,7 @@ window.addEventListener( 'pointerout', e => { - if (this.debug) - console.log( - 'pointerout', - e.pointerId, - e.pointerType, - e.target - ); + if (this.debug) console.log('pointerout', e.pointerId, e.pointerType, e.target); if (e.target == element) { this.onEnd(e); } @@ -5893,8 +5803,7 @@ element.addEventListener( 'touchstart', e => { - if (this.debug) - console.log('touchstart', this.touchPoints(e)); + if (this.debug) console.log('touchstart', this.touchPoints(e)); if (this.capture(e)) { for (let touch of e.changedTouches) { this.onStart(touch); @@ -5906,8 +5815,7 @@ element.addEventListener( 'touchmove', e => { - if (this.debug) - console.log('touchmove', this.touchPoints(e), e); + if (this.debug) console.log('touchmove', this.touchPoints(e), e); for (let touch of e.changedTouches) { this.onMove(touch); } @@ -5930,12 +5838,7 @@ element.addEventListener( 'touchcancel', e => { - if (this.debug) - console.log( - 'touchcancel', - e.targetTouches.length, - e.changedTouches.length - ); + if (this.debug) console.log('touchcancel', e.targetTouches.length, e.changedTouches.length); for (let touch of e.changedTouches) { this.onEnd(touch); } @@ -5984,9 +5887,7 @@ e => { if (e.target == element) { this.onEnd(e); - console.warn( - "Shouldn't happen: mouseout ends interaction" - ); + console.warn("Shouldn't happen: mouseout ends interaction"); } }, useCapture @@ -6027,16 +5928,8 @@ } setupMouseWheelInteraction() { - this.mouseWheelElement.addEventListener( - 'mousewheel', - this.onMouseWheel.bind(this), - true - ); - this.mouseWheelElement.addEventListener( - 'DOMMouseScroll', - this.onMouseWheel.bind(this), - true - ); + this.mouseWheelElement.addEventListener('mousewheel', this.onMouseWheel.bind(this), true); + this.mouseWheelElement.addEventListener('DOMMouseScroll', this.onMouseWheel.bind(this), true); } onMouseWheel(event) { @@ -6098,10 +5991,7 @@ break } case 'Touch': { - let id = - event.touchType === 'stylus' - ? 'stylus' - : event.identifier.toString(); + let id = event.touchType === 'stylus' ? 'stylus' : event.identifier.toString(); result[id] = this.getPosition(event); break } @@ -6151,10 +6041,7 @@ let point = extracted[key]; let updated = this.interaction.update(key, point); if (updated) { - console.warn( - "new pointer in updateInteraction shouldn't happen", - key - ); + console.warn("new pointer in updateInteraction shouldn't happen", key); this.interactionStarted(event, key, point); } } @@ -6286,11 +6173,7 @@ onEnd(event) { let extracted = this.extractPoint(event, 'changedTouches'); this.endInteraction(event, extracted); - let mapped = this.interaction.mapInteraction( - extracted, - ['ended'], - this.mapPositionToPoint.bind(this) - ); + let mapped = this.interaction.mapInteraction(extracted, ['ended'], this.mapPositionToPoint.bind(this)); for (let [target, interaction] of mapped.entries()) { target.onEnd(event, interaction); } @@ -6324,10 +6207,7 @@ // convert to array types = Array.isArray(types) ? types : types.split(/\s/); - if ( - elements instanceof NodeList || - elements instanceof HTMLCollection - ) { + if (elements instanceof NodeList || elements instanceof HTMLCollection) { elements = Array.from(elements); } elements = Array.isArray(elements) ? elements : [elements]; @@ -6336,9 +6216,7 @@ const type = types[i].toLowerCase(); // list of hammer events - const useHammer = /^(tap|doubletap|press|pan|swipe|pinch|rotate).*$/.test( - type - ); + const useHammer = /^(tap|doubletap|press|pan|swipe|pinch|rotate).*$/.test(type); // if it is a hammer event if (useHammer) { @@ -6353,33 +6231,15 @@ // recognizers if (type.startsWith('pan')) { - hammer - .get('pan') - .set( - Object.assign( - { direction: Hammer.DIRECTION_ALL }, - opts - ) - ); + hammer.get('pan').set(Object.assign({ direction: Hammer.DIRECTION_ALL }, opts)); } else if (type.startsWith('pinch')) { - hammer - .get('pinch') - .set(Object.assign({ enable: true }, opts)); + hammer.get('pinch').set(Object.assign({ enable: true }, opts)); } else if (type.startsWith('press')) { hammer.get('press').set(opts); } else if (type.startsWith('rotate')) { - hammer - .get('rotate') - .set(Object.assign({ enable: true }, opts)); + hammer.get('rotate').set(Object.assign({ enable: true }, opts)); } else if (type.startsWith('swipe')) { - hammer - .get('swipe') - .set( - Object.assign( - { direction: Hammer.DIRECTION_ALL }, - opts - ) - ); + hammer.get('swipe').set(Object.assign({ direction: Hammer.DIRECTION_ALL }, opts)); } else if (type.startsWith('tap')) { hammer.get('tap').set(opts); } @@ -6450,20 +6310,12 @@ */ static get isElectron() { // Renderer process - if ( - typeof window !== 'undefined' && - typeof window.process === 'object' && - window.process.type === 'renderer' - ) { + if (typeof window !== 'undefined' && typeof window.process === 'object' && window.process.type === 'renderer') { return true } // Main process - if ( - typeof process !== 'undefined' && - typeof process.versions === 'object' && - !!process.versions.electron - ) { + if (typeof process !== 'undefined' && typeof process.versions === 'object' && !!process.versions.electron) { return true } @@ -6531,9 +6383,7 @@ class CapabilitiesTests { static testConfirm() { let bool = confirm('Please confirm'); - document.getElementById('demo').innerHTML = bool - ? 'Confirmed' - : 'Not confirmed'; + document.getElementById('demo').innerHTML = bool ? 'Confirmed' : 'Not confirmed'; } static testPrompt() { @@ -6554,9 +6404,7 @@ } static testMultiTouchTable() { - let value = - 'Is the device a multi-touch table? ' + - Capabilities.isMultiTouchTable; + let value = 'Is the device a multi-touch table? ' + Capabilities.isMultiTouchTable; multi_touch_table.innerHTML = value; } @@ -6617,14 +6465,7 @@ class ScatterEvent extends BaseEvent { constructor( target, - { - translate = { x: 0, y: 0 }, - scale = null, - rotate = 0, - about = null, - fast = false, - type = null - } = {} + { translate = { x: 0, y: 0 }, scale = null, rotate = 0, about = null, fast = false, type = null } = {} ) { super('scatterTransformed', { target: target }); this.translate = translate; @@ -6637,13 +6478,7 @@ toString() { return ( - "Event('scatterTransformed', scale: " + - this.scale + - ' about: ' + - this.about.x + - ', ' + - this.about.y + - ')' + "Event('scatterTransformed', scale: " + this.scale + ' about: ' + this.about.x + ', ' + this.about.y + ')' ) } } @@ -6663,13 +6498,7 @@ } toString() { - return ( - 'Event(scatterResized width: ' + - this.width + - 'height: ' + - this.height + - ')' - ) + return 'Event(scatterResized width: ' + this.width + 'height: ' + this.height + ')' } } @@ -6944,6 +6773,13 @@ close() { if (this.onClose) { this.onClose.forEach(callback => callback(this)); + + /** + Removes self from container when it's closed. + */ + if (this.container) { + this.container.remove(this); + } } } @@ -7077,10 +6913,7 @@ _checkAutoClose() { if (this.scaleAutoClose) - if ( - this.scale < - this.minScale + this.scaleCloseThreshold - this.scaleCloseBuffer - ) { + if (this.scale < this.minScale + this.scaleCloseThreshold - this.scaleCloseBuffer) { this.zoom(this.minScale, { animate: 0.2, onComplete: this.close.bind(this) @@ -7135,17 +6968,7 @@ this.move(delta, { animate: animate }); } - zoom( - scale, - { - animate = 0, - about = null, - delay = 0, - x = null, - y = null, - onComplete = null - } = {} - ) { + zoom(scale, { animate = 0, about = null, delay = 0, x = null, y = null, onComplete = null } = {}) { let anchor = about || this.center; if (scale != this.scale) { if (animate > 0) { @@ -7196,15 +7019,9 @@ let origin = this.rotationOrigin; let beta = Points.angle(origin, anchor); let distance = Points.distance(origin, anchor); - let { scale: newScale, zoom: thresholdedZoom } = this.calculateScale( - zoom - ); + let { scale: newScale, zoom: thresholdedZoom } = this.calculateScale(zoom); - let newOrigin = Points.arc( - anchor, - beta + rotate, - distance * thresholdedZoom - ); + let newOrigin = Points.arc(anchor, beta + rotate, distance * thresholdedZoom); let extra = Points.subtract(newOrigin, origin); let offset = Points.subtract(anchor, origin); this._move(offset); @@ -7267,10 +7084,8 @@ } calculateScaleTransparency() { - let transparency = - (this.scale - this.minScale) / this.scaleCloseThreshold; - transparency = - transparency > 1 ? 1 : transparency < 0 ? 0 : transparency; + let transparency = (this.scale - this.minScale) / this.scaleCloseThreshold; + transparency = transparency > 1 ? 1 : transparency < 0 ? 0 : transparency; return transparency } @@ -7328,8 +7143,7 @@ if (this.scaleAutoClose) { if (this.scale <= this.minScale + this.scaleCloseThreshold) { - if (this.scaleAutoCloseTimeout) - clearTimeout(this.scaleAutoCloseTimeout); + if (this.scaleAutoCloseTimeout) clearTimeout(this.scaleAutoCloseTimeout); this.scaleAutoCloseTimeout = setTimeout(() => { this._checkAutoClose(); }, 600); @@ -7870,10 +7684,8 @@ let resizeH = -r * Math.sin(Angle.degree2radian(phiCorrected)); if ( - (this.element.offsetWidth + resizeW) / this.scale > - (this.width * 0.5) / this.scale && - (this.element.offsetHeight + resizeH) / this.scale > - (this.height * 0.3) / this.scale + (this.element.offsetWidth + resizeW) / this.scale > (this.width * 0.5) / this.scale && + (this.element.offsetHeight + resizeH) / this.scale > (this.height * 0.3) / this.scale ) TweenLite.to(this.element, 0, { width: this.element.offsetWidth + resizeW / this.scale, @@ -8034,28 +7846,22 @@ frontLoaded(loader) { return new Promise((resolve, reject) => { - let scatter = new DOMScatter( - this.cardWrapper, - this.domScatterContainer, - { - x: loader.x, - y: loader.y, - startScale: loader.scale, - scale: loader.scale, - maxScale: loader.maxScale, - minScale: loader.minScale, - width: loader.wantedWidth, - height: loader.wantedHeight, - rotation: loader.rotation, - translatable: this.translatable, - scalable: this.scalable, - rotatable: this.rotatable, - overdoScaling: this.overdoScaling, - tapDelegate: this.tapDelegateFactory - ? this.tapDelegateFactory(this.cardWrapper) - : null - } - ); + let scatter = new DOMScatter(this.cardWrapper, this.domScatterContainer, { + x: loader.x, + y: loader.y, + startScale: loader.scale, + scale: loader.scale, + maxScale: loader.maxScale, + minScale: loader.minScale, + width: loader.wantedWidth, + height: loader.wantedHeight, + rotation: loader.rotation, + translatable: this.translatable, + scalable: this.scalable, + rotatable: this.rotatable, + overdoScaling: this.overdoScaling, + tapDelegate: this.tapDelegateFactory ? this.tapDelegateFactory(this.cardWrapper) : null + }); if (this.center) { scatter.centerAt(this.center); @@ -8072,9 +7878,7 @@ //Remove callback if (scatter.onTransform) { - let callbackIdx = scatter.onTransform.indexOf( - removeOnMinScale - ); + let callbackIdx = scatter.onTransform.indexOf(removeOnMinScale); scatter.onTransform.splice(callbackIdx, 1); } } @@ -8348,9 +8152,7 @@ this.flipped = !this.flipped; let targetY = this.flipped ? 180 : 0; - let targetZ = this.flipped - ? this.startAngle + this.targetRotation(this.startAngle) - : this.startAngle; + let targetZ = this.flipped ? this.startAngle + this.targetRotation(this.startAngle) : this.startAngle; let targetScale = this.flipped ? this.wantedScale : this.startScale; let w = this.flipped ? this.wantedWidth : this.startWidth; let h = this.flipped ? this.wantedHeight : this.startHeight; @@ -10480,15 +10282,9 @@ this.scatter = scatter; this.backLoader = backLoader; this.scatterLoader = new ScatterLoader(scatter); - this.domFlip = new DOMFlip( - domScatterContainer, - flipTemplate, - this.scatterLoader, - backLoader, - { - onBack: this.backCardClosed.bind(this) - } - ); + this.domFlip = new DOMFlip(domScatterContainer, flipTemplate, this.scatterLoader, backLoader, { + onBack: this.backCardClosed.bind(this) + }); this.setupInfoButton(); } @@ -10515,11 +10311,7 @@ let center = this.scatter.center; let canvas = app.renderer.view; let domNode = this.domFlip.domScatterContainer.element; - let page = window.convertPointFromNodeToPage( - canvas, - center.x * resolution, - center.y * resolution - ); + let page = window.convertPointFromNodeToPage(canvas, center.x * resolution, center.y * resolution); let local = window.convertPointFromPageToNode(domNode, page.x, page.y); return local } @@ -10599,9 +10391,7 @@ canvas.height = 44 * 4; svgImage.onload = e => { let displayObject = this.scatter.displayObject; - canvas - .getContext('2d') - .drawImage(svgImage, 0, 0, canvas.width, canvas.height); + canvas.getContext('2d').drawImage(svgImage, 0, 0, canvas.width, canvas.height); let texure = new PIXI.Texture(new PIXI.BaseTexture(canvas)); this.infoBtn = new PIXI.Sprite(texure); this.infoBtn.anchor.set(0.5, 0.5); @@ -10751,12 +10541,7 @@ // planes //-------------------- - this.setPlanes( - this.opts.focus, - this.opts.near, - this.opts.far, - this.opts.orthographic - ); + this.setPlanes(this.opts.focus, this.opts.near, this.opts.far, this.opts.orthographic); // flipped //-------------------- @@ -10795,9 +10580,7 @@ // shadow //-------------------- - const shadow = new PIXI.projection.Sprite3d( - PIXI.Texture.fromImage('../../assets/images/shadow.png') - ); + const shadow = new PIXI.projection.Sprite3d(PIXI.Texture.fromImage('../../assets/images/shadow.png')); shadow.renderable = false; shadow.anchor.set(0.5); shadow.scale3d.set(0.98); @@ -10889,21 +10672,11 @@ y: this.opts.useBackTransforms ? toCenter.y : fromCenter.y, anchorX: this.opts.useBackTransforms ? toObject.x : fromObject.x, anchorY: this.opts.useBackTransforms ? toObject.y : fromObject.y, - width: this.opts.useBackTransforms - ? toObject.width * 2 - : fromObject.width * 2, - height: this.opts.useBackTransforms - ? toObject.height * 2 - : fromObject.height * 2, - rotation: this.opts.useBackTransforms - ? toObject.rotation - : fromObject.rotation, - skewX: this.opts.useBackTransforms - ? toObject.skew.x - : fromObject.skew.x, - skewY: this.opts.useBackTransforms - ? toObject.skew.y - : fromObject.skew.y + width: this.opts.useBackTransforms ? toObject.width * 2 : fromObject.width * 2, + height: this.opts.useBackTransforms ? toObject.height * 2 : fromObject.height * 2, + rotation: this.opts.useBackTransforms ? toObject.rotation : fromObject.rotation, + skewX: this.opts.useBackTransforms ? toObject.skew.x : fromObject.skew.x, + skewY: this.opts.useBackTransforms ? toObject.skew.y : fromObject.skew.y }; // set toObject end values @@ -10989,15 +10762,11 @@ // shadow //-------------------- - new TimelineMax() - .to(shadow, half, { alpha: 0.3, ease }) - .to(shadow, half, { alpha: 0.7, ease }); + new TimelineMax().to(shadow, half, { alpha: 0.3, ease }).to(shadow, half, { alpha: 0.7, ease }); // blurfilter //-------------------- - new TimelineMax() - .to(blurFilter, half, { blur: 6, ease }) - .to(blurFilter, half, { blur: 0.2, ease }); + new TimelineMax().to(blurFilter, half, { blur: 6, ease }).to(blurFilter, half, { blur: 0.2, ease }); } /** @@ -11011,8 +10780,7 @@ const shadow = this.objects.shadow; const inner = this.objects.inner; - inner.position3d.z = - -Math.sin(inner.euler.y) * front.texture.baseTexture.width * 2; + inner.position3d.z = -Math.sin(inner.euler.y) * front.texture.baseTexture.width * 2; //this.objects.shadow.euler = this.objects.inner.euler shadow.euler.x = -inner.euler.x; @@ -11079,10 +10847,7 @@ generateTexture(displayObject) { // renderTexture //-------------------- - const renderTexture = PIXI.RenderTexture.create( - displayObject.width, - displayObject.height - ); + const renderTexture = PIXI.RenderTexture.create(displayObject.width, displayObject.height); // save position const transform = [ @@ -11169,12 +10934,8 @@ wordWrapWidth: width - this.padding * 2 }; - this.titleTextStyle = new PIXI.TextStyle( - Object.assign({}, style, titleStyle) - ); - this.textTextStyle = new PIXI.TextStyle( - Object.assign({}, style, textStyle) - ); + this.titleTextStyle = new PIXI.TextStyle(Object.assign({}, style, titleStyle)); + this.textTextStyle = new PIXI.TextStyle(Object.assign({}, style, textStyle)); if (title || text) { this.setup(); @@ -11197,10 +10958,7 @@ if (this.opts.text) { this.textText = new PIXI.Text(this.opts.text, this.textTextStyle); - this.textText.position.set( - this.padding, - this.titleY + this.titleHeight + this.padding - ); + this.textText.position.set(this.padding, this.titleY + this.titleHeight + this.padding); this.addChild(this.textText); } @@ -11414,12 +11172,8 @@ let y = 0; // @container: We need to call the constant values, as the container // gets resized, when a child moves outside the original boundaries. - let w = this.container - ? this.containerDimensions.x - : this.backgroundWidth || this.app.width; - let h = this.container - ? this.containerDimensions.y - : this.backgroundHeight || this.app.height; + let w = this.container ? this.containerDimensions.x : this.backgroundWidth || this.app.width; + let h = this.container ? this.containerDimensions.y : this.backgroundHeight || this.app.height; if (this.app.fullscreen && this.app.monkeyPatchMapping) { let fixed = this.mapPositionToPoint({ x: w, y: 0 }); @@ -11502,14 +11256,8 @@ // if (hit) { // console.log("findHitScatter", displayObject) // } - if ( - hit && - this.hitScatter === null && - typeof displayObject != undefined - ) { - this.hitScatter = displayObject.scatter - ? displayObject.scatter - : null; + if (hit && this.hitScatter === null && typeof displayObject != undefined) { + this.hitScatter = displayObject.scatter ? displayObject.scatter : null; } } @@ -11519,10 +11267,7 @@ let local = new PIXI.Point(); let interactionManager = this.renderer.plugins.interaction; interactionManager.mapPositionToPoint(local, point.x, point.y); - if ( - element instanceof DisplayObjectScatter && - element.displayObject.parent != null - ) { + if (element instanceof DisplayObjectScatter && element.displayObject.parent != null) { return element.displayObject.parent.toLocal(local) } return local @@ -11539,12 +11284,7 @@ this.hitScatter = null; let interactionManager = this.renderer.plugins.interaction; let fakeEvent = this.fakeInteractionEvent(local); - interactionManager.processInteractive( - fakeEvent, - this, - this.findHitScatter.bind(this), - true - ); + interactionManager.processInteractive(fakeEvent, this, this.findHitScatter.bind(this), true); if (this.claimEvents) event.claimedByScatter = this.hitScatter; return this.hitScatter } @@ -11558,8 +11298,7 @@ this.hitScatter = null; let interactionManager = this.renderer.plugins.interaction; let displayObject = interactionManager.hitTest(local, this); - if (displayObject != null && displayObject.scatter != null) - this.hitScatter = displayObject.scatter; + if (displayObject != null && displayObject.scatter != null) this.hitScatter = displayObject.scatter; if (this.claimEvents) event.claimedByScatter = this.hitScatter; return this.hitScatter } @@ -11694,8 +11433,7 @@ get container() { // return this.displayObject.parent let obj = this.displayObject; - while (obj.parent != null && !(obj.parent instanceof ScatterContainer)) - obj = obj.parent; + while (obj.parent != null && !(obj.parent instanceof ScatterContainer)) obj = obj.parent; return obj.parent } @@ -11804,8 +11542,7 @@ mapPositionToContainerPoint(point) { // UO: We need the coordinates related to this scatter in case // of nested scatters - if (this.container != null) - return this.container.mapPositionToPoint(point, this) + if (this.container != null) return this.container.mapPositionToPoint(point, this) return point } @@ -11818,10 +11555,7 @@ if (this.displayObject.parent instanceof ScatterContainer) { let scatterContainer = this.displayObject.parent; scatterContainer.bringToFront(this.displayObject); - } else if ( - this.displayObject.parent != null && - this.displayObject.parent.scatter - ) { + } else if (this.displayObject.parent != null && this.displayObject.parent.scatter) { this.displayObject.parent.scatter.toFront(this.displayObject); } } @@ -11970,21 +11704,9 @@ setupToolbar() { this.toolbar = new PIXI.Graphics(); - this.record = new RecordCommand( - this, - 0xcc0000, - new PIXI.Circle(0, 0, 16) - ); - this.play = new PlayCommand( - this, - 0x0000cc, - new PIXI.Polygon(0, 16, 32, 16 + 16, 0, 16 + 32, 0, 16) - ); - this.stop = new StopCommand( - this, - 0x0000cc, - new PIXI.Rectangle(0, 0, 32, 32) - ); + this.record = new RecordCommand(this, 0xcc0000, new PIXI.Circle(0, 0, 16)); + this.play = new PlayCommand(this, 0x0000cc, new PIXI.Polygon(0, 16, 32, 16 + 16, 0, 16 + 32, 0, 16)); + this.stop = new StopCommand(this, 0x0000cc, new PIXI.Rectangle(0, 0, 32, 32)); this.toolbar.addChild(this.record).position.set(44, 48); this.toolbar.addChild(this.play).position.set(44 + 44, 16); this.toolbar.addChild(this.stop).position.set(44 + 44 + 44 + 16, 32); @@ -12022,11 +11744,7 @@ mapPositionToPoint(point) { let local = new PIXI.Point(); - this.renderer.plugins.interaction.mapPositionToPoint( - local, - point.x, - point.y - ); + this.renderer.plugins.interaction.mapPositionToPoint(local, point.x, point.y); return local } @@ -12205,15 +11923,9 @@ let first = true; let lastPart = ''; for (let part of parts) { - let partMetrics = PIXI.TextMetrics.measureText( - part, - pixiStyle - ); + let partMetrics = PIXI.TextMetrics.measureText(part, pixiStyle); if (x + partMetrics.width + space.width > width) { - newWord += - (first || lastPart.endsWith('-') - ? '\n' - : '-\n') + part; + newWord += (first || lastPart.endsWith('-') ? '\n' : '-\n') + part; x = partMetrics.width; } else { newWord += part; @@ -12264,12 +11976,7 @@ * @param {canvas} * @memberof TextLabel */ - constructor( - text, - style = null, - canvas = null, - { minZoom = 0.1, maxZoom = 10 } = {} - ) { + constructor(text, style = null, canvas = null, { minZoom = 0.1, maxZoom = 10 } = {}) { super(text, style, canvas); this.normFontSize = this.style.fontSize; this.minZoom = minZoom; @@ -12418,21 +12125,11 @@ const truncatedLines = lines.slice(0, maxLines); const lastLine = truncatedLines[truncatedLines.length - 1]; const words = lastLine.split(' '); - const wordMetrics = PIXI.TextMetrics.measureText( - `\u00A0\n...\n${words.join('\n')}`, - pixiStyle - ); - const [ - spaceLength, - dotsLength, - ...wordLengths - ] = wordMetrics.lineWidths; + const wordMetrics = PIXI.TextMetrics.measureText(`\u00A0\n...\n${words.join('\n')}`, pixiStyle); + const [spaceLength, dotsLength, ...wordLengths] = wordMetrics.lineWidths; const { text: newLastLine } = wordLengths.reduce( (data, wordLength, i) => { - if ( - data.length + wordLength + spaceLength >= - wordWrapWidth - ) { + if (data.length + wordLength + spaceLength >= wordWrapWidth) { return { ...data, length: wordWrapWidth } } return { @@ -12633,24 +12330,13 @@ return date.toLocaleDateString('de', format) } - draw( - timeline, - range, - width, - height, - available, - format, - nextFormat, - level, - extraTicks = false - ) { + draw(timeline, range, width, height, available, format, nextFormat, level, extraTicks = false) { let first = null; let last = null; let keyedFormat = format ? format[this.formatKey] : null; let keyedNextFormat = nextFormat ? nextFormat[this.formatKey] : null; let redundant = nextFormat ? this.formatKey in nextFormat : false; - let fullyRedundant = - keyedFormat != null && keyedFormat == keyedNextFormat; + let fullyRedundant = keyedFormat != null && keyedFormat == keyedNextFormat; let y = timeline.getY(); for (let { start, end } of this.iterRanges(range)) { let x = timeline.toX(start); @@ -12675,12 +12361,7 @@ } if (!fullyRedundant) { - timeline.ensureLabel( - key, - text, - { x: xx, y: yy, align }, - FontInfo.small - ); + timeline.ensureLabel(key, text, { x: xx, y: yy, align }, FontInfo.small); } if (extraTicks) timeline.drawTick(x, -level); } @@ -12830,11 +12511,7 @@ } iterStart(start) { - return Dates.create( - start.getFullYear(), - start.getMonth(), - start.getDate() - ) + return Dates.create(start.getFullYear(), start.getMonth(), start.getDate()) } next(date) { @@ -12875,10 +12552,7 @@ let available = amount * size; availables.set(ticks, available); if (available < ticks.minWidth) break - formats.set( - ticks, - available < ticks.minLabelWidth ? null : ticks.format(available) - ); + formats.set(ticks, available < ticks.minLabelWidth ? null : ticks.format(available)); nextFormats.set(previous, formats.get(ticks)); previous = ticks; visible.push(ticks); @@ -12947,16 +12621,7 @@ } class Timeline extends BitmapLabeledGraphics { - constructor( - width, - height, - { - ticks = null, - baseLine = 0.5, - showRange = true, - throwDamping = 0.95 - } = {} - ) { + constructor(width, height, { ticks = null, baseLine = 0.5, showRange = true, throwDamping = 0.95 } = {}) { super(); this.wantedWidth = width; this.wantedHeight = height; @@ -12973,12 +12638,7 @@ this.deltas = []; this.labelDates = []; this.colorRanges = []; - this.rangeColors = new Cycle( - Colors.eminence, - Colors.steelblue, - Colors.ochre, - Colors.turquoise - ); + this.rangeColors = new Cycle(Colors.eminence, Colors.steelblue, Colors.ochre, Colors.turquoise); this.callbacks = []; this.onTapCallbacks = []; this.onDoubleTapCallbacks = []; @@ -12990,14 +12650,7 @@ this.autoScroll = false; this.direction = -1; this.throwDamping = throwDamping; - this.timeticks = - ticks || - new TimeTicks( - new DecadeTicks(), - new YearTicks(), - new MonthTicks(), - new DayTicks() - ); + this.timeticks = ticks || new TimeTicks(new DecadeTicks(), new YearTicks(), new MonthTicks(), new DayTicks()); this.labelPrefix = '__'; } @@ -13154,8 +12807,7 @@ prepareLabels() { for (let key of this.labels.keys()) { - if (!key.startsWith(this.labelPrefix)) - this.labels.get(key).visible = false; + if (!key.startsWith(this.labelPrefix)) this.labels.get(key).visible = false; } } @@ -13656,10 +13308,7 @@ * @readonly */ get contentWidth() { - return ( - this.options.boxWidth - - (this.isScrollbarVertical ? this.options.scrollbarSize : 0) - ) + return this.options.boxWidth - (this.isScrollbarVertical ? this.options.scrollbarSize : 0) } /** @@ -13668,10 +13317,7 @@ * @readonly */ get contentHeight() { - return ( - this.options.boxHeight - - (this.isScrollbarHorizontal ? this.options.scrollbarSize : 0) - ) + return this.options.boxHeight - (this.isScrollbarHorizontal ? this.options.scrollbarSize : 0) } /** @@ -13748,19 +13394,11 @@ this.scrollbar.clear(); let options = {}; options.left = 0; - options.right = - this.scrollWidth + - (this._isScrollbarVertical ? this.options.scrollbarSize : 0); + options.right = this.scrollWidth + (this._isScrollbarVertical ? this.options.scrollbarSize : 0); options.top = 0; - options.bottom = - this.scrollHeight + - (this.isScrollbarHorizontal ? this.options.scrollbarSize : 0); - const width = - this.scrollWidth + - (this.isScrollbarVertical ? this.options.scrollbarSize : 0); - const height = - this.scrollHeight + - (this.isScrollbarHorizontal ? this.options.scrollbarSize : 0); + options.bottom = this.scrollHeight + (this.isScrollbarHorizontal ? this.options.scrollbarSize : 0); + const width = this.scrollWidth + (this.isScrollbarVertical ? this.options.scrollbarSize : 0); + const height = this.scrollHeight + (this.isScrollbarHorizontal ? this.options.scrollbarSize : 0); this.scrollbarTop = (this.content.top / height) * this.boxHeight; this.scrollbarTop = this.scrollbarTop < 0 ? 0 : this.scrollbarTop; this.scrollbarHeight = (this.boxHeight / height) * this.boxHeight; @@ -13777,14 +13415,9 @@ : this.scrollbarWidth; if (this.isScrollbarVertical) { this.scrollbar - .beginFill( - this.options.scrollbarBackground, - this.options.scrollbarBackgroundAlpha - ) + .beginFill(this.options.scrollbarBackground, this.options.scrollbarBackgroundAlpha) .drawRect( - this.boxWidth - - this.scrollbarSize + - this.options.scrollbarOffsetVertical, + this.boxWidth - this.scrollbarSize + this.options.scrollbarOffsetVertical, 0, this.scrollbarSize, this.boxHeight @@ -13793,15 +13426,10 @@ } if (this.isScrollbarHorizontal) { this.scrollbar - .beginFill( - this.options.scrollbarBackground, - this.options.scrollbarBackgroundAlpha - ) + .beginFill(this.options.scrollbarBackground, this.options.scrollbarBackgroundAlpha) .drawRect( 0, - this.boxHeight - - this.scrollbarSize + - this.options.scrollbarOffsetHorizontal, + this.boxHeight - this.scrollbarSize + this.options.scrollbarOffsetHorizontal, this.boxWidth, this.scrollbarSize ) @@ -13809,14 +13437,9 @@ } if (this.isScrollbarVertical) { this.scrollbar - .beginFill( - this.options.scrollbarForeground, - this.options.scrollbarForegroundAlpha - ) + .beginFill(this.options.scrollbarForeground, this.options.scrollbarForegroundAlpha) .drawRect( - this.boxWidth - - this.scrollbarSize + - this.options.scrollbarOffsetVertical, + this.boxWidth - this.scrollbarSize + this.options.scrollbarOffsetVertical, this.scrollbarTop, this.scrollbarSize, this.scrollbarHeight @@ -13825,15 +13448,10 @@ } if (this.isScrollbarHorizontal) { this.scrollbar - .beginFill( - this.options.scrollbarForeground, - this.options.scrollbarForegroundAlpha - ) + .beginFill(this.options.scrollbarForeground, this.options.scrollbarForegroundAlpha) .drawRect( this.scrollbarLeft, - this.boxHeight - - this.scrollbarSize + - this.options.scrollbarOffsetHorizontal, + this.boxHeight - this.scrollbarSize + this.options.scrollbarOffsetHorizontal, this.scrollbarWidth, this.scrollbarSize ) @@ -13907,10 +13525,7 @@ const local = this.toLocal(e.data.global); if (this.isScrollbarHorizontal) { if (local.y > this.boxHeight - this.scrollbarSize) { - if ( - local.x >= this.scrollbarLeft && - local.x <= this.scrollbarLeft + this.scrollbarWidth - ) { + if (local.x >= this.scrollbarLeft && local.x <= this.scrollbarLeft + this.scrollbarWidth) { this.pointerDown = { type: 'horizontal', last: local }; } else { if (local.x > this.scrollbarLeft) { @@ -13929,10 +13544,7 @@ } if (this.isScrollbarVertical) { if (local.x > this.boxWidth - this.scrollbarSize) { - if ( - local.y >= this.scrollbarTop && - local.y <= this.scrollbarTop + this.scrollbarWidth - ) { + if (local.y >= this.scrollbarTop && local.y <= this.scrollbarTop + this.scrollbarWidth) { this.pointerDown = { type: 'vertical', last: local }; } else { if (local.y > this.scrollbarTop) { @@ -13992,26 +13604,15 @@ * @param {number} [options.scrollHeight] set the height of the inside of the scrollbox (leave null to use content.height) */ resize(options) { - this.options.boxWidth = - typeof options.boxWidth !== 'undefined' - ? options.boxWidth - : this.options.boxWidth; - this.options.boxHeight = - typeof options.boxHeight !== 'undefined' - ? options.boxHeight - : this.options.boxHeight; + this.options.boxWidth = typeof options.boxWidth !== 'undefined' ? options.boxWidth : this.options.boxWidth; + this.options.boxHeight = typeof options.boxHeight !== 'undefined' ? options.boxHeight : this.options.boxHeight; if (options.scrollWidth) { this.scrollWidth = options.scrollWidth; } if (options.scrollHeight) { this.scrollHeight = options.scrollHeight; } - this.content.resize( - this.options.boxWidth, - this.options.boxHeight, - this.scrollWidth, - this.scrollHeight - ); + this.content.resize(this.options.boxWidth, this.options.boxHeight, this.scrollWidth, this.scrollHeight); this.update(); } @@ -14263,12 +13864,8 @@ this.on('pointermove', e => { if (this.control.dragging) { - const moveX = this.control.event.data.getLocalPosition( - this.control.parent - ).x; - this._value = this.pixelToValue( - moveX - this.control.delta - this.opts.controlRadius - ); + const moveX = this.control.event.data.getLocalPosition(this.control.parent).x; + this._value = this.pixelToValue(moveX - this.control.delta - this.opts.controlRadius); let x = this.valueToPixel(this._value) + this.opts.controlRadius; this.control.x = x; @@ -14280,16 +13877,8 @@ if (container instanceof Element) { container.addEventListener('pointerup', e => this.onEnd(e), false); - container.addEventListener( - 'pointercancel', - e => this.onEnd(e), - false - ); - container.addEventListener( - 'pointerleave', - e => this.onEnd(e), - false - ); + container.addEventListener('pointercancel', e => this.onEnd(e), false); + container.addEventListener('pointerleave', e => this.onEnd(e), false); container.addEventListener('pointerout', e => this.onEnd(e), false); container.addEventListener('mouseup', e => this.onEnd(e), false); container.addEventListener('mousecancel', e => this.onEnd(e), false); @@ -14350,9 +13939,7 @@ if (this.sliderObj.pointerdowned) { this.sliderObj.pointerdowned = false; const position = e.data.getLocalPosition(this.control.parent); - this.value = this.pixelToValue( - position.x - this.opts.controlRadius - ); + this.value = this.pixelToValue(position.x - this.opts.controlRadius); TweenLite.to(this.control, this.theme.fast, { alpha: 0.83 }); } }); @@ -14412,11 +13999,7 @@ this.sliderObj.clear(); this.sliderObj.beginFill(0xffffff, 0); this.sliderObj.drawRect(0, 0, x + w + cr, cr * 2); - this.sliderObj.lineStyle( - this.opts.strokeWidth, - this.opts.stroke, - this.opts.strokeAlpha - ); + this.sliderObj.lineStyle(this.opts.strokeWidth, this.opts.stroke, this.opts.strokeAlpha); this.sliderObj.beginFill(this.opts.fill, this.opts.fillAlpha); this.sliderObj.moveTo(x, y); this.sliderObj.lineTo(x + w, y); @@ -14430,20 +14013,10 @@ // Draw control this.control.clear(); - this.control.lineStyle( - this.opts.controlStrokeWidth, - this.opts.controlStroke, - this.opts.controlStrokeAlpha - ); - this.control.beginFill( - this.opts.controlFill, - this.opts.controlFillAlpha - ); + this.control.lineStyle(this.opts.controlStrokeWidth, this.opts.controlStroke, this.opts.controlStrokeAlpha); + this.control.beginFill(this.opts.controlFill, this.opts.controlFillAlpha); this.control.drawCircle(0, 0, cr - 1); - this.control.beginFill( - this.opts.controlStroke, - this.opts.controlStrokeAlpha - ); + this.control.beginFill(this.opts.controlStroke, this.opts.controlStrokeAlpha); this.control.drawCircle(0, 0, cr / 6); this.control.endFill(); @@ -14481,10 +14054,7 @@ } else if (value > this.opts.max) { value = this.opts.max; } - return ( - (this.opts.width * (value - this.opts.min)) / - (this.opts.max - this.opts.min) - ) + return (this.opts.width * (value - this.opts.min)) / (this.opts.max - this.opts.min) } /** @@ -14500,10 +14070,7 @@ } else if (pixel > this.opts.width) { pixel = this.opts.width; } - return ( - this.opts.min + - ((this.opts.max - this.opts.min) * pixel) / this.opts.width - ) + return this.opts.min + ((this.opts.max - this.opts.min) * pixel) / this.opts.width } /** @@ -14704,10 +14271,7 @@ let identifier = event.data.identifier; if (typeof event.data.originalEvent.changedTouches !== 'undefined') { for (let touch of event.data.originalEvent.changedTouches) { - if ( - touch.identifier === identifier && - touch.touchType === 'stylus' - ) { + if (touch.identifier === identifier && touch.touchType === 'stylus') { this.tiltX = Angle.radian2degree(touch.azimuthAngle); this.tiltY = 90.0 - Angle.radian2degree(touch.altitudeAngle); return true @@ -14727,10 +14291,7 @@ let identifier = event.data.identifier; if (typeof event.data.originalEvent.changedTouches !== 'undefined') { for (let touch of event.data.originalEvent.changedTouches) { - if ( - touch.identifier === identifier && - touch.pointerType === 'touch' - ) { + if (touch.identifier === identifier && touch.pointerType === 'touch') { return true } } @@ -14767,8 +14328,7 @@ this.tiltY += 5; break } - if (this.debug) - console.log('keydown', e.keyCode, this.tiltX, this.tiltY); + if (this.debug) console.log('keydown', e.keyCode, this.tiltX, this.tiltY); }); this.on('pointerdown', e => { @@ -14782,15 +14342,9 @@ }); this.on('pointermove', e => { - if ( - Events$1.isPointerDown(e.data.originalEvent) || - this.isStylusPointer(e) || - this.isStylusTouch(e) - ) { - if (this.debug) - console.log('pointermove', e, this.eventInside(e)); - if (this.eventInside(e) && this.singlePointer()) - this.moveStroke(this.toStroke(e)); + if (Events$1.isPointerDown(e.data.originalEvent) || this.isStylusPointer(e) || this.isStylusTouch(e)) { + if (this.debug) console.log('pointermove', e, this.eventInside(e)); + if (this.eventInside(e) && this.singlePointer()) this.moveStroke(this.toStroke(e)); } }); this.on('pointerup', e => { @@ -14905,11 +14459,7 @@ this.moveTo(start.x, start.y); for (let i = 1; i < stroke.length; i++) { let info = stroke[i]; - this.lineStyle( - this.tiltToLineWidth(info.tiltY), - info.color, - this.colorAlpha - ); + this.lineStyle(this.tiltToLineWidth(info.tiltY), info.color, this.colorAlpha); this.lineTo(info.x, info.y); } this.endFill(); @@ -15167,10 +14717,8 @@ opts ); - this.opts.controlRadius = - this.opts.controlRadius || this.opts.height / 2; - this.opts.controlRadiusActive = - this.opts.controlRadiusActive || this.opts.controlRadius; + this.opts.controlRadius = this.opts.controlRadius || this.opts.height / 2; + this.opts.controlRadiusActive = this.opts.controlRadiusActive || this.opts.controlRadius; // Validation //----------------- @@ -15332,32 +14880,15 @@ draw() { this.switchObj.clear(); if (this.active) { - this.switchObj.lineStyle( - this.opts.strokeActiveWidth, - this.opts.strokeActive, - this.opts.strokeActiveAlpha - ); - this.switchObj.beginFill( - this.opts.fillActive, - this.opts.fillActiveAlpha - ); + this.switchObj.lineStyle(this.opts.strokeActiveWidth, this.opts.strokeActive, this.opts.strokeActiveAlpha); + this.switchObj.beginFill(this.opts.fillActive, this.opts.fillActiveAlpha); } else { - this.switchObj.lineStyle( - this.opts.strokeWidth, - this.opts.stroke, - this.opts.strokeAlpha - ); + this.switchObj.lineStyle(this.opts.strokeWidth, this.opts.stroke, this.opts.strokeAlpha); this.switchObj.beginFill(this.opts.fill, this.opts.fillAlpha); } this.switchObj.moveTo(this.radius, 0); this.switchObj.lineTo(this.opts.width - this.radius, 0); - this.switchObj.arcTo( - this.opts.width, - 0, - this.opts.width, - this.radius, - this.radius - ); + this.switchObj.arcTo(this.opts.width, 0, this.opts.width, this.radius, this.radius); this.switchObj.lineTo(this.opts.width, this.radius + 1); // BUGFIX: If not specified, there is a small area without a stroke. this.switchObj.arcTo( this.opts.width, @@ -15379,21 +14910,11 @@ this.opts.controlStrokeActive, this.opts.controlStrokeActiveAlpha ); - this.control.beginFill( - this.opts.controlFillActive, - this.opts.controlFillActiveAlpha - ); + this.control.beginFill(this.opts.controlFillActive, this.opts.controlFillActiveAlpha); this.control.drawCircle(0, 0, this.opts.controlRadiusActive - 1); } else { - this.control.lineStyle( - this.opts.controlStrokeWidth, - this.opts.controlStroke, - this.opts.controlStrokeAlpha - ); - this.control.beginFill( - this.opts.controlFill, - this.opts.controlFillAlpha - ); + this.control.lineStyle(this.opts.controlStrokeWidth, this.opts.controlStroke, this.opts.controlStrokeAlpha); + this.control.beginFill(this.opts.controlFill, this.opts.controlFillAlpha); this.control.drawCircle(0, 0, this.opts.controlRadius - 1); } this.control.endFill(); @@ -15409,24 +14930,11 @@ */ drawAnimated() { this.switchObj.clear(); - this.switchObj.lineStyle( - this.tempAnimated.strokeWidth, - this.tempAnimated.stroke, - this.tempAnimated.strokeAlpha - ); - this.switchObj.beginFill( - this.tempAnimated.fill, - this.tempAnimated.fillAlpha - ); + this.switchObj.lineStyle(this.tempAnimated.strokeWidth, this.tempAnimated.stroke, this.tempAnimated.strokeAlpha); + this.switchObj.beginFill(this.tempAnimated.fill, this.tempAnimated.fillAlpha); this.switchObj.moveTo(this.radius, 0); this.switchObj.lineTo(this.opts.width - this.radius, 0); - this.switchObj.arcTo( - this.opts.width, - 0, - this.opts.width, - this.radius, - this.radius - ); + this.switchObj.arcTo(this.opts.width, 0, this.opts.width, this.radius, this.radius); this.switchObj.lineTo(this.opts.width, this.radius + 1); // BUGFIX: If not specified, there is a small area without a stroke. this.switchObj.arcTo( this.opts.width, @@ -15446,10 +14954,7 @@ this.tempAnimated.controlStroke, this.tempAnimated.controlStrokeAlpha ); - this.control.beginFill( - this.tempAnimated.controlFill, - this.tempAnimated.controlFillAlpha - ); + this.control.beginFill(this.tempAnimated.controlFill, this.tempAnimated.controlFillAlpha); this.control.drawCircle(0, 0, this.tempAnimated.controlRadius - 1); this.control.endFill(); @@ -15652,10 +15157,7 @@ let object = null; if (item.label) { - object = new PIXI.Text( - item.label, - item.textStyle || this.opts.textStyle - ); + object = new PIXI.Text(item.label, item.textStyle || this.opts.textStyle); } else { object = item.content; } @@ -15857,7 +15359,7 @@ } } - /* globals */ + /* globals ThrowPropsPlugin, Strong */ /** * Class that represents a PixiJS List. @@ -15964,9 +15466,7 @@ if (this.opts.app) { const app = this.opts.app; app.view.addEventListener('mousewheel', event => { - const bounds = this.mask - ? this.mask.getBounds() - : this.getBounds(); + const bounds = this.mask ? this.mask.getBounds() : this.getBounds(); const x = event.clientX - app.view.getBoundingClientRect().left; const y = event.clientY - app.view.getBoundingClientRect().top; if (bounds.contains(x, y)) { @@ -16023,14 +15523,10 @@ if (this.opts.orientation === 'vertical') { switch (this.opts.align) { case 'center': - this.__items.forEach( - it => (it.x = margin + this.width / 2 - it.width / 2) - ); + this.__items.forEach(it => (it.x = margin + this.width / 2 - it.width / 2)); break case 'right': - this.__items.forEach( - it => (it.x = margin + this.width - it.width) - ); + this.__items.forEach(it => (it.x = margin + this.width - it.width)); break default: this.__items.forEach(it => (it.x = margin)); @@ -16056,14 +15552,10 @@ this.__items.forEach(it => (it.y = margin)); break case 'bottom': - this.__items.forEach( - it => (it.y = margin + this.height - it.height) - ); + this.__items.forEach(it => (it.y = margin + this.height - it.height)); break default: - this.__items.forEach( - it => (it.y = margin + this.height / 2 - it.height / 2) - ); + this.__items.forEach(it => (it.y = margin + this.height / 2 - it.height / 2)); break } @@ -16197,8 +15689,7 @@ { throwProps, ease: Strong.easeOut, - onComplete: () => - ThrowPropsPlugin.untrack(this.container.position) + onComplete: () => ThrowPropsPlugin.untrack(this.container.position) }, 0.8, 0.4 @@ -16219,20 +15710,14 @@ this.container.position.x -= event.deltaX; if (this.container.position.x > 0) { this.container.position.x = 0; - } else if ( - this.container.position.x + this.innerWidth < - this.opts.width - ) { + } else if (this.container.position.x + this.innerWidth < this.opts.width) { this.container.position.x = this.opts.width - this.innerWidth; } } else { this.container.position.y -= event.deltaY; if (this.container.position.y > 0) { this.container.position.y = 0; - } else if ( - this.container.position.y + this.innerHeight < - this.opts.height - ) { + } else if (this.container.position.y + this.innerHeight < this.opts.height) { this.container.position.y = this.opts.height - this.innerHeight; } } @@ -16244,10 +15729,7 @@ * @param {event|PIXI.InteractionEvent} event - The PIXI event to capture. */ capture(event) { - const originalEvent = - event.data && event.data.originalEvent - ? event.data.originalEvent - : event; + const originalEvent = event.data && event.data.originalEvent ? event.data.originalEvent : event; Events$1.capturedBy(originalEvent, this); } } diff --git a/doc/out/AbstractPopup.html b/doc/out/AbstractPopup.html index 938d746..820f387 100644 --- a/doc/out/AbstractPopup.html +++ b/doc/out/AbstractPopup.html @@ -2912,7 +2912,7 @@ a string, a number or a PIXI.Text object.

diff --git a/doc/out/Badge.html b/doc/out/Badge.html index 1d623cb..256eb6d 100644 --- a/doc/out/Badge.html +++ b/doc/out/Badge.html @@ -2368,7 +2368,7 @@ a string, a number or a PIXI.Text object.

diff --git a/doc/out/BlurFilter.html b/doc/out/BlurFilter.html index 9514f8d..c756b66 100644 --- a/doc/out/BlurFilter.html +++ b/doc/out/BlurFilter.html @@ -1792,7 +1792,7 @@ app.scene.filters = [blurFilter]
diff --git a/doc/out/Button.html b/doc/out/Button.html index 130f6df..be55d43 100644 --- a/doc/out/Button.html +++ b/doc/out/Button.html @@ -3810,7 +3810,7 @@ the tint property of the icon sprite.

diff --git a/doc/out/ButtonGroup.html b/doc/out/ButtonGroup.html index 30aaabf..4d044ba 100644 --- a/doc/out/ButtonGroup.html +++ b/doc/out/ButtonGroup.html @@ -1465,7 +1465,7 @@ @@ -1811,6 +1811,110 @@ or a Theme object.

+ + + maxWidth + + + + + +number + + + + + + + + + + + + + + + optional + + + + + +

The maximum width of the buttongroup. Only used if stacked is true and the orientation is horizontal.

+ + + + + + + maxHeight + + + + + +number + + + + + + + + + + + + + + + optional + + + + + +

The maximum height of the buttongroup. Only used if stacked is true and the orientation is vertical.

+ + + + + + + stacked + + + + + +boolean + + + + + + + + + false + + + + + + + + optional + + + + + +

If set to true, the buttons of the buttongroup gets stacked if they are broader or higher than the maximum permitted width or height, depending on orientation.

+ + + + padding @@ -2889,7 +2993,7 @@ app.scene.addChild(buttonGroup) @@ -2994,7 +3098,7 @@ app.scene.addChild(buttonGroup) @@ -3099,7 +3203,7 @@ app.scene.addChild(buttonGroup) @@ -3206,7 +3310,7 @@ app.scene.addChild(buttonGroup)
diff --git a/doc/out/DeepZoomImage.html b/doc/out/DeepZoomImage.html index 2ac1c23..c5ae944 100644 --- a/doc/out/DeepZoomImage.html +++ b/doc/out/DeepZoomImage.html @@ -5090,7 +5090,7 @@ i.e. after loading a single tile

diff --git a/doc/out/DeepZoomInfo.html b/doc/out/DeepZoomInfo.html index fecf0d4..91440e4 100644 --- a/doc/out/DeepZoomInfo.html +++ b/doc/out/DeepZoomInfo.html @@ -2603,7 +2603,7 @@ on completion.

diff --git a/doc/out/Flippable.html b/doc/out/Flippable.html index 4b6c486..23f8325 100644 --- a/doc/out/Flippable.html +++ b/doc/out/Flippable.html @@ -2506,7 +2506,7 @@ front.on('click', event => flippable.toggle())
diff --git a/doc/out/FontInfo.html b/doc/out/FontInfo.html index d0b9130..89cfd33 100644 --- a/doc/out/FontInfo.html +++ b/doc/out/FontInfo.html @@ -1553,7 +1553,7 @@
diff --git a/doc/out/Hypenate.html b/doc/out/Hypenate.html index c018c72..8caa036 100644 --- a/doc/out/Hypenate.html +++ b/doc/out/Hypenate.html @@ -1755,7 +1755,7 @@
diff --git a/doc/out/InteractivePopup.html b/doc/out/InteractivePopup.html index 358e7ac..f30ff13 100644 --- a/doc/out/InteractivePopup.html +++ b/doc/out/InteractivePopup.html @@ -2337,7 +2337,7 @@ a string, a number or a PIXI.Text object.

diff --git a/doc/out/LabeledGraphics.exports.LabeledGraphics.html b/doc/out/LabeledGraphics.exports.LabeledGraphics.html index e64996c..3da8a63 100644 --- a/doc/out/LabeledGraphics.exports.LabeledGraphics.html +++ b/doc/out/LabeledGraphics.exports.LabeledGraphics.html @@ -1555,7 +1555,7 @@
diff --git a/doc/out/LabeledGraphics.html b/doc/out/LabeledGraphics.html index 14e6732..60fe437 100644 --- a/doc/out/LabeledGraphics.html +++ b/doc/out/LabeledGraphics.html @@ -2620,7 +2620,7 @@ than wanted

diff --git a/doc/out/List.html b/doc/out/List.html index 2250f6d..b266a23 100644 --- a/doc/out/List.html +++ b/doc/out/List.html @@ -2579,7 +2579,7 @@ app.scene.addChild(list)
diff --git a/doc/out/Message.html b/doc/out/Message.html index aea87a6..94dab65 100644 --- a/doc/out/Message.html +++ b/doc/out/Message.html @@ -2435,7 +2435,7 @@ a string, a number or a PIXI.Text object.

diff --git a/doc/out/MessageInteractivePopup.html b/doc/out/MessageInteractivePopup.html index 495f1b2..dcfa46c 100644 --- a/doc/out/MessageInteractivePopup.html +++ b/doc/out/MessageInteractivePopup.html @@ -1783,7 +1783,7 @@ like Popup, Message...

diff --git a/doc/out/MessageMessageInteractivePopup.html b/doc/out/MessageMessageInteractivePopup.html index 1aaf8e4..e185f98 100644 --- a/doc/out/MessageMessageInteractivePopup.html +++ b/doc/out/MessageMessageInteractivePopup.html @@ -1783,7 +1783,7 @@ like Popup, Message...

diff --git a/doc/out/Modal.html b/doc/out/Modal.html index 09b033f..1fde7b1 100644 --- a/doc/out/Modal.html +++ b/doc/out/Modal.html @@ -2336,7 +2336,7 @@ a string or a PIXI.Text object.

diff --git a/doc/out/ModalInteractivePopup.html b/doc/out/ModalInteractivePopup.html index fdaf3e1..66912f6 100644 --- a/doc/out/ModalInteractivePopup.html +++ b/doc/out/ModalInteractivePopup.html @@ -1783,7 +1783,7 @@ like Popup, Message...

diff --git a/doc/out/ModalModalInteractivePopup.html b/doc/out/ModalModalInteractivePopup.html index 96e34e2..d1240d2 100644 --- a/doc/out/ModalModalInteractivePopup.html +++ b/doc/out/ModalModalInteractivePopup.html @@ -1783,7 +1783,7 @@ like Popup, Message...

diff --git a/doc/out/PIXIApp.html b/doc/out/PIXIApp.html index 6888662..493ea4c 100644 --- a/doc/out/PIXIApp.html +++ b/doc/out/PIXIApp.html @@ -5737,7 +5737,7 @@ rejected with an error.
diff --git a/doc/out/Popup.html b/doc/out/Popup.html index a7139d1..a45036d 100644 --- a/doc/out/Popup.html +++ b/doc/out/Popup.html @@ -2330,7 +2330,7 @@ a string, a number or a PIXI.Text object.

diff --git a/doc/out/PopupInteractivePopup.html b/doc/out/PopupInteractivePopup.html index c32d641..32214d8 100644 --- a/doc/out/PopupInteractivePopup.html +++ b/doc/out/PopupInteractivePopup.html @@ -1783,7 +1783,7 @@ like Popup, Message...

diff --git a/doc/out/PopupMenu.html b/doc/out/PopupMenu.html index 95d90a8..46cbfda 100644 --- a/doc/out/PopupMenu.html +++ b/doc/out/PopupMenu.html @@ -2384,7 +2384,7 @@ a string, a number or a PIXI.Text object.

diff --git a/doc/out/PopupMenuPopupInteractivePopup.html b/doc/out/PopupMenuPopupInteractivePopup.html index fb28912..6ee94a1 100644 --- a/doc/out/PopupMenuPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupInteractivePopup.html @@ -1783,7 +1783,7 @@ like Popup, Message...

diff --git a/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html b/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html index 34a86bc..1b98cd1 100644 --- a/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html @@ -1783,7 +1783,7 @@ like Popup, Message...

diff --git a/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html b/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html index 04b4996..b004e22 100644 --- a/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html @@ -1783,7 +1783,7 @@ like Popup, Message...

diff --git a/doc/out/PopupMenuPopupPopupInteractivePopup.html b/doc/out/PopupMenuPopupPopupInteractivePopup.html index 9fb5615..ee3893d 100644 --- a/doc/out/PopupMenuPopupPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupPopupInteractivePopup.html @@ -1783,7 +1783,7 @@ like Popup, Message...

diff --git a/doc/out/PopupPopupInteractivePopup.html b/doc/out/PopupPopupInteractivePopup.html index f2535ed..541d817 100644 --- a/doc/out/PopupPopupInteractivePopup.html +++ b/doc/out/PopupPopupInteractivePopup.html @@ -1783,7 +1783,7 @@ like Popup, Message...

diff --git a/doc/out/Progress.html b/doc/out/Progress.html index 81b3498..53fb59f 100644 --- a/doc/out/Progress.html +++ b/doc/out/Progress.html @@ -2869,7 +2869,7 @@ app.scene.addChild(progress)
diff --git a/doc/out/Scrollview.html b/doc/out/Scrollview.html index 30dd5f4..78ebf74 100644 --- a/doc/out/Scrollview.html +++ b/doc/out/Scrollview.html @@ -1701,7 +1701,7 @@ app.loader
diff --git a/doc/out/Slider.html b/doc/out/Slider.html index 0837f2e..d63ae73 100644 --- a/doc/out/Slider.html +++ b/doc/out/Slider.html @@ -2960,7 +2960,7 @@ app.scene.addChild(slider)
diff --git a/doc/out/Switch.html b/doc/out/Switch.html index 9e9d798..6a9af41 100644 --- a/doc/out/Switch.html +++ b/doc/out/Switch.html @@ -3390,7 +3390,7 @@ app.scene.addChild(switch1)
diff --git a/doc/out/TextLabel.TextLabel.html b/doc/out/TextLabel.TextLabel.html index 9ade891..81c2102 100644 --- a/doc/out/TextLabel.TextLabel.html +++ b/doc/out/TextLabel.TextLabel.html @@ -1684,7 +1684,7 @@
diff --git a/doc/out/Theme.html b/doc/out/Theme.html index a144eef..a89dec8 100644 --- a/doc/out/Theme.html +++ b/doc/out/Theme.html @@ -3159,7 +3159,7 @@ const app = new PIXIApp({
diff --git a/doc/out/ThemeDark.html b/doc/out/ThemeDark.html index d6780a8..a47446e 100644 --- a/doc/out/ThemeDark.html +++ b/doc/out/ThemeDark.html @@ -1580,7 +1580,7 @@ const app = new PIXIApp({
diff --git a/doc/out/ThemeLight.html b/doc/out/ThemeLight.html index 2da33fd..6243a05 100644 --- a/doc/out/ThemeLight.html +++ b/doc/out/ThemeLight.html @@ -1592,7 +1592,7 @@ const app = new PIXIApp({
diff --git a/doc/out/ThemeRed.html b/doc/out/ThemeRed.html index c95b6ac..6dd17bb 100644 --- a/doc/out/ThemeRed.html +++ b/doc/out/ThemeRed.html @@ -1592,7 +1592,7 @@ const app = new PIXIApp({
diff --git a/doc/out/TileQuadNode.html b/doc/out/TileQuadNode.html index 23880b0..0cf4d32 100644 --- a/doc/out/TileQuadNode.html +++ b/doc/out/TileQuadNode.html @@ -2044,7 +2044,7 @@ an indicator of tiles to free.

diff --git a/doc/out/Tooltip.html b/doc/out/Tooltip.html index 7fc26e5..bab9c61 100644 --- a/doc/out/Tooltip.html +++ b/doc/out/Tooltip.html @@ -2506,7 +2506,7 @@ a string, a number or a PIXI.Text object.

diff --git a/doc/out/UITest.html b/doc/out/UITest.html index 8a3bb49..81fc6de 100644 --- a/doc/out/UITest.html +++ b/doc/out/UITest.html @@ -4177,7 +4177,7 @@ test.start()
diff --git a/doc/out/Volatile.html b/doc/out/Volatile.html index ee09a08..c6ec282 100644 --- a/doc/out/Volatile.html +++ b/doc/out/Volatile.html @@ -2093,7 +2093,7 @@ app.scene.addChild(button)
diff --git a/doc/out/global.html b/doc/out/global.html index ce1d837..80927d6 100644 --- a/doc/out/global.html +++ b/doc/out/global.html @@ -3314,7 +3314,7 @@
diff --git a/doc/out/index.html b/doc/out/index.html index 4d36a1e..ea12301 100644 --- a/doc/out/index.html +++ b/doc/out/index.html @@ -1479,7 +1479,7 @@
diff --git a/doc/out/pixi_abstractpopup.js.html b/doc/out/pixi_abstractpopup.js.html index d938b46..1a76339 100644 --- a/doc/out/pixi_abstractpopup.js.html +++ b/doc/out/pixi_abstractpopup.js.html @@ -1825,7 +1825,7 @@ export default class AbstractPopup extends PIXI.Graphics {
diff --git a/doc/out/pixi_app.js.html b/doc/out/pixi_app.js.html index 82b3b27..e389d6f 100644 --- a/doc/out/pixi_app.js.html +++ b/doc/out/pixi_app.js.html @@ -2227,7 +2227,7 @@ class FpsDisplay extends PIXI.Graphics {
diff --git a/doc/out/pixi_badge.js.html b/doc/out/pixi_badge.js.html index bc0f61b..4c0b1aa 100644 --- a/doc/out/pixi_badge.js.html +++ b/doc/out/pixi_badge.js.html @@ -1571,7 +1571,7 @@ export default class Badge extends AbstractPopup {
diff --git a/doc/out/pixi_blurfilter.js.html b/doc/out/pixi_blurfilter.js.html index 3e43189..def5bd9 100644 --- a/doc/out/pixi_blurfilter.js.html +++ b/doc/out/pixi_blurfilter.js.html @@ -1738,7 +1738,7 @@ class TiltShiftYFilter extends TiltShiftAxisFilter {
diff --git a/doc/out/pixi_button.js.html b/doc/out/pixi_button.js.html index b9e3dde..e253390 100644 --- a/doc/out/pixi_button.js.html +++ b/doc/out/pixi_button.js.html @@ -2182,7 +2182,7 @@ export default class Button extends PIXI.Container {
diff --git a/doc/out/pixi_buttongroup.js.html b/doc/out/pixi_buttongroup.js.html index 663cb6f..f2fc08f 100644 --- a/doc/out/pixi_buttongroup.js.html +++ b/doc/out/pixi_buttongroup.js.html @@ -1479,6 +1479,9 @@ export default class ButtonGroup extends PIXI.Graphics { * or a Theme object. * @param {number} [opts.minWidth=44] - Button: The minimum width of one button. * @param {number} [opts.minHeight=44] - Button: The minimum height of one button. + * @param {number} [opts.maxWidth] - The maximum width of the buttongroup. Only used if stacked is true and the orientation is horizontal. + * @param {number} [opts.maxHeight] - The maximum height of the buttongroup. Only used if stacked is true and the orientation is vertical. + * @param {boolean} [opts.stacked=false] - If set to true, the buttons of the buttongroup gets stacked if they are broader or higher than the maximum permitted width or height, depending on orientation. * @param {number} [opts.padding=Theme.padding] - Button: The inner spacing (distance from icon and/or label) the the border. * @param {number} [opts.margin=Theme.margin] - The outer spacing (distance from one button to the previous/next button). * @param {string} [opts.iconPosition=left] - Button: The position of the icon in relation to the label. Can be left or right. @@ -1821,7 +1824,7 @@ export default class ButtonGroup extends PIXI.Graphics {
diff --git a/doc/out/pixi_deepzoom_image.js.html b/doc/out/pixi_deepzoom_image.js.html index 6541224..71af321 100644 --- a/doc/out/pixi_deepzoom_image.js.html +++ b/doc/out/pixi_deepzoom_image.js.html @@ -2545,7 +2545,7 @@ export class DeepZoomImage extends PIXI.Container {
diff --git a/doc/out/pixi_flippable.js.html b/doc/out/pixi_flippable.js.html index 2d66435..1cbc58e 100644 --- a/doc/out/pixi_flippable.js.html +++ b/doc/out/pixi_flippable.js.html @@ -1925,7 +1925,7 @@ export default class Flippable extends PIXI.projection.Camera3d {
diff --git a/doc/out/pixi_labeledgraphics.js.html b/doc/out/pixi_labeledgraphics.js.html index d1be3f5..8b7cec0 100644 --- a/doc/out/pixi_labeledgraphics.js.html +++ b/doc/out/pixi_labeledgraphics.js.html @@ -1870,7 +1870,7 @@ export class BitmapLabeledGraphics extends LabeledGraphics {
diff --git a/doc/out/pixi_list.js.html b/doc/out/pixi_list.js.html index fd54631..02088ee 100644 --- a/doc/out/pixi_list.js.html +++ b/doc/out/pixi_list.js.html @@ -1848,7 +1848,7 @@ export default class List extends PIXI.Container {
diff --git a/doc/out/pixi_message.js.html b/doc/out/pixi_message.js.html index d1093f6..cd9656f 100644 --- a/doc/out/pixi_message.js.html +++ b/doc/out/pixi_message.js.html @@ -1579,7 +1579,7 @@ export default class Message extends InteractivePopup {
diff --git a/doc/out/pixi_modal.js.html b/doc/out/pixi_modal.js.html index 1588b6a..27ff089 100644 --- a/doc/out/pixi_modal.js.html +++ b/doc/out/pixi_modal.js.html @@ -1661,7 +1661,7 @@ export default class Modal extends PIXI.Container {
diff --git a/doc/out/pixi_popup.js.html b/doc/out/pixi_popup.js.html index a140d09..3480ce7 100644 --- a/doc/out/pixi_popup.js.html +++ b/doc/out/pixi_popup.js.html @@ -1688,7 +1688,7 @@ export default class Popup extends InteractivePopup {
diff --git a/doc/out/pixi_popupmenu.js.html b/doc/out/pixi_popupmenu.js.html index 9c5d94b..459e922 100644 --- a/doc/out/pixi_popupmenu.js.html +++ b/doc/out/pixi_popupmenu.js.html @@ -1574,7 +1574,7 @@ export default class PopupMenu extends Popup {
diff --git a/doc/out/pixi_progress.js.html b/doc/out/pixi_progress.js.html index 67d8359..a34a025 100644 --- a/doc/out/pixi_progress.js.html +++ b/doc/out/pixi_progress.js.html @@ -1779,7 +1779,7 @@ export default class Progress extends PIXI.Container {
diff --git a/doc/out/pixi_scrollview.js.html b/doc/out/pixi_scrollview.js.html index b953d5b..9d50649 100644 --- a/doc/out/pixi_scrollview.js.html +++ b/doc/out/pixi_scrollview.js.html @@ -1512,7 +1512,7 @@ export default class Scrollview extends Scrollbox {
diff --git a/doc/out/pixi_slider.js.html b/doc/out/pixi_slider.js.html index a36eaa2..5f250f8 100644 --- a/doc/out/pixi_slider.js.html +++ b/doc/out/pixi_slider.js.html @@ -1951,7 +1951,7 @@ export default class Slider extends PIXI.Container {
diff --git a/doc/out/pixi_switch.js.html b/doc/out/pixi_switch.js.html index 8f0ffe6..1cebd3a 100644 --- a/doc/out/pixi_switch.js.html +++ b/doc/out/pixi_switch.js.html @@ -2016,7 +2016,7 @@ export default class Switch extends PIXI.Container {
diff --git a/doc/out/pixi_theme.js.html b/doc/out/pixi_theme.js.html index 0c6d67a..3cb870e 100644 --- a/doc/out/pixi_theme.js.html +++ b/doc/out/pixi_theme.js.html @@ -1713,7 +1713,7 @@ export class ThemeRed extends Theme {
diff --git a/doc/out/pixi_tooltip.js.html b/doc/out/pixi_tooltip.js.html index b880d59..2ab5d2e 100644 --- a/doc/out/pixi_tooltip.js.html +++ b/doc/out/pixi_tooltip.js.html @@ -1605,7 +1605,7 @@ export default class Tooltip extends AbstractPopup {
diff --git a/doc/out/pixi_volatile.js.html b/doc/out/pixi_volatile.js.html index f8d7566..f5914db 100644 --- a/doc/out/pixi_volatile.js.html +++ b/doc/out/pixi_volatile.js.html @@ -1609,7 +1609,7 @@ export default class Volatile {
diff --git a/doc/out/uitest.js.html b/doc/out/uitest.js.html index 01e3689..96bed1c 100644 --- a/doc/out/uitest.js.html +++ b/doc/out/uitest.js.html @@ -2547,7 +2547,7 @@ class Event {
diff --git a/lib/bootstrap.js b/lib/bootstrap.js index e94bff0..9bcf68a 100644 --- a/lib/bootstrap.js +++ b/lib/bootstrap.js @@ -1,9 +1,6 @@ class Bootstrap extends Object { static get isSafari() { - return ( - /Safari/.test(navigator.userAgent) && - /Apple Computer, Inc/.test(navigator.vendor) - ) + return /Safari/.test(navigator.userAgent) && /Apple Computer, Inc/.test(navigator.vendor) } static get isModernSafari() { @@ -78,11 +75,7 @@ class Bootstrap extends Object { }, null ) - } else if ( - this.isModernSafari || - this.isModernChrome || - this.isModernFirefox - ) { + } else if (this.isModernSafari || this.isModernChrome || this.isModernFirefox) { this.load(src, callback) } else { this.load( @@ -129,8 +122,7 @@ class Bootstrap extends Object { baseURL: baseUrl, map: { 'plugin-babel': baseUrl + '/3rdparty/systemjs/plugin-babel.js', - 'systemjs-babel-build': - baseUrl + '/3rdparty/systemjs/systemjs-babel-browser.js' + 'systemjs-babel-build': baseUrl + '/3rdparty/systemjs/systemjs-babel-browser.js' }, transpiler: 'plugin-babel', meta: { diff --git a/lib/bundle.js b/lib/bundle.js index c64ef03..47c3355 100755 --- a/lib/bundle.js +++ b/lib/bundle.js @@ -2,15 +2,7 @@ import App from './app.js' import Doctest from './doctest.js' import Errors from './errors.js' import Events from './events.js' -import { - DOMFlip, - DOMFlippable, - CardLoader, - PDFLoader, - ImageLoader, - FrameLoader, - HTMLLoader -} from './flippable.js' +import { DOMFlip, DOMFlippable, CardLoader, PDFLoader, ImageLoader, FrameLoader, HTMLLoader } from './flippable.js' import Index from './index.js' import Interface from './interface.js' import Logging from './logging.js' diff --git a/lib/capabilities.js b/lib/capabilities.js index 1317a18..e64c17f 100644 --- a/lib/capabilities.js +++ b/lib/capabilities.js @@ -45,20 +45,12 @@ export class Capabilities { */ static get isElectron() { // Renderer process - if ( - typeof window !== 'undefined' && - typeof window.process === 'object' && - window.process.type === 'renderer' - ) { + if (typeof window !== 'undefined' && typeof window.process === 'object' && window.process.type === 'renderer') { return true } // Main process - if ( - typeof process !== 'undefined' && - typeof process.versions === 'object' && - !!process.versions.electron - ) { + if (typeof process !== 'undefined' && typeof process.versions === 'object' && !!process.versions.electron) { return true } @@ -126,9 +118,7 @@ export class Capabilities { export class CapabilitiesTests { static testConfirm() { let bool = confirm('Please confirm') - document.getElementById('demo').innerHTML = bool - ? 'Confirmed' - : 'Not confirmed' + document.getElementById('demo').innerHTML = bool ? 'Confirmed' : 'Not confirmed' } static testPrompt() { @@ -149,9 +139,7 @@ export class CapabilitiesTests { } static testMultiTouchTable() { - let value = - 'Is the device a multi-touch table? ' + - Capabilities.isMultiTouchTable + let value = 'Is the device a multi-touch table? ' + Capabilities.isMultiTouchTable multi_touch_table.innerHTML = value } diff --git a/lib/card/card.js b/lib/card/card.js index d70b53d..30a7b4c 100644 --- a/lib/card/card.js +++ b/lib/card/card.js @@ -32,8 +32,7 @@ export default class Card { console.log('Setup Card...', modules) context.modules = [] modules.forEach(module => { - if (module.apply(context)) - context.modules.push(module.constructor.name) + if (module.apply(context)) context.modules.push(module.constructor.name) }) } @@ -138,10 +137,7 @@ export default class Card { event.stopPropagation() if (callStack) callStack.call(that, ...args) else { - console.error( - 'Could not call callback function ' + attributeVal, - ...args - ) + console.error('Could not call callback function ' + attributeVal, ...args) } }) } @@ -168,9 +164,7 @@ export default class Card { /<\s*(a|video|img|image|circle)\s(.*?)(xlink:href|href|src)\s*=\s*["'](\..*?)["']\s*(.*?)>/g, function(data) { let path = that._getRelativePath(arguments[4]) - const tag = `<${arguments[1]} ${arguments[2]} ${ - arguments[3] - }="${path}" ${arguments[5]}>` + const tag = `<${arguments[1]} ${arguments[2]} ${arguments[3]}="${path}" ${arguments[5]}>` /* if (that.debug) */ console.log('Adjusted: ', tag) return tag } @@ -328,16 +322,13 @@ export default class Card { //Test if meanwhile another popup was registered... this._getPopup(context) || // Or if an highlight was loaded, if the highlight already was closed. - (highlight !== null && - !this._isHighlightActive(context, highlight)) + (highlight !== null && !this._isHighlightActive(context, highlight)) ) { //.. if so remove the create popup instantly. popup.remove() } else { // Otherwise set the popup regularly. - let popupParagraphs = popup.element.querySelectorAll( - '.popupContent > *' - ) + let popupParagraphs = popup.element.querySelectorAll('.popupContent > *') // Remove a design error of naming two adjacent elements popup. // Todo: fix this properly and remove this code. @@ -388,8 +379,7 @@ export default class Card { * @memberof Card */ static _createPopup(context, position, content, options = {}) { - if (this.debug) - console.log('Create Popup.', context, position, content, options) + if (this.debug) console.log('Create Popup.', context, position, content, options) let popup = new Popup( Object.assign( { @@ -482,9 +472,7 @@ export default class Card { node = event.target } if (local == null) { - let globalClick = event.center - ? event.center - : { x: event.x, y: event.y } + let globalClick = event.center ? event.center : { x: event.x, y: event.y } local = Points.fromPageToNode(context, globalClick) } if (this.debug) console.log('loadPopup', event) @@ -517,17 +505,11 @@ export default class Card { // Extract the body from the Popup site. let parser = new DOMParser() - let popupPage = parser.parseFromString( - xhr.responseText, - 'text/html' - ) + let popupPage = parser.parseFromString(xhr.responseText, 'text/html') //Fix the relative path of loaded images in the popup. popupPage.querySelectorAll('img').forEach(node => { - node.setAttribute( - 'src', - that._getRelativePath(node.getAttribute('src')) - ) + node.setAttribute('src', that._getRelativePath(node.getAttribute('src'))) }) let html = popupPage.body.innerHTML /** @@ -549,18 +531,10 @@ export default class Card { Card._cleanup(context) if (!isSame) { - Card._activateCorrespondingHighlights( - context, - node, - parentArticle - ) + Card._activateCorrespondingHighlights(context, node, parentArticle) let callback = (popup, callback) => { - if (this.debug) - console.log( - 'Close popup (Editable = ' + editable + ').', - popup - ) + if (this.debug) console.log('Close popup (Editable = ' + editable + ').', popup) if (editable) { let isDirty = mainController.askSaveNode() if (isDirty) @@ -596,8 +570,7 @@ export default class Card { } //console.log("onreadystatechange", editable) if (editable) { - if (this.debug) - console.log('pushController', src, popup.insertedNode) + if (this.debug) console.log('pushController', src, popup.insertedNode) mainController.pushController(popup.insertedNode, src) } } @@ -627,10 +600,7 @@ export default class Card { } if (correspondingHighlights.length > 0) { for (let highlight of correspondingHighlights) { - if ( - highlight.parentNode && - highlight.parentNode.nodeName.toLowerCase() == 'g' - ) { + if (highlight.parentNode && highlight.parentNode.nodeName.toLowerCase() == 'g') { Highlight.openHighlight(highlight, { animation: Card.highlightAnimation }) @@ -729,10 +699,7 @@ export default class Card { let matrix = node.getCTM() let point = svgPoint.matrixTransform(matrix) - let global = Points.fromNodeToPage( - node.closest('div'), - point - ) + let global = Points.fromNodeToPage(node.closest('div'), point) let local = Points.fromPageToNode(context, global) let overlay = document.createElement('div') @@ -778,16 +745,12 @@ export default class Card { xhr.onreadystatechange = () => { if (xhr.readyState == 4) { if (xhr.status == 200 || xhr.status == 0) { - let html = this.postProcessResponseText( - xhr.responseText - ) + let html = this.postProcessResponseText(xhr.responseText) let selector = Card.popupHtmlSelector let content = { html: html.body.innerHTML, selector } resolve(content) } else { - reject( - ` Popup request failed (Code: ${xhr.status}): Could not load resource: ${src}` - ) + reject(` Popup request failed (Code: ${xhr.status}): Could not load resource: ${src}`) } } } @@ -802,8 +765,7 @@ export default class Card { let editable = Card.isEditable() if (editable) { - if (node.classList.contains('zoomable-icon')) - this._openZoomable(event) + if (node.classList.contains('zoomable-icon')) this._openZoomable(event) return } this._openZoomable(event) @@ -852,10 +814,7 @@ export default class Card { globalBottomRight = Points.fromNodeToPage(zoomable, globalBottomRight) let globalFigurePos = Points.fromNodeToPage(zoomable, { x: 0, y: 0 }) let localFigurePos = Points.fromPageToNode(wrapper, globalFigurePos) - let relativeBottomRight = Points.fromPageToNode( - zoomable, - globalBottomRight - ) + let relativeBottomRight = Points.fromPageToNode(zoomable, globalBottomRight) let width = relativeBottomRight.x + @@ -969,12 +928,8 @@ export default class Card { }) let zoomedFigStyle = window.getComputedStyle(zoomedFig) - let borderX = - parseFloat(zoomedFigStyle.borderLeftWidth) + - parseFloat(zoomedFigStyle.borderRightWidth) - let borderY = - parseFloat(zoomedFigStyle.borderBottomWidth) + - parseFloat(zoomedFigStyle.borderTopWidth) + let borderX = parseFloat(zoomedFigStyle.borderLeftWidth) + parseFloat(zoomedFigStyle.borderRightWidth) + let borderY = parseFloat(zoomedFigStyle.borderBottomWidth) + parseFloat(zoomedFigStyle.borderTopWidth) const scaleFactor = 2 const transformOrigin = 'bottom right' @@ -1026,14 +981,7 @@ export default class Card { .to(zoomCaption, this.animation.fade, { autoAlpha: 1 }) - } else - this._openZoomableEditorBehaviour( - wrapper, - img, - zoomable, - zoomedFig, - current - ) + } else this._openZoomableEditorBehaviour(wrapper, img, zoomable, zoomedFig, current) } /** @@ -1066,13 +1014,7 @@ export default class Card { return parent.querySelector('.icon') } - static _openZoomableEditorBehaviour( - wrapper, - img, - zoomable, - zoomedFig, - current - ) { + static _openZoomableEditorBehaviour(wrapper, img, zoomable, zoomedFig, current) { let zoomContainer = document.createElement('div') let zoomIcon = zoomable.querySelector('.zoom-icon') zoomContainer.style.position = 'relative' @@ -1166,8 +1108,7 @@ export default class Card { * @memberof Card */ static closeZoomable(context, zoomable, zoomedFig) { - if (this.debug) - console.log('Close Zoomable', context, zoomable, zoomedFig) + if (this.debug) console.log('Close Zoomable', context, zoomable, zoomedFig) if (zoomable) { this._unsetZoomable(context) @@ -1218,13 +1159,7 @@ export default class Card { * @param {*} src - The src of the expanded element * @param {*} callback - A callback that is called when the expanded element is closed */ - static expandIndexCard( - card, - html, - tagName = 'article', - src = null, - callback = null - ) { + static expandIndexCard(card, html, tagName = 'article', src = null, callback = null) { let editable = Card.isEditable() let context = this.getContext(card) @@ -1257,10 +1192,7 @@ export default class Card { let globalPreviewRect = Card._getGlobalRect(card) let globalIndexCardRect = Card._getGlobalRect(indexbox) - let localOrigin = Points.fromPageToNode( - indexbox, - Rect.getPosition(globalPreviewRect) - ) + let localOrigin = Points.fromPageToNode(indexbox, Rect.getPosition(globalPreviewRect)) let scaleX = globalPreviewRect.width / globalIndexCardRect.width let scaleY = globalPreviewRect.height / globalIndexCardRect.height @@ -1331,15 +1263,12 @@ export default class Card { let cardName = strparts[strparts.length - 1] strparts = card.className.split(' ') let cardType = strparts[1] - let msg = - 'Card: ' + cardID + ': openTopic: ' + cardType + ', ' + cardName + let msg = 'Card: ' + cardID + ': openTopic: ' + cardType + ', ' + cardName console.log('Logging:', msg) Logging.log(msg) } - let desiredBorderBottomWidth = parseInt( - window.getComputedStyle(titlebar).borderBottomWidth - ) + let desiredBorderBottomWidth = parseInt(window.getComputedStyle(titlebar).borderBottomWidth) TweenLite.to(clone, Card.animation.articleTransition, { x: -padding, y: -padding, @@ -1360,8 +1289,7 @@ export default class Card { }) // Retain the border at same visual thickness. - titlebar.style.borderBottomWidth = - desiredBorderBottomWidth / transform.scaleY + 'px' + titlebar.style.borderBottomWidth = desiredBorderBottomWidth / transform.scaleY + 'px' } }) @@ -1384,13 +1312,7 @@ export default class Card { let cardName = strparts[strparts.length - 1] strparts = card.className.split(' ') let cardType = strparts[1] - let msg = - 'Card: ' + - cardID + - ': closeTopic: ' + - cardType + - ', ' + - cardName + let msg = 'Card: ' + cardID + ': closeTopic: ' + cardType + ', ' + cardName console.log('Logging:', msg) Logging.log(msg) } @@ -1457,8 +1379,7 @@ export default class Card { }) // Retain the border at same visual thickness. - titlebar.style.borderBottomWidth = - desiredBorderBottomWidth / transform.scaleY + 'px' + titlebar.style.borderBottomWidth = desiredBorderBottomWidth / transform.scaleY + 'px' } }) } @@ -1468,9 +1389,7 @@ export default class Card { if (iconClone == null) { iconClone = clone.querySelector('.cardicon') - console.warn( - "Legacy selector. Change it to 'card-icon' and find a more suitable name." - ) + console.warn("Legacy selector. Change it to 'card-icon' and find a more suitable name.") } if (iconClone.tagName == 'img') { @@ -1478,11 +1397,7 @@ export default class Card { } //console.log("ICON: ", iconClone) iconClone.classList.remove('info') - iconClone.classList.add( - 'close', - 'view-button', - 'transparent-background' - ) + iconClone.classList.add('close', 'view-button', 'transparent-background') // We append the icon clone to the subcard-content. // Then it's always on the content and not on the background @@ -1589,13 +1504,7 @@ export default class Card { // card.insertAdjacentElement('afterbegin', article) // TweenLite.set(article, { autoAlpha: 0 }) - Card.expandIndexCard( - card, - parsedHTML, - 'article', - relativeSource, - saveCallback - ) + Card.expandIndexCard(card, parsedHTML, 'article', relativeSource, saveCallback) } } xhr.onerror = () => { @@ -1632,9 +1541,7 @@ export default class Card { let dom = child.closest('.info-card') if (!dom) { dom = child.querySelector('.wrapper') - console.warn( - "Change the 'wrapper' class to 'info-card' it's more suitable." - ) + console.warn("Change the 'wrapper' class to 'info-card' it's more suitable.") } return dom // (dom == null) ? document.body : dom } @@ -1782,9 +1689,7 @@ export default class Card { if (indexbox != null) { // column != null || let links = Array.from(indexbox.getElementsByTagName('a')) - let globalClick = event.center - ? event.center - : { x: event.x, y: event.y } + let globalClick = event.center ? event.center : { x: event.x, y: event.y } let localClick = Points.fromPageToNode(indexbox, globalClick) let linkRects = links.map(link => { @@ -1819,16 +1724,9 @@ export default class Card { let closestLinkIndex = distances.indexOf(Math.min(...distances)) let closestLink = links[closestLinkIndex] - console.log( - 'finding closest links', - closestLink, - closestLink.getClientRects() - ) + console.log('finding closest links', closestLink, closestLink.getClientRects()) - if ( - distances[closestLinkIndex] < 44 && - closestLink.getAttribute('href') - ) { + if (distances[closestLinkIndex] < 44 && closestLink.getAttribute('href')) { // Adapt context and local position let context = this.getContext(closestLink) let local = Points.fromPageToNode(context, globalClick) diff --git a/lib/card/highlight.js b/lib/card/highlight.js index b80aac9..7accac8 100644 --- a/lib/card/highlight.js +++ b/lib/card/highlight.js @@ -60,10 +60,7 @@ export default class Highlight extends Object { if (circle.classList.length == 0) { circle.removeAttribute('class') } - if ( - circle.hasAttribute('id') && - circle.getAttribute('id').startsWith('@@') - ) { + if (circle.hasAttribute('id') && circle.getAttribute('id').startsWith('@@')) { circle.removeAttribute('id') } circle.removeAttribute('data-svg-origin') @@ -78,10 +75,7 @@ export default class Highlight extends Object { } } - static expand( - obj, - { scale = 2, duration = 3, stroke = 2, onComplete = null } = {} - ) { + static expand(obj, { scale = 2, duration = 3, stroke = 2, onComplete = null } = {}) { if (obj == null) return //console.log("expand") obj.classList.add('zooming') @@ -166,9 +160,7 @@ export default class Highlight extends Object { this.shrink(maskImage, { stroke }) return } - let circles = Array.from(circleGroup.children).filter( - e => e.tagName == 'circle' - ) + let circles = Array.from(circleGroup.children).filter(e => e.tagName == 'circle') for (let c of circles) { //console.log("shrinking all circles") this.shrink(c, { stroke }) @@ -188,10 +180,7 @@ export default class Highlight extends Object { return false } - static openHighlight( - target, - { animation = 0.5, scale = 2, onExpanded = null } = {} - ) { + static openHighlight(target, { animation = 0.5, scale = 2, onExpanded = null } = {}) { if (Highlight._isExpanded(target)) { console.log('Target is already expanded!') return @@ -205,10 +194,7 @@ export default class Highlight extends Object { let image = parent.querySelector(imageId) if (image) { this._bringToFront(image) - } else - console.error( - 'Could not find corresponding image element.' - ) + } else console.error('Could not find corresponding image element.') } else console.log('Element was no parent:', target) } this._bringToFront(target) @@ -253,12 +239,7 @@ export default class Highlight extends Object { if (target && parent) { parent.removeChild(target) parent.appendChild(target) - } else - console.error( - 'Could not bring to front. Either no target or no parent.', - target, - parent - ) + } else console.error('Could not bring to front. Either no target or no parent.', target, parent) } static _getSVGMask(circle, { svgRoot = null, image = null } = {}) { @@ -293,10 +274,7 @@ export default class Highlight extends Object { * @returns * @memberof Highlight */ - static _createSVGMask( - element, - { svgRoot = null, image = null, id = null } = {} - ) { + static _createSVGMask(element, { svgRoot = null, image = null, id = null } = {}) { // We can fetch these values here, but it's more efficient to // simply pass them in, as it's likely they were already retrieved beforehand. if (svgRoot == null) svgRoot = element.closest('svg') diff --git a/lib/card/plugin.js b/lib/card/plugin.js index 9d38249..519245f 100644 --- a/lib/card/plugin.js +++ b/lib/card/plugin.js @@ -48,10 +48,7 @@ export class CardPluginBase { } _getVerificationFunctions(context) { - return [ - this._verifyContext.bind(this, context), - this._verifyRequirements.bind(this, context) - ] + return [this._verifyContext.bind(this, context), this._verifyRequirements.bind(this, context)] } _verifyContext(context) { @@ -139,11 +136,7 @@ CardPlugin.EnlargeableThumbnail = class EnlargeableThumbnail extends CardPluginB constructor( wrapperSelector, overlaySelector = null, - { - zoomAnimationDuration = 0.4, - fadeAnimationDuration = 0.4, - interactionType = 'tap' - } = {} + { zoomAnimationDuration = 0.4, fadeAnimationDuration = 0.4, interactionType = 'tap' } = {} ) { super() this.wrapperSelector = wrapperSelector @@ -160,14 +153,7 @@ CardPlugin.EnlargeableThumbnail = class EnlargeableThumbnail extends CardPluginB _getVerificationFunctions(context) { let arr = super._getVerificationFunctions(context) - let funcs = [ - this._verifyElementsExist.bind( - this, - context, - this.wrapperSelector, - this.overlaySelector - ) - ] + let funcs = [this._verifyElementsExist.bind(this, context, this.wrapperSelector, this.overlaySelector)] return arr.concat(funcs) } @@ -252,9 +238,7 @@ CardPlugin.EnlargeableThumbnail = class EnlargeableThumbnail extends CardPluginB * The minor side should not exceed the height of the context window. */ const maxMinorSize = - context.offsetHeight - - 2 * parseInt(headerStlye.paddingTop) - - 2 * parseInt(headerStlye.marginTop) + context.offsetHeight - 2 * parseInt(headerStlye.paddingTop) - 2 * parseInt(headerStlye.marginTop) const max = { width: context.offsetWidth * maxFillRatio, @@ -284,10 +268,7 @@ CardPlugin.EnlargeableThumbnail = class EnlargeableThumbnail extends CardPluginB // const minorImageSize = getImageSize(minorSide) let ratio = getImageSize(minorSide) / getImageSize(majorSide) - let size = - majorImageSize > max[majorSide.name] - ? max[majorSide.name] - : majorImageSize + let size = majorImageSize > max[majorSide.name] ? max[majorSide.name] : majorImageSize if (size * ratio > maxMinorSize) { size = maxMinorSize / ratio @@ -298,10 +279,7 @@ CardPlugin.EnlargeableThumbnail = class EnlargeableThumbnail extends CardPluginB height: 0 } - let position = Points.fromPageToNode( - context, - Points.fromNodeToPage(source, { x: 0, y: 0 }) - ) + let position = Points.fromPageToNode(context, Points.fromNodeToPage(source, { x: 0, y: 0 })) let targetOffset = { x: 0, @@ -312,13 +290,9 @@ CardPlugin.EnlargeableThumbnail = class EnlargeableThumbnail extends CardPluginB targetDimensions[minorSide.name] = size * ratio targetOffset[majorSide.axis] = - (context['offset' + capitalize(majorSide.name)] - - targetDimensions[majorSide.name]) / - 2 + (context['offset' + capitalize(majorSide.name)] - targetDimensions[majorSide.name]) / 2 targetOffset[minorSide.axis] = - (context['offset' + capitalize(minorSide.name)] - - targetDimensions[minorSide.name]) / - 2 + (context['offset' + capitalize(minorSide.name)] - targetDimensions[minorSide.name]) / 2 overlay.appendChild(imageWrapper) @@ -358,18 +332,14 @@ CardPlugin.EnlargeableThumbnail = class EnlargeableThumbnail extends CardPluginB } getBorderHeight(style) { - const borderWidth = - parseInt(style.borderTopWidth) + parseInt(style.borderBottomWidth) - const padding = - parseInt(style.paddingTop) + parseInt(style.paddingBottom) + const borderWidth = parseInt(style.borderTopWidth) + parseInt(style.borderBottomWidth) + const padding = parseInt(style.paddingTop) + parseInt(style.paddingBottom) return parseInt(style.width) + borderWidth + padding } getBorderWidth(style) { - const borderWidth = - parseInt(style.borderLeftWidth) + parseInt(style.borderRightWidth) - const padding = - parseInt(style.paddingLeft) + parseInt(style.paddingRight) + const borderWidth = parseInt(style.borderLeftWidth) + parseInt(style.borderRightWidth) + const padding = parseInt(style.paddingLeft) + parseInt(style.paddingRight) return parseInt(style.width) + borderWidth + padding } @@ -404,16 +374,12 @@ CardPlugin.Ui = class UiPlugin extends CardPluginBase { _doesParentExist(context, parent) { if (parent == null) return true let valid = context.querySelector(parent) != null - if (!valid) - console.error('Could not find parent on context.', context, parent) + if (!valid) console.error('Could not find parent on context.', context, parent) return valid } append(context) { - parent = - this.parent == null - ? context - : context.querySelector(this.parent).appendChild(container) + parent = this.parent == null ? context : context.querySelector(this.parent).appendChild(container) let container = document.createElement('div') container.className = this.className parent.appendChild(container) @@ -513,15 +479,8 @@ CardPlugin.Speech = class SpeechPlugin extends CardPluginBase { utterance.onboundary = () => { console.log('onboundary', node.innerText) - if ( - this.currentText.substring(0, 5) != - node.innerText.substring(0, 5) - ) { - console.log( - 'text for speech synth changed!', - this.currentText, - node.innerText - ) + if (this.currentText.substring(0, 5) != node.innerText.substring(0, 5)) { + console.log('text for speech synth changed!', this.currentText, node.innerText) this._stop() } } diff --git a/lib/card/scatter.js b/lib/card/scatter.js index ffd4ac2..f3df28f 100644 --- a/lib/card/scatter.js +++ b/lib/card/scatter.js @@ -63,11 +63,7 @@ export default class ScatterCard extends Card { * @returns * @memberof Card */ - static createCardScatter( - html, - scatterContainer, - { basePath = './', modules = [] } = {} - ) { + static createCardScatter(html, scatterContainer, { basePath = './', modules = [] } = {}) { let element = document.createElement('div') scatterContainer.element.appendChild(element) @@ -94,11 +90,7 @@ export default class ScatterCard extends Card { * @returns * @memberof CardScatter */ - static loadAndCreateScatterCard( - scatterContainer, - item, - { basePath = '../', modules = [], onClose = null } = {} - ) { + static loadAndCreateScatterCard(scatterContainer, item, { basePath = '../', modules = [], onClose = null } = {}) { console.log(basePath) return new Promise((resolve, reject) => { let url = basePath + '/' + item + '/index.html' @@ -106,14 +98,10 @@ export default class ScatterCard extends Card { this.loadHTML(url) .then(html => { console.log('Received', html) - let element = this.createCardScatter( - html, - scatterContainer, - { - basePath, - modules - } - ) + let element = this.createCardScatter(html, scatterContainer, { + basePath, + modules + }) if (onClose) this.addOnCloseListener(element, onClose) resolve(element) }) diff --git a/lib/card/wrapper.js b/lib/card/wrapper.js index 77fc35f..e40fd71 100644 --- a/lib/card/wrapper.js +++ b/lib/card/wrapper.js @@ -5,10 +5,7 @@ import Events from '../events.js' import { Points } from '../utils.js' export default class CardWrapper extends Object { - constructor( - domNode, - { triggerSVGClicks = true, allowClickDistance = 44 } = {} - ) { + constructor(domNode, { triggerSVGClicks = true, allowClickDistance = 44 } = {}) { super() this.domNode = domNode this.triggerSVGClicks = triggerSVGClicks @@ -57,7 +54,7 @@ export default class CardWrapper extends Object { isClickable(node) { if (node == null) return false - // console.log("isClickable", node, this.isClickPrevented(node)) + // console.log("isClickable", node, this.isClickPrevented(node)) if (this.isClickPrevented(node)) { return false } @@ -99,9 +96,7 @@ export default class CardWrapper extends Object { nearestActive(event) { let element = this.domNode let activeNodes = this.activeNodes() - let globalClick = event.center - ? event.center - : { x: event.x, y: event.y } + let globalClick = event.center ? event.center : { x: event.x, y: event.y } let localClick = Points.fromPageToNode(element, globalClick) let clickRects = activeNodes.map(link => { @@ -154,7 +149,7 @@ export default class CardWrapper extends Object { } nodeTapped(node, event) { - console.log("nodeTapped", node, this.isClickable(node)) + console.log('nodeTapped', node, this.isClickable(node)) if (this.isClickable(node)) { this.simulateClick(node, event) return true @@ -165,7 +160,7 @@ export default class CardWrapper extends Object { return true } for (let [selector, handler] of this.tapHandler.entries()) { - console.log("nodeTapped", selector) + console.log('nodeTapped', selector) for (let obj of this.domNode.querySelectorAll(selector)) { if (node == obj) { handler(event, node) @@ -177,10 +172,9 @@ export default class CardWrapper extends Object { } tap(event, calledBy = 'unknown') { - if (event.isTrusted) { let node = this.nearestActive(event) - console.log("tap", node) + console.log('tap', node) this.nodeTapped(node, event) /* let node = document.elementFromPoint(event.clientX, event.clientY) diff --git a/lib/doctest.js b/lib/doctest.js index a51eda9..679eb19 100755 --- a/lib/doctest.js +++ b/lib/doctest.js @@ -30,32 +30,21 @@ export default class Doctest { static expect(expr, value) { if (this.pprint(expr) != this.pprint(value)) { //throw new Error("got `" + expr + "` but expected `" + value + "`.") - throw new Error( - 'got `' + - this.pprint(expr) + - '` but expected `' + - this.pprint(value) + - '`.' - ) + throw new Error('got `' + this.pprint(expr) + '` but expected `' + this.pprint(value) + '`.') } } static expectError(error, message) { let index = error.toString().indexOf(message) if (index < 0) { - throw new Error( - 'got `' + message + '` but expected `' + error + '`.' - ) + throw new Error('got `' + message + '` but expected `' + error + '`.') } } static expectLog(...messages) { // if (!docTestLogMessages.equals(messages)) { docTestLogMessages.forEach((msg, i) => { - if (msg != messages[i]) - throw new Error( - 'Unexpected log message: `' + messages[i] + '`.' - ) + if (msg != messages[i]) throw new Error('Unexpected log message: `' + messages[i] + '`.') }) // throw new Error('Uups') //} @@ -104,10 +93,7 @@ export default class Doctest { let lines = text.value.split('\n') let better = [] for (let line of lines) { - if ( - replaceExpect && - line.trim().startsWith('Doctest.expect(') - ) { + if (replaceExpect && line.trim().startsWith('Doctest.expect(')) { line = line.replace(/Doctest\.expect\(/, '>>> ').trim() if (line.endsWith(')') || line.endsWith(',')) { line = line.slice(0, -1) diff --git a/lib/events.js b/lib/events.js index 201aa5c..21af172 100755 --- a/lib/events.js +++ b/lib/events.js @@ -38,8 +38,7 @@ export default class Events { // be this is a bug or a security feature. Workaround: we introduce // a mouseDownSubstitute attribute that can be assigned to cloned // events after instantiation. - if (Reflect.has(event, 'mouseDownSubstitute')) - return event.mouseDownSubstitute + if (Reflect.has(event, 'mouseDownSubstitute')) return event.mouseDownSubstitute return event.buttons || event.which } @@ -74,15 +73,7 @@ export default class Events { for (let i = 0; i < targets.length; i++) { let t = targets[i] let touchTarget = document.elementFromPoint(t.pageX, t.pageY) - let touch = new Touch( - undefined, - touchTarget, - t.identifier, - t.pageX, - t.pageY, - t.screenX, - t.screenY - ) + let touch = new Touch(undefined, touchTarget, t.identifier, t.pageX, t.pageY, t.screenX, t.screenY) touches.push(touch) } return new TouchList(...touches) @@ -166,8 +157,7 @@ export default class Events { let result = event.type let selector = this.selector(event.target) result += ' selector: ' + selector - if (event.target != document.querySelector(selector)) - console.log('Cannot resolve', selector) + if (event.target != document.querySelector(selector)) console.log('Cannot resolve', selector) let keys = ['layerX', 'layerY', 'pageX', 'pageY', 'clientX', 'clientY'] for (let key of keys) { try { diff --git a/lib/flippable.js b/lib/flippable.js index 9f867c3..8c57e12 100644 --- a/lib/flippable.js +++ b/lib/flippable.js @@ -258,28 +258,22 @@ export class DOMFlip { frontLoaded(loader) { return new Promise((resolve, reject) => { - let scatter = new DOMScatter( - this.cardWrapper, - this.domScatterContainer, - { - x: loader.x, - y: loader.y, - startScale: loader.scale, - scale: loader.scale, - maxScale: loader.maxScale, - minScale: loader.minScale, - width: loader.wantedWidth, - height: loader.wantedHeight, - rotation: loader.rotation, - translatable: this.translatable, - scalable: this.scalable, - rotatable: this.rotatable, - overdoScaling: this.overdoScaling, - tapDelegate: this.tapDelegateFactory - ? this.tapDelegateFactory(this.cardWrapper) - : null - } - ) + let scatter = new DOMScatter(this.cardWrapper, this.domScatterContainer, { + x: loader.x, + y: loader.y, + startScale: loader.scale, + scale: loader.scale, + maxScale: loader.maxScale, + minScale: loader.minScale, + width: loader.wantedWidth, + height: loader.wantedHeight, + rotation: loader.rotation, + translatable: this.translatable, + scalable: this.scalable, + rotatable: this.rotatable, + overdoScaling: this.overdoScaling, + tapDelegate: this.tapDelegateFactory ? this.tapDelegateFactory(this.cardWrapper) : null + }) if (this.center) { scatter.centerAt(this.center) @@ -296,9 +290,7 @@ export class DOMFlip { //Remove callback if (scatter.onTransform) { - let callbackIdx = scatter.onTransform.indexOf( - removeOnMinScale - ) + let callbackIdx = scatter.onTransform.indexOf(removeOnMinScale) scatter.onTransform.splice(callbackIdx, 1) } } @@ -572,9 +564,7 @@ export class DOMFlippable { this.flipped = !this.flipped let targetY = this.flipped ? 180 : 0 - let targetZ = this.flipped - ? this.startAngle + this.targetRotation(this.startAngle) - : this.startAngle + let targetZ = this.flipped ? this.startAngle + this.targetRotation(this.startAngle) : this.startAngle let targetScale = this.flipped ? this.wantedScale : this.startScale let w = this.flipped ? this.wantedWidth : this.startWidth let h = this.flipped ? this.wantedHeight : this.startHeight diff --git a/lib/frames.js b/lib/frames.js index 8baf519..56893a7 100755 --- a/lib/frames.js +++ b/lib/frames.js @@ -59,15 +59,7 @@ export class FrameTarget { let point = pointMap.get(key) let p = Points.fromPageToNode(this.frame, point) let touchTarget = doc.elementFromPoint(p.x, p.y) - let touch = new Touch( - undefined, - touchTarget, - key, - p.x, - p.y, - p.x, - p.y - ) + let touch = new Touch(undefined, touchTarget, key, p.x, p.y, p.x, p.y) touches.push(touch) } return new TouchList(...touches) @@ -102,12 +94,7 @@ export class FrameTarget { this.target.dispatchEvent(touchEvent) } - simulateTouchEventSafari( - type, - point, - pointMap, - touchEventKey = 'targetTouches' - ) { + simulateTouchEventSafari(type, point, pointMap, touchEventKey = 'targetTouches') { let p = Points.fromPageToNode(this.frame, point) let data = { view: this.frame.contentWindow, @@ -131,9 +118,7 @@ export class FrameTarget { } isMouseLikeEvent(event) { - return ( - event.type.startsWith('mouse') || event.type.startsWith('pointer') - ) + return event.type.startsWith('mouse') || event.type.startsWith('pointer') } onStart(event, interaction) { @@ -142,11 +127,7 @@ export class FrameTarget { if (this.isMouseLikeEvent(event)) { this.simulateMouseEvent('mousedown', point) } else { - this.simulateTouchEvent( - 'touchstart', - point, - interaction.current - ) + this.simulateTouchEvent('touchstart', point, interaction.current) return } } @@ -170,12 +151,7 @@ export class FrameTarget { if (this.isMouseLikeEvent(event)) { this.simulateMouseEvent('mouseend', point) } else { - this.simulateTouchEvent( - 'touchend', - point, - interaction.ended, - 'changedTouches' - ) + this.simulateTouchEvent('touchend', point, interaction.ended, 'changedTouches') return } } diff --git a/lib/interaction.js b/lib/interaction.js index 5414545..7a4d9fc 100755 --- a/lib/interaction.js +++ b/lib/interaction.js @@ -205,10 +205,10 @@ export class InteractionPoints { delta() { let prev = [] let curr = [] - let cm = { x: 0, y: 0} - let pm = { x: 0, y: 0} + let cm = { x: 0, y: 0 } + let pm = { x: 0, y: 0 } let count = 0 - for(let key of this.current.keys()) { + for (let key of this.current.keys()) { if (this.previous.has(key)) { let p = this.previous.get(key) let c = this.current.get(key) @@ -227,7 +227,7 @@ export class InteractionPoints { let scaled = 0 let alpha = 0 let zoom = 1 - for(let i=0; i t1 + this.longPressTime if (tookLong) { @@ -509,10 +477,7 @@ export class Interaction extends InteractionPoints { this.unregisterTap(key) } } - if ( - this.tapTimestamps.has(key) && - performance.now() > this.tapTimestamps.get(key) + this.tapDuration - ) { + if (this.tapTimestamps.has(key) && performance.now() > this.tapTimestamps.get(key) + this.tapDuration) { //console.log("tap too long") this.unregisterTap(key) } @@ -537,11 +502,7 @@ export class Interaction extends InteractionPoints { isLongPress(key) { let ended = this.ended.get(key) let start = this.start.get(key) - if ( - start && - ended && - Points.distance(ended, start) < this.tapDistance - ) { + if (start && ended && Points.distance(ended, start) < this.tapDistance) { let t1 = this.timestamps.get(key) let tookLong = performance.now() > t1 + this.longPressTime if (tookLong) { @@ -608,9 +569,7 @@ export class InteractionDelegate { setupInteraction() { if (this.debug) { - let error = this.targetInterface.implementationError( - this.target.constructor - ) + let error = this.targetInterface.implementationError(this.target.constructor) if (error != null) { throw new Error('Expected IInteractionTarget: ' + error) } @@ -648,16 +607,11 @@ export class InteractionDelegate { element.addEventListener( 'pointermove', e => { - if (this.debug) - console.log('pointermove', e.pointerId, e.pointerType) + if (this.debug) console.log('pointermove', e.pointerId, e.pointerType) - if ( - e.pointerType == 'touch' || - (e.pointerType == 'mouse' && Events.isPointerDown(e)) - ) { + if (e.pointerType == 'touch' || (e.pointerType == 'mouse' && Events.isPointerDown(e))) { // this.capture(e) && - if (this.debug) - console.log('pointermove captured', e.pointerId) + if (this.debug) console.log('pointermove captured', e.pointerId) this.onMove(e) } }, @@ -666,8 +620,7 @@ export class InteractionDelegate { element.addEventListener( 'pointerup', e => { - if (this.debug) - console.log('pointerup', e.pointerId, e.pointerType) + if (this.debug) console.log('pointerup', e.pointerId, e.pointerType) this.onEnd(e) if (this.capturePointerEvents) { try { @@ -682,11 +635,9 @@ export class InteractionDelegate { element.addEventListener( 'pointercancel', e => { - if (this.debug) - console.log('pointercancel', e.pointerId, e.pointerType) + if (this.debug) console.log('pointercancel', e.pointerId, e.pointerType) this.onEnd(e) - if (this.capturePointerEvents) - element.releasePointerCapture(e.pointerId) + if (this.capturePointerEvents) element.releasePointerCapture(e.pointerId) }, useCapture ) @@ -695,12 +646,7 @@ export class InteractionDelegate { element.addEventListener( 'pointerleave', e => { - if (this.debug) - console.log( - 'pointerleave', - e.pointerId, - e.pointerType - ) + if (this.debug) console.log('pointerleave', e.pointerId, e.pointerType) if (e.target == element) this.onEnd(e) }, useCapture @@ -711,12 +657,7 @@ export class InteractionDelegate { element.addEventListener( 'pointerout', e => { - if (this.debug) - console.log( - 'pointerout', - e.pointerId, - e.pointerType - ) + if (this.debug) console.log('pointerout', e.pointerId, e.pointerType) if (e.target == element) this.onEnd(e) }, useCapture @@ -727,13 +668,7 @@ export class InteractionDelegate { window.addEventListener( 'pointerout', e => { - if (this.debug) - console.log( - 'pointerout', - e.pointerId, - e.pointerType, - e.target - ) + if (this.debug) console.log('pointerout', e.pointerId, e.pointerType, e.target) if (e.target == element) { this.onEnd(e) } @@ -746,8 +681,7 @@ export class InteractionDelegate { element.addEventListener( 'touchstart', e => { - if (this.debug) - console.log('touchstart', this.touchPoints(e)) + if (this.debug) console.log('touchstart', this.touchPoints(e)) if (this.capture(e)) { for (let touch of e.changedTouches) { this.onStart(touch) @@ -759,8 +693,7 @@ export class InteractionDelegate { element.addEventListener( 'touchmove', e => { - if (this.debug) - console.log('touchmove', this.touchPoints(e), e) + if (this.debug) console.log('touchmove', this.touchPoints(e), e) for (let touch of e.changedTouches) { this.onMove(touch) } @@ -783,12 +716,7 @@ export class InteractionDelegate { element.addEventListener( 'touchcancel', e => { - if (this.debug) - console.log( - 'touchcancel', - e.targetTouches.length, - e.changedTouches.length - ) + if (this.debug) console.log('touchcancel', e.targetTouches.length, e.changedTouches.length) for (let touch of e.changedTouches) { this.onEnd(touch) } @@ -837,9 +765,7 @@ export class InteractionDelegate { e => { if (e.target == element) { this.onEnd(e) - console.warn( - "Shouldn't happen: mouseout ends interaction" - ) + console.warn("Shouldn't happen: mouseout ends interaction") } }, useCapture @@ -880,16 +806,8 @@ export class InteractionDelegate { } setupMouseWheelInteraction() { - this.mouseWheelElement.addEventListener( - 'mousewheel', - this.onMouseWheel.bind(this), - true - ) - this.mouseWheelElement.addEventListener( - 'DOMMouseScroll', - this.onMouseWheel.bind(this), - true - ) + this.mouseWheelElement.addEventListener('mousewheel', this.onMouseWheel.bind(this), true) + this.mouseWheelElement.addEventListener('DOMMouseScroll', this.onMouseWheel.bind(this), true) } onMouseWheel(event) { @@ -953,10 +871,7 @@ export class InteractionDelegate { break } case 'Touch': { - let id = - event.touchType === 'stylus' - ? 'stylus' - : event.identifier.toString() + let id = event.touchType === 'stylus' ? 'stylus' : event.identifier.toString() result[id] = this.getPosition(event) break } @@ -1006,10 +921,7 @@ export class InteractionDelegate { let point = extracted[key] let updated = this.interaction.update(key, point) if (updated) { - console.warn( - "new pointer in updateInteraction shouldn't happen", - key - ) + console.warn("new pointer in updateInteraction shouldn't happen", key) this.interactionStarted(event, key, point) } } @@ -1143,11 +1055,7 @@ export class InteractionMapper extends InteractionDelegate { onEnd(event) { let extracted = this.extractPoint(event, 'changedTouches') this.endInteraction(event, extracted) - let mapped = this.interaction.mapInteraction( - extracted, - ['ended'], - this.mapPositionToPoint.bind(this) - ) + let mapped = this.interaction.mapInteraction(extracted, ['ended'], this.mapPositionToPoint.bind(this)) for (let [target, interaction] of mapped.entries()) { target.onEnd(event, interaction) } @@ -1181,10 +1089,7 @@ export class InteractionMapper extends InteractionDelegate { // convert to array types = Array.isArray(types) ? types : types.split(/\s/) - if ( - elements instanceof NodeList || - elements instanceof HTMLCollection - ) { + if (elements instanceof NodeList || elements instanceof HTMLCollection) { elements = Array.from(elements) } elements = Array.isArray(elements) ? elements : [elements] @@ -1193,9 +1098,7 @@ export class InteractionMapper extends InteractionDelegate { const type = types[i].toLowerCase() // list of hammer events - const useHammer = /^(tap|doubletap|press|pan|swipe|pinch|rotate).*$/.test( - type - ) + const useHammer = /^(tap|doubletap|press|pan|swipe|pinch|rotate).*$/.test(type) // if it is a hammer event if (useHammer) { @@ -1210,33 +1113,15 @@ export class InteractionMapper extends InteractionDelegate { // recognizers if (type.startsWith('pan')) { - hammer - .get('pan') - .set( - Object.assign( - { direction: Hammer.DIRECTION_ALL }, - opts - ) - ) + hammer.get('pan').set(Object.assign({ direction: Hammer.DIRECTION_ALL }, opts)) } else if (type.startsWith('pinch')) { - hammer - .get('pinch') - .set(Object.assign({ enable: true }, opts)) + hammer.get('pinch').set(Object.assign({ enable: true }, opts)) } else if (type.startsWith('press')) { hammer.get('press').set(opts) } else if (type.startsWith('rotate')) { - hammer - .get('rotate') - .set(Object.assign({ enable: true }, opts)) + hammer.get('rotate').set(Object.assign({ enable: true }, opts)) } else if (type.startsWith('swipe')) { - hammer - .get('swipe') - .set( - Object.assign( - { direction: Hammer.DIRECTION_ALL }, - opts - ) - ) + hammer.get('swipe').set(Object.assign({ direction: Hammer.DIRECTION_ALL }, opts)) } else if (type.startsWith('tap')) { hammer.get('tap').set(opts) } diff --git a/lib/logging.js b/lib/logging.js index 9830414..60c72c8 100644 --- a/lib/logging.js +++ b/lib/logging.js @@ -59,11 +59,7 @@ export default class Logging { } } - static setup({ - log = console.log, - warn = console.warn, - error = console.error - } = {}) { + static setup({ log = console.log, warn = console.warn, error = console.error } = {}) { logHandlers.log = log logHandlers.warn = warn logHandlers.error = error diff --git a/lib/pixi/abstractpopup.js b/lib/pixi/abstractpopup.js index c239659..990ce84 100644 --- a/lib/pixi/abstractpopup.js +++ b/lib/pixi/abstractpopup.js @@ -83,12 +83,10 @@ export default class AbstractPopup extends PIXI.Graphics { if (this.opts.maxWidth) { this.headerStyle.wordWrap = true - this.headerStyle.wordWrapWidth = - this.opts.maxWidth - 2 * this.opts.padding + this.headerStyle.wordWrapWidth = this.opts.maxWidth - 2 * this.opts.padding this.textStyle.wordWrap = true - this.textStyle.wordWrapWidth = - this.opts.maxWidth - 2 * this.opts.padding + this.textStyle.wordWrapWidth = this.opts.maxWidth - 2 * this.opts.padding } this.alpha = 0 @@ -131,10 +129,7 @@ export default class AbstractPopup extends PIXI.Graphics { if (this.opts.header instanceof PIXI.Text) { header = this.opts.header } else if (typeof this.opts.header === 'number') { - header = new PIXI.Text( - this.opts.header.toString(), - this.headerStyle - ) + header = new PIXI.Text(this.opts.header.toString(), this.headerStyle) } else { header = new PIXI.Text(this.opts.header, this.headerStyle) } @@ -161,10 +156,7 @@ export default class AbstractPopup extends PIXI.Graphics { if (typeof this.opts.content === 'string') { content = new PIXI.Text(this.opts.content, this.textStyle) } else if (typeof this.opts.content === 'number') { - content = new PIXI.Text( - this.opts.content.toString(), - this.textStyle - ) + content = new PIXI.Text(this.opts.content.toString(), this.textStyle) } else { content = this.opts.content } @@ -235,31 +227,16 @@ export default class AbstractPopup extends PIXI.Graphics { * @return {AbstractPopup} A reference to the popup for chaining. */ draw() { - const square = - Math.round(this.wantedWidth) === Math.round(this.wantedHeight) + const square = Math.round(this.wantedWidth) === Math.round(this.wantedHeight) const diameter = Math.round(this.opts.radius * 2) this.clear() - this.lineStyle( - this.opts.strokeWidth, - this.opts.stroke, - this.opts.strokeAlpha - ) + this.lineStyle(this.opts.strokeWidth, this.opts.stroke, this.opts.strokeAlpha) this.beginFill(this.opts.fill, this.opts.fillAlpha) if (square && diameter === this.wantedWidth) { - this.drawCircle( - this.wantedWidth / 2, - this.wantedHeight / 2, - this.opts.radius - ) + this.drawCircle(this.wantedWidth / 2, this.wantedHeight / 2, this.opts.radius) } else { - this.drawRoundedRect( - 0, - 0, - this.wantedWidth, - this.wantedHeight, - this.opts.radius - ) + this.drawRoundedRect(0, 0, this.wantedWidth, this.wantedHeight, this.opts.radius) } this.endFill() diff --git a/lib/pixi/app.js b/lib/pixi/app.js index d20ce7b..263f578 100644 --- a/lib/pixi/app.js +++ b/lib/pixi/app.js @@ -28,10 +28,7 @@ class FullscreenInteractionManager extends PIXI.interaction.InteractionManager { let dy = 0 let canvas = this.renderer.view let context = canvas.getContext('webgl') - if ( - context.drawingBufferWidth < canvas.width || - context.drawingBufferHeight < canvas.height - ) { + if (context.drawingBufferWidth < canvas.width || context.drawingBufferHeight < canvas.height) { extendWidth = context.drawingBufferWidth / canvas.width extendHeight = context.drawingBufferHeight / canvas.height //dx = wantedWidth - context.drawingBufferWidth @@ -143,10 +140,7 @@ export default class PIXIApp extends PIXI.Application { console.log('App is in fullScreen mode or autoResize mode') const resizeDebounced = debounce(event => this.resize(event), 50) window.addEventListener('resize', resizeDebounced) - document.body.addEventListener( - 'orientationchange', - this.checkOrientation.bind(this) - ) + document.body.addEventListener('orientationchange', this.checkOrientation.bind(this)) } if (monkeyPatchMapping) { console.log('Using monkey patched coordinate mapping') @@ -177,18 +171,12 @@ export default class PIXIApp extends PIXI.Application { uri: '/graphql' }) - const wsClient = new subscriptions.SubscriptionClient( - `wss://${location.hostname}/subscriptions`, - { - reconnect: true, - connectionParams: {} - } - ) + const wsClient = new subscriptions.SubscriptionClient(`wss://${location.hostname}/subscriptions`, { + reconnect: true, + connectionParams: {} + }) - const networkInterfaceWithSubscriptions = subscriptions.addGraphQLSubscriptions( - networkInterface, - wsClient - ) + const networkInterfaceWithSubscriptions = subscriptions.addGraphQLSubscriptions(networkInterface, wsClient) this.apolloClient = new apollo.ApolloClient({ networkInterface: networkInterfaceWithSubscriptions @@ -324,10 +312,7 @@ export default class PIXIApp extends PIXI.Application { * @param {number} [opts.height=window.innerHeight] - The height of the app to resize to. * @return {PIXIApp} - Returns the PIXIApp for chaining. */ - resize( - event, - { width = window.innerWidth, height = window.innerHeight } = {} - ) { + resize(event, { width = window.innerWidth, height = window.innerHeight } = {}) { this.width = width this.height = height this.expandRenderer() @@ -348,8 +333,7 @@ export default class PIXIApp extends PIXI.Application { monkeyPatchPixiMapping() { if (this.originalMapPositionToPoint === null) { let interactionManager = this.renderer.plugins.interaction - this.originalMapPositionToPoint = - interactionManager.mapPositionToPoint + this.originalMapPositionToPoint = interactionManager.mapPositionToPoint interactionManager.mapPositionToPoint = (point, x, y) => { return this.fixedMapPositionToPoint(point, x, y) } @@ -378,8 +362,7 @@ export default class PIXIApp extends PIXI.Application { if ( context !== null && - (context.drawingBufferWidth < canvas.width || - context.drawingBufferHeight < canvas.height) + (context.drawingBufferWidth < canvas.width || context.drawingBufferHeight < canvas.height) ) { extendWidth = context.drawingBufferWidth / canvas.width extendHeight = context.drawingBufferHeight / canvas.height @@ -388,12 +371,7 @@ export default class PIXIApp extends PIXI.Application { } x *= extendWidth y *= extendHeight - return this.originalMapPositionToPoint.call( - interactionManager, - local, - x, - y + dy - ) + return this.originalMapPositionToPoint.call(interactionManager, local, x, y + dy) } /** @@ -444,9 +422,7 @@ export default class PIXIApp extends PIXI.Application { * @return {Modal} Returns the Modal object. */ modal(opts = {}) { - let modal = new Modal( - Object.assign({ theme: this.theme }, opts, { app: this }) - ) + let modal = new Modal(Object.assign({ theme: this.theme }, opts, { app: this })) this.scene.addChild(modal) return modal @@ -459,9 +435,7 @@ export default class PIXIApp extends PIXI.Application { * @return {Message} Returns the Message object. */ message(opts = {}) { - let message = new Message( - Object.assign({ theme: this.theme }, opts, { app: this }) - ) + let message = new Message(Object.assign({ theme: this.theme }, opts, { app: this })) this.scene.addChild(message) return message @@ -480,11 +454,7 @@ export default class PIXIApp extends PIXI.Application { * @param {boolean} [opts.progress=false] - Should a progress bar display the loading status? * @return {PIXIApp} The PIXIApp object for chaining. */ - loadSprites( - resources, - loaded = null, - { resolutionDependent = true, progress = false } = {} - ) { + loadSprites(resources, loaded = null, { resolutionDependent = true, progress = false } = {}) { this.loadTextures( resources, textures => { @@ -517,11 +487,7 @@ export default class PIXIApp extends PIXI.Application { * @param {boolean} [opts.progress=false] - Should a progress bar display the loading status? * @return {PIXIApp} The PIXIApp object for chaining. */ - loadTextures( - resources, - loaded = null, - { resolutionDependent = true, progress = false } = {} - ) { + loadTextures(resources, loaded = null, { resolutionDependent = true, progress = false } = {}) { if (!Array.isArray(resources)) { resources = [resources] } @@ -534,16 +500,10 @@ export default class PIXIApp extends PIXI.Application { let resolution = Math.round(this.renderer.resolution) switch (resolution) { case 2: - loader.add( - resource, - resource.replace(/\.([^.]*)$/, '@2x.$1') - ) + loader.add(resource, resource.replace(/\.([^.]*)$/, '@2x.$1')) break case 3: - loader.add( - resource, - resource.replace(/\.([^.]*)$/, '@3x.$1') - ) + loader.add(resource, resource.replace(/\.([^.]*)$/, '@3x.$1')) break default: loader.add(resource) @@ -708,11 +668,7 @@ export default class PIXIApp extends PIXI.Application { pixiGlobal.x *= resolution pixiGlobal.y *= resolution // console.log("app.convertPointFromNodeToPage", pixiGlobal) - return window.convertPointFromNodeToPage( - app.view, - pixiGlobal.x, - pixiGlobal.y - ) + return window.convertPointFromNodeToPage(app.view, pixiGlobal.x, pixiGlobal.y) } } diff --git a/lib/pixi/badge.js b/lib/pixi/badge.js index 99dd20d..b2acd99 100644 --- a/lib/pixi/badge.js +++ b/lib/pixi/badge.js @@ -87,11 +87,7 @@ export default class Badge extends AbstractPopup { content: this.opts.tooltip }) } else { - this.opts.tooltip = Object.assign( - {}, - { object: this }, - this.opts.tooltip - ) + this.opts.tooltip = Object.assign({}, { object: this }, this.opts.tooltip) this.tooltip = new Tooltip(this.opts.tooltip) } } @@ -108,12 +104,8 @@ export default class Badge extends AbstractPopup { layout() { super.layout() - this.content.x = - this.width / 2 - this.content.width / 2 - this.opts.strokeWidth / 2 - this.content.y = - this.height / 2 - - this.content.height / 2 - - this.opts.strokeWidth / 2 + this.content.x = this.width / 2 - this.content.width / 2 - this.opts.strokeWidth / 2 + this.content.y = this.height / 2 - this.content.height / 2 - this.opts.strokeWidth / 2 return this } diff --git a/lib/pixi/blurfilter.js b/lib/pixi/blurfilter.js index 0c11e74..8b55299 100644 --- a/lib/pixi/blurfilter.js +++ b/lib/pixi/blurfilter.js @@ -68,9 +68,7 @@ export default class BlurFilter extends PIXI.Filter { return this.tiltShiftXFilter.shape } set shape(value) { - this.tiltShiftXFilter.shape = this.tiltShiftYFilter.shape = this.normalize( - value - ) + this.tiltShiftXFilter.shape = this.tiltShiftYFilter.shape = this.normalize(value) } /** @@ -189,12 +187,7 @@ class TiltShiftAxisFilter extends PIXI.Filter { this.uniforms.circle = [shape.x, shape.y, shape.r] } else { this.uniforms.shape = 2 - this.uniforms.rectangle = [ - shape.x, - shape.y, - shape.x + shape.width, - shape.y + shape.height - ] + this.uniforms.rectangle = [shape.x, shape.y, shape.x + shape.width, shape.y + shape.height] } this.uniforms.blur = blur this.uniforms.delta = new PIXI.Point(0, 0) @@ -228,12 +221,7 @@ class TiltShiftAxisFilter extends PIXI.Filter { return new PIXI.Circle(circle[0], circle[1], circle[2]) } else { const rectangle = this.uniforms.rectangle - return new PIXI.Rectangle( - rectangle[0], - rectangle[1], - rectangle[2], - rectangle[3] - ) + return new PIXI.Rectangle(rectangle[0], rectangle[1], rectangle[2], rectangle[3]) } } set shape(value) { @@ -242,12 +230,7 @@ class TiltShiftAxisFilter extends PIXI.Filter { this.uniforms.circle = [value.x, value.y, value.r] } else { this.uniforms.shape = 2 - this.uniforms.rectangle = [ - value.x, - value.y, - value.x + value.width, - value.y + value.height - ] + this.uniforms.rectangle = [value.x, value.y, value.x + value.width, value.y + value.height] } } } diff --git a/lib/pixi/button.js b/lib/pixi/button.js index 9762080..f56a851 100644 --- a/lib/pixi/button.js +++ b/lib/pixi/button.js @@ -1,8 +1,9 @@ -/* global PIXI TweenLite */ +/* global */ import Theme from './theme.js' import Tooltip from './tooltip.js' import Badge from './badge.js' import Events from '../events.js' +import { Points } from '../utils.js' /** * Callback for the button action. @@ -156,15 +157,9 @@ export default class Button extends PIXI.Container { this.id = this.opts.id - if ( - typeof this.opts.icon === 'undefined' && - typeof this.opts.iconActive !== 'undefined' - ) { + if (typeof this.opts.icon === 'undefined' && typeof this.opts.iconActive !== 'undefined') { this.opts.icon = this.opts.iconActive - } else if ( - typeof this.opts.icon !== 'undefined' && - typeof this.opts.iconActive === 'undefined' - ) { + } else if (typeof this.opts.icon !== 'undefined' && typeof this.opts.iconActive === 'undefined') { this.opts.iconActive = this.opts.icon } @@ -180,6 +175,8 @@ export default class Button extends PIXI.Container { this._active = null this._disabled = null + this.__start = { x: null, y: null } + this.iconInactive = null this.iconActive = null this.text = null @@ -234,17 +231,11 @@ export default class Button extends PIXI.Container { // Icon //----------------- if (this.opts.icon) { - this.iconInactive = this.loadIcon( - this.opts.icon, - this.opts.iconColor - ) + this.iconInactive = this.loadIcon(this.opts.icon, this.opts.iconColor) } if (this.opts.iconActive) { - this.iconActive = this.loadIcon( - this.opts.iconActive, - this.opts.iconColorActive - ) + this.iconActive = this.loadIcon(this.opts.iconActive, this.opts.iconColorActive) } // interaction @@ -272,6 +263,8 @@ export default class Button extends PIXI.Container { // eslint-disable-next-line no-unused-vars this.button.on('pointerdown', e => { //this.capture(e) + this.__start.x = e.data.global.x + this.__start.y = e.data.global.y TweenLite.to([this.button, this.content], this.theme.fast, { alpha: 0.7, overwrite: 'none' @@ -280,25 +273,30 @@ export default class Button extends PIXI.Container { this.button.on('pointerup', e => { this.capture(e) - if (this.opts.beforeAction) { - this.opts.beforeAction.call(this, e, this) - } - if (this.opts.action) { - this.opts.action.call(this, e, this) - } + const distance = Points.distance(e.data.global, this.__start) - TweenLite.to([this.button, this.content], this.theme.fast, { - alpha: 0.83, - overwrite: 'none' - }) + if (distance < 5) { + if (this.opts.beforeAction) { + this.opts.beforeAction.call(this, e, this) + } - if (this.opts.type === 'checkbox') { - this.active = !this.active - } + if (this.opts.action) { + this.opts.action.call(this, e, this) + } - if (this.opts.afterAction) { - this.opts.afterAction.call(this, e, this) + TweenLite.to([this.button, this.content], this.theme.fast, { + alpha: 0.83, + overwrite: 'none' + }) + + if (this.opts.type === 'checkbox') { + this.active = !this.active + } + + if (this.opts.afterAction) { + this.opts.afterAction.call(this, e, this) + } } }) @@ -319,11 +317,7 @@ export default class Button extends PIXI.Container { content: this.opts.tooltip }) } else { - this.opts.tooltip = Object.assign( - {}, - { object: this }, - this.opts.tooltip - ) + this.opts.tooltip = Object.assign({}, { object: this }, this.opts.tooltip) this.tooltip = new Tooltip(this.opts.tooltip) } } @@ -353,15 +347,10 @@ export default class Button extends PIXI.Container { badge.x = this.x - badge.width / 2 + opts.offsetLeft break case 'center': - badge.x = - this.x + - this.width / 2 - - badge.width / 2 + - opts.offsetLeft + badge.x = this.x + this.width / 2 - badge.width / 2 + opts.offsetLeft break case 'right': - badge.x = - this.x + this.width - badge.width / 2 + opts.offsetLeft + badge.x = this.x + this.width - badge.width / 2 + opts.offsetLeft } switch (opts.verticalAlign) { @@ -369,15 +358,10 @@ export default class Button extends PIXI.Container { badge.y = this.y - badge.height / 2 + opts.offsetTop break case 'middle': - badge.y = - this.y + - this.height / 2 - - badge.height / 2 + - opts.offsetTop + badge.y = this.y + this.height / 2 - badge.height / 2 + opts.offsetTop break case 'bottom': - badge.y = - this.y + this.height - badge.height / 2 + opts.offsetTop + badge.y = this.y + this.height - badge.height / 2 + opts.offsetTop } this.addChild(badge) @@ -516,8 +500,7 @@ export default class Button extends PIXI.Container { this.content.x = (this._width - this.content.width) / 2 break case 'right': - this.content.x = - this._width - this.opts.padding - this.content.width + this.content.x = this._width - this.opts.padding - this.content.width break } @@ -529,8 +512,7 @@ export default class Button extends PIXI.Container { this.content.y = (this._height - this.content.height) / 2 break case 'bottom': - this.content.y = - this._height - this.opts.padding - this.content.height + this.content.y = this._height - this.opts.padding - this.content.height break } @@ -546,30 +528,13 @@ export default class Button extends PIXI.Container { draw() { this.button.clear() if (this.active) { - this.button.lineStyle( - this.opts.strokeActiveWidth, - this.opts.strokeActive, - this.opts.strokeActiveAlpha - ) - this.button.beginFill( - this.opts.fillActive, - this.opts.fillActiveAlpha - ) + this.button.lineStyle(this.opts.strokeActiveWidth, this.opts.strokeActive, this.opts.strokeActiveAlpha) + this.button.beginFill(this.opts.fillActive, this.opts.fillActiveAlpha) } else { - this.button.lineStyle( - this.opts.strokeWidth, - this.opts.stroke, - this.opts.strokeAlpha - ) + this.button.lineStyle(this.opts.strokeWidth, this.opts.stroke, this.opts.strokeAlpha) this.button.beginFill(this.opts.fill, this.opts.fillAlpha) } - this.button.drawRoundedRect( - 0, - 0, - this._width, - this._height, - this.opts.radius - ) + this.button.drawRoundedRect(0, 0, this._width, this._height, this.opts.radius) this.button.endFill() return this @@ -686,9 +651,7 @@ export default class Button extends PIXI.Container { size = this.opts.minHeight - 2 * this.opts.padding } - const url = Button.iconIsUrl(icon) - ? icon - : `../../assets/icons/${icon}.png` + const url = Button.iconIsUrl(icon) ? icon : `../../assets/icons/${icon}.png` const iconTexture = PIXI.Texture.fromImage(url, true) const sprite = new PIXI.Sprite(iconTexture) diff --git a/lib/pixi/buttongroup.html b/lib/pixi/buttongroup.html index b22a7f6..2bce155 100644 --- a/lib/pixi/buttongroup.html +++ b/lib/pixi/buttongroup.html @@ -10,6 +10,7 @@ + @@ -29,10 +30,10 @@ const app = new PIXIApp({ view: canvas, width: 1000, - height: 1000 + height: 1400 }).setup().run() -let buttonGroup1 = new ButtonGroup({ +const buttonGroup1 = new ButtonGroup({ x: 10, y: 10, buttons: [ @@ -43,7 +44,7 @@ let buttonGroup1 = new ButtonGroup({ ] }) -let buttonGroup2 = new ButtonGroup({ +const buttonGroup2 = new ButtonGroup({ x: 260, y: 10, buttons: [ @@ -60,7 +61,7 @@ let buttonGroup2 = new ButtonGroup({ strokeWidth: 3 }) -let buttonGroup3 = new ButtonGroup({ +const buttonGroup3 = new ButtonGroup({ x: 610, y: 10, buttons: [ @@ -74,7 +75,7 @@ let buttonGroup3 = new ButtonGroup({ strokeWidth: 1 }) -let buttonGroup4 = new ButtonGroup({ +const buttonGroup4 = new ButtonGroup({ x: 10, y: 90, buttons: [ @@ -93,7 +94,7 @@ let buttonGroup4 = new ButtonGroup({ strokeWidth: 1 }) -let buttonGroup5 = new ButtonGroup({ +const buttonGroup5 = new ButtonGroup({ x: 10, y: 180, buttons: [ @@ -106,7 +107,7 @@ let buttonGroup5 = new ButtonGroup({ type: 'checkbox' }) -let buttonGroup6 = new ButtonGroup({ +const buttonGroup6 = new ButtonGroup({ x: 450, y: 180, buttons: [ @@ -119,7 +120,7 @@ let buttonGroup6 = new ButtonGroup({ type: 'radio' }) -let buttonGroup7 = new ButtonGroup({ +const buttonGroup7 = new ButtonGroup({ x: 10, y: 250, theme: 'light', @@ -134,7 +135,7 @@ let buttonGroup7 = new ButtonGroup({ style: 'link' }) -let buttonGroup8 = new ButtonGroup({ +const buttonGroup8 = new ButtonGroup({ x: 610, y: 250, buttons: [ @@ -147,7 +148,7 @@ let buttonGroup8 = new ButtonGroup({ margin: 0 }) -let buttonGroup9 = new ButtonGroup({ +const buttonGroup9 = new ButtonGroup({ x: 10, y: 320, buttons: [ @@ -160,7 +161,7 @@ let buttonGroup9 = new ButtonGroup({ minWidth: 70 }) -let buttonGroup10 = new ButtonGroup({ +const buttonGroup10 = new ButtonGroup({ x: 100, y: 320, buttons: [ @@ -176,7 +177,7 @@ let buttonGroup10 = new ButtonGroup({ margin: 0 }) -let buttonGroup11 = new ButtonGroup({ +const buttonGroup11 = new ButtonGroup({ x: 250, y: 320, buttons: [ @@ -197,7 +198,7 @@ let buttonGroup11 = new ButtonGroup({ type: 'checkbox' }) -let buttonGroup12 = new ButtonGroup({ +const buttonGroup12 = new ButtonGroup({ x: 400, y: 320, buttons: [ @@ -212,7 +213,7 @@ let buttonGroup12 = new ButtonGroup({ type: 'radio' }) -let buttonGroup13 = new ButtonGroup({ +const buttonGroup13 = new ButtonGroup({ x: 520, y: 320, buttons: [ @@ -231,10 +232,49 @@ let buttonGroup13 = new ButtonGroup({ minHeight: 100 }) +const buttonGroup14 = new ButtonGroup({ + x: 10, + y: 960, + buttons: [ + {label: 'Stacked button 1', action: event => console.log('clicked 1')}, + {label: 'Stacked button 2', action: event => console.log('clicked 2')}, + {label: 'Stacked button 3', action: event => console.log('clicked 3')}, + {label: 'Stacked button 4', action: event => console.log('clicked 4')}, + {label: 'Stacked button 5', action: event => console.log('clicked 5')}, + {label: 'Stacked button 6', action: event => console.log('clicked 6')}, + {label: 'Stacked button 7', action: event => console.log('clicked 7')}, + {label: 'Stacked button 8', action: event => console.log('clicked 8')} + ], + stacked: true, + maxWidth: 620, + app +}) + +const buttonGroup15 = new ButtonGroup({ + x: 10, + y: 1040, + buttons: [ + {icon: 'battery_charging_20', type: 'checkbox', iconColorActive: 0xd43e36}, + {icon: 'battery_charging_30', type: 'checkbox', iconColorActive: 0xf99927}, + {icon: 'battery_charging_50', type: 'checkbox', iconColorActive: 0xefc201}, + {icon: 'battery_charging_60', type: 'checkbox', iconColorActive: 0x839b00}, + {icon: 'battery_charging_80', type: 'checkbox', iconColorActive: 0x4ba8af}, + {icon: 'battery_charging_90', type: 'checkbox', iconColorActive: 0x5386bc}, + {icon: 'battery_charging_full', type: 'checkbox', iconColorActive: 0x9c71b7} + ], + orientation: 'vertical', + margin: 0, + stacked: true, + maxHeight: 200, + app +}) + app.scene.addChild(buttonGroup1, buttonGroup2, buttonGroup3) app.scene.addChild(buttonGroup4) app.scene.addChild(buttonGroup5, buttonGroup6) app.scene.addChild(buttonGroup7, buttonGroup8) app.scene.addChild(buttonGroup9, buttonGroup10, buttonGroup11, buttonGroup12, buttonGroup13) +app.scene.addChild(buttonGroup14, buttonGroup15) + diff --git a/lib/pixi/buttongroup.js b/lib/pixi/buttongroup.js index d0e20f8..c2419bc 100644 --- a/lib/pixi/buttongroup.js +++ b/lib/pixi/buttongroup.js @@ -1,5 +1,8 @@ +/* globals ThrowPropsPlugin, Strong */ + import Theme from './theme.js' import Button from './button.js' +import Events from '../events.js' /** * Class that represents a PixiJS ButtonGroup. @@ -23,7 +26,7 @@ import Button from './button.js' * @see {@link http://pixijs.download/dev/docs/PIXI.Graphics.html|PIXI.Graphics} * @see {@link https://www.iwm-tuebingen.de/iwmbrowser/lib/pixi/buttongroup.html|DocTest} */ -export default class ButtonGroup extends PIXI.Graphics { +export default class ButtonGroup extends PIXI.Container { /** * Creates an instance of a ButtonGroup. * @@ -39,6 +42,10 @@ export default class ButtonGroup extends PIXI.Graphics { * or a Theme object. * @param {number} [opts.minWidth=44] - Button: The minimum width of one button. * @param {number} [opts.minHeight=44] - Button: The minimum height of one button. + * @param {number} [opts.maxWidth] - The maximum width of the button group. Only used if stacked is true and the orientation is horizontal. + * @param {number} [opts.maxHeight] - The maximum height of the button group. Only used if stacked is true and the orientation is vertical. + * @param {boolean} [opts.stacked=false] - If set to true, the buttons of the button group gets stacked if they are broader or higher than the maximum permitted width or height, depending on orientation. + * @param {PIXI.Application} [opts.app] - The PixiJS Application. Must be set if you want to use the mousewheel to scroll your button group. * @param {number} [opts.padding=Theme.padding] - Button: The inner spacing (distance from icon and/or label) the the border. * @param {number} [opts.margin=Theme.margin] - The outer spacing (distance from one button to the previous/next button). * @param {string} [opts.iconPosition=left] - Button: The position of the icon in relation to the label. Can be left or right. @@ -87,6 +94,10 @@ export default class ButtonGroup extends PIXI.Graphics { buttons: [], minWidth: 44, minHeight: 44, + maxWidth: null, + maxHeight: null, + stacked: false, + app: null, padding: theme.padding, margin: theme.margin, iconPosition: 'left', // left, right @@ -119,6 +130,7 @@ export default class ButtonGroup extends PIXI.Graphics { this.buttons = [] this._disabled = null + this.__dragging = false this.visible = this.opts.visible @@ -138,6 +150,12 @@ export default class ButtonGroup extends PIXI.Graphics { * @return {ButtonGroup} A reference to the button group for chaining. */ setup() { + // inner container + //-------------------- + const container = new PIXI.Graphics() + this.addChild(container) + this.container = container + // Buttons //----------------- let position = 0 @@ -164,19 +182,11 @@ export default class ButtonGroup extends PIXI.Graphics { it.fillActive = it.fillActive || this.opts.fillActive it.fillActiveAlpha = it.fillActiveAlpha || this.opts.fillActiveAlpha it.stroke = it.stroke || this.opts.stroke - it.strokeWidth = - it.strokeWidth != null ? it.strokeWidth : this.opts.strokeWidth - it.strokeAlpha = - it.strokeAlpha != null ? it.strokeAlpha : this.opts.strokeAlpha + it.strokeWidth = it.strokeWidth != null ? it.strokeWidth : this.opts.strokeWidth + it.strokeAlpha = it.strokeAlpha != null ? it.strokeAlpha : this.opts.strokeAlpha it.strokeActive = it.strokeActive || this.opts.strokeActive - it.strokeActiveWidth = - it.strokeActiveWidth != null - ? it.strokeActiveWidth - : this.opts.strokeActiveWidth - it.strokeActiveAlpha = - it.strokeActiveAlpha != null - ? it.strokeActiveAlpha - : this.opts.strokeActiveAlpha + it.strokeActiveWidth = it.strokeActiveWidth != null ? it.strokeActiveWidth : this.opts.strokeActiveWidth + it.strokeActiveAlpha = it.strokeActiveAlpha != null ? it.strokeActiveAlpha : this.opts.strokeActiveAlpha it.textStyle = it.textStyle || this.opts.textStyle it.textStyleActive = it.textStyleActive || this.opts.textStyleActive it.style = it.style || this.opts.style @@ -195,10 +205,7 @@ export default class ButtonGroup extends PIXI.Graphics { it.align = it.align || this.opts.align it.verticalAlign = it.verticalAlign || this.opts.verticalAlign it.afterAction = (event, button) => { - if ( - this.opts.type === 'radio' && - button.opts.type === 'default' - ) { + if (this.opts.type === 'radio' && button.opts.type === 'default') { this.buttons.forEach(it => { if (it.opts.type === 'default') { it.active = false @@ -215,23 +222,21 @@ export default class ButtonGroup extends PIXI.Graphics { if (typeof it.tooltip === 'string') { it.tooltip = { content: it.tooltip, container: this } } else { - it.tooltip = Object.assign( - {}, - { container: this }, - it.tooltip - ) + it.tooltip = Object.assign({}, { container: this }, it.tooltip) } } let button = new Button(it) - this.addChild(button) + this.container.addChild(button) this.buttons.push(button) - position += - (this.opts.orientation === 'horizontal' - ? button.width - : button.height) + this.opts.margin + button.__originalPosition = { + x: button.x, + y: button.y + } + + position += (this.opts.orientation === 'horizontal' ? button.width : button.height) + this.opts.margin } if (this.opts.orientation === 'vertical') { @@ -249,6 +254,43 @@ export default class ButtonGroup extends PIXI.Graphics { this.disabled = this.opts.disabled } + // interaction + //-------------------- + if (this.opts.stacked) { + this.interactive = true + this.on('pointerdown', this.onStart.bind(this)) + this.on('pointermove', this.onMove.bind(this)) + this.on('pointerup', this.onEnd.bind(this)) + this.on('pointercancel', this.onEnd.bind(this)) + this.on('pointerout', this.onEnd.bind(this)) + this.on('pointerupoutside', this.onEnd.bind(this)) + this.on('scroll', this.onScroll.bind(this)) + + // mousewheel + //-------------------- + if (this.opts.app) { + const app = this.opts.app + app.view.addEventListener('mousewheel', event => { + const bounds = this.getBounds() + const x = event.clientX - app.view.getBoundingClientRect().left + const y = event.clientY - app.view.getBoundingClientRect().top + if (bounds.contains(x, y)) { + event.preventDefault() + this.emit('scroll', event) + } + }) + } + + const background = new PIXI.Graphics() + background.beginFill(0x000000, 0) + background.drawRect(0, 0, this.width, this.height) + background.endFill() + this.addChildAt(background, 0) + + this.__initWidth = this.container.width + this.__deltaWidth = this.container.width - this.opts.maxWidth + } + return this } @@ -266,6 +308,12 @@ export default class ButtonGroup extends PIXI.Graphics { //----------------- this.draw() + // stacked + //----------------- + if (this.opts.stacked) { + this.stack() + } + return this } @@ -279,41 +327,27 @@ export default class ButtonGroup extends PIXI.Graphics { if (this.opts.margin === 0) { this.buttons.forEach(it => it.hide()) - this.clear() - this.lineStyle( - this.opts.strokeWidth, - this.opts.stroke, - this.opts.strokeAlpha - ) - this.beginFill(this.opts.fill, this.opts.fillAlpha) - this.drawRoundedRect( - 0, - 0, - this.width, - this.height, - this.opts.radius - ) + this.container.clear() + this.container.lineStyle(this.opts.strokeWidth, this.opts.stroke, this.opts.strokeAlpha) + this.container.beginFill(this.opts.fill, this.opts.fillAlpha) + this.container.drawRoundedRect(0, 0, this.width, this.height, this.opts.radius) // Draw borders - this.lineStyle( - this.opts.strokeWidth, - this.opts.stroke, - this.opts.strokeAlpha / 2 - ) + this.container.lineStyle(this.opts.strokeWidth, this.opts.stroke, this.opts.strokeAlpha / 2) this.buttons.forEach((it, i) => { if (i > 0) { - this.moveTo(it.x, it.y) + this.container.moveTo(it.x, it.y) if (this.opts.orientation === 'horizontal') { - this.lineTo(it.x, it.height) + this.container.lineTo(it.x, it.height) } else { - this.lineTo(it.width, it.y) + this.container.lineTo(it.width, it.y) } } }) - this.endFill() + this.container.endFill() } return this @@ -367,4 +401,168 @@ export default class ButtonGroup extends PIXI.Graphics { return this } + + /** + * + * @private + * @param {*} event + */ + onStart(event) { + this.__dragging = true + + this.capture(event) + + this.__delta = { + x: this.container.position.x - event.data.global.x, + y: this.container.position.y - event.data.global.y + } + + TweenLite.killTweensOf(this.container.position, { x: true, y: true }) + if (typeof ThrowPropsPlugin != 'undefined') { + ThrowPropsPlugin.track(this.container.position, 'x,y') + } + } + + /** + * + * @private + * @param {*} event + */ + onMove(event) { + if (this.__dragging) { + this.capture(event) + + if (this.opts.orientation === 'horizontal') { + this.container.position.x = event.data.global.x + this.__delta.x + } else { + this.container.position.y = event.data.global.y + this.__delta.y + } + + if (this.opts.stacked) { + this.stack() + } + } + } + + /** + * + * @private + * @param {*} event + */ + onEnd(event) { + if (this.__dragging) { + this.__dragging = false + + this.capture(event) + + if (typeof ThrowPropsPlugin != 'undefined') { + const throwProps = { x: { velocity: 'auto' }, y: { velocity: 'auto' } } + + if (this.opts.orientation === 'horizontal') { + const distanceToLeft = this.container.x + const distanceToRight = this.opts.maxWidth - this.container.x - this.__initWidth + if (distanceToLeft > 0 && distanceToLeft > distanceToRight) { + throwProps.x.end = 0 + } else if (distanceToRight > 0 && distanceToRight > distanceToLeft) { + throwProps.x.end = this.opts.maxWidth - this.__initWidth + } + } else { + const distanceToTop = this.container.y + const distanceToBottom = this.opts.maxHeight - this.container.y - this.container.height + if (distanceToTop > 0 && distanceToTop > distanceToBottom) { + throwProps.y.end = 0 + } else if (distanceToBottom > 0 && distanceToBottom > distanceToTop) { + throwProps.y.end = this.opts.maxHeight - this.container.height + } + } + + ThrowPropsPlugin.to( + this.container.position, + { + throwProps, + ease: Strong.easeOut, + onUpdate: () => this.stack(), + onComplete: () => ThrowPropsPlugin.untrack(this.container.position) + }, + 0.8, + 0.4 + ) + } + } + } + + /** + * + * @private + * @param {*} event + */ + onScroll(event) { + this.capture(event) + + if (this.opts.orientation === 'horizontal') { + this.container.position.x -= event.deltaX + if (this.container.position.x > 0) { + this.container.position.x = 0 + } else if (this.container.position.x + this.__initWidth < this.opts.maxWidth) { + this.container.position.x = this.opts.maxWidth - this.__initWidth + } + } else { + this.container.position.y -= event.deltaY + if (this.container.position.y > 0) { + this.container.position.y = 0 + } else if (this.container.position.y + this.container.height < this.opts.maxHeight) { + this.container.position.y = this.opts.maxHeight - this.container.height + } + } + + if (this.opts.stacked) { + this.stack() + } + } + + /** + * Captures an event to inform InteractionMapper about processed events. + * + * @param {event|PIXI.InteractionEvent} event - The PIXI event to capture. + */ + capture(event) { + const originalEvent = event.data && event.data.originalEvent ? event.data.originalEvent : event + Events.capturedBy(originalEvent, this) + } + + /** + * + */ + stack() { + this.buttons.forEach((it, index) => { + if (it.__originalPosition.x + this.container.x < 0) { + // left border + it.x = -this.container.x + } else if (it.__originalPosition.x + it.width > Math.abs(this.container.x) + this.opts.maxWidth) { + // right border + it.x = Math.abs(this.container.x) + this.opts.maxWidth - it.width + } else { + it.x = it.__originalPosition.x + } + }) + + this.buttons.sort((a, b) => { + const delta = Math.abs(this.container.x) + this.opts.maxWidth / 2 + const distanceA = Math.abs(a.x - delta) + const distanceB = Math.abs(b.x - delta) + if (distanceA > distanceB) { + return -1 + } else if (distanceB > distanceA) { + return 1 + } else { + return 0 + } + }) + + this.buttons.forEach(it => { + const parent = it.parent + parent.removeChild(it) + parent.addChild(it) + }) + } } diff --git a/lib/pixi/flipeffect.js b/lib/pixi/flipeffect.js index 78b659e..0f8854e 100644 --- a/lib/pixi/flipeffect.js +++ b/lib/pixi/flipeffect.js @@ -112,15 +112,9 @@ export default class FlipEffect { this.scatter = scatter this.backLoader = backLoader this.scatterLoader = new ScatterLoader(scatter) - this.domFlip = new DOMFlip( - domScatterContainer, - flipTemplate, - this.scatterLoader, - backLoader, - { - onBack: this.backCardClosed.bind(this) - } - ) + this.domFlip = new DOMFlip(domScatterContainer, flipTemplate, this.scatterLoader, backLoader, { + onBack: this.backCardClosed.bind(this) + }) this.setupInfoButton() } @@ -147,11 +141,7 @@ export default class FlipEffect { let center = this.scatter.center let canvas = app.renderer.view let domNode = this.domFlip.domScatterContainer.element - let page = window.convertPointFromNodeToPage( - canvas, - center.x * resolution, - center.y * resolution - ) + let page = window.convertPointFromNodeToPage(canvas, center.x * resolution, center.y * resolution) let local = window.convertPointFromPageToNode(domNode, page.x, page.y) return local } @@ -231,9 +221,7 @@ export default class FlipEffect { canvas.height = 44 * 4 svgImage.onload = e => { let displayObject = this.scatter.displayObject - canvas - .getContext('2d') - .drawImage(svgImage, 0, 0, canvas.width, canvas.height) + canvas.getContext('2d').drawImage(svgImage, 0, 0, canvas.width, canvas.height) let texure = new PIXI.Texture(new PIXI.BaseTexture(canvas)) this.infoBtn = new PIXI.Sprite(texure) this.infoBtn.anchor.set(0.5, 0.5) diff --git a/lib/pixi/flippable.js b/lib/pixi/flippable.js index fc450f0..0da01a4 100644 --- a/lib/pixi/flippable.js +++ b/lib/pixi/flippable.js @@ -93,12 +93,7 @@ export default class Flippable extends PIXI.projection.Camera3d { // planes //-------------------- - this.setPlanes( - this.opts.focus, - this.opts.near, - this.opts.far, - this.opts.orthographic - ) + this.setPlanes(this.opts.focus, this.opts.near, this.opts.far, this.opts.orthographic) // flipped //-------------------- @@ -137,9 +132,7 @@ export default class Flippable extends PIXI.projection.Camera3d { // shadow //-------------------- - const shadow = new PIXI.projection.Sprite3d( - PIXI.Texture.fromImage('../../assets/images/shadow.png') - ) + const shadow = new PIXI.projection.Sprite3d(PIXI.Texture.fromImage('../../assets/images/shadow.png')) shadow.renderable = false shadow.anchor.set(0.5) shadow.scale3d.set(0.98) @@ -231,21 +224,11 @@ export default class Flippable extends PIXI.projection.Camera3d { y: this.opts.useBackTransforms ? toCenter.y : fromCenter.y, anchorX: this.opts.useBackTransforms ? toObject.x : fromObject.x, anchorY: this.opts.useBackTransforms ? toObject.y : fromObject.y, - width: this.opts.useBackTransforms - ? toObject.width * 2 - : fromObject.width * 2, - height: this.opts.useBackTransforms - ? toObject.height * 2 - : fromObject.height * 2, - rotation: this.opts.useBackTransforms - ? toObject.rotation - : fromObject.rotation, - skewX: this.opts.useBackTransforms - ? toObject.skew.x - : fromObject.skew.x, - skewY: this.opts.useBackTransforms - ? toObject.skew.y - : fromObject.skew.y + width: this.opts.useBackTransforms ? toObject.width * 2 : fromObject.width * 2, + height: this.opts.useBackTransforms ? toObject.height * 2 : fromObject.height * 2, + rotation: this.opts.useBackTransforms ? toObject.rotation : fromObject.rotation, + skewX: this.opts.useBackTransforms ? toObject.skew.x : fromObject.skew.x, + skewY: this.opts.useBackTransforms ? toObject.skew.y : fromObject.skew.y } // set toObject end values @@ -331,15 +314,11 @@ export default class Flippable extends PIXI.projection.Camera3d { // shadow //-------------------- - new TimelineMax() - .to(shadow, half, { alpha: 0.3, ease }) - .to(shadow, half, { alpha: 0.7, ease }) + new TimelineMax().to(shadow, half, { alpha: 0.3, ease }).to(shadow, half, { alpha: 0.7, ease }) // blurfilter //-------------------- - new TimelineMax() - .to(blurFilter, half, { blur: 6, ease }) - .to(blurFilter, half, { blur: 0.2, ease }) + new TimelineMax().to(blurFilter, half, { blur: 6, ease }).to(blurFilter, half, { blur: 0.2, ease }) } /** @@ -353,8 +332,7 @@ export default class Flippable extends PIXI.projection.Camera3d { const shadow = this.objects.shadow const inner = this.objects.inner - inner.position3d.z = - -Math.sin(inner.euler.y) * front.texture.baseTexture.width * 2 + inner.position3d.z = -Math.sin(inner.euler.y) * front.texture.baseTexture.width * 2 //this.objects.shadow.euler = this.objects.inner.euler shadow.euler.x = -inner.euler.x @@ -421,10 +399,7 @@ export default class Flippable extends PIXI.projection.Camera3d { generateTexture(displayObject) { // renderTexture //-------------------- - const renderTexture = PIXI.RenderTexture.create( - displayObject.width, - displayObject.height - ) + const renderTexture = PIXI.RenderTexture.create(displayObject.width, displayObject.height) // save position const transform = [ diff --git a/lib/pixi/labeledgraphics.js b/lib/pixi/labeledgraphics.js index 8657b83..03c97c7 100644 --- a/lib/pixi/labeledgraphics.js +++ b/lib/pixi/labeledgraphics.js @@ -77,15 +77,9 @@ export class Hypenate { let first = true let lastPart = '' for (let part of parts) { - let partMetrics = PIXI.TextMetrics.measureText( - part, - pixiStyle - ) + let partMetrics = PIXI.TextMetrics.measureText(part, pixiStyle) if (x + partMetrics.width + space.width > width) { - newWord += - (first || lastPart.endsWith('-') - ? '\n' - : '-\n') + part + newWord += (first || lastPart.endsWith('-') ? '\n' : '-\n') + part x = partMetrics.width } else { newWord += part @@ -136,12 +130,7 @@ class TextLabel extends PIXI.Text { * @param {canvas} * @memberof TextLabel */ - constructor( - text, - style = null, - canvas = null, - { minZoom = 0.1, maxZoom = 10 } = {} - ) { + constructor(text, style = null, canvas = null, { minZoom = 0.1, maxZoom = 10 } = {}) { super(text, style, canvas) this.normFontSize = this.style.fontSize this.minZoom = minZoom @@ -290,21 +279,11 @@ export class LabeledGraphics extends PIXI.Graphics { const truncatedLines = lines.slice(0, maxLines) const lastLine = truncatedLines[truncatedLines.length - 1] const words = lastLine.split(' ') - const wordMetrics = PIXI.TextMetrics.measureText( - `\u00A0\n...\n${words.join('\n')}`, - pixiStyle - ) - const [ - spaceLength, - dotsLength, - ...wordLengths - ] = wordMetrics.lineWidths + const wordMetrics = PIXI.TextMetrics.measureText(`\u00A0\n...\n${words.join('\n')}`, pixiStyle) + const [spaceLength, dotsLength, ...wordLengths] = wordMetrics.lineWidths const { text: newLastLine } = wordLengths.reduce( (data, wordLength, i) => { - if ( - data.length + wordLength + spaceLength >= - wordWrapWidth - ) { + if (data.length + wordLength + spaceLength >= wordWrapWidth) { return { ...data, length: wordWrapWidth } } return { diff --git a/lib/pixi/list.js b/lib/pixi/list.js index a190299..20f2f5c 100644 --- a/lib/pixi/list.js +++ b/lib/pixi/list.js @@ -1,4 +1,4 @@ -/* globals */ +/* globals ThrowPropsPlugin, Strong */ /* Imports */ import Events from '../events.js' @@ -108,9 +108,7 @@ export default class List extends PIXI.Container { if (this.opts.app) { const app = this.opts.app app.view.addEventListener('mousewheel', event => { - const bounds = this.mask - ? this.mask.getBounds() - : this.getBounds() + const bounds = this.mask ? this.mask.getBounds() : this.getBounds() const x = event.clientX - app.view.getBoundingClientRect().left const y = event.clientY - app.view.getBoundingClientRect().top if (bounds.contains(x, y)) { @@ -167,14 +165,10 @@ export default class List extends PIXI.Container { if (this.opts.orientation === 'vertical') { switch (this.opts.align) { case 'center': - this.__items.forEach( - it => (it.x = margin + this.width / 2 - it.width / 2) - ) + this.__items.forEach(it => (it.x = margin + this.width / 2 - it.width / 2)) break case 'right': - this.__items.forEach( - it => (it.x = margin + this.width - it.width) - ) + this.__items.forEach(it => (it.x = margin + this.width - it.width)) break default: this.__items.forEach(it => (it.x = margin)) @@ -200,14 +194,10 @@ export default class List extends PIXI.Container { this.__items.forEach(it => (it.y = margin)) break case 'bottom': - this.__items.forEach( - it => (it.y = margin + this.height - it.height) - ) + this.__items.forEach(it => (it.y = margin + this.height - it.height)) break default: - this.__items.forEach( - it => (it.y = margin + this.height / 2 - it.height / 2) - ) + this.__items.forEach(it => (it.y = margin + this.height / 2 - it.height / 2)) break } @@ -341,8 +331,7 @@ export default class List extends PIXI.Container { { throwProps, ease: Strong.easeOut, - onComplete: () => - ThrowPropsPlugin.untrack(this.container.position) + onComplete: () => ThrowPropsPlugin.untrack(this.container.position) }, 0.8, 0.4 @@ -363,20 +352,14 @@ export default class List extends PIXI.Container { this.container.position.x -= event.deltaX if (this.container.position.x > 0) { this.container.position.x = 0 - } else if ( - this.container.position.x + this.innerWidth < - this.opts.width - ) { + } else if (this.container.position.x + this.innerWidth < this.opts.width) { this.container.position.x = this.opts.width - this.innerWidth } } else { this.container.position.y -= event.deltaY if (this.container.position.y > 0) { this.container.position.y = 0 - } else if ( - this.container.position.y + this.innerHeight < - this.opts.height - ) { + } else if (this.container.position.y + this.innerHeight < this.opts.height) { this.container.position.y = this.opts.height - this.innerHeight } } @@ -388,10 +371,7 @@ export default class List extends PIXI.Container { * @param {event|PIXI.InteractionEvent} event - The PIXI event to capture. */ capture(event) { - const originalEvent = - event.data && event.data.originalEvent - ? event.data.originalEvent - : event + const originalEvent = event.data && event.data.originalEvent ? event.data.originalEvent : event Events.capturedBy(originalEvent, this) } } diff --git a/lib/pixi/message.js b/lib/pixi/message.js index bef9305..f9f5ba2 100644 --- a/lib/pixi/message.js +++ b/lib/pixi/message.js @@ -91,8 +91,7 @@ export default class Message extends InteractivePopup { this.x = this.opts.app.size.width / 2 - this.width / 2 break case 'right': - this.x = - this.opts.app.size.width - this.opts.margin - this.width + this.x = this.opts.app.size.width - this.opts.margin - this.width break } @@ -105,8 +104,7 @@ export default class Message extends InteractivePopup { this.y = this.opts.app.size.height / 2 - this.height / 2 break case 'bottom': - this.y = - this.opts.app.size.height - this.opts.margin - this.height + this.y = this.opts.app.size.height - this.opts.margin - this.height break } } diff --git a/lib/pixi/modal.js b/lib/pixi/modal.js index cb3a1e5..563f7b3 100644 --- a/lib/pixi/modal.js +++ b/lib/pixi/modal.js @@ -134,10 +134,7 @@ export default class Modal extends PIXI.Container { // background //----------------- this.background.clear() - this.background.beginFill( - this.opts.backgroundFill, - this.opts.backgroundFillAlpha - ) + this.background.beginFill(this.opts.backgroundFill, this.opts.backgroundFillAlpha) this.background.drawRect(0, 0, width, height) this.background.endFill() diff --git a/lib/pixi/popover.js b/lib/pixi/popover.js index 58f8f04..74f1c9b 100644 --- a/lib/pixi/popover.js +++ b/lib/pixi/popover.js @@ -36,12 +36,8 @@ export default class Popover extends PIXI.Graphics { wordWrapWidth: width - this.padding * 2 } - this.titleTextStyle = new PIXI.TextStyle( - Object.assign({}, style, titleStyle) - ) - this.textTextStyle = new PIXI.TextStyle( - Object.assign({}, style, textStyle) - ) + this.titleTextStyle = new PIXI.TextStyle(Object.assign({}, style, titleStyle)) + this.textTextStyle = new PIXI.TextStyle(Object.assign({}, style, textStyle)) if (title || text) { this.setup() @@ -64,10 +60,7 @@ export default class Popover extends PIXI.Graphics { if (this.opts.text) { this.textText = new PIXI.Text(this.opts.text, this.textTextStyle) - this.textText.position.set( - this.padding, - this.titleY + this.titleHeight + this.padding - ) + this.textText.position.set(this.padding, this.titleY + this.titleHeight + this.padding) this.addChild(this.textText) } diff --git a/lib/pixi/popup.js b/lib/pixi/popup.js index 497d4e5..807193e 100644 --- a/lib/pixi/popup.js +++ b/lib/pixi/popup.js @@ -73,10 +73,7 @@ export class InteractivePopup extends AbstractPopup { // closeButton //----------------- if (this.opts.closeButton) { - let closeButton = PIXI.Sprite.fromImage( - '../../assets/icons/close.png', - true - ) + let closeButton = PIXI.Sprite.fromImage('../../assets/icons/close.png', true) closeButton.width = this.headerStyle.fontSize closeButton.height = closeButton.width closeButton.tint = this.theme.color2 @@ -100,10 +97,7 @@ export class InteractivePopup extends AbstractPopup { //----------------- if (this.opts.maxWidth) { const wordWrapWidth = - this.opts.maxWidth - - 2 * this.opts.padding - - this.smallPadding - - this._closeButton.width + this.opts.maxWidth - 2 * this.opts.padding - this.smallPadding - this._closeButton.width if (this._header) { this.headerStyle.wordWrapWidth = wordWrapWidth } else if (this._content) { @@ -116,18 +110,10 @@ export class InteractivePopup extends AbstractPopup { //----------------- if (this.opts.button || this.opts.buttonGroup) { if (this.opts.button) { - this._buttons = new Button( - Object.assign( - { textStyle: this.theme.textStyleSmall }, - this.opts.button - ) - ) + this._buttons = new Button(Object.assign({ textStyle: this.theme.textStyleSmall }, this.opts.button)) } else { this._buttons = new ButtonGroup( - Object.assign( - { textStyle: this.theme.textStyleSmall }, - this.opts.buttonGroup - ) + Object.assign({ textStyle: this.theme.textStyleSmall }, this.opts.buttonGroup) ) } this.addChild(this._buttons) @@ -149,18 +135,15 @@ export class InteractivePopup extends AbstractPopup { // closeButton //----------------- if (this.opts.closeButton) { - this._closeButton.x = - this.wantedWidth - this.smallPadding - this._closeButton.width + this._closeButton.x = this.wantedWidth - this.smallPadding - this._closeButton.width this._closeButton.y = this.smallPadding } // buttons //----------------- if (this._buttons) { - this._buttons.x = - this.wantedWidth - this.opts.padding - this._buttons.width - this._buttons.y = - this.wantedHeight - this.opts.padding - this._buttons.height + this._buttons.x = this.wantedWidth - this.opts.padding - this._buttons.width + this._buttons.y = this.wantedHeight - this.opts.padding - this._buttons.height } return this @@ -183,10 +166,7 @@ export class InteractivePopup extends AbstractPopup { } if (this._buttons) { - size.width = Math.max( - size.width, - this._buttons.x + this._buttons.width - ) + size.width = Math.max(size.width, this._buttons.x + this._buttons.width) size.height += this.innerPadding + this._buttons.height } diff --git a/lib/pixi/popupmenu.js b/lib/pixi/popupmenu.js index 2b4ba9e..f08811a 100644 --- a/lib/pixi/popupmenu.js +++ b/lib/pixi/popupmenu.js @@ -74,10 +74,7 @@ export default class PopupMenu extends Popup { let object = null if (item.label) { - object = new PIXI.Text( - item.label, - item.textStyle || this.opts.textStyle - ) + object = new PIXI.Text(item.label, item.textStyle || this.opts.textStyle) } else { object = item.content } diff --git a/lib/pixi/progress.js b/lib/pixi/progress.js index faa6095..c3d7a5e 100644 --- a/lib/pixi/progress.js +++ b/lib/pixi/progress.js @@ -154,10 +154,7 @@ export default class Progress extends PIXI.Container { //----------------- if (this.opts.background) { this.background.clear() - this.background.beginFill( - this.opts.backgroundFill, - this.opts.backgroundFillAlpha - ) + this.background.beginFill(this.opts.backgroundFill, this.opts.backgroundFillAlpha) this.background.drawRect(0, 0, width, height) this.background.endFill() } @@ -201,20 +198,10 @@ export default class Progress extends PIXI.Container { const wantedWidth = this.opts.width || width - 2 * this.opts.margin const wantedHeight = this.opts.height - this.bar.lineStyle( - this.opts.strokeWidth, - this.opts.stroke, - this.opts.strokeAlpha - ) + this.bar.lineStyle(this.opts.strokeWidth, this.opts.stroke, this.opts.strokeAlpha) this.bar.beginFill(this.opts.fill, this.opts.fillAlpha) if (this.radius > 1) { - this.bar.drawRoundedRect( - 0, - 0, - wantedWidth, - wantedHeight, - this.radius - ) + this.bar.drawRoundedRect(0, 0, wantedWidth, wantedHeight, this.radius) } else { this.bar.drawRect(0, 0, wantedWidth, wantedHeight) } @@ -238,24 +225,11 @@ export default class Progress extends PIXI.Container { const barActiveWidth = (wantedWidth * this._progress) / 100 - this.barActive.lineStyle( - this.opts.strokeActiveWidth, - this.opts.strokeActive, - this.opts.strokeActiveAlpha - ) - this.barActive.beginFill( - this.opts.fillActive, - this.opts.fillActiveAlpha - ) + this.barActive.lineStyle(this.opts.strokeActiveWidth, this.opts.strokeActive, this.opts.strokeActiveAlpha) + this.barActive.beginFill(this.opts.fillActive, this.opts.fillActiveAlpha) if (barActiveWidth > 0) { if (this.radius > 1) { - this.barActive.drawRoundedRect( - 0, - 0, - barActiveWidth, - wantedHeight, - this.radius - ) + this.barActive.drawRoundedRect(0, 0, barActiveWidth, wantedHeight, this.radius) } else { this.barActive.drawRect(0, 0, barActiveWidth, wantedHeight) } diff --git a/lib/pixi/scatter.js b/lib/pixi/scatter.js index f5de08e..9b43d03 100755 --- a/lib/pixi/scatter.js +++ b/lib/pixi/scatter.js @@ -79,12 +79,8 @@ export class ScatterContainer extends PIXI.Graphics { let y = 0 // @container: We need to call the constant values, as the container // gets resized, when a child moves outside the original boundaries. - let w = this.container - ? this.containerDimensions.x - : this.backgroundWidth || this.app.width - let h = this.container - ? this.containerDimensions.y - : this.backgroundHeight || this.app.height + let w = this.container ? this.containerDimensions.x : this.backgroundWidth || this.app.width + let h = this.container ? this.containerDimensions.y : this.backgroundHeight || this.app.height if (this.app.fullscreen && this.app.monkeyPatchMapping) { let fixed = this.mapPositionToPoint({ x: w, y: 0 }) @@ -167,14 +163,8 @@ export class ScatterContainer extends PIXI.Graphics { // if (hit) { // console.log("findHitScatter", displayObject) // } - if ( - hit && - this.hitScatter === null && - typeof displayObject != undefined - ) { - this.hitScatter = displayObject.scatter - ? displayObject.scatter - : null + if (hit && this.hitScatter === null && typeof displayObject != undefined) { + this.hitScatter = displayObject.scatter ? displayObject.scatter : null } } @@ -184,10 +174,7 @@ export class ScatterContainer extends PIXI.Graphics { let local = new PIXI.Point() let interactionManager = this.renderer.plugins.interaction interactionManager.mapPositionToPoint(local, point.x, point.y) - if ( - element instanceof DisplayObjectScatter && - element.displayObject.parent != null - ) { + if (element instanceof DisplayObjectScatter && element.displayObject.parent != null) { return element.displayObject.parent.toLocal(local) } return local @@ -204,12 +191,7 @@ export class ScatterContainer extends PIXI.Graphics { this.hitScatter = null let interactionManager = this.renderer.plugins.interaction let fakeEvent = this.fakeInteractionEvent(local) - interactionManager.processInteractive( - fakeEvent, - this, - this.findHitScatter.bind(this), - true - ) + interactionManager.processInteractive(fakeEvent, this, this.findHitScatter.bind(this), true) if (this.claimEvents) event.claimedByScatter = this.hitScatter return this.hitScatter } @@ -223,8 +205,7 @@ export class ScatterContainer extends PIXI.Graphics { this.hitScatter = null let interactionManager = this.renderer.plugins.interaction let displayObject = interactionManager.hitTest(local, this) - if (displayObject != null && displayObject.scatter != null) - this.hitScatter = displayObject.scatter + if (displayObject != null && displayObject.scatter != null) this.hitScatter = displayObject.scatter if (this.claimEvents) event.claimedByScatter = this.hitScatter return this.hitScatter } @@ -359,8 +340,7 @@ export class DisplayObjectScatter extends AbstractScatter { get container() { // return this.displayObject.parent let obj = this.displayObject - while (obj.parent != null && !(obj.parent instanceof ScatterContainer)) - obj = obj.parent + while (obj.parent != null && !(obj.parent instanceof ScatterContainer)) obj = obj.parent return obj.parent } @@ -469,8 +449,7 @@ export class DisplayObjectScatter extends AbstractScatter { mapPositionToContainerPoint(point) { // UO: We need the coordinates related to this scatter in case // of nested scatters - if (this.container != null) - return this.container.mapPositionToPoint(point, this) + if (this.container != null) return this.container.mapPositionToPoint(point, this) return point } @@ -483,10 +462,7 @@ export class DisplayObjectScatter extends AbstractScatter { if (this.displayObject.parent instanceof ScatterContainer) { let scatterContainer = this.displayObject.parent scatterContainer.bringToFront(this.displayObject) - } else if ( - this.displayObject.parent != null && - this.displayObject.parent.scatter - ) { + } else if (this.displayObject.parent != null && this.displayObject.parent.scatter) { this.displayObject.parent.scatter.toFront(this.displayObject) } } diff --git a/lib/pixi/scrollbox.js b/lib/pixi/scrollbox.js index 397c4f3..39c1116 100644 --- a/lib/pixi/scrollbox.js +++ b/lib/pixi/scrollbox.js @@ -238,10 +238,7 @@ export default class Scrollbox extends PIXI.Container { * @readonly */ get contentWidth() { - return ( - this.options.boxWidth - - (this.isScrollbarVertical ? this.options.scrollbarSize : 0) - ) + return this.options.boxWidth - (this.isScrollbarVertical ? this.options.scrollbarSize : 0) } /** @@ -250,10 +247,7 @@ export default class Scrollbox extends PIXI.Container { * @readonly */ get contentHeight() { - return ( - this.options.boxHeight - - (this.isScrollbarHorizontal ? this.options.scrollbarSize : 0) - ) + return this.options.boxHeight - (this.isScrollbarHorizontal ? this.options.scrollbarSize : 0) } /** @@ -330,19 +324,11 @@ export default class Scrollbox extends PIXI.Container { this.scrollbar.clear() let options = {} options.left = 0 - options.right = - this.scrollWidth + - (this._isScrollbarVertical ? this.options.scrollbarSize : 0) + options.right = this.scrollWidth + (this._isScrollbarVertical ? this.options.scrollbarSize : 0) options.top = 0 - options.bottom = - this.scrollHeight + - (this.isScrollbarHorizontal ? this.options.scrollbarSize : 0) - const width = - this.scrollWidth + - (this.isScrollbarVertical ? this.options.scrollbarSize : 0) - const height = - this.scrollHeight + - (this.isScrollbarHorizontal ? this.options.scrollbarSize : 0) + options.bottom = this.scrollHeight + (this.isScrollbarHorizontal ? this.options.scrollbarSize : 0) + const width = this.scrollWidth + (this.isScrollbarVertical ? this.options.scrollbarSize : 0) + const height = this.scrollHeight + (this.isScrollbarHorizontal ? this.options.scrollbarSize : 0) this.scrollbarTop = (this.content.top / height) * this.boxHeight this.scrollbarTop = this.scrollbarTop < 0 ? 0 : this.scrollbarTop this.scrollbarHeight = (this.boxHeight / height) * this.boxHeight @@ -359,14 +345,9 @@ export default class Scrollbox extends PIXI.Container { : this.scrollbarWidth if (this.isScrollbarVertical) { this.scrollbar - .beginFill( - this.options.scrollbarBackground, - this.options.scrollbarBackgroundAlpha - ) + .beginFill(this.options.scrollbarBackground, this.options.scrollbarBackgroundAlpha) .drawRect( - this.boxWidth - - this.scrollbarSize + - this.options.scrollbarOffsetVertical, + this.boxWidth - this.scrollbarSize + this.options.scrollbarOffsetVertical, 0, this.scrollbarSize, this.boxHeight @@ -375,15 +356,10 @@ export default class Scrollbox extends PIXI.Container { } if (this.isScrollbarHorizontal) { this.scrollbar - .beginFill( - this.options.scrollbarBackground, - this.options.scrollbarBackgroundAlpha - ) + .beginFill(this.options.scrollbarBackground, this.options.scrollbarBackgroundAlpha) .drawRect( 0, - this.boxHeight - - this.scrollbarSize + - this.options.scrollbarOffsetHorizontal, + this.boxHeight - this.scrollbarSize + this.options.scrollbarOffsetHorizontal, this.boxWidth, this.scrollbarSize ) @@ -391,14 +367,9 @@ export default class Scrollbox extends PIXI.Container { } if (this.isScrollbarVertical) { this.scrollbar - .beginFill( - this.options.scrollbarForeground, - this.options.scrollbarForegroundAlpha - ) + .beginFill(this.options.scrollbarForeground, this.options.scrollbarForegroundAlpha) .drawRect( - this.boxWidth - - this.scrollbarSize + - this.options.scrollbarOffsetVertical, + this.boxWidth - this.scrollbarSize + this.options.scrollbarOffsetVertical, this.scrollbarTop, this.scrollbarSize, this.scrollbarHeight @@ -407,15 +378,10 @@ export default class Scrollbox extends PIXI.Container { } if (this.isScrollbarHorizontal) { this.scrollbar - .beginFill( - this.options.scrollbarForeground, - this.options.scrollbarForegroundAlpha - ) + .beginFill(this.options.scrollbarForeground, this.options.scrollbarForegroundAlpha) .drawRect( this.scrollbarLeft, - this.boxHeight - - this.scrollbarSize + - this.options.scrollbarOffsetHorizontal, + this.boxHeight - this.scrollbarSize + this.options.scrollbarOffsetHorizontal, this.scrollbarWidth, this.scrollbarSize ) @@ -489,10 +455,7 @@ export default class Scrollbox extends PIXI.Container { const local = this.toLocal(e.data.global) if (this.isScrollbarHorizontal) { if (local.y > this.boxHeight - this.scrollbarSize) { - if ( - local.x >= this.scrollbarLeft && - local.x <= this.scrollbarLeft + this.scrollbarWidth - ) { + if (local.x >= this.scrollbarLeft && local.x <= this.scrollbarLeft + this.scrollbarWidth) { this.pointerDown = { type: 'horizontal', last: local } } else { if (local.x > this.scrollbarLeft) { @@ -511,10 +474,7 @@ export default class Scrollbox extends PIXI.Container { } if (this.isScrollbarVertical) { if (local.x > this.boxWidth - this.scrollbarSize) { - if ( - local.y >= this.scrollbarTop && - local.y <= this.scrollbarTop + this.scrollbarWidth - ) { + if (local.y >= this.scrollbarTop && local.y <= this.scrollbarTop + this.scrollbarWidth) { this.pointerDown = { type: 'vertical', last: local } } else { if (local.y > this.scrollbarTop) { @@ -574,26 +534,15 @@ export default class Scrollbox extends PIXI.Container { * @param {number} [options.scrollHeight] set the height of the inside of the scrollbox (leave null to use content.height) */ resize(options) { - this.options.boxWidth = - typeof options.boxWidth !== 'undefined' - ? options.boxWidth - : this.options.boxWidth - this.options.boxHeight = - typeof options.boxHeight !== 'undefined' - ? options.boxHeight - : this.options.boxHeight + this.options.boxWidth = typeof options.boxWidth !== 'undefined' ? options.boxWidth : this.options.boxWidth + this.options.boxHeight = typeof options.boxHeight !== 'undefined' ? options.boxHeight : this.options.boxHeight if (options.scrollWidth) { this.scrollWidth = options.scrollWidth } if (options.scrollHeight) { this.scrollHeight = options.scrollHeight } - this.content.resize( - this.options.boxWidth, - this.options.boxHeight, - this.scrollWidth, - this.scrollHeight - ) + this.content.resize(this.options.boxWidth, this.options.boxHeight, this.scrollWidth, this.scrollHeight) this.update() } diff --git a/lib/pixi/slider.js b/lib/pixi/slider.js index de2841b..ec7db9b 100644 --- a/lib/pixi/slider.js +++ b/lib/pixi/slider.js @@ -176,12 +176,8 @@ export default class Slider extends PIXI.Container { this.on('pointermove', e => { if (this.control.dragging) { - const moveX = this.control.event.data.getLocalPosition( - this.control.parent - ).x - this._value = this.pixelToValue( - moveX - this.control.delta - this.opts.controlRadius - ) + const moveX = this.control.event.data.getLocalPosition(this.control.parent).x + this._value = this.pixelToValue(moveX - this.control.delta - this.opts.controlRadius) let x = this.valueToPixel(this._value) + this.opts.controlRadius this.control.x = x @@ -193,16 +189,8 @@ export default class Slider extends PIXI.Container { if (container instanceof Element) { container.addEventListener('pointerup', e => this.onEnd(e), false) - container.addEventListener( - 'pointercancel', - e => this.onEnd(e), - false - ) - container.addEventListener( - 'pointerleave', - e => this.onEnd(e), - false - ) + container.addEventListener('pointercancel', e => this.onEnd(e), false) + container.addEventListener('pointerleave', e => this.onEnd(e), false) container.addEventListener('pointerout', e => this.onEnd(e), false) container.addEventListener('mouseup', e => this.onEnd(e), false) container.addEventListener('mousecancel', e => this.onEnd(e), false) @@ -263,9 +251,7 @@ export default class Slider extends PIXI.Container { if (this.sliderObj.pointerdowned) { this.sliderObj.pointerdowned = false const position = e.data.getLocalPosition(this.control.parent) - this.value = this.pixelToValue( - position.x - this.opts.controlRadius - ) + this.value = this.pixelToValue(position.x - this.opts.controlRadius) TweenLite.to(this.control, this.theme.fast, { alpha: 0.83 }) } }) @@ -325,11 +311,7 @@ export default class Slider extends PIXI.Container { this.sliderObj.clear() this.sliderObj.beginFill(0xffffff, 0) this.sliderObj.drawRect(0, 0, x + w + cr, cr * 2) - this.sliderObj.lineStyle( - this.opts.strokeWidth, - this.opts.stroke, - this.opts.strokeAlpha - ) + this.sliderObj.lineStyle(this.opts.strokeWidth, this.opts.stroke, this.opts.strokeAlpha) this.sliderObj.beginFill(this.opts.fill, this.opts.fillAlpha) this.sliderObj.moveTo(x, y) this.sliderObj.lineTo(x + w, y) @@ -343,20 +325,10 @@ export default class Slider extends PIXI.Container { // Draw control this.control.clear() - this.control.lineStyle( - this.opts.controlStrokeWidth, - this.opts.controlStroke, - this.opts.controlStrokeAlpha - ) - this.control.beginFill( - this.opts.controlFill, - this.opts.controlFillAlpha - ) + this.control.lineStyle(this.opts.controlStrokeWidth, this.opts.controlStroke, this.opts.controlStrokeAlpha) + this.control.beginFill(this.opts.controlFill, this.opts.controlFillAlpha) this.control.drawCircle(0, 0, cr - 1) - this.control.beginFill( - this.opts.controlStroke, - this.opts.controlStrokeAlpha - ) + this.control.beginFill(this.opts.controlStroke, this.opts.controlStrokeAlpha) this.control.drawCircle(0, 0, cr / 6) this.control.endFill() @@ -394,10 +366,7 @@ export default class Slider extends PIXI.Container { } else if (value > this.opts.max) { value = this.opts.max } - return ( - (this.opts.width * (value - this.opts.min)) / - (this.opts.max - this.opts.min) - ) + return (this.opts.width * (value - this.opts.min)) / (this.opts.max - this.opts.min) } /** @@ -413,10 +382,7 @@ export default class Slider extends PIXI.Container { } else if (pixel > this.opts.width) { pixel = this.opts.width } - return ( - this.opts.min + - ((this.opts.max - this.opts.min) * pixel) / this.opts.width - ) + return this.opts.min + ((this.opts.max - this.opts.min) * pixel) / this.opts.width } /** diff --git a/lib/pixi/stylus.js b/lib/pixi/stylus.js index 3307155..7a5c118 100755 --- a/lib/pixi/stylus.js +++ b/lib/pixi/stylus.js @@ -119,10 +119,7 @@ export default class Stylus extends PIXI.Graphics { let identifier = event.data.identifier if (typeof event.data.originalEvent.changedTouches !== 'undefined') { for (let touch of event.data.originalEvent.changedTouches) { - if ( - touch.identifier === identifier && - touch.touchType === 'stylus' - ) { + if (touch.identifier === identifier && touch.touchType === 'stylus') { this.tiltX = Angle.radian2degree(touch.azimuthAngle) this.tiltY = 90.0 - Angle.radian2degree(touch.altitudeAngle) return true @@ -142,10 +139,7 @@ export default class Stylus extends PIXI.Graphics { let identifier = event.data.identifier if (typeof event.data.originalEvent.changedTouches !== 'undefined') { for (let touch of event.data.originalEvent.changedTouches) { - if ( - touch.identifier === identifier && - touch.pointerType === 'touch' - ) { + if (touch.identifier === identifier && touch.pointerType === 'touch') { return true } } @@ -182,8 +176,7 @@ export default class Stylus extends PIXI.Graphics { this.tiltY += 5 break } - if (this.debug) - console.log('keydown', e.keyCode, this.tiltX, this.tiltY) + if (this.debug) console.log('keydown', e.keyCode, this.tiltX, this.tiltY) }) this.on('pointerdown', e => { @@ -197,15 +190,9 @@ export default class Stylus extends PIXI.Graphics { }) this.on('pointermove', e => { - if ( - Events.isPointerDown(e.data.originalEvent) || - this.isStylusPointer(e) || - this.isStylusTouch(e) - ) { - if (this.debug) - console.log('pointermove', e, this.eventInside(e)) - if (this.eventInside(e) && this.singlePointer()) - this.moveStroke(this.toStroke(e)) + if (Events.isPointerDown(e.data.originalEvent) || this.isStylusPointer(e) || this.isStylusTouch(e)) { + if (this.debug) console.log('pointermove', e, this.eventInside(e)) + if (this.eventInside(e) && this.singlePointer()) this.moveStroke(this.toStroke(e)) } }) this.on('pointerup', e => { @@ -320,11 +307,7 @@ export default class Stylus extends PIXI.Graphics { this.moveTo(start.x, start.y) for (let i = 1; i < stroke.length; i++) { let info = stroke[i] - this.lineStyle( - this.tiltToLineWidth(info.tiltY), - info.color, - this.colorAlpha - ) + this.lineStyle(this.tiltToLineWidth(info.tiltY), info.color, this.colorAlpha) this.lineTo(info.x, info.y) } this.endFill() diff --git a/lib/pixi/switch.js b/lib/pixi/switch.js index fcb3ecf..f61adc5 100644 --- a/lib/pixi/switch.js +++ b/lib/pixi/switch.js @@ -152,10 +152,8 @@ export default class Switch extends PIXI.Container { opts ) - this.opts.controlRadius = - this.opts.controlRadius || this.opts.height / 2 - this.opts.controlRadiusActive = - this.opts.controlRadiusActive || this.opts.controlRadius + this.opts.controlRadius = this.opts.controlRadius || this.opts.height / 2 + this.opts.controlRadiusActive = this.opts.controlRadiusActive || this.opts.controlRadius // Validation //----------------- @@ -317,32 +315,15 @@ export default class Switch extends PIXI.Container { draw() { this.switchObj.clear() if (this.active) { - this.switchObj.lineStyle( - this.opts.strokeActiveWidth, - this.opts.strokeActive, - this.opts.strokeActiveAlpha - ) - this.switchObj.beginFill( - this.opts.fillActive, - this.opts.fillActiveAlpha - ) + this.switchObj.lineStyle(this.opts.strokeActiveWidth, this.opts.strokeActive, this.opts.strokeActiveAlpha) + this.switchObj.beginFill(this.opts.fillActive, this.opts.fillActiveAlpha) } else { - this.switchObj.lineStyle( - this.opts.strokeWidth, - this.opts.stroke, - this.opts.strokeAlpha - ) + this.switchObj.lineStyle(this.opts.strokeWidth, this.opts.stroke, this.opts.strokeAlpha) this.switchObj.beginFill(this.opts.fill, this.opts.fillAlpha) } this.switchObj.moveTo(this.radius, 0) this.switchObj.lineTo(this.opts.width - this.radius, 0) - this.switchObj.arcTo( - this.opts.width, - 0, - this.opts.width, - this.radius, - this.radius - ) + this.switchObj.arcTo(this.opts.width, 0, this.opts.width, this.radius, this.radius) this.switchObj.lineTo(this.opts.width, this.radius + 1) // BUGFIX: If not specified, there is a small area without a stroke. this.switchObj.arcTo( this.opts.width, @@ -364,21 +345,11 @@ export default class Switch extends PIXI.Container { this.opts.controlStrokeActive, this.opts.controlStrokeActiveAlpha ) - this.control.beginFill( - this.opts.controlFillActive, - this.opts.controlFillActiveAlpha - ) + this.control.beginFill(this.opts.controlFillActive, this.opts.controlFillActiveAlpha) this.control.drawCircle(0, 0, this.opts.controlRadiusActive - 1) } else { - this.control.lineStyle( - this.opts.controlStrokeWidth, - this.opts.controlStroke, - this.opts.controlStrokeAlpha - ) - this.control.beginFill( - this.opts.controlFill, - this.opts.controlFillAlpha - ) + this.control.lineStyle(this.opts.controlStrokeWidth, this.opts.controlStroke, this.opts.controlStrokeAlpha) + this.control.beginFill(this.opts.controlFill, this.opts.controlFillAlpha) this.control.drawCircle(0, 0, this.opts.controlRadius - 1) } this.control.endFill() @@ -394,24 +365,11 @@ export default class Switch extends PIXI.Container { */ drawAnimated() { this.switchObj.clear() - this.switchObj.lineStyle( - this.tempAnimated.strokeWidth, - this.tempAnimated.stroke, - this.tempAnimated.strokeAlpha - ) - this.switchObj.beginFill( - this.tempAnimated.fill, - this.tempAnimated.fillAlpha - ) + this.switchObj.lineStyle(this.tempAnimated.strokeWidth, this.tempAnimated.stroke, this.tempAnimated.strokeAlpha) + this.switchObj.beginFill(this.tempAnimated.fill, this.tempAnimated.fillAlpha) this.switchObj.moveTo(this.radius, 0) this.switchObj.lineTo(this.opts.width - this.radius, 0) - this.switchObj.arcTo( - this.opts.width, - 0, - this.opts.width, - this.radius, - this.radius - ) + this.switchObj.arcTo(this.opts.width, 0, this.opts.width, this.radius, this.radius) this.switchObj.lineTo(this.opts.width, this.radius + 1) // BUGFIX: If not specified, there is a small area without a stroke. this.switchObj.arcTo( this.opts.width, @@ -431,10 +389,7 @@ export default class Switch extends PIXI.Container { this.tempAnimated.controlStroke, this.tempAnimated.controlStrokeAlpha ) - this.control.beginFill( - this.tempAnimated.controlFill, - this.tempAnimated.controlFillAlpha - ) + this.control.beginFill(this.tempAnimated.controlFill, this.tempAnimated.controlFillAlpha) this.control.drawCircle(0, 0, this.tempAnimated.controlRadius - 1) this.control.endFill() diff --git a/lib/pixi/test.js b/lib/pixi/test.js index 92198e8..1a2e52a 100755 --- a/lib/pixi/test.js +++ b/lib/pixi/test.js @@ -131,21 +131,9 @@ export class RecorderTools extends PIXI.Container { setupToolbar() { this.toolbar = new PIXI.Graphics() - this.record = new RecordCommand( - this, - 0xcc0000, - new PIXI.Circle(0, 0, 16) - ) - this.play = new PlayCommand( - this, - 0x0000cc, - new PIXI.Polygon(0, 16, 32, 16 + 16, 0, 16 + 32, 0, 16) - ) - this.stop = new StopCommand( - this, - 0x0000cc, - new PIXI.Rectangle(0, 0, 32, 32) - ) + this.record = new RecordCommand(this, 0xcc0000, new PIXI.Circle(0, 0, 16)) + this.play = new PlayCommand(this, 0x0000cc, new PIXI.Polygon(0, 16, 32, 16 + 16, 0, 16 + 32, 0, 16)) + this.stop = new StopCommand(this, 0x0000cc, new PIXI.Rectangle(0, 0, 32, 32)) this.toolbar.addChild(this.record).position.set(44, 48) this.toolbar.addChild(this.play).position.set(44 + 44, 16) this.toolbar.addChild(this.stop).position.set(44 + 44 + 44 + 16, 32) @@ -183,11 +171,7 @@ export class RecorderTools extends PIXI.Container { mapPositionToPoint(point) { let local = new PIXI.Point() - this.renderer.plugins.interaction.mapPositionToPoint( - local, - point.x, - point.y - ) + this.renderer.plugins.interaction.mapPositionToPoint(local, point.x, point.y) return local } diff --git a/lib/pixi/theme.js b/lib/pixi/theme.js index 313e3c0..5507fcf 100644 --- a/lib/pixi/theme.js +++ b/lib/pixi/theme.js @@ -80,8 +80,7 @@ export default class Theme { * is used for large actived text. */ constructor(opts = {}) { - const colorPrimary = - opts.primaryColor != null ? opts.primaryColor : 0x5ec7f8 // blue + const colorPrimary = opts.primaryColor != null ? opts.primaryColor : 0x5ec7f8 // blue const color1 = opts.color1 != null ? opts.color1 : 0x282828 // black const color2 = opts.color2 != null ? opts.color2 : 0xf6f6f6 // white diff --git a/lib/pixi/timeline.js b/lib/pixi/timeline.js index 5f9f854..209481d 100644 --- a/lib/pixi/timeline.js +++ b/lib/pixi/timeline.js @@ -89,24 +89,13 @@ export class Ticks { return date.toLocaleDateString('de', format) } - draw( - timeline, - range, - width, - height, - available, - format, - nextFormat, - level, - extraTicks = false - ) { + draw(timeline, range, width, height, available, format, nextFormat, level, extraTicks = false) { let first = null let last = null let keyedFormat = format ? format[this.formatKey] : null let keyedNextFormat = nextFormat ? nextFormat[this.formatKey] : null let redundant = nextFormat ? this.formatKey in nextFormat : false - let fullyRedundant = - keyedFormat != null && keyedFormat == keyedNextFormat + let fullyRedundant = keyedFormat != null && keyedFormat == keyedNextFormat let y = timeline.getY() for (let { start, end } of this.iterRanges(range)) { let x = timeline.toX(start) @@ -131,12 +120,7 @@ export class Ticks { } if (!fullyRedundant) { - timeline.ensureLabel( - key, - text, - { x: xx, y: yy, align }, - FontInfo.small - ) + timeline.ensureLabel(key, text, { x: xx, y: yy, align }, FontInfo.small) } if (extraTicks) timeline.drawTick(x, -level) } @@ -286,11 +270,7 @@ export class DayTicks extends Ticks { } iterStart(start) { - return Dates.create( - start.getFullYear(), - start.getMonth(), - start.getDate() - ) + return Dates.create(start.getFullYear(), start.getMonth(), start.getDate()) } next(date) { @@ -331,22 +311,11 @@ export class HourTicks extends Ticks { } dateKey(date) { - return ( - this.key + - date.getFullYear() + - date.getMonth() + - date.getDate() + - date.getHours() - ) + return this.key + date.getFullYear() + date.getMonth() + date.getDate() + date.getHours() } iterStart(start) { - return Dates.create( - start.getFullYear(), - start.getMonth(), - start.getDate(), - start.getHours() - ) + return Dates.create(start.getFullYear(), start.getMonth(), start.getDate(), start.getHours()) } next(date) { @@ -388,14 +357,7 @@ export class MinuteTicks extends Ticks { } dateKey(date) { - return ( - this.key + - date.getFullYear() + - date.getMonth() + - date.getDate() + - date.getHours() + - date.getMinutes() - ) + return this.key + date.getFullYear() + date.getMonth() + date.getDate() + date.getHours() + date.getMinutes() } iterStart(start) { @@ -450,10 +412,7 @@ export class TimeTicks { let available = amount * size availables.set(ticks, available) if (available < ticks.minWidth) break - formats.set( - ticks, - available < ticks.minLabelWidth ? null : ticks.format(available) - ) + formats.set(ticks, available < ticks.minLabelWidth ? null : ticks.format(available)) nextFormats.set(previous, formats.get(ticks)) previous = ticks visible.push(ticks) @@ -522,16 +481,7 @@ export class ColorRanges { } export default class Timeline extends BitmapLabeledGraphics { - constructor( - width, - height, - { - ticks = null, - baseLine = 0.5, - showRange = true, - throwDamping = 0.95 - } = {} - ) { + constructor(width, height, { ticks = null, baseLine = 0.5, showRange = true, throwDamping = 0.95 } = {}) { super() this.wantedWidth = width this.wantedHeight = height @@ -548,12 +498,7 @@ export default class Timeline extends BitmapLabeledGraphics { this.deltas = [] this.labelDates = [] this.colorRanges = [] - this.rangeColors = new Cycle( - Colors.eminence, - Colors.steelblue, - Colors.ochre, - Colors.turquoise - ) + this.rangeColors = new Cycle(Colors.eminence, Colors.steelblue, Colors.ochre, Colors.turquoise) this.callbacks = [] this.onTapCallbacks = [] this.onDoubleTapCallbacks = [] @@ -565,14 +510,7 @@ export default class Timeline extends BitmapLabeledGraphics { this.autoScroll = false this.direction = -1 this.throwDamping = throwDamping - this.timeticks = - ticks || - new TimeTicks( - new DecadeTicks(), - new YearTicks(), - new MonthTicks(), - new DayTicks() - ) + this.timeticks = ticks || new TimeTicks(new DecadeTicks(), new YearTicks(), new MonthTicks(), new DayTicks()) this.labelPrefix = '__' } @@ -729,8 +667,7 @@ export default class Timeline extends BitmapLabeledGraphics { prepareLabels() { for (let key of this.labels.keys()) { - if (!key.startsWith(this.labelPrefix)) - this.labels.get(key).visible = false + if (!key.startsWith(this.labelPrefix)) this.labels.get(key).visible = false } } diff --git a/lib/popup.js b/lib/popup.js index b80f04e..e9fcdf3 100644 --- a/lib/popup.js +++ b/lib/popup.js @@ -147,8 +147,7 @@ export default class Popup extends Poppable { img.ondrag = e => { e.preventDefault() - let target = - this.element.querySelector('iframe') || this.element + let target = this.element.querySelector('iframe') || this.element let delta = { x: e.clientX - this.currentPos.x, y: e.clientY - this.currentPos.y @@ -250,10 +249,7 @@ export default class Popup extends Poppable { if (images.length > 0) { let count = 0 for (let image of images) { - if ( - !image.complete && - !image.src.startsWith('data:') - ) { + if (!image.complete && !image.src.startsWith('data:')) { total += 1 console.log('image not complete', image.src) image.onload = e => { @@ -365,8 +361,7 @@ export default class Popup extends Poppable { target.ondragstart = e => { this.currentPos = { x: e.clientX, y: e.clientY } var img = document.createElement('img') - img.src = - 'data:image/gifbase64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7' + img.src = 'data:image/gifbase64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7' e.dataTransfer.setDragImage(img, 0, 0) } target.ondrag = e => { @@ -416,8 +411,7 @@ export default class Popup extends Poppable { layout() {} remove() { - if (this.parent.contains(this.element)) - this.parent.removeChild(this.element) + if (this.parent.contains(this.element)) this.parent.removeChild(this.element) this.unregister(this.context) } @@ -572,36 +566,30 @@ export default class Popup extends Poppable { //if targetBoundingBox is set, popup is placed next to the rectangle if (this.targetBoundingBox) { let bbTop = this.targetBoundingBox.y - let bbBottom = - this.targetBoundingBox.y + this.targetBoundingBox.height + let bbBottom = this.targetBoundingBox.y + this.targetBoundingBox.height let bbLeft = this.targetBoundingBox.x - let bbRight = - this.targetBoundingBox.x + this.targetBoundingBox.width + let bbRight = this.targetBoundingBox.x + this.targetBoundingBox.width //console.log("place popup with bb set:", x, y, bbTop, bbBottom, bbLeft, bbRight) switch (notchPosition) { case 'bottomLeft': case 'bottomRight': case 'bottomCenter': y = bbTop - if (!this.useEventPosWithBoundingBox) - x = (bbLeft + bbRight) / 2 + if (!this.useEventPosWithBoundingBox) x = (bbLeft + bbRight) / 2 break case 'topLeft': case 'topRight': case 'topCenter': y = bbBottom - if (!this.useEventPosWithBoundingBox) - x = (bbLeft + bbRight) / 2 + if (!this.useEventPosWithBoundingBox) x = (bbLeft + bbRight) / 2 break case 'centerRight': x = bbLeft - if (!this.useEventPosWithBoundingBox) - y = (bbTop + bbBottom) / 2 + if (!this.useEventPosWithBoundingBox) y = (bbTop + bbBottom) / 2 break case 'centerLeft': x = bbRight - if (!this.useEventPosWithBoundingBox) - y = (bbTop + bbBottom) / 2 + if (!this.useEventPosWithBoundingBox) y = (bbTop + bbBottom) / 2 break default: break @@ -747,8 +735,7 @@ export default class Popup extends Poppable { boxShadow: '0 12px 15px rgba(0, 0, 0, 0.1)', bottom: -this.notchSize + 'px', position: 'absolute', - borderTop: - this.notchSize + 'px solid ' + this.backgroundColor, + borderTop: this.notchSize + 'px solid ' + this.backgroundColor, borderRight: this.notchSize + 'px solid transparent', borderLeft: this.notchSize + 'px solid transparent', borderBottom: 0 @@ -776,8 +763,7 @@ export default class Popup extends Poppable { left, top: -this.notchSize + 'px', position: 'absolute', - borderBottom: - this.notchSize + 'px solid ' + this.backgroundColor, + borderBottom: this.notchSize + 'px solid ' + this.backgroundColor, borderRight: this.notchSize + 'px solid transparent', borderLeft: this.notchSize + 'px solid transparent', borderTop: 0 @@ -814,16 +800,13 @@ export default class Popup extends Poppable { let top = size.height / 2 - this.notchSize if (notchPosition.endsWith('Left')) { left = -this.notchSize * 2 + 'px' - borderRight = - this.notchSize + 'px solid ' + this.backgroundColor - this.element.style.boxShadow = - '15px 10px 15px rgba(0, 0, 0, 0.3)' + borderRight = this.notchSize + 'px solid ' + this.backgroundColor + this.element.style.boxShadow = '15px 10px 15px rgba(0, 0, 0, 0.3)' } if (notchPosition.endsWith('Right')) { left = size.width + 'px' borderLeft = this.notchSize + 'px solid ' + this.backgroundColor - this.element.style.boxShadow = - '15px 5px 15px rgba(0, 0, 0, 0.3)' + this.element.style.boxShadow = '15px 5px 15px rgba(0, 0, 0, 0.3)' } top = Math.round(top) + 'px' @@ -880,8 +863,7 @@ export default class Popup extends Poppable { onMove = null } = {} ) { - let notchPosition = - switchPos && point.y < 50 ? 'topCenter' : 'bottomCenter' + let notchPosition = switchPos && point.y < 50 ? 'topCenter' : 'bottomCenter' let popup = new Popup({ parent, context, diff --git a/lib/popupmenu.js b/lib/popupmenu.js index 9c1f76f..0117b9a 100644 --- a/lib/popupmenu.js +++ b/lib/popupmenu.js @@ -195,8 +195,7 @@ export default class PopupMenu extends Popup { return } console.log('open', point) - let notchPosition = - point.y < 50 && switchPos ? 'topCenter' : 'bottomCenter' + let notchPosition = point.y < 50 && switchPos ? 'topCenter' : 'bottomCenter' let popup = new PopupMenu({ parent, fontSize, @@ -219,21 +218,9 @@ export default class PopupMenu extends Popup { if (this.eventOutside(e)) this.closePopup(context) } if (autoClose) { - context.addEventListener( - 'mousedown', - popup.closeEventListener, - true - ) - context.addEventListener( - 'touchstart', - popup.closeEventListener, - true - ) - context.addEventListener( - 'pointerdown', - popup.closeEventListener, - true - ) + context.addEventListener('mousedown', popup.closeEventListener, true) + context.addEventListener('touchstart', popup.closeEventListener, true) + context.addEventListener('pointerdown', popup.closeEventListener, true) } } @@ -248,18 +235,9 @@ export default class PopupMenu extends Popup { let registered = Poppable.get(context) if (registered) { registered.close() - context.removeEventListener( - 'mousedown', - registered.closeEventListener - ) - context.removeEventListener( - 'touchstart', - registered.closeEventListener - ) - context.removeEventListener( - 'pointerdown', - registered.closeEventListener - ) + context.removeEventListener('mousedown', registered.closeEventListener) + context.removeEventListener('touchstart', registered.closeEventListener) + context.removeEventListener('pointerdown', registered.closeEventListener) } } } diff --git a/lib/scatter.js b/lib/scatter.js index 5357de1..1123cc3 100644 --- a/lib/scatter.js +++ b/lib/scatter.js @@ -45,14 +45,7 @@ const END = 'onEnd' export class ScatterEvent extends BaseEvent { constructor( target, - { - translate = { x: 0, y: 0 }, - scale = null, - rotate = 0, - about = null, - fast = false, - type = null - } = {} + { translate = { x: 0, y: 0 }, scale = null, rotate = 0, about = null, fast = false, type = null } = {} ) { super('scatterTransformed', { target: target }) this.translate = translate @@ -65,13 +58,7 @@ export class ScatterEvent extends BaseEvent { toString() { return ( - "Event('scatterTransformed', scale: " + - this.scale + - ' about: ' + - this.about.x + - ', ' + - this.about.y + - ')' + "Event('scatterTransformed', scale: " + this.scale + ' about: ' + this.about.x + ', ' + this.about.y + ')' ) } } @@ -91,13 +78,7 @@ export class ResizeEvent extends BaseEvent { } toString() { - return ( - 'Event(scatterResized width: ' + - this.width + - 'height: ' + - this.height + - ')' - ) + return 'Event(scatterResized width: ' + this.width + 'height: ' + this.height + ')' } } @@ -376,7 +357,7 @@ export class AbstractScatter extends Throwable { /** Removes self from container when it's closed. */ - if(this.container){ + if (this.container) { this.container.remove(this) } } @@ -512,10 +493,7 @@ export class AbstractScatter extends Throwable { _checkAutoClose() { if (this.scaleAutoClose) - if ( - this.scale < - this.minScale + this.scaleCloseThreshold - this.scaleCloseBuffer - ) { + if (this.scale < this.minScale + this.scaleCloseThreshold - this.scaleCloseBuffer) { this.zoom(this.minScale, { animate: 0.2, onComplete: this.close.bind(this) @@ -570,17 +548,7 @@ export class AbstractScatter extends Throwable { this.move(delta, { animate: animate }) } - zoom( - scale, - { - animate = 0, - about = null, - delay = 0, - x = null, - y = null, - onComplete = null - } = {} - ) { + zoom(scale, { animate = 0, about = null, delay = 0, x = null, y = null, onComplete = null } = {}) { let anchor = about || this.center if (scale != this.scale) { if (animate > 0) { @@ -631,15 +599,9 @@ export class AbstractScatter extends Throwable { let origin = this.rotationOrigin let beta = Points.angle(origin, anchor) let distance = Points.distance(origin, anchor) - let { scale: newScale, zoom: thresholdedZoom } = this.calculateScale( - zoom - ) + let { scale: newScale, zoom: thresholdedZoom } = this.calculateScale(zoom) - let newOrigin = Points.arc( - anchor, - beta + rotate, - distance * thresholdedZoom - ) + let newOrigin = Points.arc(anchor, beta + rotate, distance * thresholdedZoom) let extra = Points.subtract(newOrigin, origin) let offset = Points.subtract(anchor, origin) this._move(offset) @@ -702,10 +664,8 @@ export class AbstractScatter extends Throwable { } calculateScaleTransparency() { - let transparency = - (this.scale - this.minScale) / this.scaleCloseThreshold - transparency = - transparency > 1 ? 1 : transparency < 0 ? 0 : transparency + let transparency = (this.scale - this.minScale) / this.scaleCloseThreshold + transparency = transparency > 1 ? 1 : transparency < 0 ? 0 : transparency return transparency } @@ -763,8 +723,7 @@ export class AbstractScatter extends Throwable { if (this.scaleAutoClose) { if (this.scale <= this.minScale + this.scaleCloseThreshold) { - if (this.scaleAutoCloseTimeout) - clearTimeout(this.scaleAutoCloseTimeout) + if (this.scaleAutoCloseTimeout) clearTimeout(this.scaleAutoCloseTimeout) this.scaleAutoCloseTimeout = setTimeout(() => { this._checkAutoClose() }, 600) @@ -927,13 +886,7 @@ export class DOMScatterContainer { */ constructor( element, - { - stopEvents = 'auto', - claimEvents = true, - useCapture = true, - touchAction = 'none', - debugCanvas = null - } = {} + { stopEvents = 'auto', claimEvents = true, useCapture = true, touchAction = 'none', debugCanvas = null } = {} ) { this.onCapture = null this.element = element @@ -944,11 +897,7 @@ export class DOMScatterContainer { movement of scatter objects, the touchmove event has to be bound again. */ if (Capabilities.isSafari) { - document.addEventListener( - 'touchmove', - event => this.preventPinch(event), - false - ) + document.addEventListener('touchmove', event => this.preventPinch(event), false) stopEvents = false } else { stopEvents = true @@ -984,14 +933,7 @@ export class DOMScatterContainer { for (let [key, point] of current.entries()) { let local = point context.beginPath() - context.arc( - local.x * resolution, - local.y * resolution, - radius, - 0, - 2 * Math.PI, - false - ) + context.arc(local.x * resolution, local.y * resolution, radius, 0, 2 * Math.PI, false) context.fill() context.stroke() } @@ -1007,18 +949,16 @@ export class DOMScatterContainer { } } - /** * Removes an element from the scatter. * * @param {Scatter} scatter - Element to remove. * @memberof DOMScatterContainer */ - remove(scatter){ + remove(scatter) { this.scatter.delete(scatter.element) } - /** * Adds an element to the ScatterContainer. * @@ -1065,10 +1005,7 @@ export class DOMScatterContainer { ***/ let found = document.elementFromPoint(global.x, global.y) for (let target of this.scatter.values()) { - if ( - target.interactive && - this.isDescendant(target.element, found) - ) { + if (target.interactive && this.isDescendant(target.element, found)) { if (this.stopEvents) Events.stop(event) if (this.claimEvents) event.claimedByScatter = target return target @@ -1499,10 +1436,8 @@ export class DOMScatter extends AbstractScatter { let resizeH = -r * Math.sin(Angle.degree2radian(phiCorrected)) if ( - (this.element.offsetWidth + resizeW) / this.scale > - (this.width * 0.5) / this.scale && - (this.element.offsetHeight + resizeH) / this.scale > - (this.height * 0.3) / this.scale + (this.element.offsetWidth + resizeW) / this.scale > (this.width * 0.5) / this.scale && + (this.element.offsetHeight + resizeH) / this.scale > (this.height * 0.3) / this.scale ) TweenLite.to(this.element, 0, { width: this.element.offsetWidth + resizeW / this.scale, diff --git a/lib/uitest.js b/lib/uitest.js index 573d0dd..7b99640 100644 --- a/lib/uitest.js +++ b/lib/uitest.js @@ -194,9 +194,7 @@ export default class UITest { if (opts.eventType) { opts.eventTypes = opts.eventType } - opts.eventTypes = Array.isArray(opts.eventTypes) - ? opts.eventTypes - : [opts.eventTypes] + opts.eventTypes = Array.isArray(opts.eventTypes) ? opts.eventTypes : [opts.eventTypes] // timeline //-------------------- @@ -234,14 +232,8 @@ export default class UITest { if (opts.eventTypes[0]) { // create and dispatch event //-------------------- - const eventStart = Event.create( - elem, - coords, - opts.eventTypes[0], - eventOpts - ) - if (this.opts.debug) - console.log('dispatch event', eventStart) + const eventStart = Event.create(elem, coords, opts.eventTypes[0], eventOpts) + if (this.opts.debug) console.log('dispatch event', eventStart) elem.dispatchEvent(eventStart) // onStart @@ -253,14 +245,8 @@ export default class UITest { // create and dispatch event //-------------------- - const eventComplete = Event.create( - elem, - coords, - opts.eventTypes[1], - eventOpts - ) - if (this.opts.debug) - console.log('dispatch event', eventComplete) + const eventComplete = Event.create(elem, coords, opts.eventTypes[1], eventOpts) + if (this.opts.debug) console.log('dispatch event', eventComplete) elem.dispatchEvent(eventComplete) // onComplete @@ -355,14 +341,8 @@ export default class UITest { onStart: () => { // create and dispatch event //-------------------- - const event = Event.create( - elem, - from, - opts.eventTypes[0], - eventOpts - ) - if (this.opts.debug) - console.log('dispatch event', event) + const event = Event.create(elem, from, opts.eventTypes[0], eventOpts) + if (this.opts.debug) console.log('dispatch event', event) elem.dispatchEvent(event) // onStart @@ -374,14 +354,8 @@ export default class UITest { onUpdate: () => { // create and dispatch event //-------------------- - const event = Event.create( - elem, - from, - opts.eventTypes[1], - eventOpts - ) - if (this.opts.debug) - console.log('dispatch event', event) + const event = Event.create(elem, from, opts.eventTypes[1], eventOpts) + if (this.opts.debug) console.log('dispatch event', event) elem.dispatchEvent(event) // onUpdate @@ -393,14 +367,8 @@ export default class UITest { onComplete: () => { // create and dispatch event //-------------------- - const event = Event.create( - elem, - from, - opts.eventTypes[2], - eventOpts - ) - if (this.opts.debug) - console.log('dispatch event', event) + const event = Event.create(elem, from, opts.eventTypes[2], eventOpts) + if (this.opts.debug) console.log('dispatch event', event) elem.dispatchEvent(event) // onComplete @@ -551,66 +519,39 @@ export default class UITest { onStart: () => { // create and dispatch event //-------------------- - const event = Event.create( - elem, - from, - opts.eventTypes[0], - eventOpts - ) - if (this.opts.debug) - console.log('dispatch event', event) + const event = Event.create(elem, from, opts.eventTypes[0], eventOpts) + if (this.opts.debug) console.log('dispatch event', event) elem.dispatchEvent(event) // onStart //-------------------- - if ( - opts.onStart && - (opts.doubleCallbacks || key === 0) - ) { + if (opts.onStart && (opts.doubleCallbacks || key === 0)) { opts.onStart.call(this, event) } }, onUpdate: () => { // create and dispatch event //-------------------- - const event = Event.create( - elem, - from, - opts.eventTypes[1], - eventOpts - ) - if (this.opts.debug) - console.log('dispatch event', event) + const event = Event.create(elem, from, opts.eventTypes[1], eventOpts) + if (this.opts.debug) console.log('dispatch event', event) elem.dispatchEvent(event) // onUpdate //-------------------- - if ( - opts.onUpdate && - (opts.doubleCallbacks || key === 0) - ) { + if (opts.onUpdate && (opts.doubleCallbacks || key === 0)) { opts.onUpdate.call(this, event) } }, onComplete: () => { // create and dispatch event //-------------------- - const event = Event.create( - elem, - from, - opts.eventTypes[2], - eventOpts - ) - if (this.opts.debug) - console.log('dispatch event', event) + const event = Event.create(elem, from, opts.eventTypes[2], eventOpts) + if (this.opts.debug) console.log('dispatch event', event) elem.dispatchEvent(event) // onComplete //-------------------- - if ( - opts.onComplete && - (opts.doubleCallbacks || key === 0) - ) { + if (opts.onComplete && (opts.doubleCallbacks || key === 0)) { opts.onComplete.call(this, event) } } @@ -728,9 +669,7 @@ export default class UITest { 'No execution time was specified for this action, and a default interval was not set in the class constructor!' ) } - timelinePosition = - Math.max(...this._timelinePositions) + - (this.opts.defaultInterval || 1) + timelinePosition = Math.max(...this._timelinePositions) + (this.opts.defaultInterval || 1) } if (opts === null) { @@ -805,12 +744,8 @@ class Util { * @return {HTMLElement|string} element - The HTML element on which the event is to be executed, e.g. button, document, h2, canvas, etc. or an selector string. If a selector has been specified, it is evaluated immediately before the event is called using the querySelector method. */ static extractElement(context, element) { - const cont = Util.isFrame(context) - ? context.contentDocument - : context.document - const elem = Util.isString(element) - ? cont.querySelector(element) - : element + const cont = Util.isFrame(context) ? context.contentDocument : context.document + const elem = Util.isString(element) ? cont.querySelector(element) : element return elem } @@ -866,9 +801,7 @@ class Util { type: 'thru' } } else { - opts.bezier.values = opts.bezier.values.map(it => - Util.extractPosition(it) - ) + opts.bezier.values = opts.bezier.values.map(it => Util.extractPosition(it)) bezier = opts.bezier } @@ -1004,16 +937,9 @@ class Event { * @param {string} type - The type of the event, see https://developer.mozilla.org/de/docs/Web/Events * @param {object} opts - An options object. Every paramter of the event object can be overridden, see e.g. https://developer.mozilla.org/de/docs/Web/API/MouseEvent for all the properties. */ - static create( - target, - position = { x: 0, y: 0 }, - type = 'pointerup', - opts = {} - ) { + static create(target, position = { x: 0, y: 0 }, type = 'pointerup', opts = {}) { const rect = - typeof target.getBoundingClientRect === 'function' - ? target.getBoundingClientRect() - : { x: 0, y: 0 } + typeof target.getBoundingClientRect === 'function' ? target.getBoundingClientRect() : { x: 0, y: 0 } // EventInit const eventOpts = { @@ -1072,25 +998,12 @@ class Event { if (type.startsWith('pointer')) { return new PointerEvent( type, - Object.assign( - {}, - eventOpts, - uiEventOpts, - mouseEventOpts, - pointerEventOpts, - opts - ) + Object.assign({}, eventOpts, uiEventOpts, mouseEventOpts, pointerEventOpts, opts) ) } else if (type.startsWith('touch')) { - return new TouchEvent( - type, - Object.assign({}, eventOpts, uiEventOpts, touchEventOpts, opts) - ) + return new TouchEvent(type, Object.assign({}, eventOpts, uiEventOpts, touchEventOpts, opts)) } else { - return new MouseEvent( - type, - Object.assign({}, eventOpts, uiEventOpts, mouseEventOpts, opts) - ) + return new MouseEvent(type, Object.assign({}, eventOpts, uiEventOpts, mouseEventOpts, opts)) } } } diff --git a/lib/utils.js b/lib/utils.js index da184a6..46f51dc 100755 --- a/lib/utils.js +++ b/lib/utils.js @@ -1,4 +1,4 @@ -/* globals WebKitPoint */ +/* globals */ /** Tests whether an object is empty * @param {Object} obj - the object to be tested @@ -60,11 +60,9 @@ export function sample(population, k) { set and it doesn't suffer from frequent reselections. */ - if (!Array.isArray(population)) - throw new TypeError('Population must be an array.') + if (!Array.isArray(population)) throw new TypeError('Population must be an array.') let n = population.length - if (k < 0 || k > n) - throw new RangeError('Sample larger than population or is negative') + if (k < 0 || k > n) throw new RangeError('Sample larger than population or is negative') let result = new Array(k) let setsize = 21 // size of a small set minus size of an empty list @@ -143,9 +141,7 @@ export class Dates { } static startYearRange(date) { - return new Date( - Date.UTC(date.getFullYear() - 1, 11, 31, 23, 59, 59, 999) - ) + return new Date(Date.UTC(date.getFullYear() - 1, 11, 31, 23, 59, 59, 999)) } static endYearRange(date) { @@ -165,11 +161,7 @@ export class Dates { } static nextDay(date) { - return this.create( - date.getFullYear(), - date.getMonth(), - date.getDate() + 1 - ) + return this.create(date.getFullYear(), date.getMonth(), date.getDate() + 1) } static nextHour(date) { @@ -672,15 +664,9 @@ export class Polygon { */ draw(context, { lineWidth = 2, stroke = '#000000', fill = null } = {}) { context.beginPath() - context.moveTo( - this.points[0].x + this.center.x, - this.points[0].y + this.center.y - ) + context.moveTo(this.points[0].x + this.center.x, this.points[0].y + this.center.y) for (let i = 1; i < this.points.length; i++) { - context.lineTo( - this.points[i].x + this.center.x, - this.points[i].y + this.center.y - ) + context.lineTo(this.points[i].x + this.center.x, this.points[i].y + this.center.y) } context.closePath() context.lineWidth = lineWidth @@ -737,10 +723,7 @@ export class Polygon { for (i = 0, j = nvert - 1; i < nvert; j = i++) { if ( verty[i] > testy != verty[j] > testy && - testx < - ((vertx[j] - vertx[i]) * (testy - verty[i])) / - (verty[j] - verty[i]) + - vertx[i] + testx < ((vertx[j] - vertx[i]) * (testy - verty[i])) / (verty[j] - verty[i]) + vertx[i] ) c = !c } @@ -774,12 +757,8 @@ export class Polygon { for (side = 0; side < this.getNumberOfSides(); side++) { /* get the axis that we will project onto */ if (side == 0) { - axis.x = - this.points[this.getNumberOfSides() - 1].y - - this.points[0].y - axis.y = - this.points[0].x - - this.points[this.getNumberOfSides() - 1].x + axis.x = this.points[this.getNumberOfSides() - 1].y - this.points[0].y + axis.y = this.points[0].x - this.points[this.getNumberOfSides() - 1].x } else { axis.x = this.points[side - 1].y - this.points[side].y axis.y = this.points[side].x - this.points[side - 1].x @@ -803,8 +782,7 @@ export class Polygon { maxA += tmp /* project polygon B onto axis to determine the min/max */ - minB = maxB = - other.points[0].x * axis.x + other.points[0].y * axis.y + minB = maxB = other.points[0].x * axis.x + other.points[0].y * axis.y for (i = 1; i < other.getNumberOfSides(); i++) { tmp = other.points[i].x * axis.x + other.points[i].y * axis.y if (tmp > maxB) maxB = tmp @@ -831,12 +809,8 @@ export class Polygon { for (side = 0; side < other.getNumberOfSides(); side++) { /* get the axis that we will project onto */ if (side == 0) { - axis.x = - other.points[other.getNumberOfSides() - 1].y - - other.points[0].y - axis.y = - other.points[0].x - - other.points[other.getNumberOfSides() - 1].x + axis.x = other.points[other.getNumberOfSides() - 1].y - other.points[0].y + axis.y = other.points[0].x - other.points[other.getNumberOfSides() - 1].x } else { axis.x = other.points[side - 1].y - other.points[side].y axis.y = other.points[side].x - other.points[side - 1].x @@ -860,8 +834,7 @@ export class Polygon { maxA += tmp /* project polygon B onto axis to determine the min/max */ - minB = maxB = - other.points[0].x * axis.x + other.points[0].y * axis.y + minB = maxB = other.points[0].x * axis.x + other.points[0].y * axis.y for (i = 1; i < other.getNumberOfSides(); i++) { tmp = other.points[i].x * axis.x + other.points[i].y * axis.y if (tmp > maxB) maxB = tmp @@ -918,12 +891,7 @@ export class Rect { * @memberof Rect */ static contains(rect, point) { - return ( - point.x > rect.left && - point.x < rect.x + rect.right && - point.y > rect.top && - point.y < rect.bottom - ) + return point.x > rect.left && point.x < rect.x + rect.right && point.y > rect.top && point.y < rect.bottom } /** @@ -1003,8 +971,7 @@ export class LowPassFilter { * @access private */ __push(value) { - let removed = - this.buffer.length === this.bufferMaxSize ? this.buffer.shift() : 0 + let removed = this.buffer.length === this.bufferMaxSize ? this.buffer.shift() : 0 this.buffer.push(value) return removed diff --git a/package-lock.json b/package-lock.json index b5cbbb0..f518d77 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1979,9 +1979,9 @@ } }, "eslint": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.0.1.tgz", - "integrity": "sha512-DyQRaMmORQ+JsWShYsSg4OPTjY56u1nCjAmICrE8vLWqyLKxhFXOthwMj1SA8xwfrv0CofLNVnqbfyhwCkaO0w==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.1.0.tgz", + "integrity": "sha512-QhrbdRD7ofuV09IuE2ySWBz0FyXCq0rriLTZXZqaWSI79CVtHVRdkFuFTViiqzZhkCgfOh9USpriuGN2gIpZDQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -1990,7 +1990,7 @@ "cross-spawn": "^6.0.5", "debug": "^4.0.1", "doctrine": "^3.0.0", - "eslint-scope": "^4.0.3", + "eslint-scope": "^5.0.0", "eslint-utils": "^1.3.1", "eslint-visitor-keys": "^1.0.0", "espree": "^6.0.0", @@ -1998,34 +1998,35 @@ "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^3.1.0", + "glob-parent": "^5.0.0", "globals": "^11.7.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^6.2.2", + "inquirer": "^6.4.1", "is-glob": "^4.0.0", "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", - "lodash": "^4.17.11", + "lodash": "^4.17.14", "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", "optionator": "^0.8.2", "progress": "^2.0.0", "regexpp": "^2.0.1", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", "table": "^5.2.3", - "text-table": "^0.2.0" + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "debug": { @@ -2043,20 +2044,41 @@ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, + "glob-parent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz", + "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.1.0" } + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true } } }, @@ -2079,9 +2101,9 @@ } }, "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", "dev": true, "requires": { "esrecurse": "^4.1.0", @@ -2123,9 +2145,9 @@ }, "dependencies": { "acorn": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.0.tgz", - "integrity": "sha512-8oe72N3WPMjA+2zVG71Ia0nXZ8DpQH+QyyHO+p06jT8eg8FGG3FbcUIi8KziHlAfheJQZeoqbvq1mQSQHXKYLw==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.1.tgz", + "integrity": "sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q==", "dev": true } } @@ -5954,11 +5976,11 @@ "dev": true }, "propagating-hammerjs": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/propagating-hammerjs/-/propagating-hammerjs-1.4.6.tgz", - "integrity": "sha1-/tAOmwB2f/1C0U9bUxvEk+tnLjc=", + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/propagating-hammerjs/-/propagating-hammerjs-1.4.7.tgz", + "integrity": "sha512-oW9Wd+W2Tp5uOz6Fh4mEU7p+FoyU85smLH/mPga83Loh0pHa6AH4ZHGywvwMk3TWP31l7iUsvJyW265p4Ipwrg==", "requires": { - "hammerjs": "^2.0.6" + "hammerjs": "^2.0.8" } }, "proxy-from-env": { @@ -6001,9 +6023,9 @@ "dev": true }, "puppeteer": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.18.1.tgz", - "integrity": "sha512-luUy0HPSuWPsPZ1wAp6NinE0zgetWtudf5zwZ6dHjMWfYpTQcmKveFRox7VBNhQ98OjNA9PQ9PzQyX8k/KrxTg==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.19.0.tgz", + "integrity": "sha512-2S6E6ygpoqcECaagDbBopoSOPDv0pAZvTbnBgUY+6hq0/XDFDOLEMNlHF/SKJlzcaZ9ckiKjKDuueWI3FN/WXw==", "dev": true, "requires": { "debug": "^4.1.0", @@ -7743,6 +7765,12 @@ "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", "dev": true }, + "v8-compile-cache": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", + "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", + "dev": true + }, "v8flags": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", diff --git a/package.json b/package.json index ba90bcb..ece34d8 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "license": "LGPL-3.0-or-later", "devDependencies": { "@pixi/jsdoc-template": "^2.4.2", - "eslint": "^6.0.1", + "eslint": "^6.1.0", "eslint-config-prettier": "^6.0.0", "eslint-plugin-prettier": "^3.1.0", "fs-extra": "^8.0.1", @@ -34,7 +34,7 @@ "gulp-uglify": "^3.0.2", "htmlhint": "^0.11.0", "prettier": "^1.18.2", - "puppeteer": "^1.18.1", + "puppeteer": "^1.19.0", "stylelint": "^10.1.0", "stylelint-config-standard": "^18.3.0" }, @@ -47,6 +47,6 @@ "pixi-particles": "^4.1.1", "pixi-projection": "^0.2.8", "pixi.js": "^4.8.8", - "propagating-hammerjs": "^1.4.6" + "propagating-hammerjs": "^1.4.7" } } From 73342a0506d601dc59dfb7e65edaa4124097cdeb Mon Sep 17 00:00:00 2001 From: Sebastian Kupke Date: Tue, 30 Jul 2019 17:12:17 +0200 Subject: [PATCH 02/30] Merged conflicts. --- .eslintrc | 3 ++- lib/scatter.js | 19 ++++++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/.eslintrc b/.eslintrc index 1aa0400..290b33b 100644 --- a/.eslintrc +++ b/.eslintrc @@ -3,7 +3,8 @@ "ecmaVersion": 10, "sourceType": "module", "ecmaFeatures": { - "impliedStrict": true + "impliedStrict": true, + "modules": true } }, "env": { diff --git a/lib/scatter.js b/lib/scatter.js index 1123cc3..14c5c2d 100644 --- a/lib/scatter.js +++ b/lib/scatter.js @@ -1,6 +1,6 @@ /* eslint-disable no-unused-vars */ /* eslint-disable no-console */ -/* globals TweenLite debugCanvas */ +/* globals debugCanvas */ import Interface from './interface.js' import { Points, Polygon, Angle, Elements, LowPassFilter } from './utils.js' import Events from './events.js' @@ -351,15 +351,20 @@ export class AbstractScatter extends Throwable { } close() { + this._callCloseCallbacks() + this._removeSelfFromScatterContainer() + } + + _callCloseCallbacks() { if (this.onClose) { this.onClose.forEach(callback => callback(this)) + } + } - /** - Removes self from container when it's closed. - */ - if (this.container) { - this.container.remove(this) - } + _removeSelfFromScatterContainer() { + // Removes self from container when it's closed. + if (this.container) { + this.container.remove(this) } } From 614b4d83506ecc330bbe03856c8fcae6f42c6051 Mon Sep 17 00:00:00 2001 From: Sebastian Kupke Date: Wed, 31 Jul 2019 16:12:00 +0200 Subject: [PATCH 03/30] Implemented stacked button groups. --- dist/iwmlib.js | 9 +- dist/iwmlib.pixi.js | 140 ++++-- doc/out/AbstractPopup.html | 16 +- doc/out/Badge.html | 16 +- doc/out/BlurFilter.html | 10 +- doc/out/Button.html | 20 +- doc/out/ButtonGroup.html | 404 +++++++++++++++++- doc/out/DeepZoomImage.html | 10 +- doc/out/DeepZoomInfo.html | 10 +- doc/out/Flippable.html | 12 +- doc/out/FontInfo.html | 10 +- doc/out/Hypenate.html | 12 +- doc/out/InteractivePopup.html | 16 +- ...beledGraphics.exports.LabeledGraphics.html | 12 +- doc/out/LabeledGraphics.html | 26 +- doc/out/List.html | 18 +- doc/out/Message.html | 12 +- doc/out/MessageInteractivePopup.html | 10 +- doc/out/MessageMessageInteractivePopup.html | 10 +- doc/out/Modal.html | 14 +- doc/out/ModalInteractivePopup.html | 10 +- doc/out/ModalModalInteractivePopup.html | 10 +- doc/out/PIXIApp.html | 50 ++- doc/out/Popup.html | 18 +- doc/out/PopupInteractivePopup.html | 10 +- doc/out/PopupMenu.html | 16 +- doc/out/PopupMenuPopupInteractivePopup.html | 10 +- ...pupMenuPopupMenuPopupInteractivePopup.html | 10 +- ...nuPopupMenuPopupPopupInteractivePopup.html | 10 +- .../PopupMenuPopupPopupInteractivePopup.html | 10 +- doc/out/PopupPopupInteractivePopup.html | 10 +- doc/out/Progress.html | 14 +- doc/out/Scrollview.html | 10 +- doc/out/Slider.html | 16 +- doc/out/Switch.html | 16 +- doc/out/TextLabel.TextLabel.html | 12 +- doc/out/Theme.html | 12 +- doc/out/ThemeDark.html | 12 +- doc/out/ThemeLight.html | 12 +- doc/out/ThemeRed.html | 12 +- doc/out/TileQuadNode.html | 10 +- doc/out/Tooltip.html | 16 +- doc/out/UITest.html | 14 +- doc/out/Volatile.html | 10 +- doc/out/global.html | 16 +- doc/out/index.html | 10 +- doc/out/pixi_abstractpopup.js.html | 49 +-- doc/out/pixi_app.js.html | 90 ++-- doc/out/pixi_badge.js.html | 24 +- doc/out/pixi_blurfilter.js.html | 35 +- doc/out/pixi_button.js.html | 131 +++--- doc/out/pixi_buttongroup.js.html | 389 ++++++++++++++--- doc/out/pixi_deepzoom_image.js.html | 10 +- doc/out/pixi_flippable.js.html | 57 +-- doc/out/pixi_labeledgraphics.js.html | 43 +- doc/out/pixi_list.js.html | 50 +-- doc/out/pixi_message.js.html | 16 +- doc/out/pixi_modal.js.html | 15 +- doc/out/pixi_popup.js.html | 46 +- doc/out/pixi_popupmenu.js.html | 15 +- doc/out/pixi_progress.js.html | 48 +-- doc/out/pixi_scrollview.js.html | 10 +- doc/out/pixi_slider.js.html | 66 +-- doc/out/pixi_switch.js.html | 81 +--- doc/out/pixi_theme.js.html | 13 +- doc/out/pixi_tooltip.js.html | 10 +- doc/out/pixi_volatile.js.html | 10 +- doc/out/uitest.js.html | 155 ++----- lib/pixi/buttongroup.html | 20 +- lib/pixi/buttongroup.js | 136 ++++-- 70 files changed, 1782 insertions(+), 880 deletions(-) diff --git a/dist/iwmlib.js b/dist/iwmlib.js index 6d03dc4..3cd4f82 100644 --- a/dist/iwmlib.js +++ b/dist/iwmlib.js @@ -3336,9 +3336,7 @@ } _removeSelfFromScatterContainer() { - /** - Removes self from container when it's closed. - */ + // Removes self from container when it's closed. if (this.container) { this.container.remove(this); } @@ -3937,10 +3935,7 @@ * @memberof DOMScatterContainer */ remove(scatter) { - const element = scatter.element; - if (!this.scatter.has(element)) console.warn(`Try removing element that is not in the scatter.`, element); - - this.scatter.delete(element); + this.scatter.delete(scatter.element); } /** diff --git a/dist/iwmlib.pixi.js b/dist/iwmlib.pixi.js index 526103b..bad2580 100644 --- a/dist/iwmlib.pixi.js +++ b/dist/iwmlib.pixi.js @@ -2963,10 +2963,10 @@ * or a Theme object. * @param {number} [opts.minWidth=44] - Button: The minimum width of one button. * @param {number} [opts.minHeight=44] - Button: The minimum height of one button. - * @param {number} [opts.maxWidth] - The maximum width of the button group. Only used if stacked is true and the orientation is horizontal. - * @param {number} [opts.maxHeight] - The maximum height of the button group. Only used if stacked is true and the orientation is vertical. - * @param {boolean} [opts.stacked=false] - If set to true, the buttons of the button group gets stacked if they are broader or higher than the maximum permitted width or height, depending on orientation. - * @param {PIXI.Application} [opts.app] - The PixiJS Application. Must be set if you want to use the mousewheel to scroll your button group. + * @param {number} [opts.maxWidth] - The maximum width of the button group. If the buttons are wider than the maximum width, the buttons get stacked. Note: The buttons can only be stacked if margin is not zero. + * @param {number} [opts.maxHeight] - The maximum height of the button group. If the buttons are higher than the maximum height, the buttons get stacked. Note: The buttons can only be stacked if margin is not zero. + * @param {number} [opts.stackPadding=10] - The padding for stacked buttons. + * @param {PIXI.Application} [opts.app] - The PixiJS Application. Must be set if you want to use the mousewheel to scroll your button group. Only used when the buttons are stacked (with maxWidth or maxHeight). * @param {number} [opts.padding=Theme.padding] - Button: The inner spacing (distance from icon and/or label) the the border. * @param {number} [opts.margin=Theme.margin] - The outer spacing (distance from one button to the previous/next button). * @param {string} [opts.iconPosition=left] - Button: The position of the icon in relation to the label. Can be left or right. @@ -3017,7 +3017,7 @@ minHeight: 44, maxWidth: null, maxHeight: null, - stacked: false, + stackPadding: 10, app: null, padding: theme.padding, margin: theme.margin, @@ -3080,6 +3080,7 @@ // Buttons //----------------- let position = 0; + let index = 0; for (let it of this.opts.buttons) { delete it.x; @@ -3158,6 +3159,9 @@ }; position += (this.opts.orientation === 'horizontal' ? button.width : button.height) + this.opts.margin; + + button.__initIndex = index; + index++; } if (this.opts.orientation === 'vertical') { @@ -3177,7 +3181,7 @@ // interaction //-------------------- - if (this.opts.stacked) { + if (this.opts.margin > 0 && (this.opts.maxWidth || this.opts.maxHeight)) { this.interactive = true; this.on('pointerdown', this.onStart.bind(this)); this.on('pointermove', this.onMove.bind(this)); @@ -3209,7 +3213,6 @@ this.addChildAt(background, 0); this.__initWidth = this.container.width; - this.__deltaWidth = this.container.width - this.opts.maxWidth; } return this @@ -3229,9 +3232,9 @@ //----------------- this.draw(); - // stacked + // stack //----------------- - if (this.opts.stacked) { + if (this.opts.margin > 0 && (this.opts.maxWidth || this.opts.maxHeight)) { this.stack(); } @@ -3359,9 +3362,7 @@ this.container.position.y = event.data.global.y + this.__delta.y; } - if (this.opts.stacked) { - this.stack(); - } + this.stack(); } } @@ -3436,9 +3437,7 @@ } } - if (this.opts.stacked) { - this.stack(); - } + this.stack(); } /** @@ -3455,36 +3454,107 @@ * */ stack() { + if (this.opts.maxWidth) { + this._stackHorizontal(); + } else if (this.opts.maxHeight) { + this._stackVertical(); + } + } + + /** + * + */ + _stackHorizontal() { + const sorted = []; + + let reverseCounter = this.buttons.length - 1; + this.buttons.forEach((it, index) => { - if (it.__originalPosition.x + this.container.x < 0) { + const leftCorner = it.__originalPosition.x + this.container.x; + const rightCorner = it.__originalPosition.x + it.width; + const paddingLeft = index * this.opts.stackPadding; + const paddingRight = reverseCounter * this.opts.stackPadding; + if (leftCorner < paddingLeft) { // left border - it.x = -this.container.x; - } else if (it.__originalPosition.x + it.width > Math.abs(this.container.x) + this.opts.maxWidth) { + it.x = -this.container.x + paddingLeft; + } else if (rightCorner > -this.container.x + this.opts.maxWidth - paddingRight) { // right border - it.x = Math.abs(this.container.x) + this.opts.maxWidth - it.width; + it.x = -this.container.x + this.opts.maxWidth - it.width - paddingRight; } else { it.x = it.__originalPosition.x; } + + reverseCounter--; + + sorted.push(it); }); - this.buttons.sort((a, b) => { - const delta = Math.abs(this.container.x) + this.opts.maxWidth / 2; - const distanceA = Math.abs(a.x - delta); - const distanceB = Math.abs(b.x - delta); - if (distanceA > distanceB) { - return -1 - } else if (distanceB > distanceA) { - return 1 + const min = Math.min(...sorted.map(it => it.x)); + const max = Math.max(...sorted.map(it => it.x)); + const center = (min + max) / 2; + + // z-index + sorted + .sort((a, b) => { + const distanceA = Math.abs(a.x - center); + const distanceB = Math.abs(b.x - center); + if (distanceA < distanceB) { + return 1 + } else if (distanceA > distanceB) { + return -1 + } else { + return 0 + } + }) + .forEach(it => it.parent.addChild(it)); + } + + /** + * + */ + _stackVertical() { + const sorted = []; + + let reverseCounter = this.buttons.length - 1; + + this.buttons.forEach((it, index) => { + const topCorner = it.__originalPosition.y + this.container.y; + const bottomCorner = it.__originalPosition.y + it.height; + const paddingTop = index * this.opts.stackPadding; + const paddingBottom = reverseCounter * this.opts.stackPadding; + if (topCorner < paddingTop) { + // top border + it.y = -this.container.y + paddingTop; + } else if (bottomCorner > -this.container.y + this.opts.maxHeight - paddingBottom) { + // bottom border + it.y = -this.container.y + this.opts.maxHeight - it.height - paddingBottom; } else { - return 0 + it.y = it.__originalPosition.y; } + + reverseCounter--; + + sorted.push(it); }); - this.buttons.forEach(it => { - const parent = it.parent; - parent.removeChild(it); - parent.addChild(it); - }); + const min = Math.min(...sorted.map(it => it.y)); + const max = Math.max(...sorted.map(it => it.y)); + const center = (min + max) / 2; + + // z-index + sorted + .sort((a, b) => { + const distanceA = Math.abs(a.y - center); + const distanceB = Math.abs(b.y - center); + if (distanceA < distanceB) { + return 1 + } else if (distanceA > distanceB) { + return -1 + } else { + return 0 + } + }) + .forEach(it => it.parent.addChild(it)); } } @@ -6782,9 +6852,7 @@ } _removeSelfFromScatterContainer() { - /** - Removes self from container when it's closed. - */ + // Removes self from container when it's closed. if (this.container) { this.container.remove(this); } diff --git a/doc/out/AbstractPopup.html b/doc/out/AbstractPopup.html index 820f387..2103869 100644 --- a/doc/out/AbstractPopup.html +++ b/doc/out/AbstractPopup.html @@ -263,12 +263,20 @@ Methods +
  • _stackHorizontal
  • + +
  • _stackVertical
  • + +
  • capture
  • +
  • hide
  • layout
  • show
  • +
  • stack
  • +
      @@ -1792,7 +1800,7 @@ app.scene.filters = [blurFilter]
      diff --git a/doc/out/Button.html b/doc/out/Button.html index be55d43..466c67f 100644 --- a/doc/out/Button.html +++ b/doc/out/Button.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1465,7 +1473,7 @@ @@ -1840,7 +1848,7 @@ or a Theme object.

      -

      The maximum width of the buttongroup. Only used if stacked is true and the orientation is horizontal.

      +

      The maximum width of the button group. If the buttons are wider than the maximum width, the buttons get stacked. Note: The buttons can only be stacked if margin is not zero.

      @@ -1874,20 +1882,20 @@ or a Theme object.

      -

      The maximum height of the buttongroup. Only used if stacked is true and the orientation is vertical.

      +

      The maximum height of the button group. If the buttons are higher than the maximum height, the buttons get stacked. Note: The buttons can only be stacked if margin is not zero.

      - stacked + stackPadding -boolean +number @@ -1896,7 +1904,7 @@ or a Theme object.

      - false + 10 @@ -1910,7 +1918,41 @@ or a Theme object.

      -

      If set to true, the buttons of the buttongroup gets stacked if they are broader or higher than the maximum permitted width or height, depending on orientation.

      +

      The padding for stacked buttons.

      + + + + + + + app + + + + + +PIXI.Application + + + + + + + + + + + + + + + optional + + + + + +

      The PixiJS Application. Must be set if you want to use the mousewheel to scroll your button group. Only used when the buttons are stacked (with maxWidth or maxHeight).

      @@ -2977,6 +3019,274 @@ app.scene.addChild(buttonGroup)
      +
      +
      +

      + + + _stackHorizontal + + () + + + + +

      + + + + +
      + + +
      +
      + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + +
      + + + +
      +
      +

      + + + _stackVertical + + () + + + + +

      + + + + +
      + + +
      +
      + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + +
      + + + +
      +
      +

      + + + capture + + (event) + + + + +

      + + + + +
      + + +
      +
      + + +
      +

      Captures an event to inform InteractionMapper about processed events.

      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      event + + +event +| + +PIXI.InteractionEvent + + + + + +

      The PIXI event to capture.

      + + + +
      + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + +
      + + +

      @@ -2993,7 +3303,7 @@ app.scene.addChild(buttonGroup)

      @@ -3098,7 +3408,7 @@ app.scene.addChild(buttonGroup) @@ -3203,7 +3513,7 @@ app.scene.addChild(buttonGroup) @@ -3288,6 +3598,78 @@ app.scene.addChild(buttonGroup) + + + + +
      +
      +

      + + + stack + + () + + + + +

      + + + + +
      + + +
      +
      + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + +
      @@ -3310,7 +3692,7 @@ app.scene.addChild(buttonGroup)
      diff --git a/doc/out/DeepZoomImage.html b/doc/out/DeepZoomImage.html index c5ae944..3da743f 100644 --- a/doc/out/DeepZoomImage.html +++ b/doc/out/DeepZoomImage.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -5090,7 +5098,7 @@ i.e. after loading a single tile

      diff --git a/doc/out/DeepZoomInfo.html b/doc/out/DeepZoomInfo.html index 91440e4..b2dcdfb 100644 --- a/doc/out/DeepZoomInfo.html +++ b/doc/out/DeepZoomInfo.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -2603,7 +2611,7 @@ on completion.

      diff --git a/doc/out/Flippable.html b/doc/out/Flippable.html index 23f8325..0974378 100644 --- a/doc/out/Flippable.html +++ b/doc/out/Flippable.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -2399,7 +2407,7 @@ front.on('click', event => flippable.toggle()) @@ -2506,7 +2514,7 @@ front.on('click', event => flippable.toggle())
      diff --git a/doc/out/FontInfo.html b/doc/out/FontInfo.html index 89cfd33..94756c1 100644 --- a/doc/out/FontInfo.html +++ b/doc/out/FontInfo.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1553,7 +1561,7 @@
      diff --git a/doc/out/Hypenate.html b/doc/out/Hypenate.html index 8caa036..670635e 100644 --- a/doc/out/Hypenate.html +++ b/doc/out/Hypenate.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1910,7 +1918,7 @@ a string, a number or a PIXI.Text object.

      @@ -2069,7 +2077,7 @@ a string, a number or a PIXI.Text object.

      @@ -2178,7 +2186,7 @@ a string, a number or a PIXI.Text object.

      @@ -2337,7 +2345,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/LabeledGraphics.exports.LabeledGraphics.html b/doc/out/LabeledGraphics.exports.LabeledGraphics.html index 3da8a63..e8007e6 100644 --- a/doc/out/LabeledGraphics.exports.LabeledGraphics.html +++ b/doc/out/LabeledGraphics.exports.LabeledGraphics.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -2169,7 +2177,7 @@ a string, a number or a PIXI.Text object.

      @@ -2435,7 +2443,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/MessageInteractivePopup.html b/doc/out/MessageInteractivePopup.html index dcfa46c..1fdd7bb 100644 --- a/doc/out/MessageInteractivePopup.html +++ b/doc/out/MessageInteractivePopup.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1783,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/MessageMessageInteractivePopup.html b/doc/out/MessageMessageInteractivePopup.html index e185f98..d66ced3 100644 --- a/doc/out/MessageMessageInteractivePopup.html +++ b/doc/out/MessageMessageInteractivePopup.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1783,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/Modal.html b/doc/out/Modal.html index 1fde7b1..e4e186d 100644 --- a/doc/out/Modal.html +++ b/doc/out/Modal.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -2015,7 +2023,7 @@ a string or a PIXI.Text object.

      @@ -2229,7 +2237,7 @@ a string or a PIXI.Text object.

      @@ -2336,7 +2344,7 @@ a string or a PIXI.Text object.

      diff --git a/doc/out/ModalInteractivePopup.html b/doc/out/ModalInteractivePopup.html index 66912f6..25a45f7 100644 --- a/doc/out/ModalInteractivePopup.html +++ b/doc/out/ModalInteractivePopup.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1783,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/ModalModalInteractivePopup.html b/doc/out/ModalModalInteractivePopup.html index d1240d2..af6d7ab 100644 --- a/doc/out/ModalModalInteractivePopup.html +++ b/doc/out/ModalModalInteractivePopup.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1783,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/PIXIApp.html b/doc/out/PIXIApp.html index 493ea4c..e1c3cb6 100644 --- a/doc/out/PIXIApp.html +++ b/doc/out/PIXIApp.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1783,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenu.html b/doc/out/PopupMenu.html index 46cbfda..1e8a4f4 100644 --- a/doc/out/PopupMenu.html +++ b/doc/out/PopupMenu.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1955,7 +1963,7 @@ a string, a number or a PIXI.Text object.

      @@ -2116,7 +2124,7 @@ a string, a number or a PIXI.Text object.

      @@ -2225,7 +2233,7 @@ a string, a number or a PIXI.Text object.

      @@ -2384,7 +2392,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/PopupMenuPopupInteractivePopup.html b/doc/out/PopupMenuPopupInteractivePopup.html index 6ee94a1..150456a 100644 --- a/doc/out/PopupMenuPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupInteractivePopup.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1783,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html b/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html index 1b98cd1..1ba7259 100644 --- a/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1783,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html b/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html index b004e22..6f2a0c7 100644 --- a/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1783,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenuPopupPopupInteractivePopup.html b/doc/out/PopupMenuPopupPopupInteractivePopup.html index ee3893d..6b4fd62 100644 --- a/doc/out/PopupMenuPopupPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupPopupInteractivePopup.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1783,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupPopupInteractivePopup.html b/doc/out/PopupPopupInteractivePopup.html index 541d817..a6edfc5 100644 --- a/doc/out/PopupPopupInteractivePopup.html +++ b/doc/out/PopupPopupInteractivePopup.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1783,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/Progress.html b/doc/out/Progress.html index 53fb59f..c611c06 100644 --- a/doc/out/Progress.html +++ b/doc/out/Progress.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -2552,7 +2560,7 @@ app.scene.addChild(progress) @@ -2762,7 +2770,7 @@ app.scene.addChild(progress) @@ -2869,7 +2877,7 @@ app.scene.addChild(progress)
      diff --git a/doc/out/Scrollview.html b/doc/out/Scrollview.html index 78ebf74..b4e0d48 100644 --- a/doc/out/Scrollview.html +++ b/doc/out/Scrollview.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1701,7 +1709,7 @@ app.loader
      diff --git a/doc/out/Slider.html b/doc/out/Slider.html index d63ae73..1c2a965 100644 --- a/doc/out/Slider.html +++ b/doc/out/Slider.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -3073,7 +3081,7 @@ app.scene.addChild(switch1) @@ -3178,7 +3186,7 @@ app.scene.addChild(switch1) @@ -3283,7 +3291,7 @@ app.scene.addChild(switch1) @@ -3390,7 +3398,7 @@ app.scene.addChild(switch1)
      diff --git a/doc/out/TextLabel.TextLabel.html b/doc/out/TextLabel.TextLabel.html index 81c2102..d1f88e9 100644 --- a/doc/out/TextLabel.TextLabel.html +++ b/doc/out/TextLabel.TextLabel.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -2999,7 +3007,7 @@ const app = new PIXIApp({ @@ -3159,7 +3167,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/ThemeDark.html b/doc/out/ThemeDark.html index a47446e..a5a95a1 100644 --- a/doc/out/ThemeDark.html +++ b/doc/out/ThemeDark.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1465,7 +1473,7 @@ @@ -1580,7 +1588,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/ThemeLight.html b/doc/out/ThemeLight.html index 6243a05..fefda39 100644 --- a/doc/out/ThemeLight.html +++ b/doc/out/ThemeLight.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1466,7 +1474,7 @@ The color1 is set to 0xf6f6f6, color2 to 0x282828.

      @@ -1592,7 +1600,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/ThemeRed.html b/doc/out/ThemeRed.html index 6dd17bb..76c992e 100644 --- a/doc/out/ThemeRed.html +++ b/doc/out/ThemeRed.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1466,7 +1474,7 @@ The primaryColor is set to 0xd92f31.

      @@ -1592,7 +1600,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/TileQuadNode.html b/doc/out/TileQuadNode.html index 0cf4d32..4227031 100644 --- a/doc/out/TileQuadNode.html +++ b/doc/out/TileQuadNode.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -2044,7 +2052,7 @@ an indicator of tiles to free.

      diff --git a/doc/out/Tooltip.html b/doc/out/Tooltip.html index bab9c61..bb4c245 100644 --- a/doc/out/Tooltip.html +++ b/doc/out/Tooltip.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -2093,7 +2101,7 @@ app.scene.addChild(button)
      diff --git a/doc/out/global.html b/doc/out/global.html index 80927d6..b03e24a 100644 --- a/doc/out/global.html +++ b/doc/out/global.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1479,7 +1487,7 @@
      diff --git a/doc/out/pixi_abstractpopup.js.html b/doc/out/pixi_abstractpopup.js.html index 1a76339..d52dfba 100644 --- a/doc/out/pixi_abstractpopup.js.html +++ b/doc/out/pixi_abstractpopup.js.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1523,12 +1531,10 @@ export default class AbstractPopup extends PIXI.Graphics { if (this.opts.maxWidth) { this.headerStyle.wordWrap = true - this.headerStyle.wordWrapWidth = - this.opts.maxWidth - 2 * this.opts.padding + this.headerStyle.wordWrapWidth = this.opts.maxWidth - 2 * this.opts.padding this.textStyle.wordWrap = true - this.textStyle.wordWrapWidth = - this.opts.maxWidth - 2 * this.opts.padding + this.textStyle.wordWrapWidth = this.opts.maxWidth - 2 * this.opts.padding } this.alpha = 0 @@ -1571,10 +1577,7 @@ export default class AbstractPopup extends PIXI.Graphics { if (this.opts.header instanceof PIXI.Text) { header = this.opts.header } else if (typeof this.opts.header === 'number') { - header = new PIXI.Text( - this.opts.header.toString(), - this.headerStyle - ) + header = new PIXI.Text(this.opts.header.toString(), this.headerStyle) } else { header = new PIXI.Text(this.opts.header, this.headerStyle) } @@ -1601,10 +1604,7 @@ export default class AbstractPopup extends PIXI.Graphics { if (typeof this.opts.content === 'string') { content = new PIXI.Text(this.opts.content, this.textStyle) } else if (typeof this.opts.content === 'number') { - content = new PIXI.Text( - this.opts.content.toString(), - this.textStyle - ) + content = new PIXI.Text(this.opts.content.toString(), this.textStyle) } else { content = this.opts.content } @@ -1675,31 +1675,16 @@ export default class AbstractPopup extends PIXI.Graphics { * @return {AbstractPopup} A reference to the popup for chaining. */ draw() { - const square = - Math.round(this.wantedWidth) === Math.round(this.wantedHeight) + const square = Math.round(this.wantedWidth) === Math.round(this.wantedHeight) const diameter = Math.round(this.opts.radius * 2) this.clear() - this.lineStyle( - this.opts.strokeWidth, - this.opts.stroke, - this.opts.strokeAlpha - ) + this.lineStyle(this.opts.strokeWidth, this.opts.stroke, this.opts.strokeAlpha) this.beginFill(this.opts.fill, this.opts.fillAlpha) if (square && diameter === this.wantedWidth) { - this.drawCircle( - this.wantedWidth / 2, - this.wantedHeight / 2, - this.opts.radius - ) + this.drawCircle(this.wantedWidth / 2, this.wantedHeight / 2, this.opts.radius) } else { - this.drawRoundedRect( - 0, - 0, - this.wantedWidth, - this.wantedHeight, - this.opts.radius - ) + this.drawRoundedRect(0, 0, this.wantedWidth, this.wantedHeight, this.opts.radius) } this.endFill() @@ -1825,7 +1810,7 @@ export default class AbstractPopup extends PIXI.Graphics {
      diff --git a/doc/out/pixi_app.js.html b/doc/out/pixi_app.js.html index e389d6f..555df7a 100644 --- a/doc/out/pixi_app.js.html +++ b/doc/out/pixi_app.js.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1468,10 +1476,7 @@ class FullscreenInteractionManager extends PIXI.interaction.InteractionManager { let dy = 0 let canvas = this.renderer.view let context = canvas.getContext('webgl') - if ( - context.drawingBufferWidth < canvas.width || - context.drawingBufferHeight < canvas.height - ) { + if (context.drawingBufferWidth < canvas.width || context.drawingBufferHeight < canvas.height) { extendWidth = context.drawingBufferWidth / canvas.width extendHeight = context.drawingBufferHeight / canvas.height //dx = wantedWidth - context.drawingBufferWidth @@ -1583,10 +1588,7 @@ export default class PIXIApp extends PIXI.Application { console.log('App is in fullScreen mode or autoResize mode') const resizeDebounced = debounce(event => this.resize(event), 50) window.addEventListener('resize', resizeDebounced) - document.body.addEventListener( - 'orientationchange', - this.checkOrientation.bind(this) - ) + document.body.addEventListener('orientationchange', this.checkOrientation.bind(this)) } if (monkeyPatchMapping) { console.log('Using monkey patched coordinate mapping') @@ -1617,18 +1619,12 @@ export default class PIXIApp extends PIXI.Application { uri: '/graphql' }) - const wsClient = new subscriptions.SubscriptionClient( - `wss://${location.hostname}/subscriptions`, - { - reconnect: true, - connectionParams: {} - } - ) + const wsClient = new subscriptions.SubscriptionClient(`wss://${location.hostname}/subscriptions`, { + reconnect: true, + connectionParams: {} + }) - const networkInterfaceWithSubscriptions = subscriptions.addGraphQLSubscriptions( - networkInterface, - wsClient - ) + const networkInterfaceWithSubscriptions = subscriptions.addGraphQLSubscriptions(networkInterface, wsClient) this.apolloClient = new apollo.ApolloClient({ networkInterface: networkInterfaceWithSubscriptions @@ -1764,10 +1760,7 @@ export default class PIXIApp extends PIXI.Application { * @param {number} [opts.height=window.innerHeight] - The height of the app to resize to. * @return {PIXIApp} - Returns the PIXIApp for chaining. */ - resize( - event, - { width = window.innerWidth, height = window.innerHeight } = {} - ) { + resize(event, { width = window.innerWidth, height = window.innerHeight } = {}) { this.width = width this.height = height this.expandRenderer() @@ -1788,8 +1781,7 @@ export default class PIXIApp extends PIXI.Application { monkeyPatchPixiMapping() { if (this.originalMapPositionToPoint === null) { let interactionManager = this.renderer.plugins.interaction - this.originalMapPositionToPoint = - interactionManager.mapPositionToPoint + this.originalMapPositionToPoint = interactionManager.mapPositionToPoint interactionManager.mapPositionToPoint = (point, x, y) => { return this.fixedMapPositionToPoint(point, x, y) } @@ -1818,8 +1810,7 @@ export default class PIXIApp extends PIXI.Application { if ( context !== null && - (context.drawingBufferWidth < canvas.width || - context.drawingBufferHeight < canvas.height) + (context.drawingBufferWidth < canvas.width || context.drawingBufferHeight < canvas.height) ) { extendWidth = context.drawingBufferWidth / canvas.width extendHeight = context.drawingBufferHeight / canvas.height @@ -1828,12 +1819,7 @@ export default class PIXIApp extends PIXI.Application { } x *= extendWidth y *= extendHeight - return this.originalMapPositionToPoint.call( - interactionManager, - local, - x, - y + dy - ) + return this.originalMapPositionToPoint.call(interactionManager, local, x, y + dy) } /** @@ -1884,9 +1870,7 @@ export default class PIXIApp extends PIXI.Application { * @return {Modal} Returns the Modal object. */ modal(opts = {}) { - let modal = new Modal( - Object.assign({ theme: this.theme }, opts, { app: this }) - ) + let modal = new Modal(Object.assign({ theme: this.theme }, opts, { app: this })) this.scene.addChild(modal) return modal @@ -1899,9 +1883,7 @@ export default class PIXIApp extends PIXI.Application { * @return {Message} Returns the Message object. */ message(opts = {}) { - let message = new Message( - Object.assign({ theme: this.theme }, opts, { app: this }) - ) + let message = new Message(Object.assign({ theme: this.theme }, opts, { app: this })) this.scene.addChild(message) return message @@ -1920,11 +1902,7 @@ export default class PIXIApp extends PIXI.Application { * @param {boolean} [opts.progress=false] - Should a progress bar display the loading status? * @return {PIXIApp} The PIXIApp object for chaining. */ - loadSprites( - resources, - loaded = null, - { resolutionDependent = true, progress = false } = {} - ) { + loadSprites(resources, loaded = null, { resolutionDependent = true, progress = false } = {}) { this.loadTextures( resources, textures => { @@ -1957,11 +1935,7 @@ export default class PIXIApp extends PIXI.Application { * @param {boolean} [opts.progress=false] - Should a progress bar display the loading status? * @return {PIXIApp} The PIXIApp object for chaining. */ - loadTextures( - resources, - loaded = null, - { resolutionDependent = true, progress = false } = {} - ) { + loadTextures(resources, loaded = null, { resolutionDependent = true, progress = false } = {}) { if (!Array.isArray(resources)) { resources = [resources] } @@ -1974,16 +1948,10 @@ export default class PIXIApp extends PIXI.Application { let resolution = Math.round(this.renderer.resolution) switch (resolution) { case 2: - loader.add( - resource, - resource.replace(/\.([^.]*)$/, '@2x.$1') - ) + loader.add(resource, resource.replace(/\.([^.]*)$/, '@2x.$1')) break case 3: - loader.add( - resource, - resource.replace(/\.([^.]*)$/, '@3x.$1') - ) + loader.add(resource, resource.replace(/\.([^.]*)$/, '@3x.$1')) break default: loader.add(resource) @@ -2148,11 +2116,7 @@ export default class PIXIApp extends PIXI.Application { pixiGlobal.x *= resolution pixiGlobal.y *= resolution // console.log("app.convertPointFromNodeToPage", pixiGlobal) - return window.convertPointFromNodeToPage( - app.view, - pixiGlobal.x, - pixiGlobal.y - ) + return window.convertPointFromNodeToPage(app.view, pixiGlobal.x, pixiGlobal.y) } } @@ -2227,7 +2191,7 @@ class FpsDisplay extends PIXI.Graphics {
      diff --git a/doc/out/pixi_badge.js.html b/doc/out/pixi_badge.js.html index 4c0b1aa..c664908 100644 --- a/doc/out/pixi_badge.js.html +++ b/doc/out/pixi_badge.js.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1527,11 +1535,7 @@ export default class Badge extends AbstractPopup { content: this.opts.tooltip }) } else { - this.opts.tooltip = Object.assign( - {}, - { object: this }, - this.opts.tooltip - ) + this.opts.tooltip = Object.assign({}, { object: this }, this.opts.tooltip) this.tooltip = new Tooltip(this.opts.tooltip) } } @@ -1548,12 +1552,8 @@ export default class Badge extends AbstractPopup { layout() { super.layout() - this.content.x = - this.width / 2 - this.content.width / 2 - this.opts.strokeWidth / 2 - this.content.y = - this.height / 2 - - this.content.height / 2 - - this.opts.strokeWidth / 2 + this.content.x = this.width / 2 - this.content.width / 2 - this.opts.strokeWidth / 2 + this.content.y = this.height / 2 - this.content.height / 2 - this.opts.strokeWidth / 2 return this } @@ -1571,7 +1571,7 @@ export default class Badge extends AbstractPopup {
      diff --git a/doc/out/pixi_blurfilter.js.html b/doc/out/pixi_blurfilter.js.html index def5bd9..bd2063c 100644 --- a/doc/out/pixi_blurfilter.js.html +++ b/doc/out/pixi_blurfilter.js.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1508,9 +1516,7 @@ export default class BlurFilter extends PIXI.Filter { return this.tiltShiftXFilter.shape } set shape(value) { - this.tiltShiftXFilter.shape = this.tiltShiftYFilter.shape = this.normalize( - value - ) + this.tiltShiftXFilter.shape = this.tiltShiftYFilter.shape = this.normalize(value) } /** @@ -1629,12 +1635,7 @@ class TiltShiftAxisFilter extends PIXI.Filter { this.uniforms.circle = [shape.x, shape.y, shape.r] } else { this.uniforms.shape = 2 - this.uniforms.rectangle = [ - shape.x, - shape.y, - shape.x + shape.width, - shape.y + shape.height - ] + this.uniforms.rectangle = [shape.x, shape.y, shape.x + shape.width, shape.y + shape.height] } this.uniforms.blur = blur this.uniforms.delta = new PIXI.Point(0, 0) @@ -1668,12 +1669,7 @@ class TiltShiftAxisFilter extends PIXI.Filter { return new PIXI.Circle(circle[0], circle[1], circle[2]) } else { const rectangle = this.uniforms.rectangle - return new PIXI.Rectangle( - rectangle[0], - rectangle[1], - rectangle[2], - rectangle[3] - ) + return new PIXI.Rectangle(rectangle[0], rectangle[1], rectangle[2], rectangle[3]) } } set shape(value) { @@ -1682,12 +1678,7 @@ class TiltShiftAxisFilter extends PIXI.Filter { this.uniforms.circle = [value.x, value.y, value.r] } else { this.uniforms.shape = 2 - this.uniforms.rectangle = [ - value.x, - value.y, - value.x + value.width, - value.y + value.height - ] + this.uniforms.rectangle = [value.x, value.y, value.x + value.width, value.y + value.height] } } } @@ -1738,7 +1729,7 @@ class TiltShiftYFilter extends TiltShiftAxisFilter {
      diff --git a/doc/out/pixi_button.js.html b/doc/out/pixi_button.js.html index e253390..9665604 100644 --- a/doc/out/pixi_button.js.html +++ b/doc/out/pixi_button.js.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1438,11 +1446,12 @@
      -
      /* global PIXI TweenLite */
      +            
      /* global */
       import Theme from './theme.js'
       import Tooltip from './tooltip.js'
       import Badge from './badge.js'
       import Events from '../events.js'
      +import { Points } from '../utils.js'
       
       /**
        * Callback for the button action.
      @@ -1596,15 +1605,9 @@ export default class Button extends PIXI.Container {
       
               this.id = this.opts.id
       
      -        if (
      -            typeof this.opts.icon === 'undefined' &&
      -            typeof this.opts.iconActive !== 'undefined'
      -        ) {
      +        if (typeof this.opts.icon === 'undefined' && typeof this.opts.iconActive !== 'undefined') {
                   this.opts.icon = this.opts.iconActive
      -        } else if (
      -            typeof this.opts.icon !== 'undefined' &&
      -            typeof this.opts.iconActive === 'undefined'
      -        ) {
      +        } else if (typeof this.opts.icon !== 'undefined' && typeof this.opts.iconActive === 'undefined') {
                   this.opts.iconActive = this.opts.icon
               }
       
      @@ -1620,6 +1623,8 @@ export default class Button extends PIXI.Container {
               this._active = null
               this._disabled = null
       
      +        this.__start = { x: null, y: null }
      +
               this.iconInactive = null
               this.iconActive = null
               this.text = null
      @@ -1674,17 +1679,11 @@ export default class Button extends PIXI.Container {
               // Icon
               //-----------------
               if (this.opts.icon) {
      -            this.iconInactive = this.loadIcon(
      -                this.opts.icon,
      -                this.opts.iconColor
      -            )
      +            this.iconInactive = this.loadIcon(this.opts.icon, this.opts.iconColor)
               }
       
               if (this.opts.iconActive) {
      -            this.iconActive = this.loadIcon(
      -                this.opts.iconActive,
      -                this.opts.iconColorActive
      -            )
      +            this.iconActive = this.loadIcon(this.opts.iconActive, this.opts.iconColorActive)
               }
       
               // interaction
      @@ -1712,6 +1711,8 @@ export default class Button extends PIXI.Container {
               // eslint-disable-next-line no-unused-vars
               this.button.on('pointerdown', e => {
                   //this.capture(e)
      +            this.__start.x = e.data.global.x
      +            this.__start.y = e.data.global.y
                   TweenLite.to([this.button, this.content], this.theme.fast, {
                       alpha: 0.7,
                       overwrite: 'none'
      @@ -1720,25 +1721,30 @@ export default class Button extends PIXI.Container {
       
               this.button.on('pointerup', e => {
                   this.capture(e)
      -            if (this.opts.beforeAction) {
      -                this.opts.beforeAction.call(this, e, this)
      -            }
       
      -            if (this.opts.action) {
      -                this.opts.action.call(this, e, this)
      -            }
      +            const distance = Points.distance(e.data.global, this.__start)
       
      -            TweenLite.to([this.button, this.content], this.theme.fast, {
      -                alpha: 0.83,
      -                overwrite: 'none'
      -            })
      +            if (distance < 5) {
      +                if (this.opts.beforeAction) {
      +                    this.opts.beforeAction.call(this, e, this)
      +                }
       
      -            if (this.opts.type === 'checkbox') {
      -                this.active = !this.active
      -            }
      +                if (this.opts.action) {
      +                    this.opts.action.call(this, e, this)
      +                }
       
      -            if (this.opts.afterAction) {
      -                this.opts.afterAction.call(this, e, this)
      +                TweenLite.to([this.button, this.content], this.theme.fast, {
      +                    alpha: 0.83,
      +                    overwrite: 'none'
      +                })
      +
      +                if (this.opts.type === 'checkbox') {
      +                    this.active = !this.active
      +                }
      +
      +                if (this.opts.afterAction) {
      +                    this.opts.afterAction.call(this, e, this)
      +                }
                   }
               })
       
      @@ -1759,11 +1765,7 @@ export default class Button extends PIXI.Container {
                           content: this.opts.tooltip
                       })
                   } else {
      -                this.opts.tooltip = Object.assign(
      -                    {},
      -                    { object: this },
      -                    this.opts.tooltip
      -                )
      +                this.opts.tooltip = Object.assign({}, { object: this }, this.opts.tooltip)
                       this.tooltip = new Tooltip(this.opts.tooltip)
                   }
               }
      @@ -1793,15 +1795,10 @@ export default class Button extends PIXI.Container {
                           badge.x = this.x - badge.width / 2 + opts.offsetLeft
                           break
                       case 'center':
      -                    badge.x =
      -                        this.x +
      -                        this.width / 2 -
      -                        badge.width / 2 +
      -                        opts.offsetLeft
      +                    badge.x = this.x + this.width / 2 - badge.width / 2 + opts.offsetLeft
                           break
                       case 'right':
      -                    badge.x =
      -                        this.x + this.width - badge.width / 2 + opts.offsetLeft
      +                    badge.x = this.x + this.width - badge.width / 2 + opts.offsetLeft
                   }
       
                   switch (opts.verticalAlign) {
      @@ -1809,15 +1806,10 @@ export default class Button extends PIXI.Container {
                           badge.y = this.y - badge.height / 2 + opts.offsetTop
                           break
                       case 'middle':
      -                    badge.y =
      -                        this.y +
      -                        this.height / 2 -
      -                        badge.height / 2 +
      -                        opts.offsetTop
      +                    badge.y = this.y + this.height / 2 - badge.height / 2 + opts.offsetTop
                           break
                       case 'bottom':
      -                    badge.y =
      -                        this.y + this.height - badge.height / 2 + opts.offsetTop
      +                    badge.y = this.y + this.height - badge.height / 2 + opts.offsetTop
                   }
       
                   this.addChild(badge)
      @@ -1956,8 +1948,7 @@ export default class Button extends PIXI.Container {
                       this.content.x = (this._width - this.content.width) / 2
                       break
                   case 'right':
      -                this.content.x =
      -                    this._width - this.opts.padding - this.content.width
      +                this.content.x = this._width - this.opts.padding - this.content.width
                       break
               }
       
      @@ -1969,8 +1960,7 @@ export default class Button extends PIXI.Container {
                       this.content.y = (this._height - this.content.height) / 2
                       break
                   case 'bottom':
      -                this.content.y =
      -                    this._height - this.opts.padding - this.content.height
      +                this.content.y = this._height - this.opts.padding - this.content.height
                       break
               }
       
      @@ -1986,30 +1976,13 @@ export default class Button extends PIXI.Container {
           draw() {
               this.button.clear()
               if (this.active) {
      -            this.button.lineStyle(
      -                this.opts.strokeActiveWidth,
      -                this.opts.strokeActive,
      -                this.opts.strokeActiveAlpha
      -            )
      -            this.button.beginFill(
      -                this.opts.fillActive,
      -                this.opts.fillActiveAlpha
      -            )
      +            this.button.lineStyle(this.opts.strokeActiveWidth, this.opts.strokeActive, this.opts.strokeActiveAlpha)
      +            this.button.beginFill(this.opts.fillActive, this.opts.fillActiveAlpha)
               } else {
      -            this.button.lineStyle(
      -                this.opts.strokeWidth,
      -                this.opts.stroke,
      -                this.opts.strokeAlpha
      -            )
      +            this.button.lineStyle(this.opts.strokeWidth, this.opts.stroke, this.opts.strokeAlpha)
                   this.button.beginFill(this.opts.fill, this.opts.fillAlpha)
               }
      -        this.button.drawRoundedRect(
      -            0,
      -            0,
      -            this._width,
      -            this._height,
      -            this.opts.radius
      -        )
      +        this.button.drawRoundedRect(0, 0, this._width, this._height, this.opts.radius)
               this.button.endFill()
       
               return this
      @@ -2126,9 +2099,7 @@ export default class Button extends PIXI.Container {
                       size = this.opts.minHeight - 2 * this.opts.padding
                   }
       
      -            const url = Button.iconIsUrl(icon)
      -                ? icon
      -                : `../../assets/icons/${icon}.png`
      +            const url = Button.iconIsUrl(icon) ? icon : `../../assets/icons/${icon}.png`
                   const iconTexture = PIXI.Texture.fromImage(url, true)
       
                   const sprite = new PIXI.Sprite(iconTexture)
      @@ -2182,7 +2153,7 @@ export default class Button extends PIXI.Container {
       
               
      diff --git a/doc/out/pixi_buttongroup.js.html b/doc/out/pixi_buttongroup.js.html index f2fc08f..4b5c814 100644 --- a/doc/out/pixi_buttongroup.js.html +++ b/doc/out/pixi_buttongroup.js.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1438,8 +1446,11 @@
      -
      import Theme from './theme.js'
      +            
      /* globals ThrowPropsPlugin, Strong */
      +
      +import Theme from './theme.js'
       import Button from './button.js'
      +import Events from '../events.js'
       
       /**
        * Class that represents a PixiJS ButtonGroup.
      @@ -1463,7 +1474,7 @@ import Button from './button.js'
        * @see {@link http://pixijs.download/dev/docs/PIXI.Graphics.html|PIXI.Graphics}
        * @see {@link https://www.iwm-tuebingen.de/iwmbrowser/lib/pixi/buttongroup.html|DocTest}
        */
      -export default class ButtonGroup extends PIXI.Graphics {
      +export default class ButtonGroup extends PIXI.Container {
           /**
            * Creates an instance of a ButtonGroup.
            *
      @@ -1479,9 +1490,10 @@ export default class ButtonGroup extends PIXI.Graphics {
            *     or a Theme object.
            * @param {number} [opts.minWidth=44] - Button: The minimum width of one button.
            * @param {number} [opts.minHeight=44] - Button: The minimum height of one button.
      -     * @param {number} [opts.maxWidth] - The maximum width of the buttongroup. Only used if stacked is true and the orientation is horizontal.
      -     * @param {number} [opts.maxHeight] - The maximum height of the buttongroup. Only used if stacked is true and the orientation is vertical.
      -     * @param {boolean} [opts.stacked=false] - If set to true, the buttons of the buttongroup gets stacked if they are broader or higher than the maximum permitted width or height, depending on orientation.
      +     * @param {number} [opts.maxWidth] - The maximum width of the button group. If the buttons are wider than the maximum width, the buttons get stacked. Note: The buttons can only be stacked if margin is not zero.
      +     * @param {number} [opts.maxHeight] - The maximum height of the button group. If the buttons are higher than the maximum height, the buttons get stacked. Note: The buttons can only be stacked if margin is not zero.
      +     * @param {number} [opts.stackPadding=10] - The padding for stacked buttons.
      +     * @param {PIXI.Application} [opts.app] - The PixiJS Application. Must be set if you want to use the mousewheel to scroll your button group. Only used when the buttons are stacked (with maxWidth or maxHeight).
            * @param {number} [opts.padding=Theme.padding] - Button: The inner spacing (distance from icon and/or label) the the border.
            * @param {number} [opts.margin=Theme.margin] - The outer spacing (distance from one button to the previous/next button).
            * @param {string} [opts.iconPosition=left] - Button: The position of the icon in relation to the label. Can be left or right.
      @@ -1530,6 +1542,10 @@ export default class ButtonGroup extends PIXI.Graphics {
                       buttons: [],
                       minWidth: 44,
                       minHeight: 44,
      +                maxWidth: null,
      +                maxHeight: null,
      +                stackPadding: 10,
      +                app: null,
                       padding: theme.padding,
                       margin: theme.margin,
                       iconPosition: 'left', // left, right
      @@ -1562,6 +1578,7 @@ export default class ButtonGroup extends PIXI.Graphics {
               this.buttons = []
       
               this._disabled = null
      +        this.__dragging = false
       
               this.visible = this.opts.visible
       
      @@ -1581,9 +1598,16 @@ export default class ButtonGroup extends PIXI.Graphics {
            * @return {ButtonGroup} A reference to the button group for chaining.
            */
           setup() {
      +        // inner container
      +        //--------------------
      +        const container = new PIXI.Graphics()
      +        this.addChild(container)
      +        this.container = container
      +
               // Buttons
               //-----------------
               let position = 0
      +        let index = 0
       
               for (let it of this.opts.buttons) {
                   delete it.x
      @@ -1607,19 +1631,11 @@ export default class ButtonGroup extends PIXI.Graphics {
                   it.fillActive = it.fillActive || this.opts.fillActive
                   it.fillActiveAlpha = it.fillActiveAlpha || this.opts.fillActiveAlpha
                   it.stroke = it.stroke || this.opts.stroke
      -            it.strokeWidth =
      -                it.strokeWidth != null ? it.strokeWidth : this.opts.strokeWidth
      -            it.strokeAlpha =
      -                it.strokeAlpha != null ? it.strokeAlpha : this.opts.strokeAlpha
      +            it.strokeWidth = it.strokeWidth != null ? it.strokeWidth : this.opts.strokeWidth
      +            it.strokeAlpha = it.strokeAlpha != null ? it.strokeAlpha : this.opts.strokeAlpha
                   it.strokeActive = it.strokeActive || this.opts.strokeActive
      -            it.strokeActiveWidth =
      -                it.strokeActiveWidth != null
      -                    ? it.strokeActiveWidth
      -                    : this.opts.strokeActiveWidth
      -            it.strokeActiveAlpha =
      -                it.strokeActiveAlpha != null
      -                    ? it.strokeActiveAlpha
      -                    : this.opts.strokeActiveAlpha
      +            it.strokeActiveWidth = it.strokeActiveWidth != null ? it.strokeActiveWidth : this.opts.strokeActiveWidth
      +            it.strokeActiveAlpha = it.strokeActiveAlpha != null ? it.strokeActiveAlpha : this.opts.strokeActiveAlpha
                   it.textStyle = it.textStyle || this.opts.textStyle
                   it.textStyleActive = it.textStyleActive || this.opts.textStyleActive
                   it.style = it.style || this.opts.style
      @@ -1638,10 +1654,7 @@ export default class ButtonGroup extends PIXI.Graphics {
                   it.align = it.align || this.opts.align
                   it.verticalAlign = it.verticalAlign || this.opts.verticalAlign
                   it.afterAction = (event, button) => {
      -                if (
      -                    this.opts.type === 'radio' &&
      -                    button.opts.type === 'default'
      -                ) {
      +                if (this.opts.type === 'radio' && button.opts.type === 'default') {
                           this.buttons.forEach(it => {
                               if (it.opts.type === 'default') {
                                   it.active = false
      @@ -1658,23 +1671,24 @@ export default class ButtonGroup extends PIXI.Graphics {
                       if (typeof it.tooltip === 'string') {
                           it.tooltip = { content: it.tooltip, container: this }
                       } else {
      -                    it.tooltip = Object.assign(
      -                        {},
      -                        { container: this },
      -                        it.tooltip
      -                    )
      +                    it.tooltip = Object.assign({}, { container: this }, it.tooltip)
                       }
                   }
       
                   let button = new Button(it)
       
      -            this.addChild(button)
      +            this.container.addChild(button)
                   this.buttons.push(button)
       
      -            position +=
      -                (this.opts.orientation === 'horizontal'
      -                    ? button.width
      -                    : button.height) + this.opts.margin
      +            button.__originalPosition = {
      +                x: button.x,
      +                y: button.y
      +            }
      +
      +            position += (this.opts.orientation === 'horizontal' ? button.width : button.height) + this.opts.margin
      +
      +            button.__initIndex = index
      +            index++
               }
       
               if (this.opts.orientation === 'vertical') {
      @@ -1692,6 +1706,42 @@ export default class ButtonGroup extends PIXI.Graphics {
                   this.disabled = this.opts.disabled
               }
       
      +        // interaction
      +        //--------------------
      +        if (this.opts.margin > 0 && (this.opts.maxWidth || this.opts.maxHeight)) {
      +            this.interactive = true
      +            this.on('pointerdown', this.onStart.bind(this))
      +            this.on('pointermove', this.onMove.bind(this))
      +            this.on('pointerup', this.onEnd.bind(this))
      +            this.on('pointercancel', this.onEnd.bind(this))
      +            this.on('pointerout', this.onEnd.bind(this))
      +            this.on('pointerupoutside', this.onEnd.bind(this))
      +            this.on('scroll', this.onScroll.bind(this))
      +
      +            // mousewheel
      +            //--------------------
      +            if (this.opts.app) {
      +                const app = this.opts.app
      +                app.view.addEventListener('mousewheel', event => {
      +                    const bounds = this.getBounds()
      +                    const x = event.clientX - app.view.getBoundingClientRect().left
      +                    const y = event.clientY - app.view.getBoundingClientRect().top
      +                    if (bounds.contains(x, y)) {
      +                        event.preventDefault()
      +                        this.emit('scroll', event)
      +                    }
      +                })
      +            }
      +
      +            const background = new PIXI.Graphics()
      +            background.beginFill(0x000000, 0)
      +            background.drawRect(0, 0, this.width, this.height)
      +            background.endFill()
      +            this.addChildAt(background, 0)
      +
      +            this.__initWidth = this.container.width
      +        }
      +
               return this
           }
       
      @@ -1709,6 +1759,12 @@ export default class ButtonGroup extends PIXI.Graphics {
               //-----------------
               this.draw()
       
      +        // stack
      +        //-----------------
      +        if (this.opts.margin > 0 && (this.opts.maxWidth || this.opts.maxHeight)) {
      +            this.stack()
      +        }
      +
               return this
           }
       
      @@ -1722,41 +1778,27 @@ export default class ButtonGroup extends PIXI.Graphics {
               if (this.opts.margin === 0) {
                   this.buttons.forEach(it => it.hide())
       
      -            this.clear()
      -            this.lineStyle(
      -                this.opts.strokeWidth,
      -                this.opts.stroke,
      -                this.opts.strokeAlpha
      -            )
      -            this.beginFill(this.opts.fill, this.opts.fillAlpha)
      -            this.drawRoundedRect(
      -                0,
      -                0,
      -                this.width,
      -                this.height,
      -                this.opts.radius
      -            )
      +            this.container.clear()
      +            this.container.lineStyle(this.opts.strokeWidth, this.opts.stroke, this.opts.strokeAlpha)
      +            this.container.beginFill(this.opts.fill, this.opts.fillAlpha)
      +            this.container.drawRoundedRect(0, 0, this.width, this.height, this.opts.radius)
       
                   // Draw borders
      -            this.lineStyle(
      -                this.opts.strokeWidth,
      -                this.opts.stroke,
      -                this.opts.strokeAlpha / 2
      -            )
      +            this.container.lineStyle(this.opts.strokeWidth, this.opts.stroke, this.opts.strokeAlpha / 2)
       
                   this.buttons.forEach((it, i) => {
                       if (i > 0) {
      -                    this.moveTo(it.x, it.y)
      +                    this.container.moveTo(it.x, it.y)
       
                           if (this.opts.orientation === 'horizontal') {
      -                        this.lineTo(it.x, it.height)
      +                        this.container.lineTo(it.x, it.height)
                           } else {
      -                        this.lineTo(it.width, it.y)
      +                        this.container.lineTo(it.width, it.y)
                           }
                       }
                   })
       
      -            this.endFill()
      +            this.container.endFill()
               }
       
               return this
      @@ -1810,6 +1852,243 @@ export default class ButtonGroup extends PIXI.Graphics {
       
               return this
           }
      +
      +    /**
      +     *
      +     * @private
      +     * @param {*} event
      +     */
      +    onStart(event) {
      +        this.__dragging = true
      +
      +        this.capture(event)
      +
      +        this.__delta = {
      +            x: this.container.position.x - event.data.global.x,
      +            y: this.container.position.y - event.data.global.y
      +        }
      +
      +        TweenLite.killTweensOf(this.container.position, { x: true, y: true })
      +        if (typeof ThrowPropsPlugin != 'undefined') {
      +            ThrowPropsPlugin.track(this.container.position, 'x,y')
      +        }
      +    }
      +
      +    /**
      +     *
      +     * @private
      +     * @param {*} event
      +     */
      +    onMove(event) {
      +        if (this.__dragging) {
      +            this.capture(event)
      +
      +            if (this.opts.orientation === 'horizontal') {
      +                this.container.position.x = event.data.global.x + this.__delta.x
      +            } else {
      +                this.container.position.y = event.data.global.y + this.__delta.y
      +            }
      +
      +            this.stack()
      +        }
      +    }
      +
      +    /**
      +     *
      +     * @private
      +     * @param {*} event
      +     */
      +    onEnd(event) {
      +        if (this.__dragging) {
      +            this.__dragging = false
      +
      +            this.capture(event)
      +
      +            if (typeof ThrowPropsPlugin != 'undefined') {
      +                const throwProps = { x: { velocity: 'auto' }, y: { velocity: 'auto' } }
      +
      +                if (this.opts.orientation === 'horizontal') {
      +                    const distanceToLeft = this.container.x
      +                    const distanceToRight = this.opts.maxWidth - this.container.x - this.__initWidth
      +                    if (distanceToLeft > 0 && distanceToLeft > distanceToRight) {
      +                        throwProps.x.end = 0
      +                    } else if (distanceToRight > 0 && distanceToRight > distanceToLeft) {
      +                        throwProps.x.end = this.opts.maxWidth - this.__initWidth
      +                    }
      +                } else {
      +                    const distanceToTop = this.container.y
      +                    const distanceToBottom = this.opts.maxHeight - this.container.y - this.container.height
      +                    if (distanceToTop > 0 && distanceToTop > distanceToBottom) {
      +                        throwProps.y.end = 0
      +                    } else if (distanceToBottom > 0 && distanceToBottom > distanceToTop) {
      +                        throwProps.y.end = this.opts.maxHeight - this.container.height
      +                    }
      +                }
      +
      +                ThrowPropsPlugin.to(
      +                    this.container.position,
      +                    {
      +                        throwProps,
      +                        ease: Strong.easeOut,
      +                        onUpdate: () => this.stack(),
      +                        onComplete: () => ThrowPropsPlugin.untrack(this.container.position)
      +                    },
      +                    0.8,
      +                    0.4
      +                )
      +            }
      +        }
      +    }
      +
      +    /**
      +     *
      +     * @private
      +     * @param {*} event
      +     */
      +    onScroll(event) {
      +        this.capture(event)
      +
      +        if (this.opts.orientation === 'horizontal') {
      +            this.container.position.x -= event.deltaX
      +            if (this.container.position.x > 0) {
      +                this.container.position.x = 0
      +            } else if (this.container.position.x + this.__initWidth < this.opts.maxWidth) {
      +                this.container.position.x = this.opts.maxWidth - this.__initWidth
      +            }
      +        } else {
      +            this.container.position.y -= event.deltaY
      +            if (this.container.position.y > 0) {
      +                this.container.position.y = 0
      +            } else if (this.container.position.y + this.container.height < this.opts.maxHeight) {
      +                this.container.position.y = this.opts.maxHeight - this.container.height
      +            }
      +        }
      +
      +        this.stack()
      +    }
      +
      +    /**
      +     * Captures an event to inform InteractionMapper about processed events.
      +     *
      +     * @param {event|PIXI.InteractionEvent} event - The PIXI event to capture.
      +     */
      +    capture(event) {
      +        const originalEvent = event.data && event.data.originalEvent ? event.data.originalEvent : event
      +        Events.capturedBy(originalEvent, this)
      +    }
      +
      +    /**
      +     *
      +     */
      +    stack() {
      +        if (this.opts.maxWidth) {
      +            this._stackHorizontal()
      +        } else if (this.opts.maxHeight) {
      +            this._stackVertical()
      +        }
      +    }
      +
      +    /**
      +     * 
      +     */
      +    _stackHorizontal() {
      +        const sorted = []
      +
      +        let reverseCounter = this.buttons.length - 1
      +
      +        this.buttons.forEach((it, index) => {
      +            const leftCorner = it.__originalPosition.x + this.container.x
      +            const rightCorner = it.__originalPosition.x + it.width
      +            const paddingLeft = index * this.opts.stackPadding
      +            const paddingRight = reverseCounter * this.opts.stackPadding
      +            if (leftCorner < paddingLeft) {
      +                // left border
      +                it.x = -this.container.x + paddingLeft
      +            } else if (rightCorner > Math.abs(this.container.x) + this.opts.maxWidth - paddingRight) {
      +                // right border
      +                it.x = Math.abs(this.container.x) + this.opts.maxWidth - it.width - paddingRight
      +            } else {
      +                it.x = it.__originalPosition.x
      +            }
      +
      +            reverseCounter--
      +
      +            sorted.push(it)
      +        })
      +
      +        // z-index
      +        sorted
      +            .sort((a, b) => {
      +                const delta = Math.abs(this.container.x) + this.opts.maxWidth / 2
      +                const distanceA = Math.abs(a.x - delta)
      +                const distanceB = Math.abs(b.x - delta)
      +                if (distanceA > distanceB) {
      +                    return -1
      +                } else if (distanceB > distanceA) {
      +                    return 1
      +                } else {
      +                    if (a.__initIndex > b.__initIndex) {
      +                        return -1
      +                    } else if (b.__initIndex > a.__initIndex) {
      +                        return 1
      +                    } else {
      +                        return 0
      +                    }
      +                }
      +            })
      +            .forEach(it => it.parent.addChild(it))
      +    }
      +
      +    /**
      +     * 
      +     */
      +    _stackVertical() {
      +        const sorted = []
      +
      +        let reverseCounter = this.buttons.length - 1
      +
      +        this.buttons.forEach((it, index) => {
      +            const topCorner = it.__originalPosition.y + this.container.y
      +            const bottomCorner = it.__originalPosition.y + it.height
      +            const paddingTop = index * this.opts.stackPadding
      +            const paddingBottom = reverseCounter * this.opts.stackPadding
      +            if (topCorner < paddingTop) {
      +                // top border
      +                it.y = -this.container.y + paddingTop
      +            } else if (bottomCorner > Math.abs(this.container.y) + this.opts.maxHeight - paddingBottom) {
      +                // bottom border
      +                it.y = Math.abs(this.container.y) + this.opts.maxHeight - it.height - paddingBottom
      +            } else {
      +                it.y = it.__originalPosition.y
      +            }
      +
      +            reverseCounter--
      +
      +            sorted.push(it)
      +        })
      +
      +        // z-index
      +        sorted
      +            .sort((a, b) => {
      +                const delta = Math.abs(this.container.y) + this.opts.maxHeight / 2
      +                const distanceA = Math.abs(a.y - delta)
      +                const distanceB = Math.abs(b.y - delta)
      +                if (distanceA > distanceB) {
      +                    return -1
      +                } else if (distanceB > distanceA) {
      +                    return 1
      +                } else {
      +                    if (a.__initIndex > b.__initIndex) {
      +                        return -1
      +                    } else if (b.__initIndex > a.__initIndex) {
      +                        return 1
      +                    } else {
      +                        return 0
      +                    }
      +                }
      +            })
      +            .forEach(it => it.parent.addChild(it))
      +    }
       }
       
      @@ -1824,7 +2103,7 @@ export default class ButtonGroup extends PIXI.Graphics {
      diff --git a/doc/out/pixi_deepzoom_image.js.html b/doc/out/pixi_deepzoom_image.js.html index 71af321..7098555 100644 --- a/doc/out/pixi_deepzoom_image.js.html +++ b/doc/out/pixi_deepzoom_image.js.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -2545,7 +2553,7 @@ export class DeepZoomImage extends PIXI.Container {
      diff --git a/doc/out/pixi_flippable.js.html b/doc/out/pixi_flippable.js.html index 1cbc58e..333e4f9 100644 --- a/doc/out/pixi_flippable.js.html +++ b/doc/out/pixi_flippable.js.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1533,12 +1541,7 @@ export default class Flippable extends PIXI.projection.Camera3d { // planes //-------------------- - this.setPlanes( - this.opts.focus, - this.opts.near, - this.opts.far, - this.opts.orthographic - ) + this.setPlanes(this.opts.focus, this.opts.near, this.opts.far, this.opts.orthographic) // flipped //-------------------- @@ -1577,9 +1580,7 @@ export default class Flippable extends PIXI.projection.Camera3d { // shadow //-------------------- - const shadow = new PIXI.projection.Sprite3d( - PIXI.Texture.fromImage('../../assets/images/shadow.png') - ) + const shadow = new PIXI.projection.Sprite3d(PIXI.Texture.fromImage('../../assets/images/shadow.png')) shadow.renderable = false shadow.anchor.set(0.5) shadow.scale3d.set(0.98) @@ -1671,21 +1672,11 @@ export default class Flippable extends PIXI.projection.Camera3d { y: this.opts.useBackTransforms ? toCenter.y : fromCenter.y, anchorX: this.opts.useBackTransforms ? toObject.x : fromObject.x, anchorY: this.opts.useBackTransforms ? toObject.y : fromObject.y, - width: this.opts.useBackTransforms - ? toObject.width * 2 - : fromObject.width * 2, - height: this.opts.useBackTransforms - ? toObject.height * 2 - : fromObject.height * 2, - rotation: this.opts.useBackTransforms - ? toObject.rotation - : fromObject.rotation, - skewX: this.opts.useBackTransforms - ? toObject.skew.x - : fromObject.skew.x, - skewY: this.opts.useBackTransforms - ? toObject.skew.y - : fromObject.skew.y + width: this.opts.useBackTransforms ? toObject.width * 2 : fromObject.width * 2, + height: this.opts.useBackTransforms ? toObject.height * 2 : fromObject.height * 2, + rotation: this.opts.useBackTransforms ? toObject.rotation : fromObject.rotation, + skewX: this.opts.useBackTransforms ? toObject.skew.x : fromObject.skew.x, + skewY: this.opts.useBackTransforms ? toObject.skew.y : fromObject.skew.y } // set toObject end values @@ -1771,15 +1762,11 @@ export default class Flippable extends PIXI.projection.Camera3d { // shadow //-------------------- - new TimelineMax() - .to(shadow, half, { alpha: 0.3, ease }) - .to(shadow, half, { alpha: 0.7, ease }) + new TimelineMax().to(shadow, half, { alpha: 0.3, ease }).to(shadow, half, { alpha: 0.7, ease }) // blurfilter //-------------------- - new TimelineMax() - .to(blurFilter, half, { blur: 6, ease }) - .to(blurFilter, half, { blur: 0.2, ease }) + new TimelineMax().to(blurFilter, half, { blur: 6, ease }).to(blurFilter, half, { blur: 0.2, ease }) } /** @@ -1793,8 +1780,7 @@ export default class Flippable extends PIXI.projection.Camera3d { const shadow = this.objects.shadow const inner = this.objects.inner - inner.position3d.z = - -Math.sin(inner.euler.y) * front.texture.baseTexture.width * 2 + inner.position3d.z = -Math.sin(inner.euler.y) * front.texture.baseTexture.width * 2 //this.objects.shadow.euler = this.objects.inner.euler shadow.euler.x = -inner.euler.x @@ -1861,10 +1847,7 @@ export default class Flippable extends PIXI.projection.Camera3d { generateTexture(displayObject) { // renderTexture //-------------------- - const renderTexture = PIXI.RenderTexture.create( - displayObject.width, - displayObject.height - ) + const renderTexture = PIXI.RenderTexture.create(displayObject.width, displayObject.height) // save position const transform = [ @@ -1925,7 +1908,7 @@ export default class Flippable extends PIXI.projection.Camera3d {
      diff --git a/doc/out/pixi_labeledgraphics.js.html b/doc/out/pixi_labeledgraphics.js.html index 8b7cec0..285460d 100644 --- a/doc/out/pixi_labeledgraphics.js.html +++ b/doc/out/pixi_labeledgraphics.js.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1517,15 +1525,9 @@ export class Hypenate { let first = true let lastPart = '' for (let part of parts) { - let partMetrics = PIXI.TextMetrics.measureText( - part, - pixiStyle - ) + let partMetrics = PIXI.TextMetrics.measureText(part, pixiStyle) if (x + partMetrics.width + space.width > width) { - newWord += - (first || lastPart.endsWith('-') - ? '\n' - : '-\n') + part + newWord += (first || lastPart.endsWith('-') ? '\n' : '-\n') + part x = partMetrics.width } else { newWord += part @@ -1576,12 +1578,7 @@ class TextLabel extends PIXI.Text { * @param {canvas} * @memberof TextLabel */ - constructor( - text, - style = null, - canvas = null, - { minZoom = 0.1, maxZoom = 10 } = {} - ) { + constructor(text, style = null, canvas = null, { minZoom = 0.1, maxZoom = 10 } = {}) { super(text, style, canvas) this.normFontSize = this.style.fontSize this.minZoom = minZoom @@ -1730,21 +1727,11 @@ export class LabeledGraphics extends PIXI.Graphics { const truncatedLines = lines.slice(0, maxLines) const lastLine = truncatedLines[truncatedLines.length - 1] const words = lastLine.split(' ') - const wordMetrics = PIXI.TextMetrics.measureText( - `\u00A0\n...\n${words.join('\n')}`, - pixiStyle - ) - const [ - spaceLength, - dotsLength, - ...wordLengths - ] = wordMetrics.lineWidths + const wordMetrics = PIXI.TextMetrics.measureText(`\u00A0\n...\n${words.join('\n')}`, pixiStyle) + const [spaceLength, dotsLength, ...wordLengths] = wordMetrics.lineWidths const { text: newLastLine } = wordLengths.reduce( (data, wordLength, i) => { - if ( - data.length + wordLength + spaceLength >= - wordWrapWidth - ) { + if (data.length + wordLength + spaceLength >= wordWrapWidth) { return { ...data, length: wordWrapWidth } } return { @@ -1870,7 +1857,7 @@ export class BitmapLabeledGraphics extends LabeledGraphics {
      diff --git a/doc/out/pixi_list.js.html b/doc/out/pixi_list.js.html index 02088ee..2b59843 100644 --- a/doc/out/pixi_list.js.html +++ b/doc/out/pixi_list.js.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1438,7 +1446,7 @@
      -
      /* globals */
      +            
      /* globals ThrowPropsPlugin, Strong */
       
       /* Imports */
       import Events from '../events.js'
      @@ -1548,9 +1556,7 @@ export default class List extends PIXI.Container {
               if (this.opts.app) {
                   const app = this.opts.app
                   app.view.addEventListener('mousewheel', event => {
      -                const bounds = this.mask
      -                    ? this.mask.getBounds()
      -                    : this.getBounds()
      +                const bounds = this.mask ? this.mask.getBounds() : this.getBounds()
                       const x = event.clientX - app.view.getBoundingClientRect().left
                       const y = event.clientY - app.view.getBoundingClientRect().top
                       if (bounds.contains(x, y)) {
      @@ -1607,14 +1613,10 @@ export default class List extends PIXI.Container {
               if (this.opts.orientation === 'vertical') {
                   switch (this.opts.align) {
                       case 'center':
      -                    this.__items.forEach(
      -                        it => (it.x = margin + this.width / 2 - it.width / 2)
      -                    )
      +                    this.__items.forEach(it => (it.x = margin + this.width / 2 - it.width / 2))
                           break
                       case 'right':
      -                    this.__items.forEach(
      -                        it => (it.x = margin + this.width - it.width)
      -                    )
      +                    this.__items.forEach(it => (it.x = margin + this.width - it.width))
                           break
                       default:
                           this.__items.forEach(it => (it.x = margin))
      @@ -1640,14 +1642,10 @@ export default class List extends PIXI.Container {
                           this.__items.forEach(it => (it.y = margin))
                           break
                       case 'bottom':
      -                    this.__items.forEach(
      -                        it => (it.y = margin + this.height - it.height)
      -                    )
      +                    this.__items.forEach(it => (it.y = margin + this.height - it.height))
                           break
                       default:
      -                    this.__items.forEach(
      -                        it => (it.y = margin + this.height / 2 - it.height / 2)
      -                    )
      +                    this.__items.forEach(it => (it.y = margin + this.height / 2 - it.height / 2))
                           break
                   }
       
      @@ -1781,8 +1779,7 @@ export default class List extends PIXI.Container {
                           {
                               throwProps,
                               ease: Strong.easeOut,
      -                        onComplete: () =>
      -                            ThrowPropsPlugin.untrack(this.container.position)
      +                        onComplete: () => ThrowPropsPlugin.untrack(this.container.position)
                           },
                           0.8,
                           0.4
      @@ -1803,20 +1800,14 @@ export default class List extends PIXI.Container {
                   this.container.position.x -= event.deltaX
                   if (this.container.position.x > 0) {
                       this.container.position.x = 0
      -            } else if (
      -                this.container.position.x + this.innerWidth <
      -                this.opts.width
      -            ) {
      +            } else if (this.container.position.x + this.innerWidth < this.opts.width) {
                       this.container.position.x = this.opts.width - this.innerWidth
                   }
               } else {
                   this.container.position.y -= event.deltaY
                   if (this.container.position.y > 0) {
                       this.container.position.y = 0
      -            } else if (
      -                this.container.position.y + this.innerHeight <
      -                this.opts.height
      -            ) {
      +            } else if (this.container.position.y + this.innerHeight < this.opts.height) {
                       this.container.position.y = this.opts.height - this.innerHeight
                   }
               }
      @@ -1828,10 +1819,7 @@ export default class List extends PIXI.Container {
            * @param {event|PIXI.InteractionEvent} event - The PIXI event to capture.
            */
           capture(event) {
      -        const originalEvent =
      -            event.data && event.data.originalEvent
      -                ? event.data.originalEvent
      -                : event
      +        const originalEvent = event.data && event.data.originalEvent ? event.data.originalEvent : event
               Events.capturedBy(originalEvent, this)
           }
       }
      @@ -1848,7 +1836,7 @@ export default class List extends PIXI.Container {
       
               
      diff --git a/doc/out/pixi_message.js.html b/doc/out/pixi_message.js.html index cd9656f..140564e 100644 --- a/doc/out/pixi_message.js.html +++ b/doc/out/pixi_message.js.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1531,8 +1539,7 @@ export default class Message extends InteractivePopup { this.x = this.opts.app.size.width / 2 - this.width / 2 break case 'right': - this.x = - this.opts.app.size.width - this.opts.margin - this.width + this.x = this.opts.app.size.width - this.opts.margin - this.width break } @@ -1545,8 +1552,7 @@ export default class Message extends InteractivePopup { this.y = this.opts.app.size.height / 2 - this.height / 2 break case 'bottom': - this.y = - this.opts.app.size.height - this.opts.margin - this.height + this.y = this.opts.app.size.height - this.opts.margin - this.height break } } @@ -1579,7 +1585,7 @@ export default class Message extends InteractivePopup {
      diff --git a/doc/out/pixi_modal.js.html b/doc/out/pixi_modal.js.html index 27ff089..442c323 100644 --- a/doc/out/pixi_modal.js.html +++ b/doc/out/pixi_modal.js.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1574,10 +1582,7 @@ export default class Modal extends PIXI.Container { // background //----------------- this.background.clear() - this.background.beginFill( - this.opts.backgroundFill, - this.opts.backgroundFillAlpha - ) + this.background.beginFill(this.opts.backgroundFill, this.opts.backgroundFillAlpha) this.background.drawRect(0, 0, width, height) this.background.endFill() @@ -1661,7 +1666,7 @@ export default class Modal extends PIXI.Container {
      diff --git a/doc/out/pixi_popup.js.html b/doc/out/pixi_popup.js.html index 3480ce7..24f4cf7 100644 --- a/doc/out/pixi_popup.js.html +++ b/doc/out/pixi_popup.js.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1513,10 +1521,7 @@ export class InteractivePopup extends AbstractPopup { // closeButton //----------------- if (this.opts.closeButton) { - let closeButton = PIXI.Sprite.fromImage( - '../../assets/icons/close.png', - true - ) + let closeButton = PIXI.Sprite.fromImage('../../assets/icons/close.png', true) closeButton.width = this.headerStyle.fontSize closeButton.height = closeButton.width closeButton.tint = this.theme.color2 @@ -1540,10 +1545,7 @@ export class InteractivePopup extends AbstractPopup { //----------------- if (this.opts.maxWidth) { const wordWrapWidth = - this.opts.maxWidth - - 2 * this.opts.padding - - this.smallPadding - - this._closeButton.width + this.opts.maxWidth - 2 * this.opts.padding - this.smallPadding - this._closeButton.width if (this._header) { this.headerStyle.wordWrapWidth = wordWrapWidth } else if (this._content) { @@ -1556,18 +1558,10 @@ export class InteractivePopup extends AbstractPopup { //----------------- if (this.opts.button || this.opts.buttonGroup) { if (this.opts.button) { - this._buttons = new Button( - Object.assign( - { textStyle: this.theme.textStyleSmall }, - this.opts.button - ) - ) + this._buttons = new Button(Object.assign({ textStyle: this.theme.textStyleSmall }, this.opts.button)) } else { this._buttons = new ButtonGroup( - Object.assign( - { textStyle: this.theme.textStyleSmall }, - this.opts.buttonGroup - ) + Object.assign({ textStyle: this.theme.textStyleSmall }, this.opts.buttonGroup) ) } this.addChild(this._buttons) @@ -1589,18 +1583,15 @@ export class InteractivePopup extends AbstractPopup { // closeButton //----------------- if (this.opts.closeButton) { - this._closeButton.x = - this.wantedWidth - this.smallPadding - this._closeButton.width + this._closeButton.x = this.wantedWidth - this.smallPadding - this._closeButton.width this._closeButton.y = this.smallPadding } // buttons //----------------- if (this._buttons) { - this._buttons.x = - this.wantedWidth - this.opts.padding - this._buttons.width - this._buttons.y = - this.wantedHeight - this.opts.padding - this._buttons.height + this._buttons.x = this.wantedWidth - this.opts.padding - this._buttons.width + this._buttons.y = this.wantedHeight - this.opts.padding - this._buttons.height } return this @@ -1623,10 +1614,7 @@ export class InteractivePopup extends AbstractPopup { } if (this._buttons) { - size.width = Math.max( - size.width, - this._buttons.x + this._buttons.width - ) + size.width = Math.max(size.width, this._buttons.x + this._buttons.width) size.height += this.innerPadding + this._buttons.height } @@ -1688,7 +1676,7 @@ export default class Popup extends InteractivePopup {
      diff --git a/doc/out/pixi_popupmenu.js.html b/doc/out/pixi_popupmenu.js.html index 459e922..f573773 100644 --- a/doc/out/pixi_popupmenu.js.html +++ b/doc/out/pixi_popupmenu.js.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1514,10 +1522,7 @@ export default class PopupMenu extends Popup { let object = null if (item.label) { - object = new PIXI.Text( - item.label, - item.textStyle || this.opts.textStyle - ) + object = new PIXI.Text(item.label, item.textStyle || this.opts.textStyle) } else { object = item.content } @@ -1574,7 +1579,7 @@ export default class PopupMenu extends Popup {
      diff --git a/doc/out/pixi_progress.js.html b/doc/out/pixi_progress.js.html index a34a025..9498c91 100644 --- a/doc/out/pixi_progress.js.html +++ b/doc/out/pixi_progress.js.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1594,10 +1602,7 @@ export default class Progress extends PIXI.Container { //----------------- if (this.opts.background) { this.background.clear() - this.background.beginFill( - this.opts.backgroundFill, - this.opts.backgroundFillAlpha - ) + this.background.beginFill(this.opts.backgroundFill, this.opts.backgroundFillAlpha) this.background.drawRect(0, 0, width, height) this.background.endFill() } @@ -1641,20 +1646,10 @@ export default class Progress extends PIXI.Container { const wantedWidth = this.opts.width || width - 2 * this.opts.margin const wantedHeight = this.opts.height - this.bar.lineStyle( - this.opts.strokeWidth, - this.opts.stroke, - this.opts.strokeAlpha - ) + this.bar.lineStyle(this.opts.strokeWidth, this.opts.stroke, this.opts.strokeAlpha) this.bar.beginFill(this.opts.fill, this.opts.fillAlpha) if (this.radius > 1) { - this.bar.drawRoundedRect( - 0, - 0, - wantedWidth, - wantedHeight, - this.radius - ) + this.bar.drawRoundedRect(0, 0, wantedWidth, wantedHeight, this.radius) } else { this.bar.drawRect(0, 0, wantedWidth, wantedHeight) } @@ -1678,24 +1673,11 @@ export default class Progress extends PIXI.Container { const barActiveWidth = (wantedWidth * this._progress) / 100 - this.barActive.lineStyle( - this.opts.strokeActiveWidth, - this.opts.strokeActive, - this.opts.strokeActiveAlpha - ) - this.barActive.beginFill( - this.opts.fillActive, - this.opts.fillActiveAlpha - ) + this.barActive.lineStyle(this.opts.strokeActiveWidth, this.opts.strokeActive, this.opts.strokeActiveAlpha) + this.barActive.beginFill(this.opts.fillActive, this.opts.fillActiveAlpha) if (barActiveWidth > 0) { if (this.radius > 1) { - this.barActive.drawRoundedRect( - 0, - 0, - barActiveWidth, - wantedHeight, - this.radius - ) + this.barActive.drawRoundedRect(0, 0, barActiveWidth, wantedHeight, this.radius) } else { this.barActive.drawRect(0, 0, barActiveWidth, wantedHeight) } @@ -1779,7 +1761,7 @@ export default class Progress extends PIXI.Container {
      diff --git a/doc/out/pixi_scrollview.js.html b/doc/out/pixi_scrollview.js.html index 9d50649..50f249b 100644 --- a/doc/out/pixi_scrollview.js.html +++ b/doc/out/pixi_scrollview.js.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1512,7 +1520,7 @@ export default class Scrollview extends Scrollbox {
      diff --git a/doc/out/pixi_slider.js.html b/doc/out/pixi_slider.js.html index 5f250f8..19add97 100644 --- a/doc/out/pixi_slider.js.html +++ b/doc/out/pixi_slider.js.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1616,12 +1624,8 @@ export default class Slider extends PIXI.Container { this.on('pointermove', e => { if (this.control.dragging) { - const moveX = this.control.event.data.getLocalPosition( - this.control.parent - ).x - this._value = this.pixelToValue( - moveX - this.control.delta - this.opts.controlRadius - ) + const moveX = this.control.event.data.getLocalPosition(this.control.parent).x + this._value = this.pixelToValue(moveX - this.control.delta - this.opts.controlRadius) let x = this.valueToPixel(this._value) + this.opts.controlRadius this.control.x = x @@ -1633,16 +1637,8 @@ export default class Slider extends PIXI.Container { if (container instanceof Element) { container.addEventListener('pointerup', e => this.onEnd(e), false) - container.addEventListener( - 'pointercancel', - e => this.onEnd(e), - false - ) - container.addEventListener( - 'pointerleave', - e => this.onEnd(e), - false - ) + container.addEventListener('pointercancel', e => this.onEnd(e), false) + container.addEventListener('pointerleave', e => this.onEnd(e), false) container.addEventListener('pointerout', e => this.onEnd(e), false) container.addEventListener('mouseup', e => this.onEnd(e), false) container.addEventListener('mousecancel', e => this.onEnd(e), false) @@ -1703,9 +1699,7 @@ export default class Slider extends PIXI.Container { if (this.sliderObj.pointerdowned) { this.sliderObj.pointerdowned = false const position = e.data.getLocalPosition(this.control.parent) - this.value = this.pixelToValue( - position.x - this.opts.controlRadius - ) + this.value = this.pixelToValue(position.x - this.opts.controlRadius) TweenLite.to(this.control, this.theme.fast, { alpha: 0.83 }) } }) @@ -1765,11 +1759,7 @@ export default class Slider extends PIXI.Container { this.sliderObj.clear() this.sliderObj.beginFill(0xffffff, 0) this.sliderObj.drawRect(0, 0, x + w + cr, cr * 2) - this.sliderObj.lineStyle( - this.opts.strokeWidth, - this.opts.stroke, - this.opts.strokeAlpha - ) + this.sliderObj.lineStyle(this.opts.strokeWidth, this.opts.stroke, this.opts.strokeAlpha) this.sliderObj.beginFill(this.opts.fill, this.opts.fillAlpha) this.sliderObj.moveTo(x, y) this.sliderObj.lineTo(x + w, y) @@ -1783,20 +1773,10 @@ export default class Slider extends PIXI.Container { // Draw control this.control.clear() - this.control.lineStyle( - this.opts.controlStrokeWidth, - this.opts.controlStroke, - this.opts.controlStrokeAlpha - ) - this.control.beginFill( - this.opts.controlFill, - this.opts.controlFillAlpha - ) + this.control.lineStyle(this.opts.controlStrokeWidth, this.opts.controlStroke, this.opts.controlStrokeAlpha) + this.control.beginFill(this.opts.controlFill, this.opts.controlFillAlpha) this.control.drawCircle(0, 0, cr - 1) - this.control.beginFill( - this.opts.controlStroke, - this.opts.controlStrokeAlpha - ) + this.control.beginFill(this.opts.controlStroke, this.opts.controlStrokeAlpha) this.control.drawCircle(0, 0, cr / 6) this.control.endFill() @@ -1834,10 +1814,7 @@ export default class Slider extends PIXI.Container { } else if (value > this.opts.max) { value = this.opts.max } - return ( - (this.opts.width * (value - this.opts.min)) / - (this.opts.max - this.opts.min) - ) + return (this.opts.width * (value - this.opts.min)) / (this.opts.max - this.opts.min) } /** @@ -1853,10 +1830,7 @@ export default class Slider extends PIXI.Container { } else if (pixel > this.opts.width) { pixel = this.opts.width } - return ( - this.opts.min + - ((this.opts.max - this.opts.min) * pixel) / this.opts.width - ) + return this.opts.min + ((this.opts.max - this.opts.min) * pixel) / this.opts.width } /** @@ -1951,7 +1925,7 @@ export default class Slider extends PIXI.Container {
      diff --git a/doc/out/pixi_switch.js.html b/doc/out/pixi_switch.js.html index 1cebd3a..f933c5c 100644 --- a/doc/out/pixi_switch.js.html +++ b/doc/out/pixi_switch.js.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1592,10 +1600,8 @@ export default class Switch extends PIXI.Container { opts ) - this.opts.controlRadius = - this.opts.controlRadius || this.opts.height / 2 - this.opts.controlRadiusActive = - this.opts.controlRadiusActive || this.opts.controlRadius + this.opts.controlRadius = this.opts.controlRadius || this.opts.height / 2 + this.opts.controlRadiusActive = this.opts.controlRadiusActive || this.opts.controlRadius // Validation //----------------- @@ -1757,32 +1763,15 @@ export default class Switch extends PIXI.Container { draw() { this.switchObj.clear() if (this.active) { - this.switchObj.lineStyle( - this.opts.strokeActiveWidth, - this.opts.strokeActive, - this.opts.strokeActiveAlpha - ) - this.switchObj.beginFill( - this.opts.fillActive, - this.opts.fillActiveAlpha - ) + this.switchObj.lineStyle(this.opts.strokeActiveWidth, this.opts.strokeActive, this.opts.strokeActiveAlpha) + this.switchObj.beginFill(this.opts.fillActive, this.opts.fillActiveAlpha) } else { - this.switchObj.lineStyle( - this.opts.strokeWidth, - this.opts.stroke, - this.opts.strokeAlpha - ) + this.switchObj.lineStyle(this.opts.strokeWidth, this.opts.stroke, this.opts.strokeAlpha) this.switchObj.beginFill(this.opts.fill, this.opts.fillAlpha) } this.switchObj.moveTo(this.radius, 0) this.switchObj.lineTo(this.opts.width - this.radius, 0) - this.switchObj.arcTo( - this.opts.width, - 0, - this.opts.width, - this.radius, - this.radius - ) + this.switchObj.arcTo(this.opts.width, 0, this.opts.width, this.radius, this.radius) this.switchObj.lineTo(this.opts.width, this.radius + 1) // BUGFIX: If not specified, there is a small area without a stroke. this.switchObj.arcTo( this.opts.width, @@ -1804,21 +1793,11 @@ export default class Switch extends PIXI.Container { this.opts.controlStrokeActive, this.opts.controlStrokeActiveAlpha ) - this.control.beginFill( - this.opts.controlFillActive, - this.opts.controlFillActiveAlpha - ) + this.control.beginFill(this.opts.controlFillActive, this.opts.controlFillActiveAlpha) this.control.drawCircle(0, 0, this.opts.controlRadiusActive - 1) } else { - this.control.lineStyle( - this.opts.controlStrokeWidth, - this.opts.controlStroke, - this.opts.controlStrokeAlpha - ) - this.control.beginFill( - this.opts.controlFill, - this.opts.controlFillAlpha - ) + this.control.lineStyle(this.opts.controlStrokeWidth, this.opts.controlStroke, this.opts.controlStrokeAlpha) + this.control.beginFill(this.opts.controlFill, this.opts.controlFillAlpha) this.control.drawCircle(0, 0, this.opts.controlRadius - 1) } this.control.endFill() @@ -1834,24 +1813,11 @@ export default class Switch extends PIXI.Container { */ drawAnimated() { this.switchObj.clear() - this.switchObj.lineStyle( - this.tempAnimated.strokeWidth, - this.tempAnimated.stroke, - this.tempAnimated.strokeAlpha - ) - this.switchObj.beginFill( - this.tempAnimated.fill, - this.tempAnimated.fillAlpha - ) + this.switchObj.lineStyle(this.tempAnimated.strokeWidth, this.tempAnimated.stroke, this.tempAnimated.strokeAlpha) + this.switchObj.beginFill(this.tempAnimated.fill, this.tempAnimated.fillAlpha) this.switchObj.moveTo(this.radius, 0) this.switchObj.lineTo(this.opts.width - this.radius, 0) - this.switchObj.arcTo( - this.opts.width, - 0, - this.opts.width, - this.radius, - this.radius - ) + this.switchObj.arcTo(this.opts.width, 0, this.opts.width, this.radius, this.radius) this.switchObj.lineTo(this.opts.width, this.radius + 1) // BUGFIX: If not specified, there is a small area without a stroke. this.switchObj.arcTo( this.opts.width, @@ -1871,10 +1837,7 @@ export default class Switch extends PIXI.Container { this.tempAnimated.controlStroke, this.tempAnimated.controlStrokeAlpha ) - this.control.beginFill( - this.tempAnimated.controlFill, - this.tempAnimated.controlFillAlpha - ) + this.control.beginFill(this.tempAnimated.controlFill, this.tempAnimated.controlFillAlpha) this.control.drawCircle(0, 0, this.tempAnimated.controlRadius - 1) this.control.endFill() @@ -2016,7 +1979,7 @@ export default class Switch extends PIXI.Container {
      diff --git a/doc/out/pixi_theme.js.html b/doc/out/pixi_theme.js.html index 3cb870e..657d49c 100644 --- a/doc/out/pixi_theme.js.html +++ b/doc/out/pixi_theme.js.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1520,8 +1528,7 @@ export default class Theme { * is used for large actived text. */ constructor(opts = {}) { - const colorPrimary = - opts.primaryColor != null ? opts.primaryColor : 0x5ec7f8 // blue + const colorPrimary = opts.primaryColor != null ? opts.primaryColor : 0x5ec7f8 // blue const color1 = opts.color1 != null ? opts.color1 : 0x282828 // black const color2 = opts.color2 != null ? opts.color2 : 0xf6f6f6 // white @@ -1713,7 +1720,7 @@ export class ThemeRed extends Theme {
      diff --git a/doc/out/pixi_tooltip.js.html b/doc/out/pixi_tooltip.js.html index 2ab5d2e..daf1b70 100644 --- a/doc/out/pixi_tooltip.js.html +++ b/doc/out/pixi_tooltip.js.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1605,7 +1613,7 @@ export default class Tooltip extends AbstractPopup {
      diff --git a/doc/out/pixi_volatile.js.html b/doc/out/pixi_volatile.js.html index f5914db..5242a27 100644 --- a/doc/out/pixi_volatile.js.html +++ b/doc/out/pixi_volatile.js.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1609,7 +1617,7 @@ export default class Volatile {
      diff --git a/doc/out/uitest.js.html b/doc/out/uitest.js.html index 96bed1c..3bacbba 100644 --- a/doc/out/uitest.js.html +++ b/doc/out/uitest.js.html @@ -263,12 +263,20 @@ Methods +
    • _stackHorizontal
    • + +
    • _stackVertical
    • + +
    • capture
    • +
    • hide
    • layout
    • show
    • +
    • stack
    • +
      @@ -1634,9 +1642,7 @@ export default class UITest { if (opts.eventType) { opts.eventTypes = opts.eventType } - opts.eventTypes = Array.isArray(opts.eventTypes) - ? opts.eventTypes - : [opts.eventTypes] + opts.eventTypes = Array.isArray(opts.eventTypes) ? opts.eventTypes : [opts.eventTypes] // timeline //-------------------- @@ -1674,14 +1680,8 @@ export default class UITest { if (opts.eventTypes[0]) { // create and dispatch event //-------------------- - const eventStart = Event.create( - elem, - coords, - opts.eventTypes[0], - eventOpts - ) - if (this.opts.debug) - console.log('dispatch event', eventStart) + const eventStart = Event.create(elem, coords, opts.eventTypes[0], eventOpts) + if (this.opts.debug) console.log('dispatch event', eventStart) elem.dispatchEvent(eventStart) // onStart @@ -1693,14 +1693,8 @@ export default class UITest { // create and dispatch event //-------------------- - const eventComplete = Event.create( - elem, - coords, - opts.eventTypes[1], - eventOpts - ) - if (this.opts.debug) - console.log('dispatch event', eventComplete) + const eventComplete = Event.create(elem, coords, opts.eventTypes[1], eventOpts) + if (this.opts.debug) console.log('dispatch event', eventComplete) elem.dispatchEvent(eventComplete) // onComplete @@ -1795,14 +1789,8 @@ export default class UITest { onStart: () => { // create and dispatch event //-------------------- - const event = Event.create( - elem, - from, - opts.eventTypes[0], - eventOpts - ) - if (this.opts.debug) - console.log('dispatch event', event) + const event = Event.create(elem, from, opts.eventTypes[0], eventOpts) + if (this.opts.debug) console.log('dispatch event', event) elem.dispatchEvent(event) // onStart @@ -1814,14 +1802,8 @@ export default class UITest { onUpdate: () => { // create and dispatch event //-------------------- - const event = Event.create( - elem, - from, - opts.eventTypes[1], - eventOpts - ) - if (this.opts.debug) - console.log('dispatch event', event) + const event = Event.create(elem, from, opts.eventTypes[1], eventOpts) + if (this.opts.debug) console.log('dispatch event', event) elem.dispatchEvent(event) // onUpdate @@ -1833,14 +1815,8 @@ export default class UITest { onComplete: () => { // create and dispatch event //-------------------- - const event = Event.create( - elem, - from, - opts.eventTypes[2], - eventOpts - ) - if (this.opts.debug) - console.log('dispatch event', event) + const event = Event.create(elem, from, opts.eventTypes[2], eventOpts) + if (this.opts.debug) console.log('dispatch event', event) elem.dispatchEvent(event) // onComplete @@ -1991,66 +1967,39 @@ export default class UITest { onStart: () => { // create and dispatch event //-------------------- - const event = Event.create( - elem, - from, - opts.eventTypes[0], - eventOpts - ) - if (this.opts.debug) - console.log('dispatch event', event) + const event = Event.create(elem, from, opts.eventTypes[0], eventOpts) + if (this.opts.debug) console.log('dispatch event', event) elem.dispatchEvent(event) // onStart //-------------------- - if ( - opts.onStart && - (opts.doubleCallbacks || key === 0) - ) { + if (opts.onStart && (opts.doubleCallbacks || key === 0)) { opts.onStart.call(this, event) } }, onUpdate: () => { // create and dispatch event //-------------------- - const event = Event.create( - elem, - from, - opts.eventTypes[1], - eventOpts - ) - if (this.opts.debug) - console.log('dispatch event', event) + const event = Event.create(elem, from, opts.eventTypes[1], eventOpts) + if (this.opts.debug) console.log('dispatch event', event) elem.dispatchEvent(event) // onUpdate //-------------------- - if ( - opts.onUpdate && - (opts.doubleCallbacks || key === 0) - ) { + if (opts.onUpdate && (opts.doubleCallbacks || key === 0)) { opts.onUpdate.call(this, event) } }, onComplete: () => { // create and dispatch event //-------------------- - const event = Event.create( - elem, - from, - opts.eventTypes[2], - eventOpts - ) - if (this.opts.debug) - console.log('dispatch event', event) + const event = Event.create(elem, from, opts.eventTypes[2], eventOpts) + if (this.opts.debug) console.log('dispatch event', event) elem.dispatchEvent(event) // onComplete //-------------------- - if ( - opts.onComplete && - (opts.doubleCallbacks || key === 0) - ) { + if (opts.onComplete && (opts.doubleCallbacks || key === 0)) { opts.onComplete.call(this, event) } } @@ -2168,9 +2117,7 @@ export default class UITest { 'No execution time was specified for this action, and a default interval was not set in the class constructor!' ) } - timelinePosition = - Math.max(...this._timelinePositions) + - (this.opts.defaultInterval || 1) + timelinePosition = Math.max(...this._timelinePositions) + (this.opts.defaultInterval || 1) } if (opts === null) { @@ -2245,12 +2192,8 @@ class Util { * @return {HTMLElement|string} element - The HTML element on which the event is to be executed, e.g. button, document, h2, canvas, etc. or an selector string. If a selector has been specified, it is evaluated immediately before the event is called using the querySelector method. */ static extractElement(context, element) { - const cont = Util.isFrame(context) - ? context.contentDocument - : context.document - const elem = Util.isString(element) - ? cont.querySelector(element) - : element + const cont = Util.isFrame(context) ? context.contentDocument : context.document + const elem = Util.isString(element) ? cont.querySelector(element) : element return elem } @@ -2306,9 +2249,7 @@ class Util { type: 'thru' } } else { - opts.bezier.values = opts.bezier.values.map(it => - Util.extractPosition(it) - ) + opts.bezier.values = opts.bezier.values.map(it => Util.extractPosition(it)) bezier = opts.bezier } @@ -2444,16 +2385,9 @@ class Event { * @param {string} type - The type of the event, see https://developer.mozilla.org/de/docs/Web/Events * @param {object} opts - An options object. Every paramter of the event object can be overridden, see e.g. https://developer.mozilla.org/de/docs/Web/API/MouseEvent for all the properties. */ - static create( - target, - position = { x: 0, y: 0 }, - type = 'pointerup', - opts = {} - ) { + static create(target, position = { x: 0, y: 0 }, type = 'pointerup', opts = {}) { const rect = - typeof target.getBoundingClientRect === 'function' - ? target.getBoundingClientRect() - : { x: 0, y: 0 } + typeof target.getBoundingClientRect === 'function' ? target.getBoundingClientRect() : { x: 0, y: 0 } // EventInit const eventOpts = { @@ -2512,25 +2446,12 @@ class Event { if (type.startsWith('pointer')) { return new PointerEvent( type, - Object.assign( - {}, - eventOpts, - uiEventOpts, - mouseEventOpts, - pointerEventOpts, - opts - ) + Object.assign({}, eventOpts, uiEventOpts, mouseEventOpts, pointerEventOpts, opts) ) } else if (type.startsWith('touch')) { - return new TouchEvent( - type, - Object.assign({}, eventOpts, uiEventOpts, touchEventOpts, opts) - ) + return new TouchEvent(type, Object.assign({}, eventOpts, uiEventOpts, touchEventOpts, opts)) } else { - return new MouseEvent( - type, - Object.assign({}, eventOpts, uiEventOpts, mouseEventOpts, opts) - ) + return new MouseEvent(type, Object.assign({}, eventOpts, uiEventOpts, mouseEventOpts, opts)) } } } @@ -2547,7 +2468,7 @@ class Event {
      diff --git a/lib/pixi/buttongroup.html b/lib/pixi/buttongroup.html index 2bce155..fe3fe5c 100644 --- a/lib/pixi/buttongroup.html +++ b/lib/pixi/buttongroup.html @@ -245,7 +245,7 @@ const buttonGroup14 = new ButtonGroup({ {label: 'Stacked button 7', action: event => console.log('clicked 7')}, {label: 'Stacked button 8', action: event => console.log('clicked 8')} ], - stacked: true, + stackPadding: 6, maxWidth: 620, app }) @@ -263,18 +263,30 @@ const buttonGroup15 = new ButtonGroup({ {icon: 'battery_charging_full', type: 'checkbox', iconColorActive: 0x9c71b7} ], orientation: 'vertical', - margin: 0, - stacked: true, + margin: 1, maxHeight: 200, app }) +const buttons16 = [] +for (let i = 1; i < 51; i++) { + buttons16.push({label: `Button ${i}`, stroke: Math.floor(Math.random() * 16777215), strokeWidth: 3, radius: 16}) +} +const buttonGroup16 = new ButtonGroup({ + x: 90, + y: 1040, + buttons: buttons16, + stackPadding: 3, + maxWidth: 700, + app +}) + app.scene.addChild(buttonGroup1, buttonGroup2, buttonGroup3) app.scene.addChild(buttonGroup4) app.scene.addChild(buttonGroup5, buttonGroup6) app.scene.addChild(buttonGroup7, buttonGroup8) app.scene.addChild(buttonGroup9, buttonGroup10, buttonGroup11, buttonGroup12, buttonGroup13) -app.scene.addChild(buttonGroup14, buttonGroup15) +app.scene.addChild(buttonGroup14, buttonGroup15, buttonGroup16) diff --git a/lib/pixi/buttongroup.js b/lib/pixi/buttongroup.js index c2419bc..87bc6de 100644 --- a/lib/pixi/buttongroup.js +++ b/lib/pixi/buttongroup.js @@ -42,10 +42,10 @@ export default class ButtonGroup extends PIXI.Container { * or a Theme object. * @param {number} [opts.minWidth=44] - Button: The minimum width of one button. * @param {number} [opts.minHeight=44] - Button: The minimum height of one button. - * @param {number} [opts.maxWidth] - The maximum width of the button group. Only used if stacked is true and the orientation is horizontal. - * @param {number} [opts.maxHeight] - The maximum height of the button group. Only used if stacked is true and the orientation is vertical. - * @param {boolean} [opts.stacked=false] - If set to true, the buttons of the button group gets stacked if they are broader or higher than the maximum permitted width or height, depending on orientation. - * @param {PIXI.Application} [opts.app] - The PixiJS Application. Must be set if you want to use the mousewheel to scroll your button group. + * @param {number} [opts.maxWidth] - The maximum width of the button group. If the buttons are wider than the maximum width, the buttons get stacked. Note: The buttons can only be stacked if margin is not zero. + * @param {number} [opts.maxHeight] - The maximum height of the button group. If the buttons are higher than the maximum height, the buttons get stacked. Note: The buttons can only be stacked if margin is not zero. + * @param {number} [opts.stackPadding=10] - The padding for stacked buttons. + * @param {PIXI.Application} [opts.app] - The PixiJS Application. Must be set if you want to use the mousewheel to scroll your button group. Only used when the buttons are stacked (with maxWidth or maxHeight). * @param {number} [opts.padding=Theme.padding] - Button: The inner spacing (distance from icon and/or label) the the border. * @param {number} [opts.margin=Theme.margin] - The outer spacing (distance from one button to the previous/next button). * @param {string} [opts.iconPosition=left] - Button: The position of the icon in relation to the label. Can be left or right. @@ -96,7 +96,7 @@ export default class ButtonGroup extends PIXI.Container { minHeight: 44, maxWidth: null, maxHeight: null, - stacked: false, + stackPadding: 10, app: null, padding: theme.padding, margin: theme.margin, @@ -159,6 +159,7 @@ export default class ButtonGroup extends PIXI.Container { // Buttons //----------------- let position = 0 + let index = 0 for (let it of this.opts.buttons) { delete it.x @@ -237,6 +238,9 @@ export default class ButtonGroup extends PIXI.Container { } position += (this.opts.orientation === 'horizontal' ? button.width : button.height) + this.opts.margin + + button.__initIndex = index + index++ } if (this.opts.orientation === 'vertical') { @@ -256,7 +260,7 @@ export default class ButtonGroup extends PIXI.Container { // interaction //-------------------- - if (this.opts.stacked) { + if (this.opts.margin > 0 && (this.opts.maxWidth || this.opts.maxHeight)) { this.interactive = true this.on('pointerdown', this.onStart.bind(this)) this.on('pointermove', this.onMove.bind(this)) @@ -288,7 +292,6 @@ export default class ButtonGroup extends PIXI.Container { this.addChildAt(background, 0) this.__initWidth = this.container.width - this.__deltaWidth = this.container.width - this.opts.maxWidth } return this @@ -308,9 +311,9 @@ export default class ButtonGroup extends PIXI.Container { //----------------- this.draw() - // stacked + // stack //----------------- - if (this.opts.stacked) { + if (this.opts.margin > 0 && (this.opts.maxWidth || this.opts.maxHeight)) { this.stack() } @@ -438,9 +441,7 @@ export default class ButtonGroup extends PIXI.Container { this.container.position.y = event.data.global.y + this.__delta.y } - if (this.opts.stacked) { - this.stack() - } + this.stack() } } @@ -515,9 +516,7 @@ export default class ButtonGroup extends PIXI.Container { } } - if (this.opts.stacked) { - this.stack() - } + this.stack() } /** @@ -534,35 +533,106 @@ export default class ButtonGroup extends PIXI.Container { * */ stack() { + if (this.opts.maxWidth) { + this._stackHorizontal() + } else if (this.opts.maxHeight) { + this._stackVertical() + } + } + + /** + * + */ + _stackHorizontal() { + const sorted = [] + + let reverseCounter = this.buttons.length - 1 + this.buttons.forEach((it, index) => { - if (it.__originalPosition.x + this.container.x < 0) { + const leftCorner = it.__originalPosition.x + this.container.x + const rightCorner = it.__originalPosition.x + it.width + const paddingLeft = index * this.opts.stackPadding + const paddingRight = reverseCounter * this.opts.stackPadding + if (leftCorner < paddingLeft) { // left border - it.x = -this.container.x - } else if (it.__originalPosition.x + it.width > Math.abs(this.container.x) + this.opts.maxWidth) { + it.x = -this.container.x + paddingLeft + } else if (rightCorner > -this.container.x + this.opts.maxWidth - paddingRight) { // right border - it.x = Math.abs(this.container.x) + this.opts.maxWidth - it.width + it.x = -this.container.x + this.opts.maxWidth - it.width - paddingRight } else { it.x = it.__originalPosition.x } + + reverseCounter-- + + sorted.push(it) }) - this.buttons.sort((a, b) => { - const delta = Math.abs(this.container.x) + this.opts.maxWidth / 2 - const distanceA = Math.abs(a.x - delta) - const distanceB = Math.abs(b.x - delta) - if (distanceA > distanceB) { - return -1 - } else if (distanceB > distanceA) { - return 1 + const min = Math.min(...sorted.map(it => it.x)) + const max = Math.max(...sorted.map(it => it.x)) + const center = (min + max) / 2 + + // z-index + sorted + .sort((a, b) => { + const distanceA = Math.abs(a.x - center) + const distanceB = Math.abs(b.x - center) + if (distanceA < distanceB) { + return 1 + } else if (distanceA > distanceB) { + return -1 + } else { + return 0 + } + }) + .forEach(it => it.parent.addChild(it)) + } + + /** + * + */ + _stackVertical() { + const sorted = [] + + let reverseCounter = this.buttons.length - 1 + + this.buttons.forEach((it, index) => { + const topCorner = it.__originalPosition.y + this.container.y + const bottomCorner = it.__originalPosition.y + it.height + const paddingTop = index * this.opts.stackPadding + const paddingBottom = reverseCounter * this.opts.stackPadding + if (topCorner < paddingTop) { + // top border + it.y = -this.container.y + paddingTop + } else if (bottomCorner > -this.container.y + this.opts.maxHeight - paddingBottom) { + // bottom border + it.y = -this.container.y + this.opts.maxHeight - it.height - paddingBottom } else { - return 0 + it.y = it.__originalPosition.y } + + reverseCounter-- + + sorted.push(it) }) - this.buttons.forEach(it => { - const parent = it.parent - parent.removeChild(it) - parent.addChild(it) - }) + const min = Math.min(...sorted.map(it => it.y)) + const max = Math.max(...sorted.map(it => it.y)) + const center = (min + max) / 2 + + // z-index + sorted + .sort((a, b) => { + const distanceA = Math.abs(a.y - center) + const distanceB = Math.abs(b.y - center) + if (distanceA < distanceB) { + return 1 + } else if (distanceA > distanceB) { + return -1 + } else { + return 0 + } + }) + .forEach(it => it.parent.addChild(it)) } } From dafc820466d8b0102e7b739cbc7645274bc005e7 Mon Sep 17 00:00:00 2001 From: Sebastian Kupke Date: Wed, 31 Jul 2019 16:12:15 +0200 Subject: [PATCH 04/30] Fixed html bug. --- lib/pixi/button.html | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/pixi/button.html b/lib/pixi/button.html index e9fa2d1..1b113bc 100644 --- a/lib/pixi/button.html +++ b/lib/pixi/button.html @@ -269,3 +269,4 @@ app.scene.addChild(button14, button15, button16, button17) app.scene.addChild(button18, button19, button20, button21) + \ No newline at end of file From afa1c71a0a2246d39f2f5909e98116a228cefe63 Mon Sep 17 00:00:00 2001 From: Sebastian Kupke Date: Thu, 1 Aug 2019 09:42:04 +0200 Subject: [PATCH 05/30] Added badge examples for buttons and button groups. --- lib/pixi/button.html | 73 +++++++++++++++++++++++++++------------ lib/pixi/buttongroup.html | 24 ++++++++++++- 2 files changed, 74 insertions(+), 23 deletions(-) diff --git a/lib/pixi/button.html b/lib/pixi/button.html index 1b113bc..d478174 100644 --- a/lib/pixi/button.html +++ b/lib/pixi/button.html @@ -32,13 +32,13 @@ const app = new PIXIApp({ view: canvas, width: 900, - height: 420, + height: 520, transparent: false }).setup().run() -let button1 = new Button({x: 10, y: 10}) +const button1 = new Button({x: 10, y: 10}) -let button2 = new Button({ +const button2 = new Button({ theme: 'red', x: 60, y: 10, @@ -49,7 +49,7 @@ let button2 = new Button({ } }) -let button3 = new Button({ +const button3 = new Button({ x: 150, y: 10, label: 'Checkbox button', @@ -59,7 +59,7 @@ let button3 = new Button({ } }) -let button4 = new Button({ +const button4 = new Button({ x: 330, y: 10, label: 'Disabled button', @@ -69,14 +69,14 @@ let button4 = new Button({ } }) -let button5 = new Button({ +const button5 = new Button({ x: 500, y: 10, label: 'Active button', active: true }) -let button6 = new Button({ +const button6 = new Button({ x: 650, y: 10, label: 'Active disabled button', @@ -85,7 +85,7 @@ let button6 = new Button({ disabled: true }) -let button7 = new Button({ +const button7 = new Button({ x: 10, y: 70, label: 'Icon button', @@ -94,7 +94,7 @@ let button7 = new Button({ icon: 'arrow_back' }) -let button8 = new Button({ +const button8 = new Button({ x: 180, y: 70, theme: 'light', @@ -104,7 +104,7 @@ let button8 = new Button({ iconPosition: 'right' }) -let button9 = new Button({ +const button9 = new Button({ x: 10, y: 130, type: 'checkbox', @@ -112,7 +112,7 @@ let button9 = new Button({ iconActive: 'pause' }) -let button10 = new Button({ +const button10 = new Button({ x: 60, y: 130, icon: 'stop', @@ -121,14 +121,14 @@ let button10 = new Button({ } }) -let button11 = new Button({ +const button11 = new Button({ x: 110, y: 130, icon: 'star_border', tooltip: 'Bookmark' }) -let button12 = new Button({ +const button12 = new Button({ x: 10, y: 190, icon: 'airplay', @@ -141,7 +141,7 @@ let button12 = new Button({ type: 'checkbox' }) -let button13 = new Button({ +const button13 = new Button({ x: 50, y: 190, label: 'Button', @@ -169,7 +169,7 @@ let button13 = new Button({ type: 'checkbox' }) -let button14 = new Button({ +const button14 = new Button({ x: 10, y: 250, label: 'Button', @@ -178,7 +178,7 @@ let button14 = new Button({ iconActive: 'add_circle' }) -let button15 = new Button({ +const button15 = new Button({ x: 200, y: 250, label: 'Button', @@ -187,7 +187,7 @@ let button15 = new Button({ iconActive: null }) -let button16 = new Button({ +const button16 = new Button({ x: 400, y: 250, label: 'Button', @@ -197,7 +197,7 @@ let button16 = new Button({ active: true }) -let button17 = new Button({ +const button17 = new Button({ x: 600, y: 250, label: 'Button', @@ -215,7 +215,7 @@ let graphic2 = new PIXI.Graphics() graphic2.beginFill(0x40c3f2) graphic2.drawCircle(30, 30, 30) -let button18 = new Button({ +const button18 = new Button({ x: 10, y: 310, label: 'Button', @@ -232,7 +232,7 @@ let graphic4 = new PIXI.Graphics() graphic4.beginFill(0xf8ce2d) graphic4.drawCircle(40, 40, 40) -let button19 = new Button({ +const button19 = new Button({ x: 200, y: 310, label: 'Button', @@ -243,7 +243,7 @@ let button19 = new Button({ iconPosition: 'right' }) -let button20 = new Button({ +const button20 = new Button({ x: 400, y: 310, label: 'Link Button', @@ -251,7 +251,7 @@ let button20 = new Button({ style: 'link' }) -let button21 = new Button({ +const button21 = new Button({ x: 600, y: 310, minWidth: 70, @@ -261,12 +261,41 @@ let button21 = new Button({ style: 'link' }) +const button22 = new Button({ + x: 10, + y: 440, + icon: 'play_arrow', + badge: '19' +}) + +const button23 = new Button({ + x: 100, + y: 440, + icon: 'stop', + badge: 'Stop' +}) + +const button24 = new Button({ + x: 200, + y: 440, + icon: 'star_border', + badge: { + content: 'Bookmark', + align: 'center', + verticalAlign: 'bottom', + offsetTop: 8, + radius: 14, + fill: 0xfe832d + } +}) + app.scene.addChild(button1, button2, button3, button4, button5, button6) app.scene.addChild(button7, button8) app.scene.addChild(button9, button10, button11) app.scene.addChild(button12, button13) app.scene.addChild(button14, button15, button16, button17) app.scene.addChild(button18, button19, button20, button21) +app.scene.addChild(button22, button23, button24) \ No newline at end of file diff --git a/lib/pixi/buttongroup.html b/lib/pixi/buttongroup.html index fe3fe5c..eece850 100644 --- a/lib/pixi/buttongroup.html +++ b/lib/pixi/buttongroup.html @@ -281,12 +281,34 @@ const buttonGroup16 = new ButtonGroup({ app }) +const buttonGroup17 = new ButtonGroup({ + x: 10, + y: 1270, + buttons: [ + {icon: 'local_airport', type: 'checkbox', iconColorActive: 0xefc201, badge: 'Airport'}, + {icon: 'local_bar', type: 'checkbox', iconColorActive: 0xefc201, badge: 'Bar'}, + {icon: 'local_cafe', type: 'checkbox', iconColorActive: 0xefc201, badge: 'Cafe'}, + {icon: 'local_car_wash', type: 'checkbox', iconColorActive: 0xefc201, badge: 'Car wash'}, + {icon: 'local_dining', type: 'checkbox', iconColorActive: 0xefc201, badge: 'Dining'}, + {icon: 'local_florist', type: 'checkbox', iconColorActive: 0xefc201, badge: 'Florist'}, + {icon: 'local_gas_station', type: 'checkbox', iconColorActive: 0xefc201, badge: 'Gas station'}, + {icon: 'local_grocery_store', type: 'checkbox', iconColorActive: 0xefc201, badge: 'Grocery store'}, + {icon: 'local_mall', type: 'checkbox', iconColorActive: 0xefc201, badge: 'Mall'}, + {icon: 'local_pizza', type: 'checkbox', iconColorActive: 0xefc201, badge: 'Pizza'}, + {icon: 'local_printshop', type: 'checkbox', iconColorActive: 0xefc201, badge: 'Printshop'}, + {icon: 'local_pharmacy', type: 'checkbox', iconColorActive: 0xefc201, badge: 'Pharmacy'} + ], + margin: 50, + maxWidth: 400, + app +}) + app.scene.addChild(buttonGroup1, buttonGroup2, buttonGroup3) app.scene.addChild(buttonGroup4) app.scene.addChild(buttonGroup5, buttonGroup6) app.scene.addChild(buttonGroup7, buttonGroup8) app.scene.addChild(buttonGroup9, buttonGroup10, buttonGroup11, buttonGroup12, buttonGroup13) -app.scene.addChild(buttonGroup14, buttonGroup15, buttonGroup16) +app.scene.addChild(buttonGroup14, buttonGroup15, buttonGroup16, buttonGroup17) From a6f0341fe4f9d30a427c97698f8f4e7e572d98d3 Mon Sep 17 00:00:00 2001 From: Sebastian Kupke Date: Thu, 1 Aug 2019 09:44:03 +0200 Subject: [PATCH 06/30] Added huge button group example. --- lib/pixi/buttongroup.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pixi/buttongroup.html b/lib/pixi/buttongroup.html index eece850..233061b 100644 --- a/lib/pixi/buttongroup.html +++ b/lib/pixi/buttongroup.html @@ -269,7 +269,7 @@ const buttonGroup15 = new ButtonGroup({ }) const buttons16 = [] -for (let i = 1; i < 51; i++) { +for (let i = 1; i < 101; i++) { buttons16.push({label: `Button ${i}`, stroke: Math.floor(Math.random() * 16777215), strokeWidth: 3, radius: 16}) } const buttonGroup16 = new ButtonGroup({ @@ -277,7 +277,7 @@ const buttonGroup16 = new ButtonGroup({ y: 1040, buttons: buttons16, stackPadding: 3, - maxWidth: 700, + maxWidth: 900, app }) From 56407539aa1267a796ea9390b7018c6f6134a9e8 Mon Sep 17 00:00:00 2001 From: Sebastian Kupke Date: Thu, 1 Aug 2019 09:51:32 +0200 Subject: [PATCH 07/30] Updated docs. --- doc/out/AbstractPopup.html | 2 +- doc/out/Badge.html | 2 +- doc/out/BlurFilter.html | 2 +- doc/out/Button.html | 2 +- doc/out/ButtonGroup.html | 4 +- doc/out/DeepZoomImage.html | 2 +- doc/out/DeepZoomInfo.html | 2 +- doc/out/Flippable.html | 2 +- doc/out/FontInfo.html | 2 +- doc/out/Hypenate.html | 2 +- doc/out/InteractivePopup.html | 2 +- ...beledGraphics.exports.LabeledGraphics.html | 2 +- doc/out/LabeledGraphics.html | 2 +- doc/out/List.html | 2 +- doc/out/Message.html | 2 +- doc/out/MessageInteractivePopup.html | 2 +- doc/out/MessageMessageInteractivePopup.html | 2 +- doc/out/Modal.html | 2 +- doc/out/ModalInteractivePopup.html | 2 +- doc/out/ModalModalInteractivePopup.html | 2 +- doc/out/PIXIApp.html | 2 +- doc/out/Popup.html | 2 +- doc/out/PopupInteractivePopup.html | 2 +- doc/out/PopupMenu.html | 2 +- doc/out/PopupMenuPopupInteractivePopup.html | 2 +- ...pupMenuPopupMenuPopupInteractivePopup.html | 2 +- ...nuPopupMenuPopupPopupInteractivePopup.html | 2 +- .../PopupMenuPopupPopupInteractivePopup.html | 2 +- doc/out/PopupPopupInteractivePopup.html | 2 +- doc/out/Progress.html | 2 +- doc/out/Scrollview.html | 2 +- doc/out/Slider.html | 2 +- doc/out/Switch.html | 2 +- doc/out/TextLabel.TextLabel.html | 2 +- doc/out/Theme.html | 2 +- doc/out/ThemeDark.html | 2 +- doc/out/ThemeLight.html | 2 +- doc/out/ThemeRed.html | 2 +- doc/out/TileQuadNode.html | 2 +- doc/out/Tooltip.html | 2 +- doc/out/UITest.html | 2 +- doc/out/Volatile.html | 2 +- doc/out/global.html | 2 +- doc/out/index.html | 2 +- doc/out/pixi_abstractpopup.js.html | 2 +- doc/out/pixi_app.js.html | 2 +- doc/out/pixi_badge.js.html | 2 +- doc/out/pixi_blurfilter.js.html | 2 +- doc/out/pixi_button.js.html | 2 +- doc/out/pixi_buttongroup.js.html | 56 +++++++++---------- doc/out/pixi_deepzoom_image.js.html | 2 +- doc/out/pixi_flippable.js.html | 2 +- doc/out/pixi_labeledgraphics.js.html | 2 +- doc/out/pixi_list.js.html | 2 +- doc/out/pixi_message.js.html | 2 +- doc/out/pixi_modal.js.html | 2 +- doc/out/pixi_popup.js.html | 2 +- doc/out/pixi_popupmenu.js.html | 2 +- doc/out/pixi_progress.js.html | 2 +- doc/out/pixi_scrollview.js.html | 2 +- doc/out/pixi_slider.js.html | 2 +- doc/out/pixi_switch.js.html | 2 +- doc/out/pixi_theme.js.html | 2 +- doc/out/pixi_tooltip.js.html | 2 +- doc/out/pixi_volatile.js.html | 2 +- doc/out/uitest.js.html | 2 +- lib/pixi/buttongroup.js | 4 +- 67 files changed, 93 insertions(+), 99 deletions(-) diff --git a/doc/out/AbstractPopup.html b/doc/out/AbstractPopup.html index 2103869..65bee4c 100644 --- a/doc/out/AbstractPopup.html +++ b/doc/out/AbstractPopup.html @@ -2920,7 +2920,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/Badge.html b/doc/out/Badge.html index a343e59..e06728b 100644 --- a/doc/out/Badge.html +++ b/doc/out/Badge.html @@ -2376,7 +2376,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/BlurFilter.html b/doc/out/BlurFilter.html index 761e3ab..76687e8 100644 --- a/doc/out/BlurFilter.html +++ b/doc/out/BlurFilter.html @@ -1800,7 +1800,7 @@ app.scene.filters = [blurFilter]
      diff --git a/doc/out/Button.html b/doc/out/Button.html index 466c67f..3e591da 100644 --- a/doc/out/Button.html +++ b/doc/out/Button.html @@ -3818,7 +3818,7 @@ the tint property of the icon sprite.

      diff --git a/doc/out/ButtonGroup.html b/doc/out/ButtonGroup.html index a041c90..a814cec 100644 --- a/doc/out/ButtonGroup.html +++ b/doc/out/ButtonGroup.html @@ -3107,7 +3107,7 @@ app.scene.addChild(buttonGroup)
      @@ -3692,7 +3692,7 @@ app.scene.addChild(buttonGroup)
      diff --git a/doc/out/DeepZoomImage.html b/doc/out/DeepZoomImage.html index 3da743f..1b5bf7f 100644 --- a/doc/out/DeepZoomImage.html +++ b/doc/out/DeepZoomImage.html @@ -5098,7 +5098,7 @@ i.e. after loading a single tile

      diff --git a/doc/out/DeepZoomInfo.html b/doc/out/DeepZoomInfo.html index b2dcdfb..8069471 100644 --- a/doc/out/DeepZoomInfo.html +++ b/doc/out/DeepZoomInfo.html @@ -2611,7 +2611,7 @@ on completion.

      diff --git a/doc/out/Flippable.html b/doc/out/Flippable.html index 0974378..567f601 100644 --- a/doc/out/Flippable.html +++ b/doc/out/Flippable.html @@ -2514,7 +2514,7 @@ front.on('click', event => flippable.toggle())
      diff --git a/doc/out/FontInfo.html b/doc/out/FontInfo.html index 94756c1..3654a21 100644 --- a/doc/out/FontInfo.html +++ b/doc/out/FontInfo.html @@ -1561,7 +1561,7 @@
      diff --git a/doc/out/Hypenate.html b/doc/out/Hypenate.html index 670635e..055f47f 100644 --- a/doc/out/Hypenate.html +++ b/doc/out/Hypenate.html @@ -1763,7 +1763,7 @@
      diff --git a/doc/out/InteractivePopup.html b/doc/out/InteractivePopup.html index cf127f9..8647183 100644 --- a/doc/out/InteractivePopup.html +++ b/doc/out/InteractivePopup.html @@ -2345,7 +2345,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/LabeledGraphics.exports.LabeledGraphics.html b/doc/out/LabeledGraphics.exports.LabeledGraphics.html index e8007e6..06ec4f3 100644 --- a/doc/out/LabeledGraphics.exports.LabeledGraphics.html +++ b/doc/out/LabeledGraphics.exports.LabeledGraphics.html @@ -1563,7 +1563,7 @@
      diff --git a/doc/out/LabeledGraphics.html b/doc/out/LabeledGraphics.html index e5ce015..62bdef4 100644 --- a/doc/out/LabeledGraphics.html +++ b/doc/out/LabeledGraphics.html @@ -2628,7 +2628,7 @@ than wanted

      diff --git a/doc/out/List.html b/doc/out/List.html index 6f0850a..6628abd 100644 --- a/doc/out/List.html +++ b/doc/out/List.html @@ -2587,7 +2587,7 @@ app.scene.addChild(list)
      diff --git a/doc/out/Message.html b/doc/out/Message.html index 2a498aa..6089231 100644 --- a/doc/out/Message.html +++ b/doc/out/Message.html @@ -2443,7 +2443,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/MessageInteractivePopup.html b/doc/out/MessageInteractivePopup.html index 1fdd7bb..d675731 100644 --- a/doc/out/MessageInteractivePopup.html +++ b/doc/out/MessageInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/MessageMessageInteractivePopup.html b/doc/out/MessageMessageInteractivePopup.html index d66ced3..219680f 100644 --- a/doc/out/MessageMessageInteractivePopup.html +++ b/doc/out/MessageMessageInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/Modal.html b/doc/out/Modal.html index e4e186d..c2f5ae7 100644 --- a/doc/out/Modal.html +++ b/doc/out/Modal.html @@ -2344,7 +2344,7 @@ a string or a PIXI.Text object.

      diff --git a/doc/out/ModalInteractivePopup.html b/doc/out/ModalInteractivePopup.html index 25a45f7..1adeae9 100644 --- a/doc/out/ModalInteractivePopup.html +++ b/doc/out/ModalInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/ModalModalInteractivePopup.html b/doc/out/ModalModalInteractivePopup.html index af6d7ab..bd02cb8 100644 --- a/doc/out/ModalModalInteractivePopup.html +++ b/doc/out/ModalModalInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/PIXIApp.html b/doc/out/PIXIApp.html index e1c3cb6..4ccdb83 100644 --- a/doc/out/PIXIApp.html +++ b/doc/out/PIXIApp.html @@ -5745,7 +5745,7 @@ rejected with an error.
      diff --git a/doc/out/Popup.html b/doc/out/Popup.html index 29962bf..4b894a5 100644 --- a/doc/out/Popup.html +++ b/doc/out/Popup.html @@ -2338,7 +2338,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/PopupInteractivePopup.html b/doc/out/PopupInteractivePopup.html index b0aee50..38d7a7a 100644 --- a/doc/out/PopupInteractivePopup.html +++ b/doc/out/PopupInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenu.html b/doc/out/PopupMenu.html index 1e8a4f4..ddd86d9 100644 --- a/doc/out/PopupMenu.html +++ b/doc/out/PopupMenu.html @@ -2392,7 +2392,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/PopupMenuPopupInteractivePopup.html b/doc/out/PopupMenuPopupInteractivePopup.html index 150456a..fa20244 100644 --- a/doc/out/PopupMenuPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html b/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html index 1ba7259..07631b5 100644 --- a/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html b/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html index 6f2a0c7..2da9747 100644 --- a/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenuPopupPopupInteractivePopup.html b/doc/out/PopupMenuPopupPopupInteractivePopup.html index 6b4fd62..f31c36c 100644 --- a/doc/out/PopupMenuPopupPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupPopupInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupPopupInteractivePopup.html b/doc/out/PopupPopupInteractivePopup.html index a6edfc5..94eb07c 100644 --- a/doc/out/PopupPopupInteractivePopup.html +++ b/doc/out/PopupPopupInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/Progress.html b/doc/out/Progress.html index c611c06..1c7005e 100644 --- a/doc/out/Progress.html +++ b/doc/out/Progress.html @@ -2877,7 +2877,7 @@ app.scene.addChild(progress)
      diff --git a/doc/out/Scrollview.html b/doc/out/Scrollview.html index b4e0d48..6bb8938 100644 --- a/doc/out/Scrollview.html +++ b/doc/out/Scrollview.html @@ -1709,7 +1709,7 @@ app.loader
      diff --git a/doc/out/Slider.html b/doc/out/Slider.html index 1c2a965..7c6be84 100644 --- a/doc/out/Slider.html +++ b/doc/out/Slider.html @@ -2968,7 +2968,7 @@ app.scene.addChild(slider)
      diff --git a/doc/out/Switch.html b/doc/out/Switch.html index c882799..7ee63f1 100644 --- a/doc/out/Switch.html +++ b/doc/out/Switch.html @@ -3398,7 +3398,7 @@ app.scene.addChild(switch1)
      diff --git a/doc/out/TextLabel.TextLabel.html b/doc/out/TextLabel.TextLabel.html index d1f88e9..0db9526 100644 --- a/doc/out/TextLabel.TextLabel.html +++ b/doc/out/TextLabel.TextLabel.html @@ -1692,7 +1692,7 @@
      diff --git a/doc/out/Theme.html b/doc/out/Theme.html index 9601273..7d63242 100644 --- a/doc/out/Theme.html +++ b/doc/out/Theme.html @@ -3167,7 +3167,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/ThemeDark.html b/doc/out/ThemeDark.html index a5a95a1..3d5dab8 100644 --- a/doc/out/ThemeDark.html +++ b/doc/out/ThemeDark.html @@ -1588,7 +1588,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/ThemeLight.html b/doc/out/ThemeLight.html index fefda39..e75e62d 100644 --- a/doc/out/ThemeLight.html +++ b/doc/out/ThemeLight.html @@ -1600,7 +1600,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/ThemeRed.html b/doc/out/ThemeRed.html index 76c992e..232acad 100644 --- a/doc/out/ThemeRed.html +++ b/doc/out/ThemeRed.html @@ -1600,7 +1600,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/TileQuadNode.html b/doc/out/TileQuadNode.html index 4227031..c63bcbb 100644 --- a/doc/out/TileQuadNode.html +++ b/doc/out/TileQuadNode.html @@ -2052,7 +2052,7 @@ an indicator of tiles to free.

      diff --git a/doc/out/Tooltip.html b/doc/out/Tooltip.html index bb4c245..27a3357 100644 --- a/doc/out/Tooltip.html +++ b/doc/out/Tooltip.html @@ -2514,7 +2514,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/UITest.html b/doc/out/UITest.html index 8a36a3a..670f16a 100644 --- a/doc/out/UITest.html +++ b/doc/out/UITest.html @@ -4185,7 +4185,7 @@ test.start()
      diff --git a/doc/out/Volatile.html b/doc/out/Volatile.html index 8a7bd34..ed3a093 100644 --- a/doc/out/Volatile.html +++ b/doc/out/Volatile.html @@ -2101,7 +2101,7 @@ app.scene.addChild(button)
      diff --git a/doc/out/global.html b/doc/out/global.html index b03e24a..36da43f 100644 --- a/doc/out/global.html +++ b/doc/out/global.html @@ -3322,7 +3322,7 @@
      diff --git a/doc/out/index.html b/doc/out/index.html index b5377d1..f6166f5 100644 --- a/doc/out/index.html +++ b/doc/out/index.html @@ -1487,7 +1487,7 @@
      diff --git a/doc/out/pixi_abstractpopup.js.html b/doc/out/pixi_abstractpopup.js.html index d52dfba..47e828f 100644 --- a/doc/out/pixi_abstractpopup.js.html +++ b/doc/out/pixi_abstractpopup.js.html @@ -1810,7 +1810,7 @@ export default class AbstractPopup extends PIXI.Graphics {
      diff --git a/doc/out/pixi_app.js.html b/doc/out/pixi_app.js.html index 555df7a..6a368a5 100644 --- a/doc/out/pixi_app.js.html +++ b/doc/out/pixi_app.js.html @@ -2191,7 +2191,7 @@ class FpsDisplay extends PIXI.Graphics {
      diff --git a/doc/out/pixi_badge.js.html b/doc/out/pixi_badge.js.html index c664908..6f6adef 100644 --- a/doc/out/pixi_badge.js.html +++ b/doc/out/pixi_badge.js.html @@ -1571,7 +1571,7 @@ export default class Badge extends AbstractPopup {
      diff --git a/doc/out/pixi_blurfilter.js.html b/doc/out/pixi_blurfilter.js.html index bd2063c..9d8d6d5 100644 --- a/doc/out/pixi_blurfilter.js.html +++ b/doc/out/pixi_blurfilter.js.html @@ -1729,7 +1729,7 @@ class TiltShiftYFilter extends TiltShiftAxisFilter {
      diff --git a/doc/out/pixi_button.js.html b/doc/out/pixi_button.js.html index 9665604..6b75adf 100644 --- a/doc/out/pixi_button.js.html +++ b/doc/out/pixi_button.js.html @@ -2153,7 +2153,7 @@ export default class Button extends PIXI.Container {
      diff --git a/doc/out/pixi_buttongroup.js.html b/doc/out/pixi_buttongroup.js.html index 4b5c814..3fa826b 100644 --- a/doc/out/pixi_buttongroup.js.html +++ b/doc/out/pixi_buttongroup.js.html @@ -2004,9 +2004,9 @@ export default class ButtonGroup extends PIXI.Container { if (leftCorner < paddingLeft) { // left border it.x = -this.container.x + paddingLeft - } else if (rightCorner > Math.abs(this.container.x) + this.opts.maxWidth - paddingRight) { + } else if (rightCorner > -this.container.x + this.opts.maxWidth - paddingRight) { // right border - it.x = Math.abs(this.container.x) + this.opts.maxWidth - it.width - paddingRight + it.x = -this.container.x + this.opts.maxWidth - it.width - paddingRight } else { it.x = it.__originalPosition.x } @@ -2016,24 +2016,21 @@ export default class ButtonGroup extends PIXI.Container { sorted.push(it) }) + const min = Math.min(...sorted.map(it => it.x)) + const max = Math.max(...sorted.map(it => it.x)) + const center = (min + max) / 2 + // z-index sorted .sort((a, b) => { - const delta = Math.abs(this.container.x) + this.opts.maxWidth / 2 - const distanceA = Math.abs(a.x - delta) - const distanceB = Math.abs(b.x - delta) - if (distanceA > distanceB) { - return -1 - } else if (distanceB > distanceA) { + const distanceA = Math.abs(a.x - center) + const distanceB = Math.abs(b.x - center) + if (distanceA < distanceB) { return 1 + } else if (distanceA > distanceB) { + return -1 } else { - if (a.__initIndex > b.__initIndex) { - return -1 - } else if (b.__initIndex > a.__initIndex) { - return 1 - } else { - return 0 - } + return 0 } }) .forEach(it => it.parent.addChild(it)) @@ -2055,9 +2052,9 @@ export default class ButtonGroup extends PIXI.Container { if (topCorner < paddingTop) { // top border it.y = -this.container.y + paddingTop - } else if (bottomCorner > Math.abs(this.container.y) + this.opts.maxHeight - paddingBottom) { + } else if (bottomCorner > -this.container.y + this.opts.maxHeight - paddingBottom) { // bottom border - it.y = Math.abs(this.container.y) + this.opts.maxHeight - it.height - paddingBottom + it.y = -this.container.y + this.opts.maxHeight - it.height - paddingBottom } else { it.y = it.__originalPosition.y } @@ -2067,24 +2064,21 @@ export default class ButtonGroup extends PIXI.Container { sorted.push(it) }) + const min = Math.min(...sorted.map(it => it.y)) + const max = Math.max(...sorted.map(it => it.y)) + const center = (min + max) / 2 + // z-index sorted .sort((a, b) => { - const delta = Math.abs(this.container.y) + this.opts.maxHeight / 2 - const distanceA = Math.abs(a.y - delta) - const distanceB = Math.abs(b.y - delta) - if (distanceA > distanceB) { - return -1 - } else if (distanceB > distanceA) { + const distanceA = Math.abs(a.y - center) + const distanceB = Math.abs(b.y - center) + if (distanceA < distanceB) { return 1 + } else if (distanceA > distanceB) { + return -1 } else { - if (a.__initIndex > b.__initIndex) { - return -1 - } else if (b.__initIndex > a.__initIndex) { - return 1 - } else { - return 0 - } + return 0 } }) .forEach(it => it.parent.addChild(it)) @@ -2103,7 +2097,7 @@ export default class ButtonGroup extends PIXI.Container {
      diff --git a/doc/out/pixi_deepzoom_image.js.html b/doc/out/pixi_deepzoom_image.js.html index 7098555..7725d62 100644 --- a/doc/out/pixi_deepzoom_image.js.html +++ b/doc/out/pixi_deepzoom_image.js.html @@ -2553,7 +2553,7 @@ export class DeepZoomImage extends PIXI.Container {
      diff --git a/doc/out/pixi_flippable.js.html b/doc/out/pixi_flippable.js.html index 333e4f9..04edcff 100644 --- a/doc/out/pixi_flippable.js.html +++ b/doc/out/pixi_flippable.js.html @@ -1908,7 +1908,7 @@ export default class Flippable extends PIXI.projection.Camera3d {
      diff --git a/doc/out/pixi_labeledgraphics.js.html b/doc/out/pixi_labeledgraphics.js.html index 285460d..876c1b4 100644 --- a/doc/out/pixi_labeledgraphics.js.html +++ b/doc/out/pixi_labeledgraphics.js.html @@ -1857,7 +1857,7 @@ export class BitmapLabeledGraphics extends LabeledGraphics {
      diff --git a/doc/out/pixi_list.js.html b/doc/out/pixi_list.js.html index 2b59843..6a9da03 100644 --- a/doc/out/pixi_list.js.html +++ b/doc/out/pixi_list.js.html @@ -1836,7 +1836,7 @@ export default class List extends PIXI.Container {
      diff --git a/doc/out/pixi_message.js.html b/doc/out/pixi_message.js.html index 140564e..85dba6e 100644 --- a/doc/out/pixi_message.js.html +++ b/doc/out/pixi_message.js.html @@ -1585,7 +1585,7 @@ export default class Message extends InteractivePopup {
      diff --git a/doc/out/pixi_modal.js.html b/doc/out/pixi_modal.js.html index 442c323..e1f9533 100644 --- a/doc/out/pixi_modal.js.html +++ b/doc/out/pixi_modal.js.html @@ -1666,7 +1666,7 @@ export default class Modal extends PIXI.Container {
      diff --git a/doc/out/pixi_popup.js.html b/doc/out/pixi_popup.js.html index 24f4cf7..b68a814 100644 --- a/doc/out/pixi_popup.js.html +++ b/doc/out/pixi_popup.js.html @@ -1676,7 +1676,7 @@ export default class Popup extends InteractivePopup {
      diff --git a/doc/out/pixi_popupmenu.js.html b/doc/out/pixi_popupmenu.js.html index f573773..b9cad48 100644 --- a/doc/out/pixi_popupmenu.js.html +++ b/doc/out/pixi_popupmenu.js.html @@ -1579,7 +1579,7 @@ export default class PopupMenu extends Popup {
      diff --git a/doc/out/pixi_progress.js.html b/doc/out/pixi_progress.js.html index 9498c91..c6e4f88 100644 --- a/doc/out/pixi_progress.js.html +++ b/doc/out/pixi_progress.js.html @@ -1761,7 +1761,7 @@ export default class Progress extends PIXI.Container {
      diff --git a/doc/out/pixi_scrollview.js.html b/doc/out/pixi_scrollview.js.html index 50f249b..c7ee1a9 100644 --- a/doc/out/pixi_scrollview.js.html +++ b/doc/out/pixi_scrollview.js.html @@ -1520,7 +1520,7 @@ export default class Scrollview extends Scrollbox {
      diff --git a/doc/out/pixi_slider.js.html b/doc/out/pixi_slider.js.html index 19add97..a99f25d 100644 --- a/doc/out/pixi_slider.js.html +++ b/doc/out/pixi_slider.js.html @@ -1925,7 +1925,7 @@ export default class Slider extends PIXI.Container {
      diff --git a/doc/out/pixi_switch.js.html b/doc/out/pixi_switch.js.html index f933c5c..83f28c5 100644 --- a/doc/out/pixi_switch.js.html +++ b/doc/out/pixi_switch.js.html @@ -1979,7 +1979,7 @@ export default class Switch extends PIXI.Container {
      diff --git a/doc/out/pixi_theme.js.html b/doc/out/pixi_theme.js.html index 657d49c..709ff9a 100644 --- a/doc/out/pixi_theme.js.html +++ b/doc/out/pixi_theme.js.html @@ -1720,7 +1720,7 @@ export class ThemeRed extends Theme {
      diff --git a/doc/out/pixi_tooltip.js.html b/doc/out/pixi_tooltip.js.html index daf1b70..7568c05 100644 --- a/doc/out/pixi_tooltip.js.html +++ b/doc/out/pixi_tooltip.js.html @@ -1613,7 +1613,7 @@ export default class Tooltip extends AbstractPopup {
      diff --git a/doc/out/pixi_volatile.js.html b/doc/out/pixi_volatile.js.html index 5242a27..41a1a2c 100644 --- a/doc/out/pixi_volatile.js.html +++ b/doc/out/pixi_volatile.js.html @@ -1617,7 +1617,7 @@ export default class Volatile {
      diff --git a/doc/out/uitest.js.html b/doc/out/uitest.js.html index 3bacbba..0cb2ca0 100644 --- a/doc/out/uitest.js.html +++ b/doc/out/uitest.js.html @@ -2468,7 +2468,7 @@ class Event {
      diff --git a/lib/pixi/buttongroup.js b/lib/pixi/buttongroup.js index 87bc6de..0ee8f79 100644 --- a/lib/pixi/buttongroup.js +++ b/lib/pixi/buttongroup.js @@ -541,7 +541,7 @@ export default class ButtonGroup extends PIXI.Container { } /** - * + * */ _stackHorizontal() { const sorted = [] @@ -589,7 +589,7 @@ export default class ButtonGroup extends PIXI.Container { } /** - * + * */ _stackVertical() { const sorted = [] From e9f1246e0a7cca5f42698bf23161bde22542a506 Mon Sep 17 00:00:00 2001 From: Sebastian Kupke Date: Thu, 1 Aug 2019 10:19:34 +0200 Subject: [PATCH 08/30] Improved button group stacking behaviour if ThrowPropsPlugin is not loaded. --- dist/iwmlib.pixi.js | 50 ++++++++++-------- doc/out/AbstractPopup.html | 2 +- doc/out/Badge.html | 2 +- doc/out/BlurFilter.html | 2 +- doc/out/Button.html | 2 +- doc/out/ButtonGroup.html | 14 ++--- doc/out/DeepZoomImage.html | 2 +- doc/out/DeepZoomInfo.html | 2 +- doc/out/Flippable.html | 2 +- doc/out/FontInfo.html | 2 +- doc/out/Hypenate.html | 2 +- doc/out/InteractivePopup.html | 2 +- ...beledGraphics.exports.LabeledGraphics.html | 2 +- doc/out/LabeledGraphics.html | 2 +- doc/out/List.html | 2 +- doc/out/Message.html | 2 +- doc/out/MessageInteractivePopup.html | 2 +- doc/out/MessageMessageInteractivePopup.html | 2 +- doc/out/Modal.html | 2 +- doc/out/ModalInteractivePopup.html | 2 +- doc/out/ModalModalInteractivePopup.html | 2 +- doc/out/PIXIApp.html | 2 +- doc/out/Popup.html | 2 +- doc/out/PopupInteractivePopup.html | 2 +- doc/out/PopupMenu.html | 2 +- doc/out/PopupMenuPopupInteractivePopup.html | 2 +- ...pupMenuPopupMenuPopupInteractivePopup.html | 2 +- ...nuPopupMenuPopupPopupInteractivePopup.html | 2 +- .../PopupMenuPopupPopupInteractivePopup.html | 2 +- doc/out/PopupPopupInteractivePopup.html | 2 +- doc/out/Progress.html | 2 +- doc/out/Scrollview.html | 2 +- doc/out/Slider.html | 2 +- doc/out/Switch.html | 2 +- doc/out/TextLabel.TextLabel.html | 2 +- doc/out/Theme.html | 2 +- doc/out/ThemeDark.html | 2 +- doc/out/ThemeLight.html | 2 +- doc/out/ThemeRed.html | 2 +- doc/out/TileQuadNode.html | 2 +- doc/out/Tooltip.html | 2 +- doc/out/UITest.html | 2 +- doc/out/Volatile.html | 2 +- doc/out/global.html | 2 +- doc/out/index.html | 2 +- doc/out/pixi_abstractpopup.js.html | 2 +- doc/out/pixi_app.js.html | 2 +- doc/out/pixi_badge.js.html | 2 +- doc/out/pixi_blurfilter.js.html | 2 +- doc/out/pixi_button.js.html | 2 +- doc/out/pixi_buttongroup.js.html | 52 +++++++++++-------- doc/out/pixi_deepzoom_image.js.html | 2 +- doc/out/pixi_flippable.js.html | 2 +- doc/out/pixi_labeledgraphics.js.html | 2 +- doc/out/pixi_list.js.html | 2 +- doc/out/pixi_message.js.html | 2 +- doc/out/pixi_modal.js.html | 2 +- doc/out/pixi_popup.js.html | 2 +- doc/out/pixi_popupmenu.js.html | 2 +- doc/out/pixi_progress.js.html | 2 +- doc/out/pixi_scrollview.js.html | 2 +- doc/out/pixi_slider.js.html | 2 +- doc/out/pixi_switch.js.html | 2 +- doc/out/pixi_theme.js.html | 2 +- doc/out/pixi_tooltip.js.html | 2 +- doc/out/pixi_volatile.js.html | 2 +- doc/out/uitest.js.html | 2 +- lib/pixi/buttongroup.html | 2 +- lib/pixi/buttongroup.js | 46 +++++++++------- 69 files changed, 155 insertions(+), 137 deletions(-) diff --git a/dist/iwmlib.pixi.js b/dist/iwmlib.pixi.js index bad2580..cf723d0 100644 --- a/dist/iwmlib.pixi.js +++ b/dist/iwmlib.pixi.js @@ -2963,8 +2963,8 @@ * or a Theme object. * @param {number} [opts.minWidth=44] - Button: The minimum width of one button. * @param {number} [opts.minHeight=44] - Button: The minimum height of one button. - * @param {number} [opts.maxWidth] - The maximum width of the button group. If the buttons are wider than the maximum width, the buttons get stacked. Note: The buttons can only be stacked if margin is not zero. - * @param {number} [opts.maxHeight] - The maximum height of the button group. If the buttons are higher than the maximum height, the buttons get stacked. Note: The buttons can only be stacked if margin is not zero. + * @param {number} [opts.maxWidth] - The maximum width of the button group. If the buttons are wider than the maximum width, the buttons get stacked. Note: The buttons can only be stacked if margin is not zero. Note 2: Load the Greensock ThrowPropsPlugin for smoother animations. + * @param {number} [opts.maxHeight] - The maximum height of the button group. If the buttons are higher than the maximum height, the buttons get stacked. Note: The buttons can only be stacked if margin is not zero. Note 2: Load the Greensock ThrowPropsPlugin for smoother animations. * @param {number} [opts.stackPadding=10] - The padding for stacked buttons. * @param {PIXI.Application} [opts.app] - The PixiJS Application. Must be set if you want to use the mousewheel to scroll your button group. Only used when the buttons are stacked (with maxWidth or maxHeight). * @param {number} [opts.padding=Theme.padding] - Button: The inner spacing (distance from icon and/or label) the the border. @@ -3377,27 +3377,27 @@ this.capture(event); - if (typeof ThrowPropsPlugin != 'undefined') { - const throwProps = { x: { velocity: 'auto' }, y: { velocity: 'auto' } }; + const throwProps = { x: { velocity: 'auto' }, y: { velocity: 'auto' } }; - if (this.opts.orientation === 'horizontal') { - const distanceToLeft = this.container.x; - const distanceToRight = this.opts.maxWidth - this.container.x - this.__initWidth; - if (distanceToLeft > 0 && distanceToLeft > distanceToRight) { - throwProps.x.end = 0; - } else if (distanceToRight > 0 && distanceToRight > distanceToLeft) { - throwProps.x.end = this.opts.maxWidth - this.__initWidth; - } - } else { - const distanceToTop = this.container.y; - const distanceToBottom = this.opts.maxHeight - this.container.y - this.container.height; - if (distanceToTop > 0 && distanceToTop > distanceToBottom) { - throwProps.y.end = 0; - } else if (distanceToBottom > 0 && distanceToBottom > distanceToTop) { - throwProps.y.end = this.opts.maxHeight - this.container.height; - } + if (this.opts.orientation === 'horizontal') { + const distanceToLeft = this.container.x; + const distanceToRight = this.opts.maxWidth - this.container.x - this.__initWidth; + if (distanceToLeft > 0 && distanceToLeft > distanceToRight) { + throwProps.x.end = 0; + } else if (distanceToRight > 0 && distanceToRight > distanceToLeft) { + throwProps.x.end = this.opts.maxWidth - this.__initWidth; } + } else { + const distanceToTop = this.container.y; + const distanceToBottom = this.opts.maxHeight - this.container.y - this.container.height; + if (distanceToTop > 0 && distanceToTop > distanceToBottom) { + throwProps.y.end = 0; + } else if (distanceToBottom > 0 && distanceToBottom > distanceToTop) { + throwProps.y.end = this.opts.maxHeight - this.container.height; + } + } + if (typeof ThrowPropsPlugin != 'undefined') { ThrowPropsPlugin.to( this.container.position, { @@ -3409,6 +3409,12 @@ 0.8, 0.4 ); + } else { + if (this.opts.orientation === 'horizontal' && throwProps.x.end != null) { + TweenMax.to(this.container.position, 0.3, { x: throwProps.x.end, onUpdate: this.stack.bind(this) }); + } else if (this.opts.orientation === 'vertical' && throwProps.y.end != null) { + TweenMax.to(this.container.position, 0.3, { y: throwProps.y.end, onUpdate: this.stack.bind(this) }); + } } } } @@ -3462,7 +3468,7 @@ } /** - * + * */ _stackHorizontal() { const sorted = []; @@ -3510,7 +3516,7 @@ } /** - * + * */ _stackVertical() { const sorted = []; diff --git a/doc/out/AbstractPopup.html b/doc/out/AbstractPopup.html index 65bee4c..4081236 100644 --- a/doc/out/AbstractPopup.html +++ b/doc/out/AbstractPopup.html @@ -2920,7 +2920,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/Badge.html b/doc/out/Badge.html index e06728b..e0f51c8 100644 --- a/doc/out/Badge.html +++ b/doc/out/Badge.html @@ -2376,7 +2376,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/BlurFilter.html b/doc/out/BlurFilter.html index 76687e8..bdffa14 100644 --- a/doc/out/BlurFilter.html +++ b/doc/out/BlurFilter.html @@ -1800,7 +1800,7 @@ app.scene.filters = [blurFilter]
      diff --git a/doc/out/Button.html b/doc/out/Button.html index 3e591da..83d137e 100644 --- a/doc/out/Button.html +++ b/doc/out/Button.html @@ -3818,7 +3818,7 @@ the tint property of the icon sprite.

      diff --git a/doc/out/ButtonGroup.html b/doc/out/ButtonGroup.html index a814cec..fb522b6 100644 --- a/doc/out/ButtonGroup.html +++ b/doc/out/ButtonGroup.html @@ -1848,7 +1848,7 @@ or a Theme object.

      -

      The maximum width of the button group. If the buttons are wider than the maximum width, the buttons get stacked. Note: The buttons can only be stacked if margin is not zero.

      +

      The maximum width of the button group. If the buttons are wider than the maximum width, the buttons get stacked. Note: The buttons can only be stacked if margin is not zero. Note 2: Load the Greensock ThrowPropsPlugin for smoother animations.

      @@ -1882,7 +1882,7 @@ or a Theme object.

      -

      The maximum height of the button group. If the buttons are higher than the maximum height, the buttons get stacked. Note: The buttons can only be stacked if margin is not zero.

      +

      The maximum height of the button group. If the buttons are higher than the maximum height, the buttons get stacked. Note: The buttons can only be stacked if margin is not zero. Note 2: Load the Greensock ThrowPropsPlugin for smoother animations.

      @@ -3035,7 +3035,7 @@ app.scene.addChild(buttonGroup) @@ -3107,7 +3107,7 @@ app.scene.addChild(buttonGroup) @@ -3179,7 +3179,7 @@ app.scene.addChild(buttonGroup) @@ -3618,7 +3618,7 @@ app.scene.addChild(buttonGroup) @@ -3692,7 +3692,7 @@ app.scene.addChild(buttonGroup)
      diff --git a/doc/out/DeepZoomImage.html b/doc/out/DeepZoomImage.html index 1b5bf7f..e62cd1a 100644 --- a/doc/out/DeepZoomImage.html +++ b/doc/out/DeepZoomImage.html @@ -5098,7 +5098,7 @@ i.e. after loading a single tile

      diff --git a/doc/out/DeepZoomInfo.html b/doc/out/DeepZoomInfo.html index 8069471..eb97fdb 100644 --- a/doc/out/DeepZoomInfo.html +++ b/doc/out/DeepZoomInfo.html @@ -2611,7 +2611,7 @@ on completion.

      diff --git a/doc/out/Flippable.html b/doc/out/Flippable.html index 567f601..5400a8c 100644 --- a/doc/out/Flippable.html +++ b/doc/out/Flippable.html @@ -2514,7 +2514,7 @@ front.on('click', event => flippable.toggle())
      diff --git a/doc/out/FontInfo.html b/doc/out/FontInfo.html index 3654a21..34b7c78 100644 --- a/doc/out/FontInfo.html +++ b/doc/out/FontInfo.html @@ -1561,7 +1561,7 @@
      diff --git a/doc/out/Hypenate.html b/doc/out/Hypenate.html index 055f47f..39ea437 100644 --- a/doc/out/Hypenate.html +++ b/doc/out/Hypenate.html @@ -1763,7 +1763,7 @@
      diff --git a/doc/out/InteractivePopup.html b/doc/out/InteractivePopup.html index 8647183..bf37e4a 100644 --- a/doc/out/InteractivePopup.html +++ b/doc/out/InteractivePopup.html @@ -2345,7 +2345,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/LabeledGraphics.exports.LabeledGraphics.html b/doc/out/LabeledGraphics.exports.LabeledGraphics.html index 06ec4f3..0b2515f 100644 --- a/doc/out/LabeledGraphics.exports.LabeledGraphics.html +++ b/doc/out/LabeledGraphics.exports.LabeledGraphics.html @@ -1563,7 +1563,7 @@
      diff --git a/doc/out/LabeledGraphics.html b/doc/out/LabeledGraphics.html index 62bdef4..b6f53e8 100644 --- a/doc/out/LabeledGraphics.html +++ b/doc/out/LabeledGraphics.html @@ -2628,7 +2628,7 @@ than wanted

      diff --git a/doc/out/List.html b/doc/out/List.html index 6628abd..0d817d8 100644 --- a/doc/out/List.html +++ b/doc/out/List.html @@ -2587,7 +2587,7 @@ app.scene.addChild(list)
      diff --git a/doc/out/Message.html b/doc/out/Message.html index 6089231..fc59b49 100644 --- a/doc/out/Message.html +++ b/doc/out/Message.html @@ -2443,7 +2443,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/MessageInteractivePopup.html b/doc/out/MessageInteractivePopup.html index d675731..57430af 100644 --- a/doc/out/MessageInteractivePopup.html +++ b/doc/out/MessageInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/MessageMessageInteractivePopup.html b/doc/out/MessageMessageInteractivePopup.html index 219680f..aa6d5ab 100644 --- a/doc/out/MessageMessageInteractivePopup.html +++ b/doc/out/MessageMessageInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/Modal.html b/doc/out/Modal.html index c2f5ae7..d5a92fc 100644 --- a/doc/out/Modal.html +++ b/doc/out/Modal.html @@ -2344,7 +2344,7 @@ a string or a PIXI.Text object.

      diff --git a/doc/out/ModalInteractivePopup.html b/doc/out/ModalInteractivePopup.html index 1adeae9..1dccd52 100644 --- a/doc/out/ModalInteractivePopup.html +++ b/doc/out/ModalInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/ModalModalInteractivePopup.html b/doc/out/ModalModalInteractivePopup.html index bd02cb8..b72513d 100644 --- a/doc/out/ModalModalInteractivePopup.html +++ b/doc/out/ModalModalInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/PIXIApp.html b/doc/out/PIXIApp.html index 4ccdb83..8a58ca2 100644 --- a/doc/out/PIXIApp.html +++ b/doc/out/PIXIApp.html @@ -5745,7 +5745,7 @@ rejected with an error.
      diff --git a/doc/out/Popup.html b/doc/out/Popup.html index 4b894a5..be17b52 100644 --- a/doc/out/Popup.html +++ b/doc/out/Popup.html @@ -2338,7 +2338,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/PopupInteractivePopup.html b/doc/out/PopupInteractivePopup.html index 38d7a7a..5aebad5 100644 --- a/doc/out/PopupInteractivePopup.html +++ b/doc/out/PopupInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenu.html b/doc/out/PopupMenu.html index ddd86d9..9e9b315 100644 --- a/doc/out/PopupMenu.html +++ b/doc/out/PopupMenu.html @@ -2392,7 +2392,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/PopupMenuPopupInteractivePopup.html b/doc/out/PopupMenuPopupInteractivePopup.html index fa20244..4f58817 100644 --- a/doc/out/PopupMenuPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html b/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html index 07631b5..9133839 100644 --- a/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html b/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html index 2da9747..3876b05 100644 --- a/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenuPopupPopupInteractivePopup.html b/doc/out/PopupMenuPopupPopupInteractivePopup.html index f31c36c..c559f6f 100644 --- a/doc/out/PopupMenuPopupPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupPopupInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupPopupInteractivePopup.html b/doc/out/PopupPopupInteractivePopup.html index 94eb07c..cf5e2d4 100644 --- a/doc/out/PopupPopupInteractivePopup.html +++ b/doc/out/PopupPopupInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/Progress.html b/doc/out/Progress.html index 1c7005e..7150cfe 100644 --- a/doc/out/Progress.html +++ b/doc/out/Progress.html @@ -2877,7 +2877,7 @@ app.scene.addChild(progress)
      diff --git a/doc/out/Scrollview.html b/doc/out/Scrollview.html index 6bb8938..6b7dfba 100644 --- a/doc/out/Scrollview.html +++ b/doc/out/Scrollview.html @@ -1709,7 +1709,7 @@ app.loader
      diff --git a/doc/out/Slider.html b/doc/out/Slider.html index 7c6be84..2c3d4c5 100644 --- a/doc/out/Slider.html +++ b/doc/out/Slider.html @@ -2968,7 +2968,7 @@ app.scene.addChild(slider)
      diff --git a/doc/out/Switch.html b/doc/out/Switch.html index 7ee63f1..642d56e 100644 --- a/doc/out/Switch.html +++ b/doc/out/Switch.html @@ -3398,7 +3398,7 @@ app.scene.addChild(switch1)
      diff --git a/doc/out/TextLabel.TextLabel.html b/doc/out/TextLabel.TextLabel.html index 0db9526..65df9e9 100644 --- a/doc/out/TextLabel.TextLabel.html +++ b/doc/out/TextLabel.TextLabel.html @@ -1692,7 +1692,7 @@
      diff --git a/doc/out/Theme.html b/doc/out/Theme.html index 7d63242..28cf6c4 100644 --- a/doc/out/Theme.html +++ b/doc/out/Theme.html @@ -3167,7 +3167,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/ThemeDark.html b/doc/out/ThemeDark.html index 3d5dab8..22fed3f 100644 --- a/doc/out/ThemeDark.html +++ b/doc/out/ThemeDark.html @@ -1588,7 +1588,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/ThemeLight.html b/doc/out/ThemeLight.html index e75e62d..c9053f6 100644 --- a/doc/out/ThemeLight.html +++ b/doc/out/ThemeLight.html @@ -1600,7 +1600,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/ThemeRed.html b/doc/out/ThemeRed.html index 232acad..3cfcc86 100644 --- a/doc/out/ThemeRed.html +++ b/doc/out/ThemeRed.html @@ -1600,7 +1600,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/TileQuadNode.html b/doc/out/TileQuadNode.html index c63bcbb..f0df52e 100644 --- a/doc/out/TileQuadNode.html +++ b/doc/out/TileQuadNode.html @@ -2052,7 +2052,7 @@ an indicator of tiles to free.

      diff --git a/doc/out/Tooltip.html b/doc/out/Tooltip.html index 27a3357..31043c0 100644 --- a/doc/out/Tooltip.html +++ b/doc/out/Tooltip.html @@ -2514,7 +2514,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/UITest.html b/doc/out/UITest.html index 670f16a..991d9d9 100644 --- a/doc/out/UITest.html +++ b/doc/out/UITest.html @@ -4185,7 +4185,7 @@ test.start()
      diff --git a/doc/out/Volatile.html b/doc/out/Volatile.html index ed3a093..bfa15b9 100644 --- a/doc/out/Volatile.html +++ b/doc/out/Volatile.html @@ -2101,7 +2101,7 @@ app.scene.addChild(button)
      diff --git a/doc/out/global.html b/doc/out/global.html index 36da43f..b78172c 100644 --- a/doc/out/global.html +++ b/doc/out/global.html @@ -3322,7 +3322,7 @@
      diff --git a/doc/out/index.html b/doc/out/index.html index f6166f5..a5b42e3 100644 --- a/doc/out/index.html +++ b/doc/out/index.html @@ -1487,7 +1487,7 @@
      diff --git a/doc/out/pixi_abstractpopup.js.html b/doc/out/pixi_abstractpopup.js.html index 47e828f..39e6760 100644 --- a/doc/out/pixi_abstractpopup.js.html +++ b/doc/out/pixi_abstractpopup.js.html @@ -1810,7 +1810,7 @@ export default class AbstractPopup extends PIXI.Graphics {
      diff --git a/doc/out/pixi_app.js.html b/doc/out/pixi_app.js.html index 6a368a5..ad17078 100644 --- a/doc/out/pixi_app.js.html +++ b/doc/out/pixi_app.js.html @@ -2191,7 +2191,7 @@ class FpsDisplay extends PIXI.Graphics {
      diff --git a/doc/out/pixi_badge.js.html b/doc/out/pixi_badge.js.html index 6f6adef..b58ecac 100644 --- a/doc/out/pixi_badge.js.html +++ b/doc/out/pixi_badge.js.html @@ -1571,7 +1571,7 @@ export default class Badge extends AbstractPopup {
      diff --git a/doc/out/pixi_blurfilter.js.html b/doc/out/pixi_blurfilter.js.html index 9d8d6d5..7093a67 100644 --- a/doc/out/pixi_blurfilter.js.html +++ b/doc/out/pixi_blurfilter.js.html @@ -1729,7 +1729,7 @@ class TiltShiftYFilter extends TiltShiftAxisFilter {
      diff --git a/doc/out/pixi_button.js.html b/doc/out/pixi_button.js.html index 6b75adf..b9207de 100644 --- a/doc/out/pixi_button.js.html +++ b/doc/out/pixi_button.js.html @@ -2153,7 +2153,7 @@ export default class Button extends PIXI.Container {
      diff --git a/doc/out/pixi_buttongroup.js.html b/doc/out/pixi_buttongroup.js.html index 3fa826b..2a0e6c8 100644 --- a/doc/out/pixi_buttongroup.js.html +++ b/doc/out/pixi_buttongroup.js.html @@ -1490,8 +1490,8 @@ export default class ButtonGroup extends PIXI.Container { * or a Theme object. * @param {number} [opts.minWidth=44] - Button: The minimum width of one button. * @param {number} [opts.minHeight=44] - Button: The minimum height of one button. - * @param {number} [opts.maxWidth] - The maximum width of the button group. If the buttons are wider than the maximum width, the buttons get stacked. Note: The buttons can only be stacked if margin is not zero. - * @param {number} [opts.maxHeight] - The maximum height of the button group. If the buttons are higher than the maximum height, the buttons get stacked. Note: The buttons can only be stacked if margin is not zero. + * @param {number} [opts.maxWidth] - The maximum width of the button group. If the buttons are wider than the maximum width, the buttons get stacked. Note: The buttons can only be stacked if margin is not zero. Note 2: Load the Greensock ThrowPropsPlugin for smoother animations. + * @param {number} [opts.maxHeight] - The maximum height of the button group. If the buttons are higher than the maximum height, the buttons get stacked. Note: The buttons can only be stacked if margin is not zero. Note 2: Load the Greensock ThrowPropsPlugin for smoother animations. * @param {number} [opts.stackPadding=10] - The padding for stacked buttons. * @param {PIXI.Application} [opts.app] - The PixiJS Application. Must be set if you want to use the mousewheel to scroll your button group. Only used when the buttons are stacked (with maxWidth or maxHeight). * @param {number} [opts.padding=Theme.padding] - Button: The inner spacing (distance from icon and/or label) the the border. @@ -1904,27 +1904,27 @@ export default class ButtonGroup extends PIXI.Container { this.capture(event) - if (typeof ThrowPropsPlugin != 'undefined') { - const throwProps = { x: { velocity: 'auto' }, y: { velocity: 'auto' } } + const throwProps = { x: { velocity: 'auto' }, y: { velocity: 'auto' } } - if (this.opts.orientation === 'horizontal') { - const distanceToLeft = this.container.x - const distanceToRight = this.opts.maxWidth - this.container.x - this.__initWidth - if (distanceToLeft > 0 && distanceToLeft > distanceToRight) { - throwProps.x.end = 0 - } else if (distanceToRight > 0 && distanceToRight > distanceToLeft) { - throwProps.x.end = this.opts.maxWidth - this.__initWidth - } - } else { - const distanceToTop = this.container.y - const distanceToBottom = this.opts.maxHeight - this.container.y - this.container.height - if (distanceToTop > 0 && distanceToTop > distanceToBottom) { - throwProps.y.end = 0 - } else if (distanceToBottom > 0 && distanceToBottom > distanceToTop) { - throwProps.y.end = this.opts.maxHeight - this.container.height - } + if (this.opts.orientation === 'horizontal') { + const distanceToLeft = this.container.x + const distanceToRight = this.opts.maxWidth - this.container.x - this.__initWidth + if (distanceToLeft > 0 && distanceToLeft > distanceToRight) { + throwProps.x.end = 0 + } else if (distanceToRight > 0 && distanceToRight > distanceToLeft) { + throwProps.x.end = this.opts.maxWidth - this.__initWidth } + } else { + const distanceToTop = this.container.y + const distanceToBottom = this.opts.maxHeight - this.container.y - this.container.height + if (distanceToTop > 0 && distanceToTop > distanceToBottom) { + throwProps.y.end = 0 + } else if (distanceToBottom > 0 && distanceToBottom > distanceToTop) { + throwProps.y.end = this.opts.maxHeight - this.container.height + } + } + if (typeof ThrowPropsPlugin != 'undefined') { ThrowPropsPlugin.to( this.container.position, { @@ -1936,6 +1936,12 @@ export default class ButtonGroup extends PIXI.Container { 0.8, 0.4 ) + } else { + if (this.opts.orientation === 'horizontal' && throwProps.x.end != null) { + TweenMax.to(this.container.position, 0.3, { x: throwProps.x.end, onUpdate: this.stack.bind(this) }) + } else if (this.opts.orientation === 'vertical' && throwProps.y.end != null) { + TweenMax.to(this.container.position, 0.3, { y: throwProps.y.end, onUpdate: this.stack.bind(this) }) + } } } } @@ -1989,7 +1995,7 @@ export default class ButtonGroup extends PIXI.Container { } /** - * + * */ _stackHorizontal() { const sorted = [] @@ -2037,7 +2043,7 @@ export default class ButtonGroup extends PIXI.Container { } /** - * + * */ _stackVertical() { const sorted = [] @@ -2097,7 +2103,7 @@ export default class ButtonGroup extends PIXI.Container {
      diff --git a/doc/out/pixi_deepzoom_image.js.html b/doc/out/pixi_deepzoom_image.js.html index 7725d62..9ed5198 100644 --- a/doc/out/pixi_deepzoom_image.js.html +++ b/doc/out/pixi_deepzoom_image.js.html @@ -2553,7 +2553,7 @@ export class DeepZoomImage extends PIXI.Container {
      diff --git a/doc/out/pixi_flippable.js.html b/doc/out/pixi_flippable.js.html index 04edcff..d1d6b59 100644 --- a/doc/out/pixi_flippable.js.html +++ b/doc/out/pixi_flippable.js.html @@ -1908,7 +1908,7 @@ export default class Flippable extends PIXI.projection.Camera3d {
      diff --git a/doc/out/pixi_labeledgraphics.js.html b/doc/out/pixi_labeledgraphics.js.html index 876c1b4..28a3a8d 100644 --- a/doc/out/pixi_labeledgraphics.js.html +++ b/doc/out/pixi_labeledgraphics.js.html @@ -1857,7 +1857,7 @@ export class BitmapLabeledGraphics extends LabeledGraphics {
      diff --git a/doc/out/pixi_list.js.html b/doc/out/pixi_list.js.html index 6a9da03..0de4e9c 100644 --- a/doc/out/pixi_list.js.html +++ b/doc/out/pixi_list.js.html @@ -1836,7 +1836,7 @@ export default class List extends PIXI.Container {
      diff --git a/doc/out/pixi_message.js.html b/doc/out/pixi_message.js.html index 85dba6e..4ca04e3 100644 --- a/doc/out/pixi_message.js.html +++ b/doc/out/pixi_message.js.html @@ -1585,7 +1585,7 @@ export default class Message extends InteractivePopup {
      diff --git a/doc/out/pixi_modal.js.html b/doc/out/pixi_modal.js.html index e1f9533..9824689 100644 --- a/doc/out/pixi_modal.js.html +++ b/doc/out/pixi_modal.js.html @@ -1666,7 +1666,7 @@ export default class Modal extends PIXI.Container {
      diff --git a/doc/out/pixi_popup.js.html b/doc/out/pixi_popup.js.html index b68a814..28ab6a0 100644 --- a/doc/out/pixi_popup.js.html +++ b/doc/out/pixi_popup.js.html @@ -1676,7 +1676,7 @@ export default class Popup extends InteractivePopup {
      diff --git a/doc/out/pixi_popupmenu.js.html b/doc/out/pixi_popupmenu.js.html index b9cad48..d081fab 100644 --- a/doc/out/pixi_popupmenu.js.html +++ b/doc/out/pixi_popupmenu.js.html @@ -1579,7 +1579,7 @@ export default class PopupMenu extends Popup {
      diff --git a/doc/out/pixi_progress.js.html b/doc/out/pixi_progress.js.html index c6e4f88..c15fcdd 100644 --- a/doc/out/pixi_progress.js.html +++ b/doc/out/pixi_progress.js.html @@ -1761,7 +1761,7 @@ export default class Progress extends PIXI.Container {
      diff --git a/doc/out/pixi_scrollview.js.html b/doc/out/pixi_scrollview.js.html index c7ee1a9..cdadd7b 100644 --- a/doc/out/pixi_scrollview.js.html +++ b/doc/out/pixi_scrollview.js.html @@ -1520,7 +1520,7 @@ export default class Scrollview extends Scrollbox {
      diff --git a/doc/out/pixi_slider.js.html b/doc/out/pixi_slider.js.html index a99f25d..d984fc2 100644 --- a/doc/out/pixi_slider.js.html +++ b/doc/out/pixi_slider.js.html @@ -1925,7 +1925,7 @@ export default class Slider extends PIXI.Container {
      diff --git a/doc/out/pixi_switch.js.html b/doc/out/pixi_switch.js.html index 83f28c5..929cd5b 100644 --- a/doc/out/pixi_switch.js.html +++ b/doc/out/pixi_switch.js.html @@ -1979,7 +1979,7 @@ export default class Switch extends PIXI.Container {
      diff --git a/doc/out/pixi_theme.js.html b/doc/out/pixi_theme.js.html index 709ff9a..c827ef4 100644 --- a/doc/out/pixi_theme.js.html +++ b/doc/out/pixi_theme.js.html @@ -1720,7 +1720,7 @@ export class ThemeRed extends Theme {
      diff --git a/doc/out/pixi_tooltip.js.html b/doc/out/pixi_tooltip.js.html index 7568c05..9fe0462 100644 --- a/doc/out/pixi_tooltip.js.html +++ b/doc/out/pixi_tooltip.js.html @@ -1613,7 +1613,7 @@ export default class Tooltip extends AbstractPopup {
      diff --git a/doc/out/pixi_volatile.js.html b/doc/out/pixi_volatile.js.html index 41a1a2c..1d30e2b 100644 --- a/doc/out/pixi_volatile.js.html +++ b/doc/out/pixi_volatile.js.html @@ -1617,7 +1617,7 @@ export default class Volatile {
      diff --git a/doc/out/uitest.js.html b/doc/out/uitest.js.html index 0cb2ca0..f2aad5b 100644 --- a/doc/out/uitest.js.html +++ b/doc/out/uitest.js.html @@ -2468,7 +2468,7 @@ class Event {
      diff --git a/lib/pixi/buttongroup.html b/lib/pixi/buttongroup.html index 233061b..cf7808f 100644 --- a/lib/pixi/buttongroup.html +++ b/lib/pixi/buttongroup.html @@ -10,7 +10,7 @@ - + diff --git a/lib/pixi/buttongroup.js b/lib/pixi/buttongroup.js index 0ee8f79..cfee7cf 100644 --- a/lib/pixi/buttongroup.js +++ b/lib/pixi/buttongroup.js @@ -42,8 +42,8 @@ export default class ButtonGroup extends PIXI.Container { * or a Theme object. * @param {number} [opts.minWidth=44] - Button: The minimum width of one button. * @param {number} [opts.minHeight=44] - Button: The minimum height of one button. - * @param {number} [opts.maxWidth] - The maximum width of the button group. If the buttons are wider than the maximum width, the buttons get stacked. Note: The buttons can only be stacked if margin is not zero. - * @param {number} [opts.maxHeight] - The maximum height of the button group. If the buttons are higher than the maximum height, the buttons get stacked. Note: The buttons can only be stacked if margin is not zero. + * @param {number} [opts.maxWidth] - The maximum width of the button group. If the buttons are wider than the maximum width, the buttons get stacked. Note: The buttons can only be stacked if margin is not zero. Note 2: Load the Greensock ThrowPropsPlugin for smoother animations. + * @param {number} [opts.maxHeight] - The maximum height of the button group. If the buttons are higher than the maximum height, the buttons get stacked. Note: The buttons can only be stacked if margin is not zero. Note 2: Load the Greensock ThrowPropsPlugin for smoother animations. * @param {number} [opts.stackPadding=10] - The padding for stacked buttons. * @param {PIXI.Application} [opts.app] - The PixiJS Application. Must be set if you want to use the mousewheel to scroll your button group. Only used when the buttons are stacked (with maxWidth or maxHeight). * @param {number} [opts.padding=Theme.padding] - Button: The inner spacing (distance from icon and/or label) the the border. @@ -456,27 +456,27 @@ export default class ButtonGroup extends PIXI.Container { this.capture(event) - if (typeof ThrowPropsPlugin != 'undefined') { - const throwProps = { x: { velocity: 'auto' }, y: { velocity: 'auto' } } + const throwProps = { x: { velocity: 'auto' }, y: { velocity: 'auto' } } - if (this.opts.orientation === 'horizontal') { - const distanceToLeft = this.container.x - const distanceToRight = this.opts.maxWidth - this.container.x - this.__initWidth - if (distanceToLeft > 0 && distanceToLeft > distanceToRight) { - throwProps.x.end = 0 - } else if (distanceToRight > 0 && distanceToRight > distanceToLeft) { - throwProps.x.end = this.opts.maxWidth - this.__initWidth - } - } else { - const distanceToTop = this.container.y - const distanceToBottom = this.opts.maxHeight - this.container.y - this.container.height - if (distanceToTop > 0 && distanceToTop > distanceToBottom) { - throwProps.y.end = 0 - } else if (distanceToBottom > 0 && distanceToBottom > distanceToTop) { - throwProps.y.end = this.opts.maxHeight - this.container.height - } + if (this.opts.orientation === 'horizontal') { + const distanceToLeft = this.container.x + const distanceToRight = this.opts.maxWidth - this.container.x - this.__initWidth + if (distanceToLeft > 0 && distanceToLeft > distanceToRight) { + throwProps.x.end = 0 + } else if (distanceToRight > 0 && distanceToRight > distanceToLeft) { + throwProps.x.end = this.opts.maxWidth - this.__initWidth } + } else { + const distanceToTop = this.container.y + const distanceToBottom = this.opts.maxHeight - this.container.y - this.container.height + if (distanceToTop > 0 && distanceToTop > distanceToBottom) { + throwProps.y.end = 0 + } else if (distanceToBottom > 0 && distanceToBottom > distanceToTop) { + throwProps.y.end = this.opts.maxHeight - this.container.height + } + } + if (typeof ThrowPropsPlugin != 'undefined') { ThrowPropsPlugin.to( this.container.position, { @@ -488,6 +488,12 @@ export default class ButtonGroup extends PIXI.Container { 0.8, 0.4 ) + } else { + if (this.opts.orientation === 'horizontal' && throwProps.x.end != null) { + TweenMax.to(this.container.position, 0.3, { x: throwProps.x.end, onUpdate: this.stack.bind(this) }) + } else if (this.opts.orientation === 'vertical' && throwProps.y.end != null) { + TweenMax.to(this.container.position, 0.3, { y: throwProps.y.end, onUpdate: this.stack.bind(this) }) + } } } } From b1f0f173e736a2d33faf3b206dde4bddd180a297 Mon Sep 17 00:00:00 2001 From: Sebastian Kupke Date: Thu, 1 Aug 2019 10:31:05 +0200 Subject: [PATCH 09/30] Fixed bug with stacked buttons in a button group with badges. --- dist/iwmlib.pixi.js | 12 ++++++------ doc/out/AbstractPopup.html | 2 +- doc/out/Badge.html | 2 +- doc/out/BlurFilter.html | 2 +- doc/out/Button.html | 2 +- doc/out/ButtonGroup.html | 2 +- doc/out/DeepZoomImage.html | 2 +- doc/out/DeepZoomInfo.html | 2 +- doc/out/Flippable.html | 2 +- doc/out/FontInfo.html | 2 +- doc/out/Hypenate.html | 2 +- doc/out/InteractivePopup.html | 2 +- .../LabeledGraphics.exports.LabeledGraphics.html | 2 +- doc/out/LabeledGraphics.html | 2 +- doc/out/List.html | 2 +- doc/out/Message.html | 2 +- doc/out/MessageInteractivePopup.html | 2 +- doc/out/MessageMessageInteractivePopup.html | 2 +- doc/out/Modal.html | 2 +- doc/out/ModalInteractivePopup.html | 2 +- doc/out/ModalModalInteractivePopup.html | 2 +- doc/out/PIXIApp.html | 2 +- doc/out/Popup.html | 2 +- doc/out/PopupInteractivePopup.html | 2 +- doc/out/PopupMenu.html | 2 +- doc/out/PopupMenuPopupInteractivePopup.html | 2 +- .../PopupMenuPopupMenuPopupInteractivePopup.html | 2 +- ...pupMenuPopupMenuPopupPopupInteractivePopup.html | 2 +- doc/out/PopupMenuPopupPopupInteractivePopup.html | 2 +- doc/out/PopupPopupInteractivePopup.html | 2 +- doc/out/Progress.html | 2 +- doc/out/Scrollview.html | 2 +- doc/out/Slider.html | 2 +- doc/out/Switch.html | 2 +- doc/out/TextLabel.TextLabel.html | 2 +- doc/out/Theme.html | 2 +- doc/out/ThemeDark.html | 2 +- doc/out/ThemeLight.html | 2 +- doc/out/ThemeRed.html | 2 +- doc/out/TileQuadNode.html | 2 +- doc/out/Tooltip.html | 2 +- doc/out/UITest.html | 2 +- doc/out/Volatile.html | 2 +- doc/out/global.html | 2 +- doc/out/index.html | 2 +- doc/out/pixi_abstractpopup.js.html | 2 +- doc/out/pixi_app.js.html | 2 +- doc/out/pixi_badge.js.html | 2 +- doc/out/pixi_blurfilter.js.html | 2 +- doc/out/pixi_button.js.html | 2 +- doc/out/pixi_buttongroup.js.html | 14 +++++++------- doc/out/pixi_deepzoom_image.js.html | 2 +- doc/out/pixi_flippable.js.html | 2 +- doc/out/pixi_labeledgraphics.js.html | 2 +- doc/out/pixi_list.js.html | 2 +- doc/out/pixi_message.js.html | 2 +- doc/out/pixi_modal.js.html | 2 +- doc/out/pixi_popup.js.html | 2 +- doc/out/pixi_popupmenu.js.html | 2 +- doc/out/pixi_progress.js.html | 2 +- doc/out/pixi_scrollview.js.html | 2 +- doc/out/pixi_slider.js.html | 2 +- doc/out/pixi_switch.js.html | 2 +- doc/out/pixi_theme.js.html | 2 +- doc/out/pixi_tooltip.js.html | 2 +- doc/out/pixi_volatile.js.html | 2 +- doc/out/uitest.js.html | 2 +- lib/pixi/buttongroup.html | 2 +- lib/pixi/buttongroup.js | 12 ++++++------ 69 files changed, 85 insertions(+), 85 deletions(-) diff --git a/dist/iwmlib.pixi.js b/dist/iwmlib.pixi.js index cf723d0..b172daa 100644 --- a/dist/iwmlib.pixi.js +++ b/dist/iwmlib.pixi.js @@ -3477,7 +3477,7 @@ this.buttons.forEach((it, index) => { const leftCorner = it.__originalPosition.x + this.container.x; - const rightCorner = it.__originalPosition.x + it.width; + const rightCorner = it.__originalPosition.x + it.button.width; const paddingLeft = index * this.opts.stackPadding; const paddingRight = reverseCounter * this.opts.stackPadding; if (leftCorner < paddingLeft) { @@ -3485,7 +3485,7 @@ it.x = -this.container.x + paddingLeft; } else if (rightCorner > -this.container.x + this.opts.maxWidth - paddingRight) { // right border - it.x = -this.container.x + this.opts.maxWidth - it.width - paddingRight; + it.x = -this.container.x + this.opts.maxWidth - it.button.width - paddingRight; } else { it.x = it.__originalPosition.x; } @@ -3496,7 +3496,7 @@ }); const min = Math.min(...sorted.map(it => it.x)); - const max = Math.max(...sorted.map(it => it.x)); + const max = Math.max(...sorted.map(it => it.x + it.button.width)); const center = (min + max) / 2; // z-index @@ -3525,7 +3525,7 @@ this.buttons.forEach((it, index) => { const topCorner = it.__originalPosition.y + this.container.y; - const bottomCorner = it.__originalPosition.y + it.height; + const bottomCorner = it.__originalPosition.y + it.button.height; const paddingTop = index * this.opts.stackPadding; const paddingBottom = reverseCounter * this.opts.stackPadding; if (topCorner < paddingTop) { @@ -3533,7 +3533,7 @@ it.y = -this.container.y + paddingTop; } else if (bottomCorner > -this.container.y + this.opts.maxHeight - paddingBottom) { // bottom border - it.y = -this.container.y + this.opts.maxHeight - it.height - paddingBottom; + it.y = -this.container.y + this.opts.maxHeight - it.button.height - paddingBottom; } else { it.y = it.__originalPosition.y; } @@ -3544,7 +3544,7 @@ }); const min = Math.min(...sorted.map(it => it.y)); - const max = Math.max(...sorted.map(it => it.y)); + const max = Math.max(...sorted.map(it => it.y + it.button.height)); const center = (min + max) / 2; // z-index diff --git a/doc/out/AbstractPopup.html b/doc/out/AbstractPopup.html index 4081236..36edcba 100644 --- a/doc/out/AbstractPopup.html +++ b/doc/out/AbstractPopup.html @@ -2920,7 +2920,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/Badge.html b/doc/out/Badge.html index e0f51c8..8ebe070 100644 --- a/doc/out/Badge.html +++ b/doc/out/Badge.html @@ -2376,7 +2376,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/BlurFilter.html b/doc/out/BlurFilter.html index bdffa14..97bfd82 100644 --- a/doc/out/BlurFilter.html +++ b/doc/out/BlurFilter.html @@ -1800,7 +1800,7 @@ app.scene.filters = [blurFilter]
      diff --git a/doc/out/Button.html b/doc/out/Button.html index 83d137e..b0ca13c 100644 --- a/doc/out/Button.html +++ b/doc/out/Button.html @@ -3818,7 +3818,7 @@ the tint property of the icon sprite.

      diff --git a/doc/out/ButtonGroup.html b/doc/out/ButtonGroup.html index fb522b6..f051f1a 100644 --- a/doc/out/ButtonGroup.html +++ b/doc/out/ButtonGroup.html @@ -3692,7 +3692,7 @@ app.scene.addChild(buttonGroup)
      diff --git a/doc/out/DeepZoomImage.html b/doc/out/DeepZoomImage.html index e62cd1a..179e06b 100644 --- a/doc/out/DeepZoomImage.html +++ b/doc/out/DeepZoomImage.html @@ -5098,7 +5098,7 @@ i.e. after loading a single tile

      diff --git a/doc/out/DeepZoomInfo.html b/doc/out/DeepZoomInfo.html index eb97fdb..2433ff4 100644 --- a/doc/out/DeepZoomInfo.html +++ b/doc/out/DeepZoomInfo.html @@ -2611,7 +2611,7 @@ on completion.

      diff --git a/doc/out/Flippable.html b/doc/out/Flippable.html index 5400a8c..188504e 100644 --- a/doc/out/Flippable.html +++ b/doc/out/Flippable.html @@ -2514,7 +2514,7 @@ front.on('click', event => flippable.toggle())
      diff --git a/doc/out/FontInfo.html b/doc/out/FontInfo.html index 34b7c78..a1f086b 100644 --- a/doc/out/FontInfo.html +++ b/doc/out/FontInfo.html @@ -1561,7 +1561,7 @@
      diff --git a/doc/out/Hypenate.html b/doc/out/Hypenate.html index 39ea437..e544a34 100644 --- a/doc/out/Hypenate.html +++ b/doc/out/Hypenate.html @@ -1763,7 +1763,7 @@
      diff --git a/doc/out/InteractivePopup.html b/doc/out/InteractivePopup.html index bf37e4a..c310cd5 100644 --- a/doc/out/InteractivePopup.html +++ b/doc/out/InteractivePopup.html @@ -2345,7 +2345,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/LabeledGraphics.exports.LabeledGraphics.html b/doc/out/LabeledGraphics.exports.LabeledGraphics.html index 0b2515f..bf71bbc 100644 --- a/doc/out/LabeledGraphics.exports.LabeledGraphics.html +++ b/doc/out/LabeledGraphics.exports.LabeledGraphics.html @@ -1563,7 +1563,7 @@
      diff --git a/doc/out/LabeledGraphics.html b/doc/out/LabeledGraphics.html index b6f53e8..81270b7 100644 --- a/doc/out/LabeledGraphics.html +++ b/doc/out/LabeledGraphics.html @@ -2628,7 +2628,7 @@ than wanted

      diff --git a/doc/out/List.html b/doc/out/List.html index 0d817d8..b561118 100644 --- a/doc/out/List.html +++ b/doc/out/List.html @@ -2587,7 +2587,7 @@ app.scene.addChild(list)
      diff --git a/doc/out/Message.html b/doc/out/Message.html index fc59b49..6387fc2 100644 --- a/doc/out/Message.html +++ b/doc/out/Message.html @@ -2443,7 +2443,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/MessageInteractivePopup.html b/doc/out/MessageInteractivePopup.html index 57430af..c8c77a5 100644 --- a/doc/out/MessageInteractivePopup.html +++ b/doc/out/MessageInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/MessageMessageInteractivePopup.html b/doc/out/MessageMessageInteractivePopup.html index aa6d5ab..6a9f109 100644 --- a/doc/out/MessageMessageInteractivePopup.html +++ b/doc/out/MessageMessageInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/Modal.html b/doc/out/Modal.html index d5a92fc..cc321ed 100644 --- a/doc/out/Modal.html +++ b/doc/out/Modal.html @@ -2344,7 +2344,7 @@ a string or a PIXI.Text object.

      diff --git a/doc/out/ModalInteractivePopup.html b/doc/out/ModalInteractivePopup.html index 1dccd52..a45a194 100644 --- a/doc/out/ModalInteractivePopup.html +++ b/doc/out/ModalInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/ModalModalInteractivePopup.html b/doc/out/ModalModalInteractivePopup.html index b72513d..b1ca8cb 100644 --- a/doc/out/ModalModalInteractivePopup.html +++ b/doc/out/ModalModalInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/PIXIApp.html b/doc/out/PIXIApp.html index 8a58ca2..433900e 100644 --- a/doc/out/PIXIApp.html +++ b/doc/out/PIXIApp.html @@ -5745,7 +5745,7 @@ rejected with an error.
      diff --git a/doc/out/Popup.html b/doc/out/Popup.html index be17b52..4cbc968 100644 --- a/doc/out/Popup.html +++ b/doc/out/Popup.html @@ -2338,7 +2338,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/PopupInteractivePopup.html b/doc/out/PopupInteractivePopup.html index 5aebad5..4a54afe 100644 --- a/doc/out/PopupInteractivePopup.html +++ b/doc/out/PopupInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenu.html b/doc/out/PopupMenu.html index 9e9b315..b4d92dc 100644 --- a/doc/out/PopupMenu.html +++ b/doc/out/PopupMenu.html @@ -2392,7 +2392,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/PopupMenuPopupInteractivePopup.html b/doc/out/PopupMenuPopupInteractivePopup.html index 4f58817..1c78dff 100644 --- a/doc/out/PopupMenuPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html b/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html index 9133839..3f2d007 100644 --- a/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html b/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html index 3876b05..8f5a7cf 100644 --- a/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenuPopupPopupInteractivePopup.html b/doc/out/PopupMenuPopupPopupInteractivePopup.html index c559f6f..d9f8e47 100644 --- a/doc/out/PopupMenuPopupPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupPopupInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupPopupInteractivePopup.html b/doc/out/PopupPopupInteractivePopup.html index cf5e2d4..074ae22 100644 --- a/doc/out/PopupPopupInteractivePopup.html +++ b/doc/out/PopupPopupInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/Progress.html b/doc/out/Progress.html index 7150cfe..ebaed92 100644 --- a/doc/out/Progress.html +++ b/doc/out/Progress.html @@ -2877,7 +2877,7 @@ app.scene.addChild(progress)
      diff --git a/doc/out/Scrollview.html b/doc/out/Scrollview.html index 6b7dfba..30b9589 100644 --- a/doc/out/Scrollview.html +++ b/doc/out/Scrollview.html @@ -1709,7 +1709,7 @@ app.loader
      diff --git a/doc/out/Slider.html b/doc/out/Slider.html index 2c3d4c5..d9115e2 100644 --- a/doc/out/Slider.html +++ b/doc/out/Slider.html @@ -2968,7 +2968,7 @@ app.scene.addChild(slider)
      diff --git a/doc/out/Switch.html b/doc/out/Switch.html index 642d56e..bbdfc6e 100644 --- a/doc/out/Switch.html +++ b/doc/out/Switch.html @@ -3398,7 +3398,7 @@ app.scene.addChild(switch1)
      diff --git a/doc/out/TextLabel.TextLabel.html b/doc/out/TextLabel.TextLabel.html index 65df9e9..a3c69d1 100644 --- a/doc/out/TextLabel.TextLabel.html +++ b/doc/out/TextLabel.TextLabel.html @@ -1692,7 +1692,7 @@
      diff --git a/doc/out/Theme.html b/doc/out/Theme.html index 28cf6c4..aa87533 100644 --- a/doc/out/Theme.html +++ b/doc/out/Theme.html @@ -3167,7 +3167,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/ThemeDark.html b/doc/out/ThemeDark.html index 22fed3f..3bc0ba5 100644 --- a/doc/out/ThemeDark.html +++ b/doc/out/ThemeDark.html @@ -1588,7 +1588,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/ThemeLight.html b/doc/out/ThemeLight.html index c9053f6..a28f73e 100644 --- a/doc/out/ThemeLight.html +++ b/doc/out/ThemeLight.html @@ -1600,7 +1600,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/ThemeRed.html b/doc/out/ThemeRed.html index 3cfcc86..7973730 100644 --- a/doc/out/ThemeRed.html +++ b/doc/out/ThemeRed.html @@ -1600,7 +1600,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/TileQuadNode.html b/doc/out/TileQuadNode.html index f0df52e..f9a246e 100644 --- a/doc/out/TileQuadNode.html +++ b/doc/out/TileQuadNode.html @@ -2052,7 +2052,7 @@ an indicator of tiles to free.

      diff --git a/doc/out/Tooltip.html b/doc/out/Tooltip.html index 31043c0..ee4a325 100644 --- a/doc/out/Tooltip.html +++ b/doc/out/Tooltip.html @@ -2514,7 +2514,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/UITest.html b/doc/out/UITest.html index 991d9d9..f3cae66 100644 --- a/doc/out/UITest.html +++ b/doc/out/UITest.html @@ -4185,7 +4185,7 @@ test.start()
      diff --git a/doc/out/Volatile.html b/doc/out/Volatile.html index bfa15b9..499b324 100644 --- a/doc/out/Volatile.html +++ b/doc/out/Volatile.html @@ -2101,7 +2101,7 @@ app.scene.addChild(button)
      diff --git a/doc/out/global.html b/doc/out/global.html index b78172c..cd78fc0 100644 --- a/doc/out/global.html +++ b/doc/out/global.html @@ -3322,7 +3322,7 @@
      diff --git a/doc/out/index.html b/doc/out/index.html index a5b42e3..c28271b 100644 --- a/doc/out/index.html +++ b/doc/out/index.html @@ -1487,7 +1487,7 @@
      diff --git a/doc/out/pixi_abstractpopup.js.html b/doc/out/pixi_abstractpopup.js.html index 39e6760..c058bc9 100644 --- a/doc/out/pixi_abstractpopup.js.html +++ b/doc/out/pixi_abstractpopup.js.html @@ -1810,7 +1810,7 @@ export default class AbstractPopup extends PIXI.Graphics {
      diff --git a/doc/out/pixi_app.js.html b/doc/out/pixi_app.js.html index ad17078..1a4def3 100644 --- a/doc/out/pixi_app.js.html +++ b/doc/out/pixi_app.js.html @@ -2191,7 +2191,7 @@ class FpsDisplay extends PIXI.Graphics {
      diff --git a/doc/out/pixi_badge.js.html b/doc/out/pixi_badge.js.html index b58ecac..f26bae8 100644 --- a/doc/out/pixi_badge.js.html +++ b/doc/out/pixi_badge.js.html @@ -1571,7 +1571,7 @@ export default class Badge extends AbstractPopup {
      diff --git a/doc/out/pixi_blurfilter.js.html b/doc/out/pixi_blurfilter.js.html index 7093a67..4662a3a 100644 --- a/doc/out/pixi_blurfilter.js.html +++ b/doc/out/pixi_blurfilter.js.html @@ -1729,7 +1729,7 @@ class TiltShiftYFilter extends TiltShiftAxisFilter {
      diff --git a/doc/out/pixi_button.js.html b/doc/out/pixi_button.js.html index b9207de..774da58 100644 --- a/doc/out/pixi_button.js.html +++ b/doc/out/pixi_button.js.html @@ -2153,7 +2153,7 @@ export default class Button extends PIXI.Container {
      diff --git a/doc/out/pixi_buttongroup.js.html b/doc/out/pixi_buttongroup.js.html index 2a0e6c8..ddd859d 100644 --- a/doc/out/pixi_buttongroup.js.html +++ b/doc/out/pixi_buttongroup.js.html @@ -2004,7 +2004,7 @@ export default class ButtonGroup extends PIXI.Container { this.buttons.forEach((it, index) => { const leftCorner = it.__originalPosition.x + this.container.x - const rightCorner = it.__originalPosition.x + it.width + const rightCorner = it.__originalPosition.x + it.button.width const paddingLeft = index * this.opts.stackPadding const paddingRight = reverseCounter * this.opts.stackPadding if (leftCorner < paddingLeft) { @@ -2012,7 +2012,7 @@ export default class ButtonGroup extends PIXI.Container { it.x = -this.container.x + paddingLeft } else if (rightCorner > -this.container.x + this.opts.maxWidth - paddingRight) { // right border - it.x = -this.container.x + this.opts.maxWidth - it.width - paddingRight + it.x = -this.container.x + this.opts.maxWidth - it.button.width - paddingRight } else { it.x = it.__originalPosition.x } @@ -2023,7 +2023,7 @@ export default class ButtonGroup extends PIXI.Container { }) const min = Math.min(...sorted.map(it => it.x)) - const max = Math.max(...sorted.map(it => it.x)) + const max = Math.max(...sorted.map(it => it.x + it.button.width)) const center = (min + max) / 2 // z-index @@ -2052,7 +2052,7 @@ export default class ButtonGroup extends PIXI.Container { this.buttons.forEach((it, index) => { const topCorner = it.__originalPosition.y + this.container.y - const bottomCorner = it.__originalPosition.y + it.height + const bottomCorner = it.__originalPosition.y + it.button.height const paddingTop = index * this.opts.stackPadding const paddingBottom = reverseCounter * this.opts.stackPadding if (topCorner < paddingTop) { @@ -2060,7 +2060,7 @@ export default class ButtonGroup extends PIXI.Container { it.y = -this.container.y + paddingTop } else if (bottomCorner > -this.container.y + this.opts.maxHeight - paddingBottom) { // bottom border - it.y = -this.container.y + this.opts.maxHeight - it.height - paddingBottom + it.y = -this.container.y + this.opts.maxHeight - it.button.height - paddingBottom } else { it.y = it.__originalPosition.y } @@ -2071,7 +2071,7 @@ export default class ButtonGroup extends PIXI.Container { }) const min = Math.min(...sorted.map(it => it.y)) - const max = Math.max(...sorted.map(it => it.y)) + const max = Math.max(...sorted.map(it => it.y + it.button.height)) const center = (min + max) / 2 // z-index @@ -2103,7 +2103,7 @@ export default class ButtonGroup extends PIXI.Container {
      diff --git a/doc/out/pixi_deepzoom_image.js.html b/doc/out/pixi_deepzoom_image.js.html index 9ed5198..cf42d7f 100644 --- a/doc/out/pixi_deepzoom_image.js.html +++ b/doc/out/pixi_deepzoom_image.js.html @@ -2553,7 +2553,7 @@ export class DeepZoomImage extends PIXI.Container {
      diff --git a/doc/out/pixi_flippable.js.html b/doc/out/pixi_flippable.js.html index d1d6b59..2c0699d 100644 --- a/doc/out/pixi_flippable.js.html +++ b/doc/out/pixi_flippable.js.html @@ -1908,7 +1908,7 @@ export default class Flippable extends PIXI.projection.Camera3d {
      diff --git a/doc/out/pixi_labeledgraphics.js.html b/doc/out/pixi_labeledgraphics.js.html index 28a3a8d..d8055ad 100644 --- a/doc/out/pixi_labeledgraphics.js.html +++ b/doc/out/pixi_labeledgraphics.js.html @@ -1857,7 +1857,7 @@ export class BitmapLabeledGraphics extends LabeledGraphics {
      diff --git a/doc/out/pixi_list.js.html b/doc/out/pixi_list.js.html index 0de4e9c..cb1e124 100644 --- a/doc/out/pixi_list.js.html +++ b/doc/out/pixi_list.js.html @@ -1836,7 +1836,7 @@ export default class List extends PIXI.Container {
      diff --git a/doc/out/pixi_message.js.html b/doc/out/pixi_message.js.html index 4ca04e3..b047784 100644 --- a/doc/out/pixi_message.js.html +++ b/doc/out/pixi_message.js.html @@ -1585,7 +1585,7 @@ export default class Message extends InteractivePopup {
      diff --git a/doc/out/pixi_modal.js.html b/doc/out/pixi_modal.js.html index 9824689..a9ef14d 100644 --- a/doc/out/pixi_modal.js.html +++ b/doc/out/pixi_modal.js.html @@ -1666,7 +1666,7 @@ export default class Modal extends PIXI.Container {
      diff --git a/doc/out/pixi_popup.js.html b/doc/out/pixi_popup.js.html index 28ab6a0..f22c6ca 100644 --- a/doc/out/pixi_popup.js.html +++ b/doc/out/pixi_popup.js.html @@ -1676,7 +1676,7 @@ export default class Popup extends InteractivePopup {
      diff --git a/doc/out/pixi_popupmenu.js.html b/doc/out/pixi_popupmenu.js.html index d081fab..739f6be 100644 --- a/doc/out/pixi_popupmenu.js.html +++ b/doc/out/pixi_popupmenu.js.html @@ -1579,7 +1579,7 @@ export default class PopupMenu extends Popup {
      diff --git a/doc/out/pixi_progress.js.html b/doc/out/pixi_progress.js.html index c15fcdd..a7b94df 100644 --- a/doc/out/pixi_progress.js.html +++ b/doc/out/pixi_progress.js.html @@ -1761,7 +1761,7 @@ export default class Progress extends PIXI.Container {
      diff --git a/doc/out/pixi_scrollview.js.html b/doc/out/pixi_scrollview.js.html index cdadd7b..508015f 100644 --- a/doc/out/pixi_scrollview.js.html +++ b/doc/out/pixi_scrollview.js.html @@ -1520,7 +1520,7 @@ export default class Scrollview extends Scrollbox {
      diff --git a/doc/out/pixi_slider.js.html b/doc/out/pixi_slider.js.html index d984fc2..8d518b1 100644 --- a/doc/out/pixi_slider.js.html +++ b/doc/out/pixi_slider.js.html @@ -1925,7 +1925,7 @@ export default class Slider extends PIXI.Container {
      diff --git a/doc/out/pixi_switch.js.html b/doc/out/pixi_switch.js.html index 929cd5b..36e298a 100644 --- a/doc/out/pixi_switch.js.html +++ b/doc/out/pixi_switch.js.html @@ -1979,7 +1979,7 @@ export default class Switch extends PIXI.Container {
      diff --git a/doc/out/pixi_theme.js.html b/doc/out/pixi_theme.js.html index c827ef4..d21be7c 100644 --- a/doc/out/pixi_theme.js.html +++ b/doc/out/pixi_theme.js.html @@ -1720,7 +1720,7 @@ export class ThemeRed extends Theme {
      diff --git a/doc/out/pixi_tooltip.js.html b/doc/out/pixi_tooltip.js.html index 9fe0462..3017945 100644 --- a/doc/out/pixi_tooltip.js.html +++ b/doc/out/pixi_tooltip.js.html @@ -1613,7 +1613,7 @@ export default class Tooltip extends AbstractPopup {
      diff --git a/doc/out/pixi_volatile.js.html b/doc/out/pixi_volatile.js.html index 1d30e2b..76b6af3 100644 --- a/doc/out/pixi_volatile.js.html +++ b/doc/out/pixi_volatile.js.html @@ -1617,7 +1617,7 @@ export default class Volatile {
      diff --git a/doc/out/uitest.js.html b/doc/out/uitest.js.html index f2aad5b..78efbc8 100644 --- a/doc/out/uitest.js.html +++ b/doc/out/uitest.js.html @@ -2468,7 +2468,7 @@ class Event {
      diff --git a/lib/pixi/buttongroup.html b/lib/pixi/buttongroup.html index cf7808f..233061b 100644 --- a/lib/pixi/buttongroup.html +++ b/lib/pixi/buttongroup.html @@ -10,7 +10,7 @@ - + diff --git a/lib/pixi/buttongroup.js b/lib/pixi/buttongroup.js index cfee7cf..e5a8824 100644 --- a/lib/pixi/buttongroup.js +++ b/lib/pixi/buttongroup.js @@ -556,7 +556,7 @@ export default class ButtonGroup extends PIXI.Container { this.buttons.forEach((it, index) => { const leftCorner = it.__originalPosition.x + this.container.x - const rightCorner = it.__originalPosition.x + it.width + const rightCorner = it.__originalPosition.x + it.button.width const paddingLeft = index * this.opts.stackPadding const paddingRight = reverseCounter * this.opts.stackPadding if (leftCorner < paddingLeft) { @@ -564,7 +564,7 @@ export default class ButtonGroup extends PIXI.Container { it.x = -this.container.x + paddingLeft } else if (rightCorner > -this.container.x + this.opts.maxWidth - paddingRight) { // right border - it.x = -this.container.x + this.opts.maxWidth - it.width - paddingRight + it.x = -this.container.x + this.opts.maxWidth - it.button.width - paddingRight } else { it.x = it.__originalPosition.x } @@ -575,7 +575,7 @@ export default class ButtonGroup extends PIXI.Container { }) const min = Math.min(...sorted.map(it => it.x)) - const max = Math.max(...sorted.map(it => it.x)) + const max = Math.max(...sorted.map(it => it.x + it.button.width)) const center = (min + max) / 2 // z-index @@ -604,7 +604,7 @@ export default class ButtonGroup extends PIXI.Container { this.buttons.forEach((it, index) => { const topCorner = it.__originalPosition.y + this.container.y - const bottomCorner = it.__originalPosition.y + it.height + const bottomCorner = it.__originalPosition.y + it.button.height const paddingTop = index * this.opts.stackPadding const paddingBottom = reverseCounter * this.opts.stackPadding if (topCorner < paddingTop) { @@ -612,7 +612,7 @@ export default class ButtonGroup extends PIXI.Container { it.y = -this.container.y + paddingTop } else if (bottomCorner > -this.container.y + this.opts.maxHeight - paddingBottom) { // bottom border - it.y = -this.container.y + this.opts.maxHeight - it.height - paddingBottom + it.y = -this.container.y + this.opts.maxHeight - it.button.height - paddingBottom } else { it.y = it.__originalPosition.y } @@ -623,7 +623,7 @@ export default class ButtonGroup extends PIXI.Container { }) const min = Math.min(...sorted.map(it => it.y)) - const max = Math.max(...sorted.map(it => it.y)) + const max = Math.max(...sorted.map(it => it.y + it.button.height)) const center = (min + max) / 2 // z-index From 32087608cc1a631d73f458ad705016314c86c2f0 Mon Sep 17 00:00:00 2001 From: Sebastian Kupke Date: Thu, 1 Aug 2019 11:26:22 +0200 Subject: [PATCH 10/30] Improved button group stack sorting. --- dist/iwmlib.pixi.js | 50 ++++++++++++------ doc/out/AbstractPopup.html | 2 +- doc/out/Badge.html | 2 +- doc/out/BlurFilter.html | 2 +- doc/out/Button.html | 2 +- doc/out/ButtonGroup.html | 4 +- doc/out/DeepZoomImage.html | 2 +- doc/out/DeepZoomInfo.html | 2 +- doc/out/Flippable.html | 2 +- doc/out/FontInfo.html | 2 +- doc/out/Hypenate.html | 2 +- doc/out/InteractivePopup.html | 2 +- ...beledGraphics.exports.LabeledGraphics.html | 2 +- doc/out/LabeledGraphics.html | 2 +- doc/out/List.html | 2 +- doc/out/Message.html | 2 +- doc/out/MessageInteractivePopup.html | 2 +- doc/out/MessageMessageInteractivePopup.html | 2 +- doc/out/Modal.html | 2 +- doc/out/ModalInteractivePopup.html | 2 +- doc/out/ModalModalInteractivePopup.html | 2 +- doc/out/PIXIApp.html | 2 +- doc/out/Popup.html | 2 +- doc/out/PopupInteractivePopup.html | 2 +- doc/out/PopupMenu.html | 2 +- doc/out/PopupMenuPopupInteractivePopup.html | 2 +- ...pupMenuPopupMenuPopupInteractivePopup.html | 2 +- ...nuPopupMenuPopupPopupInteractivePopup.html | 2 +- .../PopupMenuPopupPopupInteractivePopup.html | 2 +- doc/out/PopupPopupInteractivePopup.html | 2 +- doc/out/Progress.html | 2 +- doc/out/Scrollview.html | 2 +- doc/out/Slider.html | 2 +- doc/out/Switch.html | 2 +- doc/out/TextLabel.TextLabel.html | 2 +- doc/out/Theme.html | 2 +- doc/out/ThemeDark.html | 2 +- doc/out/ThemeLight.html | 2 +- doc/out/ThemeRed.html | 2 +- doc/out/TileQuadNode.html | 2 +- doc/out/Tooltip.html | 2 +- doc/out/UITest.html | 2 +- doc/out/Volatile.html | 2 +- doc/out/global.html | 2 +- doc/out/index.html | 2 +- doc/out/pixi_abstractpopup.js.html | 2 +- doc/out/pixi_app.js.html | 2 +- doc/out/pixi_badge.js.html | 2 +- doc/out/pixi_blurfilter.js.html | 2 +- doc/out/pixi_button.js.html | 2 +- doc/out/pixi_buttongroup.js.html | 52 +++++++++++++------ doc/out/pixi_deepzoom_image.js.html | 2 +- doc/out/pixi_flippable.js.html | 2 +- doc/out/pixi_labeledgraphics.js.html | 2 +- doc/out/pixi_list.js.html | 2 +- doc/out/pixi_message.js.html | 2 +- doc/out/pixi_modal.js.html | 2 +- doc/out/pixi_popup.js.html | 2 +- doc/out/pixi_popupmenu.js.html | 2 +- doc/out/pixi_progress.js.html | 2 +- doc/out/pixi_scrollview.js.html | 2 +- doc/out/pixi_slider.js.html | 2 +- doc/out/pixi_switch.js.html | 2 +- doc/out/pixi_theme.js.html | 2 +- doc/out/pixi_tooltip.js.html | 2 +- doc/out/pixi_volatile.js.html | 2 +- doc/out/uitest.js.html | 2 +- lib/pixi/buttongroup.html | 23 +++++++- lib/pixi/buttongroup.js | 50 ++++++++++++------ 69 files changed, 191 insertions(+), 116 deletions(-) diff --git a/dist/iwmlib.pixi.js b/dist/iwmlib.pixi.js index b172daa..83f6fdd 100644 --- a/dist/iwmlib.pixi.js +++ b/dist/iwmlib.pixi.js @@ -3502,15 +3502,24 @@ // z-index sorted .sort((a, b) => { - const distanceA = Math.abs(a.x - center); - const distanceB = Math.abs(b.x - center); - if (distanceA < distanceB) { - return 1 - } else if (distanceA > distanceB) { - return -1 - } else { - return 0 + const centerA = a.x + a.button.width / 2; + const centerB = b.x + b.button.width / 2; + + if (centerA < center && centerB < center) { + if (a.x < b.x) { + return -1 + } else if (b.x < a.x) { + return 1 + } + } else if (centerA > center && centerB > center) { + if (a.x + a.button.width > b.x + b.button.width) { + return -1 + } else if (b.x + b.button.width < a.x + a.button.x) { + return 1 + } } + + return 0 }) .forEach(it => it.parent.addChild(it)); } @@ -3550,15 +3559,24 @@ // z-index sorted .sort((a, b) => { - const distanceA = Math.abs(a.y - center); - const distanceB = Math.abs(b.y - center); - if (distanceA < distanceB) { - return 1 - } else if (distanceA > distanceB) { - return -1 - } else { - return 0 + const centerA = a.y + a.button.height / 2; + const centerB = b.y + b.button.height / 2; + + if (centerA < center && centerB < center) { + if (a.y < b.y) { + return -1 + } else if (b.y < a.y) { + return 1 + } + } else if (centerA > center && centerB > center) { + if (a.y + a.button.height > b.y + b.button.height) { + return -1 + } else if (b.y + b.button.height < a.y + a.button.y) { + return 1 + } } + + return 0 }) .forEach(it => it.parent.addChild(it)); } diff --git a/doc/out/AbstractPopup.html b/doc/out/AbstractPopup.html index 36edcba..65a3bce 100644 --- a/doc/out/AbstractPopup.html +++ b/doc/out/AbstractPopup.html @@ -2920,7 +2920,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/Badge.html b/doc/out/Badge.html index 8ebe070..d82153d 100644 --- a/doc/out/Badge.html +++ b/doc/out/Badge.html @@ -2376,7 +2376,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/BlurFilter.html b/doc/out/BlurFilter.html index 97bfd82..33f3d24 100644 --- a/doc/out/BlurFilter.html +++ b/doc/out/BlurFilter.html @@ -1800,7 +1800,7 @@ app.scene.filters = [blurFilter]
      diff --git a/doc/out/Button.html b/doc/out/Button.html index b0ca13c..a2e0c16 100644 --- a/doc/out/Button.html +++ b/doc/out/Button.html @@ -3818,7 +3818,7 @@ the tint property of the icon sprite.

      diff --git a/doc/out/ButtonGroup.html b/doc/out/ButtonGroup.html index f051f1a..7d63851 100644 --- a/doc/out/ButtonGroup.html +++ b/doc/out/ButtonGroup.html @@ -3107,7 +3107,7 @@ app.scene.addChild(buttonGroup) @@ -3692,7 +3692,7 @@ app.scene.addChild(buttonGroup)
      diff --git a/doc/out/DeepZoomImage.html b/doc/out/DeepZoomImage.html index 179e06b..f56db59 100644 --- a/doc/out/DeepZoomImage.html +++ b/doc/out/DeepZoomImage.html @@ -5098,7 +5098,7 @@ i.e. after loading a single tile

      diff --git a/doc/out/DeepZoomInfo.html b/doc/out/DeepZoomInfo.html index 2433ff4..013f3c8 100644 --- a/doc/out/DeepZoomInfo.html +++ b/doc/out/DeepZoomInfo.html @@ -2611,7 +2611,7 @@ on completion.

      diff --git a/doc/out/Flippable.html b/doc/out/Flippable.html index 188504e..601ecf3 100644 --- a/doc/out/Flippable.html +++ b/doc/out/Flippable.html @@ -2514,7 +2514,7 @@ front.on('click', event => flippable.toggle())
      diff --git a/doc/out/FontInfo.html b/doc/out/FontInfo.html index a1f086b..7b98696 100644 --- a/doc/out/FontInfo.html +++ b/doc/out/FontInfo.html @@ -1561,7 +1561,7 @@
      diff --git a/doc/out/Hypenate.html b/doc/out/Hypenate.html index e544a34..cfeac6c 100644 --- a/doc/out/Hypenate.html +++ b/doc/out/Hypenate.html @@ -1763,7 +1763,7 @@
      diff --git a/doc/out/InteractivePopup.html b/doc/out/InteractivePopup.html index c310cd5..5283cb4 100644 --- a/doc/out/InteractivePopup.html +++ b/doc/out/InteractivePopup.html @@ -2345,7 +2345,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/LabeledGraphics.exports.LabeledGraphics.html b/doc/out/LabeledGraphics.exports.LabeledGraphics.html index bf71bbc..e3ada67 100644 --- a/doc/out/LabeledGraphics.exports.LabeledGraphics.html +++ b/doc/out/LabeledGraphics.exports.LabeledGraphics.html @@ -1563,7 +1563,7 @@
      diff --git a/doc/out/LabeledGraphics.html b/doc/out/LabeledGraphics.html index 81270b7..060e318 100644 --- a/doc/out/LabeledGraphics.html +++ b/doc/out/LabeledGraphics.html @@ -2628,7 +2628,7 @@ than wanted

      diff --git a/doc/out/List.html b/doc/out/List.html index b561118..67dea74 100644 --- a/doc/out/List.html +++ b/doc/out/List.html @@ -2587,7 +2587,7 @@ app.scene.addChild(list)
      diff --git a/doc/out/Message.html b/doc/out/Message.html index 6387fc2..d1043fc 100644 --- a/doc/out/Message.html +++ b/doc/out/Message.html @@ -2443,7 +2443,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/MessageInteractivePopup.html b/doc/out/MessageInteractivePopup.html index c8c77a5..c5c3ee1 100644 --- a/doc/out/MessageInteractivePopup.html +++ b/doc/out/MessageInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/MessageMessageInteractivePopup.html b/doc/out/MessageMessageInteractivePopup.html index 6a9f109..a755058 100644 --- a/doc/out/MessageMessageInteractivePopup.html +++ b/doc/out/MessageMessageInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/Modal.html b/doc/out/Modal.html index cc321ed..302cd6c 100644 --- a/doc/out/Modal.html +++ b/doc/out/Modal.html @@ -2344,7 +2344,7 @@ a string or a PIXI.Text object.

      diff --git a/doc/out/ModalInteractivePopup.html b/doc/out/ModalInteractivePopup.html index a45a194..e65567c 100644 --- a/doc/out/ModalInteractivePopup.html +++ b/doc/out/ModalInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/ModalModalInteractivePopup.html b/doc/out/ModalModalInteractivePopup.html index b1ca8cb..097a079 100644 --- a/doc/out/ModalModalInteractivePopup.html +++ b/doc/out/ModalModalInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/PIXIApp.html b/doc/out/PIXIApp.html index 433900e..fcbc3a9 100644 --- a/doc/out/PIXIApp.html +++ b/doc/out/PIXIApp.html @@ -5745,7 +5745,7 @@ rejected with an error.
      diff --git a/doc/out/Popup.html b/doc/out/Popup.html index 4cbc968..56f368a 100644 --- a/doc/out/Popup.html +++ b/doc/out/Popup.html @@ -2338,7 +2338,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/PopupInteractivePopup.html b/doc/out/PopupInteractivePopup.html index 4a54afe..313c7dc 100644 --- a/doc/out/PopupInteractivePopup.html +++ b/doc/out/PopupInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenu.html b/doc/out/PopupMenu.html index b4d92dc..da8b85b 100644 --- a/doc/out/PopupMenu.html +++ b/doc/out/PopupMenu.html @@ -2392,7 +2392,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/PopupMenuPopupInteractivePopup.html b/doc/out/PopupMenuPopupInteractivePopup.html index 1c78dff..d1bf56f 100644 --- a/doc/out/PopupMenuPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html b/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html index 3f2d007..7c10884 100644 --- a/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html b/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html index 8f5a7cf..d7e1f90 100644 --- a/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenuPopupPopupInteractivePopup.html b/doc/out/PopupMenuPopupPopupInteractivePopup.html index d9f8e47..e52e03a 100644 --- a/doc/out/PopupMenuPopupPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupPopupInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupPopupInteractivePopup.html b/doc/out/PopupPopupInteractivePopup.html index 074ae22..59c7c3b 100644 --- a/doc/out/PopupPopupInteractivePopup.html +++ b/doc/out/PopupPopupInteractivePopup.html @@ -1791,7 +1791,7 @@ like Popup, Message...

      diff --git a/doc/out/Progress.html b/doc/out/Progress.html index ebaed92..4761562 100644 --- a/doc/out/Progress.html +++ b/doc/out/Progress.html @@ -2877,7 +2877,7 @@ app.scene.addChild(progress)
      diff --git a/doc/out/Scrollview.html b/doc/out/Scrollview.html index 30b9589..fa58a7a 100644 --- a/doc/out/Scrollview.html +++ b/doc/out/Scrollview.html @@ -1709,7 +1709,7 @@ app.loader
      diff --git a/doc/out/Slider.html b/doc/out/Slider.html index d9115e2..2bee9df 100644 --- a/doc/out/Slider.html +++ b/doc/out/Slider.html @@ -2968,7 +2968,7 @@ app.scene.addChild(slider)
      diff --git a/doc/out/Switch.html b/doc/out/Switch.html index bbdfc6e..cf4e7d6 100644 --- a/doc/out/Switch.html +++ b/doc/out/Switch.html @@ -3398,7 +3398,7 @@ app.scene.addChild(switch1)
      diff --git a/doc/out/TextLabel.TextLabel.html b/doc/out/TextLabel.TextLabel.html index a3c69d1..6b45046 100644 --- a/doc/out/TextLabel.TextLabel.html +++ b/doc/out/TextLabel.TextLabel.html @@ -1692,7 +1692,7 @@
      diff --git a/doc/out/Theme.html b/doc/out/Theme.html index aa87533..cd8b856 100644 --- a/doc/out/Theme.html +++ b/doc/out/Theme.html @@ -3167,7 +3167,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/ThemeDark.html b/doc/out/ThemeDark.html index 3bc0ba5..79fdda2 100644 --- a/doc/out/ThemeDark.html +++ b/doc/out/ThemeDark.html @@ -1588,7 +1588,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/ThemeLight.html b/doc/out/ThemeLight.html index a28f73e..f6915cd 100644 --- a/doc/out/ThemeLight.html +++ b/doc/out/ThemeLight.html @@ -1600,7 +1600,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/ThemeRed.html b/doc/out/ThemeRed.html index 7973730..f824138 100644 --- a/doc/out/ThemeRed.html +++ b/doc/out/ThemeRed.html @@ -1600,7 +1600,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/TileQuadNode.html b/doc/out/TileQuadNode.html index f9a246e..b7b5110 100644 --- a/doc/out/TileQuadNode.html +++ b/doc/out/TileQuadNode.html @@ -2052,7 +2052,7 @@ an indicator of tiles to free.

      diff --git a/doc/out/Tooltip.html b/doc/out/Tooltip.html index ee4a325..339ee94 100644 --- a/doc/out/Tooltip.html +++ b/doc/out/Tooltip.html @@ -2514,7 +2514,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/UITest.html b/doc/out/UITest.html index f3cae66..5bac7f0 100644 --- a/doc/out/UITest.html +++ b/doc/out/UITest.html @@ -4185,7 +4185,7 @@ test.start()
      diff --git a/doc/out/Volatile.html b/doc/out/Volatile.html index 499b324..241bb19 100644 --- a/doc/out/Volatile.html +++ b/doc/out/Volatile.html @@ -2101,7 +2101,7 @@ app.scene.addChild(button)
      diff --git a/doc/out/global.html b/doc/out/global.html index cd78fc0..085c1ee 100644 --- a/doc/out/global.html +++ b/doc/out/global.html @@ -3322,7 +3322,7 @@
      diff --git a/doc/out/index.html b/doc/out/index.html index c28271b..0cd30e1 100644 --- a/doc/out/index.html +++ b/doc/out/index.html @@ -1487,7 +1487,7 @@
      diff --git a/doc/out/pixi_abstractpopup.js.html b/doc/out/pixi_abstractpopup.js.html index c058bc9..14768f3 100644 --- a/doc/out/pixi_abstractpopup.js.html +++ b/doc/out/pixi_abstractpopup.js.html @@ -1810,7 +1810,7 @@ export default class AbstractPopup extends PIXI.Graphics {
      diff --git a/doc/out/pixi_app.js.html b/doc/out/pixi_app.js.html index 1a4def3..b7dc801 100644 --- a/doc/out/pixi_app.js.html +++ b/doc/out/pixi_app.js.html @@ -2191,7 +2191,7 @@ class FpsDisplay extends PIXI.Graphics {
      diff --git a/doc/out/pixi_badge.js.html b/doc/out/pixi_badge.js.html index f26bae8..f4333e6 100644 --- a/doc/out/pixi_badge.js.html +++ b/doc/out/pixi_badge.js.html @@ -1571,7 +1571,7 @@ export default class Badge extends AbstractPopup {
      diff --git a/doc/out/pixi_blurfilter.js.html b/doc/out/pixi_blurfilter.js.html index 4662a3a..d67139b 100644 --- a/doc/out/pixi_blurfilter.js.html +++ b/doc/out/pixi_blurfilter.js.html @@ -1729,7 +1729,7 @@ class TiltShiftYFilter extends TiltShiftAxisFilter {
      diff --git a/doc/out/pixi_button.js.html b/doc/out/pixi_button.js.html index 774da58..bc9063d 100644 --- a/doc/out/pixi_button.js.html +++ b/doc/out/pixi_button.js.html @@ -2153,7 +2153,7 @@ export default class Button extends PIXI.Container {
      diff --git a/doc/out/pixi_buttongroup.js.html b/doc/out/pixi_buttongroup.js.html index ddd859d..945ebeb 100644 --- a/doc/out/pixi_buttongroup.js.html +++ b/doc/out/pixi_buttongroup.js.html @@ -2029,15 +2029,24 @@ export default class ButtonGroup extends PIXI.Container { // z-index sorted .sort((a, b) => { - const distanceA = Math.abs(a.x - center) - const distanceB = Math.abs(b.x - center) - if (distanceA < distanceB) { - return 1 - } else if (distanceA > distanceB) { - return -1 - } else { - return 0 + const centerA = a.x + a.button.width / 2 + const centerB = b.x + b.button.width / 2 + + if (centerA < center && centerB < center) { + if (a.x < b.x) { + return -1 + } else if (b.x < a.x) { + return 1 + } + } else if (centerA > center && centerB > center) { + if (a.x + a.button.width > b.x + b.button.width) { + return -1 + } else if (b.x + b.button.width < a.x + a.button.x) { + return 1 + } } + + return 0 }) .forEach(it => it.parent.addChild(it)) } @@ -2077,15 +2086,24 @@ export default class ButtonGroup extends PIXI.Container { // z-index sorted .sort((a, b) => { - const distanceA = Math.abs(a.y - center) - const distanceB = Math.abs(b.y - center) - if (distanceA < distanceB) { - return 1 - } else if (distanceA > distanceB) { - return -1 - } else { - return 0 + const centerA = a.y + a.button.height / 2 + const centerB = b.y + b.button.height / 2 + + if (centerA < center && centerB < center) { + if (a.y < b.y) { + return -1 + } else if (b.y < a.y) { + return 1 + } + } else if (centerA > center && centerB > center) { + if (a.y + a.button.height > b.y + b.button.height) { + return -1 + } else if (b.y + b.button.height < a.y + a.button.y) { + return 1 + } } + + return 0 }) .forEach(it => it.parent.addChild(it)) } @@ -2103,7 +2121,7 @@ export default class ButtonGroup extends PIXI.Container {
      diff --git a/doc/out/pixi_deepzoom_image.js.html b/doc/out/pixi_deepzoom_image.js.html index cf42d7f..2e05ac2 100644 --- a/doc/out/pixi_deepzoom_image.js.html +++ b/doc/out/pixi_deepzoom_image.js.html @@ -2553,7 +2553,7 @@ export class DeepZoomImage extends PIXI.Container {
      diff --git a/doc/out/pixi_flippable.js.html b/doc/out/pixi_flippable.js.html index 2c0699d..8e00349 100644 --- a/doc/out/pixi_flippable.js.html +++ b/doc/out/pixi_flippable.js.html @@ -1908,7 +1908,7 @@ export default class Flippable extends PIXI.projection.Camera3d {
      diff --git a/doc/out/pixi_labeledgraphics.js.html b/doc/out/pixi_labeledgraphics.js.html index d8055ad..7a30599 100644 --- a/doc/out/pixi_labeledgraphics.js.html +++ b/doc/out/pixi_labeledgraphics.js.html @@ -1857,7 +1857,7 @@ export class BitmapLabeledGraphics extends LabeledGraphics {
      diff --git a/doc/out/pixi_list.js.html b/doc/out/pixi_list.js.html index cb1e124..e73637b 100644 --- a/doc/out/pixi_list.js.html +++ b/doc/out/pixi_list.js.html @@ -1836,7 +1836,7 @@ export default class List extends PIXI.Container {
      diff --git a/doc/out/pixi_message.js.html b/doc/out/pixi_message.js.html index b047784..38287a9 100644 --- a/doc/out/pixi_message.js.html +++ b/doc/out/pixi_message.js.html @@ -1585,7 +1585,7 @@ export default class Message extends InteractivePopup {
      diff --git a/doc/out/pixi_modal.js.html b/doc/out/pixi_modal.js.html index a9ef14d..0cd78fd 100644 --- a/doc/out/pixi_modal.js.html +++ b/doc/out/pixi_modal.js.html @@ -1666,7 +1666,7 @@ export default class Modal extends PIXI.Container {
      diff --git a/doc/out/pixi_popup.js.html b/doc/out/pixi_popup.js.html index f22c6ca..a87b858 100644 --- a/doc/out/pixi_popup.js.html +++ b/doc/out/pixi_popup.js.html @@ -1676,7 +1676,7 @@ export default class Popup extends InteractivePopup {
      diff --git a/doc/out/pixi_popupmenu.js.html b/doc/out/pixi_popupmenu.js.html index 739f6be..386d3a7 100644 --- a/doc/out/pixi_popupmenu.js.html +++ b/doc/out/pixi_popupmenu.js.html @@ -1579,7 +1579,7 @@ export default class PopupMenu extends Popup {
      diff --git a/doc/out/pixi_progress.js.html b/doc/out/pixi_progress.js.html index a7b94df..31697e6 100644 --- a/doc/out/pixi_progress.js.html +++ b/doc/out/pixi_progress.js.html @@ -1761,7 +1761,7 @@ export default class Progress extends PIXI.Container {
      diff --git a/doc/out/pixi_scrollview.js.html b/doc/out/pixi_scrollview.js.html index 508015f..f76ebfc 100644 --- a/doc/out/pixi_scrollview.js.html +++ b/doc/out/pixi_scrollview.js.html @@ -1520,7 +1520,7 @@ export default class Scrollview extends Scrollbox {
      diff --git a/doc/out/pixi_slider.js.html b/doc/out/pixi_slider.js.html index 8d518b1..ef438c3 100644 --- a/doc/out/pixi_slider.js.html +++ b/doc/out/pixi_slider.js.html @@ -1925,7 +1925,7 @@ export default class Slider extends PIXI.Container {
      diff --git a/doc/out/pixi_switch.js.html b/doc/out/pixi_switch.js.html index 36e298a..9bcbfbc 100644 --- a/doc/out/pixi_switch.js.html +++ b/doc/out/pixi_switch.js.html @@ -1979,7 +1979,7 @@ export default class Switch extends PIXI.Container {
      diff --git a/doc/out/pixi_theme.js.html b/doc/out/pixi_theme.js.html index d21be7c..446c2ee 100644 --- a/doc/out/pixi_theme.js.html +++ b/doc/out/pixi_theme.js.html @@ -1720,7 +1720,7 @@ export class ThemeRed extends Theme {
      diff --git a/doc/out/pixi_tooltip.js.html b/doc/out/pixi_tooltip.js.html index 3017945..e31ed30 100644 --- a/doc/out/pixi_tooltip.js.html +++ b/doc/out/pixi_tooltip.js.html @@ -1613,7 +1613,7 @@ export default class Tooltip extends AbstractPopup {
      diff --git a/doc/out/pixi_volatile.js.html b/doc/out/pixi_volatile.js.html index 76b6af3..879319a 100644 --- a/doc/out/pixi_volatile.js.html +++ b/doc/out/pixi_volatile.js.html @@ -1617,7 +1617,7 @@ export default class Volatile {
      diff --git a/doc/out/uitest.js.html b/doc/out/uitest.js.html index 78efbc8..e585274 100644 --- a/doc/out/uitest.js.html +++ b/doc/out/uitest.js.html @@ -2468,7 +2468,7 @@ class Event {
      diff --git a/lib/pixi/buttongroup.html b/lib/pixi/buttongroup.html index 233061b..3c5a786 100644 --- a/lib/pixi/buttongroup.html +++ b/lib/pixi/buttongroup.html @@ -303,12 +303,33 @@ const buttonGroup17 = new ButtonGroup({ app }) +const buttonGroup18 = new ButtonGroup({ + x: 10, + y: 1340, + buttons: [ + {label: 'move'}, + {label: 'explanation dried'}, + {label: 'out catch'}, + {label: 'late either'}, + {label: 'tell pour'}, + {label: 'willing apart airplane'}, + {label: 'high war'}, + {label: 'future struck'}, + {label: 'sense image'}, + {label: 'never'}, + {label: 'mark cloth'}, + {label: 'everywhere due large'} + ], + maxWidth: 500, + app +}) + app.scene.addChild(buttonGroup1, buttonGroup2, buttonGroup3) app.scene.addChild(buttonGroup4) app.scene.addChild(buttonGroup5, buttonGroup6) app.scene.addChild(buttonGroup7, buttonGroup8) app.scene.addChild(buttonGroup9, buttonGroup10, buttonGroup11, buttonGroup12, buttonGroup13) -app.scene.addChild(buttonGroup14, buttonGroup15, buttonGroup16, buttonGroup17) +app.scene.addChild(buttonGroup14, buttonGroup15, buttonGroup16, buttonGroup17, buttonGroup18) diff --git a/lib/pixi/buttongroup.js b/lib/pixi/buttongroup.js index e5a8824..1c0f728 100644 --- a/lib/pixi/buttongroup.js +++ b/lib/pixi/buttongroup.js @@ -581,15 +581,24 @@ export default class ButtonGroup extends PIXI.Container { // z-index sorted .sort((a, b) => { - const distanceA = Math.abs(a.x - center) - const distanceB = Math.abs(b.x - center) - if (distanceA < distanceB) { - return 1 - } else if (distanceA > distanceB) { - return -1 - } else { - return 0 + const centerA = a.x + a.button.width / 2 + const centerB = b.x + b.button.width / 2 + + if (centerA < center && centerB < center) { + if (a.x < b.x) { + return -1 + } else if (b.x < a.x) { + return 1 + } + } else if (centerA > center && centerB > center) { + if (a.x + a.button.width > b.x + b.button.width) { + return -1 + } else if (b.x + b.button.width < a.x + a.button.x) { + return 1 + } } + + return 0 }) .forEach(it => it.parent.addChild(it)) } @@ -629,15 +638,24 @@ export default class ButtonGroup extends PIXI.Container { // z-index sorted .sort((a, b) => { - const distanceA = Math.abs(a.y - center) - const distanceB = Math.abs(b.y - center) - if (distanceA < distanceB) { - return 1 - } else if (distanceA > distanceB) { - return -1 - } else { - return 0 + const centerA = a.y + a.button.height / 2 + const centerB = b.y + b.button.height / 2 + + if (centerA < center && centerB < center) { + if (a.y < b.y) { + return -1 + } else if (b.y < a.y) { + return 1 + } + } else if (centerA > center && centerB > center) { + if (a.y + a.button.height > b.y + b.button.height) { + return -1 + } else if (b.y + b.button.height < a.y + a.button.y) { + return 1 + } } + + return 0 }) .forEach(it => it.parent.addChild(it)) } From 1e3f66bb195dd2aff3bfbf9ea139f6072a4659e5 Mon Sep 17 00:00:00 2001 From: Sebastian Kupke Date: Thu, 1 Aug 2019 14:27:04 +0200 Subject: [PATCH 11/30] Fixed button hover bug. --- dist/iwmlib.pixi.js | 20 +++++++++++++------- lib/pixi/button.js | 20 +++++++++++++------- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/dist/iwmlib.pixi.js b/dist/iwmlib.pixi.js index 83f6fdd..b6dbb3c 100644 --- a/dist/iwmlib.pixi.js +++ b/dist/iwmlib.pixi.js @@ -2482,13 +2482,11 @@ this.capture(e); }); - this.button.on('pointerout', e => { - this.capture(e); - TweenLite.to([this.button, this.content], this.theme.fast, { - alpha: 1, - overwrite: 'none' - }); - }); + this.button.on('pointerout', this.onEnd.bind(this)); + this.button.on('pointercancel', this.onEnd.bind(this)); + this.button.on('pointerupoutside', this.onEnd.bind(this)); + this.button.on('pointertap', this.onEnd.bind(this)); + this.button.on('scroll', this.onEnd.bind(this)); // eslint-disable-next-line no-unused-vars this.button.on('pointerdown', e => { @@ -2921,6 +2919,14 @@ this.icon.tint = value; } } + + onEnd(event) { + this.capture(event); + TweenLite.to([this.button, this.content], this.theme.fast, { + alpha: 1, + overwrite: 'none' + }); + } } /* globals ThrowPropsPlugin, Strong */ diff --git a/lib/pixi/button.js b/lib/pixi/button.js index f56a851..e414988 100644 --- a/lib/pixi/button.js +++ b/lib/pixi/button.js @@ -252,13 +252,11 @@ export default class Button extends PIXI.Container { this.capture(e) }) - this.button.on('pointerout', e => { - this.capture(e) - TweenLite.to([this.button, this.content], this.theme.fast, { - alpha: 1, - overwrite: 'none' - }) - }) + this.button.on('pointerout', this.onEnd.bind(this)) + this.button.on('pointercancel', this.onEnd.bind(this)) + this.button.on('pointerupoutside', this.onEnd.bind(this)) + this.button.on('pointertap', this.onEnd.bind(this)) + this.button.on('scroll', this.onEnd.bind(this)) // eslint-disable-next-line no-unused-vars this.button.on('pointerdown', e => { @@ -691,4 +689,12 @@ export default class Button extends PIXI.Container { this.icon.tint = value } } + + onEnd(event) { + this.capture(event) + TweenLite.to([this.button, this.content], this.theme.fast, { + alpha: 1, + overwrite: 'none' + }) + } } From db2badfc0d45a98b642b1448da82a40cb64b5188 Mon Sep 17 00:00:00 2001 From: Uwe Oestermeier Date: Thu, 1 Aug 2019 19:30:07 +0200 Subject: [PATCH 12/30] Added event parameter, --- css/highlight.css | 2 -- dist/iwmlib.js | 44 ++++++++++++++++++++++++++------------------ dist/iwmlib.pixi.js | 4 ++++ lib/popup.js | 10 +++++++--- 4 files changed, 37 insertions(+), 23 deletions(-) diff --git a/css/highlight.css b/css/highlight.css index 2a04689..63db9c3 100644 --- a/css/highlight.css +++ b/css/highlight.css @@ -4,8 +4,6 @@ circle { stroke-width: 8px; } - - mask circle { stroke-width: 0; fill: white; diff --git a/dist/iwmlib.js b/dist/iwmlib.js index b000db8..8242442 100644 --- a/dist/iwmlib.js +++ b/dist/iwmlib.js @@ -2621,6 +2621,8 @@ onMouseWheel(event) { if (this.capture(event) && this.target.onMouseWheel) { this.target.onMouseWheel(event); + } else { + //console.warn('Target has no onMouseWheel callback') } } @@ -2830,6 +2832,8 @@ } if (this.target.onMouseWheel) { this.target.onMouseWheel(event); + } else { + //console.warn('Target has no onMouseWheel callback', this.target) } } } @@ -5464,6 +5468,8 @@ Poppable.registrations = new Map(); + /* eslint-disable no-console */ + /** A Popup that shows text labels, images, or html */ class Popup$1 extends Poppable { @@ -5645,6 +5651,7 @@ } for (let key in content) { + console.log('using', key, this.loaded); switch (key) { case 'selector': break @@ -5756,7 +5763,7 @@ handleClose(e) { let closing = this.closingEvent(e); if (closing) { - this.close(); + this.close(e); } else { this.setupCloseHandler(); } @@ -5886,11 +5893,11 @@ /** Close and remove the Popup from the DOM tree. */ - close() { + close(event) { //console.log("Popup.close", this.closeCommand) this.unregister(this.context); if (this.closeCommand) { - this.closeCommand(this, () => this.remove()); + this.closeCommand(this, () => this.remove(), event); } else { this.remove(); } @@ -7984,6 +7991,8 @@ /** To avoid problems with relative URL paths, we use inline data URI to load svg icons. */ + const enableNearestNeighborTaps = false; + /** * A class that collects static methods to maintain the states and parts of * EyeVisit like cards. @@ -9452,6 +9461,16 @@ if (this.dynamicHeight) { article.appendChild(iconClone); } + + if (enableNearestNeighborTaps) { + //look for nearby popups on tap + InteractionMapper.on('tap', indexbox, () => { + console.log('Tap handler called', editable); + if (!editable) { + this.findNearbyPopups(event, card); + } + }); + } // Use the 'tap' event for closing. // Otherwise the subcard cannot be closed, // when another subcard is touched. @@ -10137,7 +10156,6 @@ } /* eslint-disable no-console */ - /* global TweenLite */ let _HighlightEnabled = true; let _CircleIds = 0; @@ -10356,14 +10374,14 @@ return } let image = svgRoot.querySelector('image'); - + // eslint-disable-next-line no-unused-vars let [mask, maskImage] = Highlight$1._getSVGMask(target, { svgRoot, image }); let center = Highlight$1._calculateCenterRelativeTo(target, image); - console.log("_calculateCenterRelativeTo", center); + console.log('_calculateCenterRelativeTo', center); TweenLite.set(maskImage, { transformOrigin: `${center.x} ${center.y}` }); @@ -10379,7 +10397,7 @@ } static toggleHighlight(node) { - console.log("toggleHighlight", Highlight$1._isExpanded(node)); + console.log('toggleHighlight', Highlight$1._isExpanded(node)); if (Highlight$1._isExpanded(node)) { Highlight$1.closeHighlight(node); } else { @@ -10506,18 +10524,8 @@ return target.classList.contains(Highlight$1.expandedClass) } - static _setExpanded(target) { - target.classList.add(Highlight$1.expandedClass); - } - - static _notExpanded(target) { - target.classList.remove(Highlight$1.expandedClass); - } - static closeHighlight(target, { animation = 0.5 } = {}) { - - Highlight$1._notExpanded(target); - + target.classList.remove(Highlight$1.expandedClass); // eslint-disable-next-line no-unused-vars let [mask, maskImage] = Highlight$1._getSVGMask(target); console.log('Close Highlight', maskImage); diff --git a/dist/iwmlib.pixi.js b/dist/iwmlib.pixi.js index 96f3428..6e0ee75 100644 --- a/dist/iwmlib.pixi.js +++ b/dist/iwmlib.pixi.js @@ -6042,6 +6042,8 @@ onMouseWheel(event) { if (this.capture(event) && this.target.onMouseWheel) { this.target.onMouseWheel(event); + } else { + //console.warn('Target has no onMouseWheel callback') } } @@ -6251,6 +6253,8 @@ } if (this.target.onMouseWheel) { this.target.onMouseWheel(event); + } else { + //console.warn('Target has no onMouseWheel callback', this.target) } } } diff --git a/lib/popup.js b/lib/popup.js index b80f04e..1bd6489 100644 --- a/lib/popup.js +++ b/lib/popup.js @@ -1,3 +1,6 @@ +/* eslint-disable no-console */ +/* eslint-disable no-case-declarations */ +/* eslint-disable no-unused-vars */ import { Elements } from './utils.js' import Poppable from './poppable.js' @@ -182,6 +185,7 @@ export default class Popup extends Poppable { } for (let key in content) { + console.log('using', key, this.loaded) switch (key) { case 'selector': break @@ -293,7 +297,7 @@ export default class Popup extends Poppable { handleClose(e) { let closing = this.closingEvent(e) if (closing) { - this.close() + this.close(e) } else { this.setupCloseHandler() } @@ -423,11 +427,11 @@ export default class Popup extends Poppable { /** Close and remove the Popup from the DOM tree. */ - close() { + close(event) { //console.log("Popup.close", this.closeCommand) this.unregister(this.context) if (this.closeCommand) { - this.closeCommand(this, () => this.remove()) + this.closeCommand(this, () => this.remove(), event) } else { this.remove() } From 488c1807d6f53cc779007012304798de492d72db Mon Sep 17 00:00:00 2001 From: Uwe Oestermeier Date: Thu, 1 Aug 2019 19:34:32 +0200 Subject: [PATCH 13/30] Improved card API. --- dist/iwmlib.js | 69 ++++++++++++++++++++++++++++++++++----------- dist/iwmlib.pixi.js | 4 +++ lib/card/card.js | 53 +++++++++++++++++++++++----------- lib/card/index.html | 6 ++-- 4 files changed, 97 insertions(+), 35 deletions(-) diff --git a/dist/iwmlib.js b/dist/iwmlib.js index 3cd4f82..f4d2426 100644 --- a/dist/iwmlib.js +++ b/dist/iwmlib.js @@ -2480,6 +2480,8 @@ onMouseWheel(event) { if (this.capture(event) && this.target.onMouseWheel) { this.target.onMouseWheel(event); + } else { + //console.warn('Target has no onMouseWheel callback') } } @@ -2683,6 +2685,8 @@ } if (this.target.onMouseWheel) { this.target.onMouseWheel(event); + } else { + //console.warn('Target has no onMouseWheel callback', this.target) } } } @@ -7602,6 +7606,8 @@ /** To avoid problems with relative URL paths, we use inline data URI to load svg icons. */ + const enableNearestNeighborTaps = false; + /** * A class that collects static methods to maintain the states and parts of * EyeVisit like cards. @@ -8225,6 +8231,23 @@ return requestedSame } + static _calculateCenterRelativeTo(target, image) { + console.log("_calculateCenterRelativeTo", target, image); + let bbox = image.getBBox(); + let width = bbox.width; + let height = bbox.height; + let cx = target.getAttribute('cx'); + let cy = target.getAttribute('cy'); + let r = target.getAttribute('r'); + let radius = r.endsWith('%') ? (parseFloat(r) / 100) * width : parseFloat(r); + + + let x = cx.endsWith('%') ? (parseFloat(cx) / 100) * width : cx; + let y = cy.endsWith('%') ? (parseFloat(cy) / 100) * height : cx; + console.log({x, y, width, height , radius}); + return { x, y } + } + /** * Opens a popup for a highlight. Typically used as a onlick handler of a link. * @@ -8233,14 +8256,16 @@ * @returns {bool} false - Returns false to prevent default click action * @memberof Card */ - static loadHighlightPopup(event) { - if (this.debug) console.log('Load Highlight Popup: ', event); - let node; - if (event.firstTarget) { - node = event.firstTarget; - } else { - node = event.target; + static loadHighlightPopup(event, node=null) { + if (this.debug) console.log('Card.loadHighlightPopup', event, node); + if (node == null) { + if (event.firstTarget) { + node = event.firstTarget; + } else { + node = event.target; + } } + let context = this.getContext(node); event.stopPropagation(); @@ -8259,27 +8284,29 @@ animation: Card.highlightAnimation, onExpanded: () => { // We assume it's always a circle. This may break, when other svg shapes are used. - let x = node.getAttribute('cx'); - let y = node.getAttribute('cy'); - let position = { x, y }; - - let radius = parseFloat(node.getAttribute('r')); + + let svgRoot = node.closest('svg'); + let image = svgRoot.querySelector('image'); + let position = Card._calculateCenterRelativeTo(node, image); + /* As the popup is appended directly to the card. We have to transform the location from the subcard-/svg-space to the card space. */ - let svgRoot = node.closest('svg'); + // let svgRoot = node.closest('svg') let svgPoint = svgRoot.createSVGPoint(); svgPoint.x = position.x; - svgPoint.y = position.y - radius; + svgPoint.y = position.y; let matrix = node.getCTM(); let point = svgPoint.matrixTransform(matrix); - let global = Points.fromNodeToPage(node.closest('div'), point); + let closestDiv = node.closest('div'); + console.log("closestDiv", closestDiv, point); + let global = Points.fromNodeToPage(closestDiv, point); let local = Points.fromPageToNode(context, global); let overlay = document.createElement('div'); @@ -8290,7 +8317,7 @@ // we could load the data while the circle is animating. // but for simplicity it's just done here for now. // TODO: Adjust to load while animating (Problem: Unload when cancelled). - console.log(src); + console.log("loadHighlightPopup", src, position, local); this._loadPopupContent(src) .then(content => { this._openPopup(context, src, local, content, { @@ -8985,6 +9012,16 @@ if (this.dynamicHeight) { article.appendChild(iconClone); } + + if (enableNearestNeighborTaps) { + //look for nearby popups on tap + InteractionMapper.on('tap', indexbox, () => { + console.log('Tap handler called', editable); + if (!editable) { + this.findNearbyPopups(event, card); + } + }); + } // Use the 'tap' event for closing. // Otherwise the subcard cannot be closed, // when another subcard is touched. diff --git a/dist/iwmlib.pixi.js b/dist/iwmlib.pixi.js index cf723d0..787e827 100644 --- a/dist/iwmlib.pixi.js +++ b/dist/iwmlib.pixi.js @@ -6011,6 +6011,8 @@ onMouseWheel(event) { if (this.capture(event) && this.target.onMouseWheel) { this.target.onMouseWheel(event); + } else { + //console.warn('Target has no onMouseWheel callback') } } @@ -6214,6 +6216,8 @@ } if (this.target.onMouseWheel) { this.target.onMouseWheel(event); + } else { + //console.warn('Target has no onMouseWheel callback', this.target) } } } diff --git a/lib/card/card.js b/lib/card/card.js index 30a7b4c..0d8f7ac 100644 --- a/lib/card/card.js +++ b/lib/card/card.js @@ -645,6 +645,23 @@ export default class Card { return requestedSame } + static _calculateCenterRelativeTo(target, image) { + console.log("_calculateCenterRelativeTo", target, image) + let bbox = image.getBBox() + let width = bbox.width + let height = bbox.height + let cx = target.getAttribute('cx') + let cy = target.getAttribute('cy') + let r = target.getAttribute('r') + let radius = r.endsWith('%') ? (parseFloat(r) / 100) * width : parseFloat(r) + + + let x = cx.endsWith('%') ? (parseFloat(cx) / 100) * width : cx + let y = cy.endsWith('%') ? (parseFloat(cy) / 100) * height : cx + console.log({x, y, width, height , radius}) + return { x, y } + } + /** * Opens a popup for a highlight. Typically used as a onlick handler of a link. * @@ -653,14 +670,16 @@ export default class Card { * @returns {bool} false - Returns false to prevent default click action * @memberof Card */ - static loadHighlightPopup(event) { - if (this.debug) console.log('Load Highlight Popup: ', event) - let node - if (event.firstTarget) { - node = event.firstTarget - } else { - node = event.target + static loadHighlightPopup(event, node=null) { + if (this.debug) console.log('Card.loadHighlightPopup', event, node) + if (node == null) { + if (event.firstTarget) { + node = event.firstTarget + } else { + node = event.target + } } + let context = this.getContext(node) event.stopPropagation() @@ -679,27 +698,29 @@ export default class Card { animation: Card.highlightAnimation, onExpanded: () => { // We assume it's always a circle. This may break, when other svg shapes are used. - let x = node.getAttribute('cx') - let y = node.getAttribute('cy') - let position = { x, y } - - let radius = parseFloat(node.getAttribute('r')) + + let svgRoot = node.closest('svg') + let image = svgRoot.querySelector('image') + let position = Card._calculateCenterRelativeTo(node, image) + /* As the popup is appended directly to the card. We have to transform the location from the subcard-/svg-space to the card space. */ - let svgRoot = node.closest('svg') + // let svgRoot = node.closest('svg') let svgPoint = svgRoot.createSVGPoint() svgPoint.x = position.x - svgPoint.y = position.y - radius + svgPoint.y = position.y let matrix = node.getCTM() let point = svgPoint.matrixTransform(matrix) - let global = Points.fromNodeToPage(node.closest('div'), point) + let closestDiv = node.closest('div') + console.log("closestDiv", closestDiv, point) + let global = Points.fromNodeToPage(closestDiv, point) let local = Points.fromPageToNode(context, global) let overlay = document.createElement('div') @@ -710,7 +731,7 @@ export default class Card { // we could load the data while the circle is animating. // but for simplicity it's just done here for now. // TODO: Adjust to load while animating (Problem: Unload when cancelled). - console.log(src) + console.log("loadHighlightPopup", src, position, local) this._loadPopupContent(src) .then(content => { this._openPopup(context, src, local, content, { diff --git a/lib/card/index.html b/lib/card/index.html index 5e4e7e4..0cafbe1 100644 --- a/lib/card/index.html +++ b/lib/card/index.html @@ -71,7 +71,7 @@ - @@ -96,8 +96,8 @@ const wrapper2 = new CardWrapper(demoCardWithSelector) wrapper2.handleClicksAsTaps() - wrapper2.onTap('circle', event => { - Card.loadHighlightPopup(event) + wrapper2.onTap('circle', (event, node) => { + Card.loadHighlightPopup(event, node) }) wrapper2.onTap('a', event => { From e8a64fb014cc065b2558c6a8c76b0490da7baa58 Mon Sep 17 00:00:00 2001 From: Sebastian Kupke Date: Fri, 2 Aug 2019 10:15:49 +0200 Subject: [PATCH 14/30] Added getter and setter for maxWidth and maxHeight for button groups. --- dist/iwmlib.js | 16 --- dist/iwmlib.pixi.js | 32 ++++- doc/out/AbstractPopup.html | 6 +- doc/out/Badge.html | 6 +- doc/out/BlurFilter.html | 6 +- doc/out/Button.html | 12 +- doc/out/ButtonGroup.html | 120 +++++++++++++++++- doc/out/DeepZoomImage.html | 6 +- doc/out/DeepZoomInfo.html | 6 +- doc/out/Flippable.html | 6 +- doc/out/FontInfo.html | 6 +- doc/out/Hypenate.html | 6 +- doc/out/InteractivePopup.html | 6 +- ...beledGraphics.exports.LabeledGraphics.html | 6 +- doc/out/LabeledGraphics.html | 6 +- doc/out/List.html | 6 +- doc/out/Message.html | 6 +- doc/out/MessageInteractivePopup.html | 6 +- doc/out/MessageMessageInteractivePopup.html | 6 +- doc/out/Modal.html | 6 +- doc/out/ModalInteractivePopup.html | 6 +- doc/out/ModalModalInteractivePopup.html | 6 +- doc/out/PIXIApp.html | 6 +- doc/out/Popup.html | 6 +- doc/out/PopupInteractivePopup.html | 6 +- doc/out/PopupMenu.html | 6 +- doc/out/PopupMenuPopupInteractivePopup.html | 6 +- ...pupMenuPopupMenuPopupInteractivePopup.html | 6 +- ...nuPopupMenuPopupPopupInteractivePopup.html | 6 +- .../PopupMenuPopupPopupInteractivePopup.html | 6 +- doc/out/PopupPopupInteractivePopup.html | 6 +- doc/out/Progress.html | 6 +- doc/out/Scrollview.html | 6 +- doc/out/Slider.html | 6 +- doc/out/Switch.html | 6 +- doc/out/TextLabel.TextLabel.html | 6 +- doc/out/Theme.html | 6 +- doc/out/ThemeDark.html | 6 +- doc/out/ThemeLight.html | 6 +- doc/out/ThemeRed.html | 6 +- doc/out/TileQuadNode.html | 6 +- doc/out/Tooltip.html | 6 +- doc/out/UITest.html | 6 +- doc/out/Volatile.html | 6 +- doc/out/global.html | 6 +- doc/out/index.html | 6 +- doc/out/pixi_abstractpopup.js.html | 6 +- doc/out/pixi_app.js.html | 6 +- doc/out/pixi_badge.js.html | 6 +- doc/out/pixi_blurfilter.js.html | 6 +- doc/out/pixi_button.js.html | 26 ++-- doc/out/pixi_buttongroup.js.html | 34 ++++- doc/out/pixi_deepzoom_image.js.html | 6 +- doc/out/pixi_flippable.js.html | 6 +- doc/out/pixi_labeledgraphics.js.html | 6 +- doc/out/pixi_list.js.html | 6 +- doc/out/pixi_message.js.html | 6 +- doc/out/pixi_modal.js.html | 6 +- doc/out/pixi_popup.js.html | 6 +- doc/out/pixi_popupmenu.js.html | 6 +- doc/out/pixi_progress.js.html | 6 +- doc/out/pixi_scrollview.js.html | 6 +- doc/out/pixi_slider.js.html | 6 +- doc/out/pixi_switch.js.html | 6 +- doc/out/pixi_theme.js.html | 6 +- doc/out/pixi_tooltip.js.html | 6 +- doc/out/pixi_volatile.js.html | 6 +- doc/out/uitest.js.html | 6 +- lib/card/card.js | 18 ++- lib/pixi/button.js | 24 ++-- lib/pixi/buttongroup.js | 28 ++++ 71 files changed, 558 insertions(+), 124 deletions(-) diff --git a/dist/iwmlib.js b/dist/iwmlib.js index 414e534..9be616d 100644 --- a/dist/iwmlib.js +++ b/dist/iwmlib.js @@ -2480,8 +2480,6 @@ onMouseWheel(event) { if (this.capture(event) && this.target.onMouseWheel) { this.target.onMouseWheel(event); - } else { - //console.warn('Target has no onMouseWheel callback') } } @@ -2685,8 +2683,6 @@ } if (this.target.onMouseWheel) { this.target.onMouseWheel(event); - } else { - //console.warn('Target has no onMouseWheel callback', this.target) } } } @@ -7609,8 +7605,6 @@ /** To avoid problems with relative URL paths, we use inline data URI to load svg icons. */ - const enableNearestNeighborTaps = false; - /** * A class that collects static methods to maintain the states and parts of * EyeVisit like cards. @@ -9015,16 +9009,6 @@ if (this.dynamicHeight) { article.appendChild(iconClone); } - - if (enableNearestNeighborTaps) { - //look for nearby popups on tap - InteractionMapper.on('tap', indexbox, () => { - console.log('Tap handler called', editable); - if (!editable) { - this.findNearbyPopups(event, card); - } - }); - } // Use the 'tap' event for closing. // Otherwise the subcard cannot be closed, // when another subcard is touched. diff --git a/dist/iwmlib.pixi.js b/dist/iwmlib.pixi.js index ed5fc52..df57b22 100644 --- a/dist/iwmlib.pixi.js +++ b/dist/iwmlib.pixi.js @@ -3298,6 +3298,34 @@ this.buttons.forEach(it => (it.disabled = value)); } + /** + * Gets or sets the maximum width of the button group for stacking. Usefull when you want to resize the available space. + * + * @member {number} + */ + get maxWidth() { + return this.opts.maxWidth + } + + set maxWidth(value) { + this.opts.maxWidth = value; + this.layout(); + } + + /** + * Gets or sets the maximum height of the button group for stacking. Usefull when you want to resize the available space. + * + * @member {number} + */ + get maxHeight() { + return this.opts.maxHeight + } + + set maxHeight(value) { + this.opts.maxHeight = value; + this.layout(); + } + /** * Searches all buttons of the button group and returns the maximum width of one button. * @@ -6035,8 +6063,6 @@ onMouseWheel(event) { if (this.capture(event) && this.target.onMouseWheel) { this.target.onMouseWheel(event); - } else { - //console.warn('Target has no onMouseWheel callback') } } @@ -6240,8 +6266,6 @@ } if (this.target.onMouseWheel) { this.target.onMouseWheel(event); - } else { - //console.warn('Target has no onMouseWheel callback', this.target) } } } diff --git a/doc/out/AbstractPopup.html b/doc/out/AbstractPopup.html index 65a3bce..aec30eb 100644 --- a/doc/out/AbstractPopup.html +++ b/doc/out/AbstractPopup.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -2920,7 +2924,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/Badge.html b/doc/out/Badge.html index d82153d..3eaa314 100644 --- a/doc/out/Badge.html +++ b/doc/out/Badge.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -2376,7 +2380,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/BlurFilter.html b/doc/out/BlurFilter.html index 33f3d24..8de2d53 100644 --- a/doc/out/BlurFilter.html +++ b/doc/out/BlurFilter.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1800,7 +1804,7 @@ app.scene.filters = [blurFilter]
      diff --git a/doc/out/Button.html b/doc/out/Button.html index a2e0c16..e8a4231 100644 --- a/doc/out/Button.html +++ b/doc/out/Button.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -3501,7 +3505,7 @@ the tint property of the icon sprite.

      @@ -3606,7 +3610,7 @@ the tint property of the icon sprite.

      @@ -3711,7 +3715,7 @@ the tint property of the icon sprite.

      @@ -3818,7 +3822,7 @@ the tint property of the icon sprite.

      diff --git a/doc/out/ButtonGroup.html b/doc/out/ButtonGroup.html index 7d63851..7bd0e2e 100644 --- a/doc/out/ButtonGroup.html +++ b/doc/out/ButtonGroup.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -3005,6 +3009,108 @@ app.scene.addChild(buttonGroup) + + + + + + + + +
      +
      +

      + + maxHeight + number + + + + +

      +
      + + +
      +
      + +
      +

      Gets or sets the maximum height of the button group for stacking. Usefull when you want to resize the available space.

      +
      + + + +
      + + + + + + + + + + + + + + + + + + + +
      + + + +
      + + + +
      +
      +

      + + maxWidth + number + + + + +

      +
      + + +
      +
      + +
      +

      Gets or sets the maximum width of the button group for stacking. Usefull when you want to resize the available space.

      +
      + + + +
      + + + + + + + + + + + + + + + + + + +
      @@ -3035,7 +3141,7 @@ app.scene.addChild(buttonGroup) @@ -3107,7 +3213,7 @@ app.scene.addChild(buttonGroup) @@ -3179,7 +3285,7 @@ app.scene.addChild(buttonGroup) @@ -3303,7 +3409,7 @@ app.scene.addChild(buttonGroup) @@ -3513,7 +3619,7 @@ app.scene.addChild(buttonGroup) @@ -3618,7 +3724,7 @@ app.scene.addChild(buttonGroup) @@ -3692,7 +3798,7 @@ app.scene.addChild(buttonGroup)
      diff --git a/doc/out/DeepZoomImage.html b/doc/out/DeepZoomImage.html index f56db59..e0f0b4f 100644 --- a/doc/out/DeepZoomImage.html +++ b/doc/out/DeepZoomImage.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -5098,7 +5102,7 @@ i.e. after loading a single tile

      diff --git a/doc/out/DeepZoomInfo.html b/doc/out/DeepZoomInfo.html index 013f3c8..11f0c10 100644 --- a/doc/out/DeepZoomInfo.html +++ b/doc/out/DeepZoomInfo.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -2611,7 +2615,7 @@ on completion.

      diff --git a/doc/out/Flippable.html b/doc/out/Flippable.html index 601ecf3..dc76c84 100644 --- a/doc/out/Flippable.html +++ b/doc/out/Flippable.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -2514,7 +2518,7 @@ front.on('click', event => flippable.toggle())
      diff --git a/doc/out/FontInfo.html b/doc/out/FontInfo.html index 7b98696..c3fe6e4 100644 --- a/doc/out/FontInfo.html +++ b/doc/out/FontInfo.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1561,7 +1565,7 @@
      diff --git a/doc/out/Hypenate.html b/doc/out/Hypenate.html index cfeac6c..3b2556d 100644 --- a/doc/out/Hypenate.html +++ b/doc/out/Hypenate.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1763,7 +1767,7 @@
      diff --git a/doc/out/InteractivePopup.html b/doc/out/InteractivePopup.html index 5283cb4..626c0ef 100644 --- a/doc/out/InteractivePopup.html +++ b/doc/out/InteractivePopup.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -2345,7 +2349,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/LabeledGraphics.exports.LabeledGraphics.html b/doc/out/LabeledGraphics.exports.LabeledGraphics.html index e3ada67..8a62c1b 100644 --- a/doc/out/LabeledGraphics.exports.LabeledGraphics.html +++ b/doc/out/LabeledGraphics.exports.LabeledGraphics.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1563,7 +1567,7 @@
      diff --git a/doc/out/LabeledGraphics.html b/doc/out/LabeledGraphics.html index 060e318..21661dd 100644 --- a/doc/out/LabeledGraphics.html +++ b/doc/out/LabeledGraphics.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -2628,7 +2632,7 @@ than wanted

      diff --git a/doc/out/List.html b/doc/out/List.html index 67dea74..70b42d5 100644 --- a/doc/out/List.html +++ b/doc/out/List.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -2587,7 +2591,7 @@ app.scene.addChild(list)
      diff --git a/doc/out/Message.html b/doc/out/Message.html index d1043fc..5b58c3c 100644 --- a/doc/out/Message.html +++ b/doc/out/Message.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -2443,7 +2447,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/MessageInteractivePopup.html b/doc/out/MessageInteractivePopup.html index c5c3ee1..1bb8e3d 100644 --- a/doc/out/MessageInteractivePopup.html +++ b/doc/out/MessageInteractivePopup.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1791,7 +1795,7 @@ like Popup, Message...

      diff --git a/doc/out/MessageMessageInteractivePopup.html b/doc/out/MessageMessageInteractivePopup.html index a755058..bb40473 100644 --- a/doc/out/MessageMessageInteractivePopup.html +++ b/doc/out/MessageMessageInteractivePopup.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1791,7 +1795,7 @@ like Popup, Message...

      diff --git a/doc/out/Modal.html b/doc/out/Modal.html index 302cd6c..44ee9e0 100644 --- a/doc/out/Modal.html +++ b/doc/out/Modal.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -2344,7 +2348,7 @@ a string or a PIXI.Text object.

      diff --git a/doc/out/ModalInteractivePopup.html b/doc/out/ModalInteractivePopup.html index e65567c..60d101a 100644 --- a/doc/out/ModalInteractivePopup.html +++ b/doc/out/ModalInteractivePopup.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1791,7 +1795,7 @@ like Popup, Message...

      diff --git a/doc/out/ModalModalInteractivePopup.html b/doc/out/ModalModalInteractivePopup.html index 097a079..dece6d9 100644 --- a/doc/out/ModalModalInteractivePopup.html +++ b/doc/out/ModalModalInteractivePopup.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1791,7 +1795,7 @@ like Popup, Message...

      diff --git a/doc/out/PIXIApp.html b/doc/out/PIXIApp.html index fcbc3a9..c4f7a26 100644 --- a/doc/out/PIXIApp.html +++ b/doc/out/PIXIApp.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -5745,7 +5749,7 @@ rejected with an error.
      diff --git a/doc/out/Popup.html b/doc/out/Popup.html index 56f368a..6fe1268 100644 --- a/doc/out/Popup.html +++ b/doc/out/Popup.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -2338,7 +2342,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/PopupInteractivePopup.html b/doc/out/PopupInteractivePopup.html index 313c7dc..022f399 100644 --- a/doc/out/PopupInteractivePopup.html +++ b/doc/out/PopupInteractivePopup.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1791,7 +1795,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenu.html b/doc/out/PopupMenu.html index da8b85b..e833914 100644 --- a/doc/out/PopupMenu.html +++ b/doc/out/PopupMenu.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -2392,7 +2396,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/PopupMenuPopupInteractivePopup.html b/doc/out/PopupMenuPopupInteractivePopup.html index d1bf56f..32fd054 100644 --- a/doc/out/PopupMenuPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupInteractivePopup.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1791,7 +1795,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html b/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html index 7c10884..3b67e61 100644 --- a/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1791,7 +1795,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html b/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html index d7e1f90..b49eedb 100644 --- a/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1791,7 +1795,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenuPopupPopupInteractivePopup.html b/doc/out/PopupMenuPopupPopupInteractivePopup.html index e52e03a..59469d7 100644 --- a/doc/out/PopupMenuPopupPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupPopupInteractivePopup.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1791,7 +1795,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupPopupInteractivePopup.html b/doc/out/PopupPopupInteractivePopup.html index 59c7c3b..071db90 100644 --- a/doc/out/PopupPopupInteractivePopup.html +++ b/doc/out/PopupPopupInteractivePopup.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1791,7 +1795,7 @@ like Popup, Message...

      diff --git a/doc/out/Progress.html b/doc/out/Progress.html index 4761562..5e1c291 100644 --- a/doc/out/Progress.html +++ b/doc/out/Progress.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -2877,7 +2881,7 @@ app.scene.addChild(progress)
      diff --git a/doc/out/Scrollview.html b/doc/out/Scrollview.html index fa58a7a..6679717 100644 --- a/doc/out/Scrollview.html +++ b/doc/out/Scrollview.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1709,7 +1713,7 @@ app.loader
      diff --git a/doc/out/Slider.html b/doc/out/Slider.html index 2bee9df..3fd405e 100644 --- a/doc/out/Slider.html +++ b/doc/out/Slider.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -2968,7 +2972,7 @@ app.scene.addChild(slider)
      diff --git a/doc/out/Switch.html b/doc/out/Switch.html index cf4e7d6..0910b55 100644 --- a/doc/out/Switch.html +++ b/doc/out/Switch.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -3398,7 +3402,7 @@ app.scene.addChild(switch1)
      diff --git a/doc/out/TextLabel.TextLabel.html b/doc/out/TextLabel.TextLabel.html index 6b45046..d66ada8 100644 --- a/doc/out/TextLabel.TextLabel.html +++ b/doc/out/TextLabel.TextLabel.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1692,7 +1696,7 @@
      diff --git a/doc/out/Theme.html b/doc/out/Theme.html index cd8b856..39113c7 100644 --- a/doc/out/Theme.html +++ b/doc/out/Theme.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -3167,7 +3171,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/ThemeDark.html b/doc/out/ThemeDark.html index 79fdda2..a96aa7d 100644 --- a/doc/out/ThemeDark.html +++ b/doc/out/ThemeDark.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1588,7 +1592,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/ThemeLight.html b/doc/out/ThemeLight.html index f6915cd..8e98a52 100644 --- a/doc/out/ThemeLight.html +++ b/doc/out/ThemeLight.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1600,7 +1604,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/ThemeRed.html b/doc/out/ThemeRed.html index f824138..54a825c 100644 --- a/doc/out/ThemeRed.html +++ b/doc/out/ThemeRed.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1600,7 +1604,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/TileQuadNode.html b/doc/out/TileQuadNode.html index b7b5110..9808c5a 100644 --- a/doc/out/TileQuadNode.html +++ b/doc/out/TileQuadNode.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -2052,7 +2056,7 @@ an indicator of tiles to free.

      diff --git a/doc/out/Tooltip.html b/doc/out/Tooltip.html index 339ee94..0f3f8e6 100644 --- a/doc/out/Tooltip.html +++ b/doc/out/Tooltip.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -2514,7 +2518,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/UITest.html b/doc/out/UITest.html index 5bac7f0..b8c9245 100644 --- a/doc/out/UITest.html +++ b/doc/out/UITest.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -4185,7 +4189,7 @@ test.start()
      diff --git a/doc/out/Volatile.html b/doc/out/Volatile.html index 241bb19..807ce05 100644 --- a/doc/out/Volatile.html +++ b/doc/out/Volatile.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -2101,7 +2105,7 @@ app.scene.addChild(button)
      diff --git a/doc/out/global.html b/doc/out/global.html index 085c1ee..ca589fd 100644 --- a/doc/out/global.html +++ b/doc/out/global.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -3322,7 +3326,7 @@
      diff --git a/doc/out/index.html b/doc/out/index.html index 0cd30e1..9b84215 100644 --- a/doc/out/index.html +++ b/doc/out/index.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1487,7 +1491,7 @@
      diff --git a/doc/out/pixi_abstractpopup.js.html b/doc/out/pixi_abstractpopup.js.html index 14768f3..d7122a6 100644 --- a/doc/out/pixi_abstractpopup.js.html +++ b/doc/out/pixi_abstractpopup.js.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1810,7 +1814,7 @@ export default class AbstractPopup extends PIXI.Graphics {
      diff --git a/doc/out/pixi_app.js.html b/doc/out/pixi_app.js.html index b7dc801..dc337a8 100644 --- a/doc/out/pixi_app.js.html +++ b/doc/out/pixi_app.js.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -2191,7 +2195,7 @@ class FpsDisplay extends PIXI.Graphics {
      diff --git a/doc/out/pixi_badge.js.html b/doc/out/pixi_badge.js.html index f4333e6..1bbbfe9 100644 --- a/doc/out/pixi_badge.js.html +++ b/doc/out/pixi_badge.js.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1571,7 +1575,7 @@ export default class Badge extends AbstractPopup {
      diff --git a/doc/out/pixi_blurfilter.js.html b/doc/out/pixi_blurfilter.js.html index d67139b..f2345db 100644 --- a/doc/out/pixi_blurfilter.js.html +++ b/doc/out/pixi_blurfilter.js.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1729,7 +1733,7 @@ class TiltShiftYFilter extends TiltShiftAxisFilter {
      diff --git a/doc/out/pixi_button.js.html b/doc/out/pixi_button.js.html index bc9063d..00093da 100644 --- a/doc/out/pixi_button.js.html +++ b/doc/out/pixi_button.js.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1700,13 +1704,11 @@ export default class Button extends PIXI.Container { this.capture(e) }) - this.button.on('pointerout', e => { - this.capture(e) - TweenLite.to([this.button, this.content], this.theme.fast, { - alpha: 1, - overwrite: 'none' - }) - }) + this.button.on('pointerout', this.onEnd.bind(this)) + this.button.on('pointercancel', this.onEnd.bind(this)) + this.button.on('pointerupoutside', this.onEnd.bind(this)) + this.button.on('pointertap', this.onEnd.bind(this)) + this.button.on('scroll', this.onEnd.bind(this)) // eslint-disable-next-line no-unused-vars this.button.on('pointerdown', e => { @@ -2139,6 +2141,14 @@ export default class Button extends PIXI.Container { this.icon.tint = value } } + + onEnd(event) { + this.capture(event) + TweenLite.to([this.button, this.content], this.theme.fast, { + alpha: 1, + overwrite: 'none' + }) + } } @@ -2153,7 +2163,7 @@ export default class Button extends PIXI.Container {
      diff --git a/doc/out/pixi_buttongroup.js.html b/doc/out/pixi_buttongroup.js.html index 945ebeb..f4769ca 100644 --- a/doc/out/pixi_buttongroup.js.html +++ b/doc/out/pixi_buttongroup.js.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1819,6 +1823,34 @@ export default class ButtonGroup extends PIXI.Container { this.buttons.forEach(it => (it.disabled = value)) } + /** + * Gets or sets the maximum width of the button group for stacking. Usefull when you want to resize the available space. + * + * @member {number} + */ + get maxWidth() { + return this.opts.maxWidth + } + + set maxWidth(value) { + this.opts.maxWidth = value + this.layout() + } + + /** + * Gets or sets the maximum height of the button group for stacking. Usefull when you want to resize the available space. + * + * @member {number} + */ + get maxHeight() { + return this.opts.maxHeight + } + + set maxHeight(value) { + this.opts.maxHeight = value + this.layout() + } + /** * Searches all buttons of the button group and returns the maximum width of one button. * @@ -2121,7 +2153,7 @@ export default class ButtonGroup extends PIXI.Container {
      diff --git a/doc/out/pixi_deepzoom_image.js.html b/doc/out/pixi_deepzoom_image.js.html index 2e05ac2..2d957f8 100644 --- a/doc/out/pixi_deepzoom_image.js.html +++ b/doc/out/pixi_deepzoom_image.js.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -2553,7 +2557,7 @@ export class DeepZoomImage extends PIXI.Container {
      diff --git a/doc/out/pixi_flippable.js.html b/doc/out/pixi_flippable.js.html index 8e00349..773a71f 100644 --- a/doc/out/pixi_flippable.js.html +++ b/doc/out/pixi_flippable.js.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1908,7 +1912,7 @@ export default class Flippable extends PIXI.projection.Camera3d {
      diff --git a/doc/out/pixi_labeledgraphics.js.html b/doc/out/pixi_labeledgraphics.js.html index 7a30599..e62ce64 100644 --- a/doc/out/pixi_labeledgraphics.js.html +++ b/doc/out/pixi_labeledgraphics.js.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1857,7 +1861,7 @@ export class BitmapLabeledGraphics extends LabeledGraphics {
      diff --git a/doc/out/pixi_list.js.html b/doc/out/pixi_list.js.html index e73637b..e3e3e8f 100644 --- a/doc/out/pixi_list.js.html +++ b/doc/out/pixi_list.js.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1836,7 +1840,7 @@ export default class List extends PIXI.Container {
      diff --git a/doc/out/pixi_message.js.html b/doc/out/pixi_message.js.html index 38287a9..f0cc2de 100644 --- a/doc/out/pixi_message.js.html +++ b/doc/out/pixi_message.js.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1585,7 +1589,7 @@ export default class Message extends InteractivePopup {
      diff --git a/doc/out/pixi_modal.js.html b/doc/out/pixi_modal.js.html index 0cd78fd..30ff617 100644 --- a/doc/out/pixi_modal.js.html +++ b/doc/out/pixi_modal.js.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1666,7 +1670,7 @@ export default class Modal extends PIXI.Container {
      diff --git a/doc/out/pixi_popup.js.html b/doc/out/pixi_popup.js.html index a87b858..e32f2a0 100644 --- a/doc/out/pixi_popup.js.html +++ b/doc/out/pixi_popup.js.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1676,7 +1680,7 @@ export default class Popup extends InteractivePopup {
      diff --git a/doc/out/pixi_popupmenu.js.html b/doc/out/pixi_popupmenu.js.html index 386d3a7..6fb8067 100644 --- a/doc/out/pixi_popupmenu.js.html +++ b/doc/out/pixi_popupmenu.js.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1579,7 +1583,7 @@ export default class PopupMenu extends Popup {
      diff --git a/doc/out/pixi_progress.js.html b/doc/out/pixi_progress.js.html index 31697e6..915bb30 100644 --- a/doc/out/pixi_progress.js.html +++ b/doc/out/pixi_progress.js.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1761,7 +1765,7 @@ export default class Progress extends PIXI.Container {
      diff --git a/doc/out/pixi_scrollview.js.html b/doc/out/pixi_scrollview.js.html index f76ebfc..075bd93 100644 --- a/doc/out/pixi_scrollview.js.html +++ b/doc/out/pixi_scrollview.js.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1520,7 +1524,7 @@ export default class Scrollview extends Scrollbox {
      diff --git a/doc/out/pixi_slider.js.html b/doc/out/pixi_slider.js.html index ef438c3..223aaad 100644 --- a/doc/out/pixi_slider.js.html +++ b/doc/out/pixi_slider.js.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1925,7 +1929,7 @@ export default class Slider extends PIXI.Container {
      diff --git a/doc/out/pixi_switch.js.html b/doc/out/pixi_switch.js.html index 9bcbfbc..65ef200 100644 --- a/doc/out/pixi_switch.js.html +++ b/doc/out/pixi_switch.js.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1979,7 +1983,7 @@ export default class Switch extends PIXI.Container {
      diff --git a/doc/out/pixi_theme.js.html b/doc/out/pixi_theme.js.html index 446c2ee..8b4911e 100644 --- a/doc/out/pixi_theme.js.html +++ b/doc/out/pixi_theme.js.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1720,7 +1724,7 @@ export class ThemeRed extends Theme {
      diff --git a/doc/out/pixi_tooltip.js.html b/doc/out/pixi_tooltip.js.html index e31ed30..793d8ed 100644 --- a/doc/out/pixi_tooltip.js.html +++ b/doc/out/pixi_tooltip.js.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1613,7 +1617,7 @@ export default class Tooltip extends AbstractPopup {
      diff --git a/doc/out/pixi_volatile.js.html b/doc/out/pixi_volatile.js.html index 879319a..0b14cff 100644 --- a/doc/out/pixi_volatile.js.html +++ b/doc/out/pixi_volatile.js.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -1617,7 +1621,7 @@ export default class Volatile {
      diff --git a/doc/out/uitest.js.html b/doc/out/uitest.js.html index e585274..2f186fd 100644 --- a/doc/out/uitest.js.html +++ b/doc/out/uitest.js.html @@ -252,6 +252,10 @@
    • disabled
    • +
    • maxHeight
    • + +
    • maxWidth
    • +
      @@ -2468,7 +2472,7 @@ class Event {
      diff --git a/lib/card/card.js b/lib/card/card.js index 0d8f7ac..b9b1acc 100644 --- a/lib/card/card.js +++ b/lib/card/card.js @@ -646,7 +646,7 @@ export default class Card { } static _calculateCenterRelativeTo(target, image) { - console.log("_calculateCenterRelativeTo", target, image) + console.log('_calculateCenterRelativeTo', target, image) let bbox = image.getBBox() let width = bbox.width let height = bbox.height @@ -655,10 +655,9 @@ export default class Card { let r = target.getAttribute('r') let radius = r.endsWith('%') ? (parseFloat(r) / 100) * width : parseFloat(r) - let x = cx.endsWith('%') ? (parseFloat(cx) / 100) * width : cx let y = cy.endsWith('%') ? (parseFloat(cy) / 100) * height : cx - console.log({x, y, width, height , radius}) + console.log({ x, y, width, height, radius }) return { x, y } } @@ -670,7 +669,7 @@ export default class Card { * @returns {bool} false - Returns false to prevent default click action * @memberof Card */ - static loadHighlightPopup(event, node=null) { + static loadHighlightPopup(event, node = null) { if (this.debug) console.log('Card.loadHighlightPopup', event, node) if (node == null) { if (event.firstTarget) { @@ -679,7 +678,7 @@ export default class Card { node = event.target } } - + let context = this.getContext(node) event.stopPropagation() @@ -699,18 +698,17 @@ export default class Card { onExpanded: () => { // We assume it's always a circle. This may break, when other svg shapes are used. - let svgRoot = node.closest('svg') let image = svgRoot.querySelector('image') let position = Card._calculateCenterRelativeTo(node, image) - + /* As the popup is appended directly to the card. We have to transform the location from the subcard-/svg-space to the card space. */ - // let svgRoot = node.closest('svg') + // let svgRoot = node.closest('svg') let svgPoint = svgRoot.createSVGPoint() svgPoint.x = position.x @@ -719,7 +717,7 @@ export default class Card { let point = svgPoint.matrixTransform(matrix) let closestDiv = node.closest('div') - console.log("closestDiv", closestDiv, point) + console.log('closestDiv', closestDiv, point) let global = Points.fromNodeToPage(closestDiv, point) let local = Points.fromPageToNode(context, global) @@ -731,7 +729,7 @@ export default class Card { // we could load the data while the circle is animating. // but for simplicity it's just done here for now. // TODO: Adjust to load while animating (Problem: Unload when cancelled). - console.log("loadHighlightPopup", src, position, local) + console.log('loadHighlightPopup', src, position, local) this._loadPopupContent(src) .then(content => { this._openPopup(context, src, local, content, { diff --git a/lib/pixi/button.js b/lib/pixi/button.js index e414988..c9674f0 100644 --- a/lib/pixi/button.js +++ b/lib/pixi/button.js @@ -253,10 +253,10 @@ export default class Button extends PIXI.Container { }) this.button.on('pointerout', this.onEnd.bind(this)) - this.button.on('pointercancel', this.onEnd.bind(this)) - this.button.on('pointerupoutside', this.onEnd.bind(this)) - this.button.on('pointertap', this.onEnd.bind(this)) - this.button.on('scroll', this.onEnd.bind(this)) + this.button.on('pointercancel', this.onEnd.bind(this)) + this.button.on('pointerupoutside', this.onEnd.bind(this)) + this.button.on('pointertap', this.onEnd.bind(this)) + this.button.on('scroll', this.onEnd.bind(this)) // eslint-disable-next-line no-unused-vars this.button.on('pointerdown', e => { @@ -689,12 +689,12 @@ export default class Button extends PIXI.Container { this.icon.tint = value } } - - onEnd(event) { - this.capture(event) - TweenLite.to([this.button, this.content], this.theme.fast, { - alpha: 1, - overwrite: 'none' - }) - } + + onEnd(event) { + this.capture(event) + TweenLite.to([this.button, this.content], this.theme.fast, { + alpha: 1, + overwrite: 'none' + }) + } } diff --git a/lib/pixi/buttongroup.js b/lib/pixi/buttongroup.js index 1c0f728..feaec6c 100644 --- a/lib/pixi/buttongroup.js +++ b/lib/pixi/buttongroup.js @@ -371,6 +371,34 @@ export default class ButtonGroup extends PIXI.Container { this.buttons.forEach(it => (it.disabled = value)) } + /** + * Gets or sets the maximum width of the button group for stacking. Usefull when you want to resize the available space. + * + * @member {number} + */ + get maxWidth() { + return this.opts.maxWidth + } + + set maxWidth(value) { + this.opts.maxWidth = value + this.layout() + } + + /** + * Gets or sets the maximum height of the button group for stacking. Usefull when you want to resize the available space. + * + * @member {number} + */ + get maxHeight() { + return this.opts.maxHeight + } + + set maxHeight(value) { + this.opts.maxHeight = value + this.layout() + } + /** * Searches all buttons of the button group and returns the maximum width of one button. * From a44fd6c46906f86d61b379841ec674d8ab57acee Mon Sep 17 00:00:00 2001 From: Sebastian Kupke Date: Fri, 2 Aug 2019 11:39:56 +0200 Subject: [PATCH 15/30] Removed d3 from globals. --- .eslintrc | 1 - gulpfile.js | 24 ++++++------------------ 2 files changed, 6 insertions(+), 19 deletions(-) diff --git a/.eslintrc b/.eslintrc index 290b33b..e060e9c 100644 --- a/.eslintrc +++ b/.eslintrc @@ -22,7 +22,6 @@ "TweenMax": false, "TimelineLite": false, "TimelineMax": false, - "d3": false, "SystemJS": false, "app": true }, diff --git a/gulpfile.js b/gulpfile.js index e818761..751ce24 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -38,13 +38,9 @@ function vendors() { } function preload() { - return src( - [ - './node_modules/gsap/src/uncompressed/TweenMax.js', - './lib/3rdparty/convertPointFromPageToNode.js' - ], - { sourcemaps: false } - ) + return src(['./node_modules/gsap/src/uncompressed/TweenMax.js', './lib/3rdparty/convertPointFromPageToNode.js'], { + sourcemaps: false + }) .pipe(concat('iwmlib.3rdparty.preload.js')) .pipe(replace(/^\/\/# sourceMappingURL=.*$/gim, '')) .pipe(dest('dist', { sourcemaps: false })) @@ -54,17 +50,9 @@ function preload() { } function prettify() { - return src( - [ - './lib/*.js', - './lib/card/*.js', - './lib/pixi/*.js', - '!./lib/bootstrap.babel.js' - ], - { - base: './lib' - } - ) + return src(['./lib/*.js', './lib/card/*.js', './lib/pixi/*.js', '!./lib/bootstrap.babel.js'], { + base: './lib' + }) .pipe( prettier({ singleQuote: true, From e502c97de5b3c80c67b51b4bdfbaf5b177b5fc93 Mon Sep 17 00:00:00 2001 From: Uwe Oestermeier Date: Sat, 3 Aug 2019 09:02:58 +0200 Subject: [PATCH 16/30] Added prepare method --- lib/flippable.js | 39 +++++++++++++++++---------------------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/lib/flippable.js b/lib/flippable.js index 8c57e12..20f6b36 100644 --- a/lib/flippable.js +++ b/lib/flippable.js @@ -1,6 +1,7 @@ +/* eslint-disable no-unused-vars */ +/* global PDFJS Power1 */ import { getId } from './utils.js' import { DOMScatter } from './scatter.js' -import { InteractionMapper } from './interaction.js' export class CardLoader { constructor( @@ -22,7 +23,7 @@ export class CardLoader { this.x = x this.y = y this.scale = scale - this.rotation = 0 + this.rotation = rotation this.maxScale = maxScale this.minScale = minScale this.wantedWidth = width @@ -30,12 +31,6 @@ export class CardLoader { this.maxWidth = maxWidth != null ? maxWidth : window.innerWidth this.maxHeight = maxHeight != null ? maxHeight : window.innerHeight this.addedNode = null - console.log({ - width, - height, - maxWidth, - maxHeight - }) } unload() { @@ -120,7 +115,6 @@ export class FrameLoader extends CardLoader { return new Promise((resolve, reject) => { let isFrame = domNode instanceof HTMLIFrameElement let iframe = isFrame ? domNode : document.createElement('iframe') - console.log('FrameLoader.load', isFrame, iframe, this.src) iframe.frameBorder = 0 iframe.style.scrolling = false iframe.width = this.wantedWidth @@ -147,14 +141,9 @@ export class HTMLLoader extends CardLoader { let xhr = new XMLHttpRequest() xhr.open('GET', this.src, false) xhr.onload = e => { - domNode.innerHTML = xhr.response + domNode.innerHTML = this.prepare(xhr.response) this.addedNode = domNode.firstElementChild let { width, height } = this.size(this.addedNode) - console.log('HTMLLoader.load', { - added: this.addedNode, - width, - height - }) if (width) this.wantedWidth = width || this.wantedWidth if (height) this.wantedHeight = height || this.wantedHeight resolve(this) @@ -166,6 +155,18 @@ export class HTMLLoader extends CardLoader { }) } + /** + * Preoares the html before it is assigned with innerHTML. + * Can be overwritten in subclasses. + * + * @param {*} html + * @returns + * @memberof HTMLLoader + */ + prepare(html) { + return html + } + /** * Tries to determine the size of the addedNode. * Checks for explicit width and height style attributes. @@ -321,7 +322,6 @@ export class DOMFlip { } setupFlippable(flippable, loader) { - console.log('setupFlippable', loader.wantedWidth) flippable.wantedWidth = loader.wantedWidth flippable.wantedHeight = loader.wantedHeight flippable.wantedScale = loader.scale @@ -331,7 +331,6 @@ export class DOMFlip { } start({ targetCenter = null } = {}) { - console.log('DOMFlip.start', targetCenter) if (this.preloadBack) { this.flippable.start({ duration: this.flipDuration, targetCenter }) } else { @@ -481,7 +480,6 @@ export class DOMFlippable { clickInfo() { this.bringToFront() - console.log('clickInfo') this.infoBtn.click() } @@ -508,6 +506,7 @@ export class DOMFlippable { let startScale = this.element._gsTransform.scaleX let w = this.element.style.width let h = this.element.style.height + // eslint-disable-next-line no-console console.log(info, startX, startY, startAngle, startScale, w, h) } @@ -577,14 +576,12 @@ export class DOMFlippable { let y = this.flipped ? yy : this.startY let onUpdate = this.onUpdate !== null ? () => this.onUpdate(this) : null - console.log('start', this.flipDuration) TweenLite.to(this.card, this.flipDuration, { rotationY: targetY, ease: Power1.easeOut, transformOrigin: '50% 50%', onUpdate, onComplete: e => { - console.log('start end', this.flipDuration) if (this.flipped) { //this.hide(this.front) this.enable(this.backBtn) @@ -615,8 +612,6 @@ export class DOMFlippable { }, force3D: true }) - - console.log('start 2', this.wantedWidth, this.startWidth, { w, h }) // See https://greensock.com/forums/topic/7997-rotate-the-shortest-way/ TweenLite.to(this.element, this.flipDuration / 2, { scale: targetScale, From 03f927d1d5b34a0193b60273109ab7bc5e9f4200 Mon Sep 17 00:00:00 2001 From: Sebastian Kupke Date: Mon, 5 Aug 2019 11:44:59 +0200 Subject: [PATCH 17/30] Set window.app as default value for button group option "app". --- dist/iwmlib.js | 18 ++++++------ dist/iwmlib.pixi.js | 28 +++++++++---------- doc/out/AbstractPopup.html | 2 +- doc/out/Badge.html | 2 +- doc/out/BlurFilter.html | 2 +- doc/out/Button.html | 2 +- doc/out/ButtonGroup.html | 4 ++- doc/out/DeepZoomImage.html | 2 +- doc/out/DeepZoomInfo.html | 2 +- doc/out/Flippable.html | 2 +- doc/out/FontInfo.html | 2 +- doc/out/Hypenate.html | 2 +- doc/out/InteractivePopup.html | 2 +- ...beledGraphics.exports.LabeledGraphics.html | 2 +- doc/out/LabeledGraphics.html | 2 +- doc/out/List.html | 2 +- doc/out/Message.html | 2 +- doc/out/MessageInteractivePopup.html | 2 +- doc/out/MessageMessageInteractivePopup.html | 2 +- doc/out/Modal.html | 2 +- doc/out/ModalInteractivePopup.html | 2 +- doc/out/ModalModalInteractivePopup.html | 2 +- doc/out/PIXIApp.html | 2 +- doc/out/Popup.html | 2 +- doc/out/PopupInteractivePopup.html | 2 +- doc/out/PopupMenu.html | 2 +- doc/out/PopupMenuPopupInteractivePopup.html | 2 +- ...pupMenuPopupMenuPopupInteractivePopup.html | 2 +- ...nuPopupMenuPopupPopupInteractivePopup.html | 2 +- .../PopupMenuPopupPopupInteractivePopup.html | 2 +- doc/out/PopupPopupInteractivePopup.html | 2 +- doc/out/Progress.html | 2 +- doc/out/Scrollview.html | 2 +- doc/out/Slider.html | 2 +- doc/out/Switch.html | 2 +- doc/out/TextLabel.TextLabel.html | 2 +- doc/out/Theme.html | 2 +- doc/out/ThemeDark.html | 2 +- doc/out/ThemeLight.html | 2 +- doc/out/ThemeRed.html | 2 +- doc/out/TileQuadNode.html | 2 +- doc/out/Tooltip.html | 2 +- doc/out/UITest.html | 2 +- doc/out/Volatile.html | 2 +- doc/out/global.html | 2 +- doc/out/index.html | 2 +- doc/out/pixi_abstractpopup.js.html | 2 +- doc/out/pixi_app.js.html | 2 +- doc/out/pixi_badge.js.html | 2 +- doc/out/pixi_blurfilter.js.html | 2 +- doc/out/pixi_button.js.html | 26 ++++++++--------- doc/out/pixi_buttongroup.js.html | 6 ++-- doc/out/pixi_deepzoom_image.js.html | 2 +- doc/out/pixi_flippable.js.html | 2 +- doc/out/pixi_labeledgraphics.js.html | 2 +- doc/out/pixi_list.js.html | 2 +- doc/out/pixi_message.js.html | 2 +- doc/out/pixi_modal.js.html | 2 +- doc/out/pixi_popup.js.html | 2 +- doc/out/pixi_popupmenu.js.html | 2 +- doc/out/pixi_progress.js.html | 2 +- doc/out/pixi_scrollview.js.html | 2 +- doc/out/pixi_slider.js.html | 2 +- doc/out/pixi_switch.js.html | 2 +- doc/out/pixi_theme.js.html | 2 +- doc/out/pixi_tooltip.js.html | 2 +- doc/out/pixi_volatile.js.html | 2 +- doc/out/uitest.js.html | 2 +- lib/pixi/buttongroup.js | 4 +-- 69 files changed, 106 insertions(+), 106 deletions(-) diff --git a/dist/iwmlib.js b/dist/iwmlib.js index 9be616d..480b8b6 100644 --- a/dist/iwmlib.js +++ b/dist/iwmlib.js @@ -8229,7 +8229,7 @@ } static _calculateCenterRelativeTo(target, image) { - console.log("_calculateCenterRelativeTo", target, image); + console.log('_calculateCenterRelativeTo', target, image); let bbox = image.getBBox(); let width = bbox.width; let height = bbox.height; @@ -8238,10 +8238,9 @@ let r = target.getAttribute('r'); let radius = r.endsWith('%') ? (parseFloat(r) / 100) * width : parseFloat(r); - let x = cx.endsWith('%') ? (parseFloat(cx) / 100) * width : cx; let y = cy.endsWith('%') ? (parseFloat(cy) / 100) * height : cx; - console.log({x, y, width, height , radius}); + console.log({ x, y, width, height, radius }); return { x, y } } @@ -8253,7 +8252,7 @@ * @returns {bool} false - Returns false to prevent default click action * @memberof Card */ - static loadHighlightPopup(event, node=null) { + static loadHighlightPopup(event, node = null) { if (this.debug) console.log('Card.loadHighlightPopup', event, node); if (node == null) { if (event.firstTarget) { @@ -8262,7 +8261,7 @@ node = event.target; } } - + let context = this.getContext(node); event.stopPropagation(); @@ -8282,18 +8281,17 @@ onExpanded: () => { // We assume it's always a circle. This may break, when other svg shapes are used. - let svgRoot = node.closest('svg'); let image = svgRoot.querySelector('image'); let position = Card._calculateCenterRelativeTo(node, image); - + /* As the popup is appended directly to the card. We have to transform the location from the subcard-/svg-space to the card space. */ - // let svgRoot = node.closest('svg') + // let svgRoot = node.closest('svg') let svgPoint = svgRoot.createSVGPoint(); svgPoint.x = position.x; @@ -8302,7 +8300,7 @@ let point = svgPoint.matrixTransform(matrix); let closestDiv = node.closest('div'); - console.log("closestDiv", closestDiv, point); + console.log('closestDiv', closestDiv, point); let global = Points.fromNodeToPage(closestDiv, point); let local = Points.fromPageToNode(context, global); @@ -8314,7 +8312,7 @@ // we could load the data while the circle is animating. // but for simplicity it's just done here for now. // TODO: Adjust to load while animating (Problem: Unload when cancelled). - console.log("loadHighlightPopup", src, position, local); + console.log('loadHighlightPopup', src, position, local); this._loadPopupContent(src) .then(content => { this._openPopup(context, src, local, content, { diff --git a/dist/iwmlib.pixi.js b/dist/iwmlib.pixi.js index df57b22..52dc372 100644 --- a/dist/iwmlib.pixi.js +++ b/dist/iwmlib.pixi.js @@ -2483,10 +2483,10 @@ }); this.button.on('pointerout', this.onEnd.bind(this)); - this.button.on('pointercancel', this.onEnd.bind(this)); - this.button.on('pointerupoutside', this.onEnd.bind(this)); - this.button.on('pointertap', this.onEnd.bind(this)); - this.button.on('scroll', this.onEnd.bind(this)); + this.button.on('pointercancel', this.onEnd.bind(this)); + this.button.on('pointerupoutside', this.onEnd.bind(this)); + this.button.on('pointertap', this.onEnd.bind(this)); + this.button.on('scroll', this.onEnd.bind(this)); // eslint-disable-next-line no-unused-vars this.button.on('pointerdown', e => { @@ -2919,14 +2919,14 @@ this.icon.tint = value; } } - - onEnd(event) { - this.capture(event); - TweenLite.to([this.button, this.content], this.theme.fast, { - alpha: 1, - overwrite: 'none' - }); - } + + onEnd(event) { + this.capture(event); + TweenLite.to([this.button, this.content], this.theme.fast, { + alpha: 1, + overwrite: 'none' + }); + } } /* globals ThrowPropsPlugin, Strong */ @@ -2972,7 +2972,7 @@ * @param {number} [opts.maxWidth] - The maximum width of the button group. If the buttons are wider than the maximum width, the buttons get stacked. Note: The buttons can only be stacked if margin is not zero. Note 2: Load the Greensock ThrowPropsPlugin for smoother animations. * @param {number} [opts.maxHeight] - The maximum height of the button group. If the buttons are higher than the maximum height, the buttons get stacked. Note: The buttons can only be stacked if margin is not zero. Note 2: Load the Greensock ThrowPropsPlugin for smoother animations. * @param {number} [opts.stackPadding=10] - The padding for stacked buttons. - * @param {PIXI.Application} [opts.app] - The PixiJS Application. Must be set if you want to use the mousewheel to scroll your button group. Only used when the buttons are stacked (with maxWidth or maxHeight). + * @param {PIXI.Application} [opts.app=window.app] - The PixiJS Application. Must be set if you want to use the mousewheel to scroll your button group. Only used when the buttons are stacked (with maxWidth or maxHeight). * @param {number} [opts.padding=Theme.padding] - Button: The inner spacing (distance from icon and/or label) the the border. * @param {number} [opts.margin=Theme.margin] - The outer spacing (distance from one button to the previous/next button). * @param {string} [opts.iconPosition=left] - Button: The position of the icon in relation to the label. Can be left or right. @@ -3024,7 +3024,7 @@ maxWidth: null, maxHeight: null, stackPadding: 10, - app: null, + app: window.app, padding: theme.padding, margin: theme.margin, iconPosition: 'left', // left, right diff --git a/doc/out/AbstractPopup.html b/doc/out/AbstractPopup.html index aec30eb..92e6fc2 100644 --- a/doc/out/AbstractPopup.html +++ b/doc/out/AbstractPopup.html @@ -2924,7 +2924,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/Badge.html b/doc/out/Badge.html index 3eaa314..9ca0a6d 100644 --- a/doc/out/Badge.html +++ b/doc/out/Badge.html @@ -2380,7 +2380,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/BlurFilter.html b/doc/out/BlurFilter.html index 8de2d53..e7d5fa4 100644 --- a/doc/out/BlurFilter.html +++ b/doc/out/BlurFilter.html @@ -1804,7 +1804,7 @@ app.scene.filters = [blurFilter]
      diff --git a/doc/out/Button.html b/doc/out/Button.html index e8a4231..c2f1b3d 100644 --- a/doc/out/Button.html +++ b/doc/out/Button.html @@ -3822,7 +3822,7 @@ the tint property of the icon sprite.

      diff --git a/doc/out/ButtonGroup.html b/doc/out/ButtonGroup.html index 7bd0e2e..b627c1f 100644 --- a/doc/out/ButtonGroup.html +++ b/doc/out/ButtonGroup.html @@ -1944,6 +1944,8 @@ or a Theme object.

      + window.app + @@ -3798,7 +3800,7 @@ app.scene.addChild(buttonGroup)
      diff --git a/doc/out/DeepZoomImage.html b/doc/out/DeepZoomImage.html index e0f0b4f..ae386ce 100644 --- a/doc/out/DeepZoomImage.html +++ b/doc/out/DeepZoomImage.html @@ -5102,7 +5102,7 @@ i.e. after loading a single tile

      diff --git a/doc/out/DeepZoomInfo.html b/doc/out/DeepZoomInfo.html index 11f0c10..3e0eff4 100644 --- a/doc/out/DeepZoomInfo.html +++ b/doc/out/DeepZoomInfo.html @@ -2615,7 +2615,7 @@ on completion.

      diff --git a/doc/out/Flippable.html b/doc/out/Flippable.html index dc76c84..c6009df 100644 --- a/doc/out/Flippable.html +++ b/doc/out/Flippable.html @@ -2518,7 +2518,7 @@ front.on('click', event => flippable.toggle())
      diff --git a/doc/out/FontInfo.html b/doc/out/FontInfo.html index c3fe6e4..9f41c13 100644 --- a/doc/out/FontInfo.html +++ b/doc/out/FontInfo.html @@ -1565,7 +1565,7 @@
      diff --git a/doc/out/Hypenate.html b/doc/out/Hypenate.html index 3b2556d..b7fdafe 100644 --- a/doc/out/Hypenate.html +++ b/doc/out/Hypenate.html @@ -1767,7 +1767,7 @@
      diff --git a/doc/out/InteractivePopup.html b/doc/out/InteractivePopup.html index 626c0ef..7d462ec 100644 --- a/doc/out/InteractivePopup.html +++ b/doc/out/InteractivePopup.html @@ -2349,7 +2349,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/LabeledGraphics.exports.LabeledGraphics.html b/doc/out/LabeledGraphics.exports.LabeledGraphics.html index 8a62c1b..adfb475 100644 --- a/doc/out/LabeledGraphics.exports.LabeledGraphics.html +++ b/doc/out/LabeledGraphics.exports.LabeledGraphics.html @@ -1567,7 +1567,7 @@
      diff --git a/doc/out/LabeledGraphics.html b/doc/out/LabeledGraphics.html index 21661dd..391c734 100644 --- a/doc/out/LabeledGraphics.html +++ b/doc/out/LabeledGraphics.html @@ -2632,7 +2632,7 @@ than wanted

      diff --git a/doc/out/List.html b/doc/out/List.html index 70b42d5..25deaa3 100644 --- a/doc/out/List.html +++ b/doc/out/List.html @@ -2591,7 +2591,7 @@ app.scene.addChild(list)
      diff --git a/doc/out/Message.html b/doc/out/Message.html index 5b58c3c..32ef279 100644 --- a/doc/out/Message.html +++ b/doc/out/Message.html @@ -2447,7 +2447,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/MessageInteractivePopup.html b/doc/out/MessageInteractivePopup.html index 1bb8e3d..d8105de 100644 --- a/doc/out/MessageInteractivePopup.html +++ b/doc/out/MessageInteractivePopup.html @@ -1795,7 +1795,7 @@ like Popup, Message...

      diff --git a/doc/out/MessageMessageInteractivePopup.html b/doc/out/MessageMessageInteractivePopup.html index bb40473..b18521c 100644 --- a/doc/out/MessageMessageInteractivePopup.html +++ b/doc/out/MessageMessageInteractivePopup.html @@ -1795,7 +1795,7 @@ like Popup, Message...

      diff --git a/doc/out/Modal.html b/doc/out/Modal.html index 44ee9e0..d7c2d93 100644 --- a/doc/out/Modal.html +++ b/doc/out/Modal.html @@ -2348,7 +2348,7 @@ a string or a PIXI.Text object.

      diff --git a/doc/out/ModalInteractivePopup.html b/doc/out/ModalInteractivePopup.html index 60d101a..9decd58 100644 --- a/doc/out/ModalInteractivePopup.html +++ b/doc/out/ModalInteractivePopup.html @@ -1795,7 +1795,7 @@ like Popup, Message...

      diff --git a/doc/out/ModalModalInteractivePopup.html b/doc/out/ModalModalInteractivePopup.html index dece6d9..9d58b6e 100644 --- a/doc/out/ModalModalInteractivePopup.html +++ b/doc/out/ModalModalInteractivePopup.html @@ -1795,7 +1795,7 @@ like Popup, Message...

      diff --git a/doc/out/PIXIApp.html b/doc/out/PIXIApp.html index c4f7a26..ca1a6f5 100644 --- a/doc/out/PIXIApp.html +++ b/doc/out/PIXIApp.html @@ -5749,7 +5749,7 @@ rejected with an error.
      diff --git a/doc/out/Popup.html b/doc/out/Popup.html index 6fe1268..95072f7 100644 --- a/doc/out/Popup.html +++ b/doc/out/Popup.html @@ -2342,7 +2342,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/PopupInteractivePopup.html b/doc/out/PopupInteractivePopup.html index 022f399..290058a 100644 --- a/doc/out/PopupInteractivePopup.html +++ b/doc/out/PopupInteractivePopup.html @@ -1795,7 +1795,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenu.html b/doc/out/PopupMenu.html index e833914..a00f44f 100644 --- a/doc/out/PopupMenu.html +++ b/doc/out/PopupMenu.html @@ -2396,7 +2396,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/PopupMenuPopupInteractivePopup.html b/doc/out/PopupMenuPopupInteractivePopup.html index 32fd054..ebff136 100644 --- a/doc/out/PopupMenuPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupInteractivePopup.html @@ -1795,7 +1795,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html b/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html index 3b67e61..5ba9e22 100644 --- a/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html @@ -1795,7 +1795,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html b/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html index b49eedb..a202c34 100644 --- a/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html @@ -1795,7 +1795,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenuPopupPopupInteractivePopup.html b/doc/out/PopupMenuPopupPopupInteractivePopup.html index 59469d7..0b425ae 100644 --- a/doc/out/PopupMenuPopupPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupPopupInteractivePopup.html @@ -1795,7 +1795,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupPopupInteractivePopup.html b/doc/out/PopupPopupInteractivePopup.html index 071db90..3d795e0 100644 --- a/doc/out/PopupPopupInteractivePopup.html +++ b/doc/out/PopupPopupInteractivePopup.html @@ -1795,7 +1795,7 @@ like Popup, Message...

      diff --git a/doc/out/Progress.html b/doc/out/Progress.html index 5e1c291..76ffe52 100644 --- a/doc/out/Progress.html +++ b/doc/out/Progress.html @@ -2881,7 +2881,7 @@ app.scene.addChild(progress)
      diff --git a/doc/out/Scrollview.html b/doc/out/Scrollview.html index 6679717..917edcc 100644 --- a/doc/out/Scrollview.html +++ b/doc/out/Scrollview.html @@ -1713,7 +1713,7 @@ app.loader
      diff --git a/doc/out/Slider.html b/doc/out/Slider.html index 3fd405e..f7a0519 100644 --- a/doc/out/Slider.html +++ b/doc/out/Slider.html @@ -2972,7 +2972,7 @@ app.scene.addChild(slider)
      diff --git a/doc/out/Switch.html b/doc/out/Switch.html index 0910b55..a39418a 100644 --- a/doc/out/Switch.html +++ b/doc/out/Switch.html @@ -3402,7 +3402,7 @@ app.scene.addChild(switch1)
      diff --git a/doc/out/TextLabel.TextLabel.html b/doc/out/TextLabel.TextLabel.html index d66ada8..bda6c4f 100644 --- a/doc/out/TextLabel.TextLabel.html +++ b/doc/out/TextLabel.TextLabel.html @@ -1696,7 +1696,7 @@
      diff --git a/doc/out/Theme.html b/doc/out/Theme.html index 39113c7..b35b789 100644 --- a/doc/out/Theme.html +++ b/doc/out/Theme.html @@ -3171,7 +3171,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/ThemeDark.html b/doc/out/ThemeDark.html index a96aa7d..34be186 100644 --- a/doc/out/ThemeDark.html +++ b/doc/out/ThemeDark.html @@ -1592,7 +1592,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/ThemeLight.html b/doc/out/ThemeLight.html index 8e98a52..2c43d69 100644 --- a/doc/out/ThemeLight.html +++ b/doc/out/ThemeLight.html @@ -1604,7 +1604,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/ThemeRed.html b/doc/out/ThemeRed.html index 54a825c..f256719 100644 --- a/doc/out/ThemeRed.html +++ b/doc/out/ThemeRed.html @@ -1604,7 +1604,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/TileQuadNode.html b/doc/out/TileQuadNode.html index 9808c5a..30e6b3b 100644 --- a/doc/out/TileQuadNode.html +++ b/doc/out/TileQuadNode.html @@ -2056,7 +2056,7 @@ an indicator of tiles to free.

      diff --git a/doc/out/Tooltip.html b/doc/out/Tooltip.html index 0f3f8e6..a2d166a 100644 --- a/doc/out/Tooltip.html +++ b/doc/out/Tooltip.html @@ -2518,7 +2518,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/UITest.html b/doc/out/UITest.html index b8c9245..e8bb23c 100644 --- a/doc/out/UITest.html +++ b/doc/out/UITest.html @@ -4189,7 +4189,7 @@ test.start()
      diff --git a/doc/out/Volatile.html b/doc/out/Volatile.html index 807ce05..a155ce0 100644 --- a/doc/out/Volatile.html +++ b/doc/out/Volatile.html @@ -2105,7 +2105,7 @@ app.scene.addChild(button)
      diff --git a/doc/out/global.html b/doc/out/global.html index ca589fd..b60d478 100644 --- a/doc/out/global.html +++ b/doc/out/global.html @@ -3326,7 +3326,7 @@
      diff --git a/doc/out/index.html b/doc/out/index.html index 9b84215..9f15b12 100644 --- a/doc/out/index.html +++ b/doc/out/index.html @@ -1491,7 +1491,7 @@
      diff --git a/doc/out/pixi_abstractpopup.js.html b/doc/out/pixi_abstractpopup.js.html index d7122a6..9e6648d 100644 --- a/doc/out/pixi_abstractpopup.js.html +++ b/doc/out/pixi_abstractpopup.js.html @@ -1814,7 +1814,7 @@ export default class AbstractPopup extends PIXI.Graphics {
      diff --git a/doc/out/pixi_app.js.html b/doc/out/pixi_app.js.html index dc337a8..000577b 100644 --- a/doc/out/pixi_app.js.html +++ b/doc/out/pixi_app.js.html @@ -2195,7 +2195,7 @@ class FpsDisplay extends PIXI.Graphics {
      diff --git a/doc/out/pixi_badge.js.html b/doc/out/pixi_badge.js.html index 1bbbfe9..132b317 100644 --- a/doc/out/pixi_badge.js.html +++ b/doc/out/pixi_badge.js.html @@ -1575,7 +1575,7 @@ export default class Badge extends AbstractPopup {
      diff --git a/doc/out/pixi_blurfilter.js.html b/doc/out/pixi_blurfilter.js.html index f2345db..1cf9b7b 100644 --- a/doc/out/pixi_blurfilter.js.html +++ b/doc/out/pixi_blurfilter.js.html @@ -1733,7 +1733,7 @@ class TiltShiftYFilter extends TiltShiftAxisFilter {
      diff --git a/doc/out/pixi_button.js.html b/doc/out/pixi_button.js.html index 00093da..106286e 100644 --- a/doc/out/pixi_button.js.html +++ b/doc/out/pixi_button.js.html @@ -1705,10 +1705,10 @@ export default class Button extends PIXI.Container { }) this.button.on('pointerout', this.onEnd.bind(this)) - this.button.on('pointercancel', this.onEnd.bind(this)) - this.button.on('pointerupoutside', this.onEnd.bind(this)) - this.button.on('pointertap', this.onEnd.bind(this)) - this.button.on('scroll', this.onEnd.bind(this)) + this.button.on('pointercancel', this.onEnd.bind(this)) + this.button.on('pointerupoutside', this.onEnd.bind(this)) + this.button.on('pointertap', this.onEnd.bind(this)) + this.button.on('scroll', this.onEnd.bind(this)) // eslint-disable-next-line no-unused-vars this.button.on('pointerdown', e => { @@ -2141,14 +2141,14 @@ export default class Button extends PIXI.Container { this.icon.tint = value } } - - onEnd(event) { - this.capture(event) - TweenLite.to([this.button, this.content], this.theme.fast, { - alpha: 1, - overwrite: 'none' - }) - } + + onEnd(event) { + this.capture(event) + TweenLite.to([this.button, this.content], this.theme.fast, { + alpha: 1, + overwrite: 'none' + }) + } } @@ -2163,7 +2163,7 @@ export default class Button extends PIXI.Container {
      diff --git a/doc/out/pixi_buttongroup.js.html b/doc/out/pixi_buttongroup.js.html index f4769ca..6d37fd8 100644 --- a/doc/out/pixi_buttongroup.js.html +++ b/doc/out/pixi_buttongroup.js.html @@ -1497,7 +1497,7 @@ export default class ButtonGroup extends PIXI.Container { * @param {number} [opts.maxWidth] - The maximum width of the button group. If the buttons are wider than the maximum width, the buttons get stacked. Note: The buttons can only be stacked if margin is not zero. Note 2: Load the Greensock ThrowPropsPlugin for smoother animations. * @param {number} [opts.maxHeight] - The maximum height of the button group. If the buttons are higher than the maximum height, the buttons get stacked. Note: The buttons can only be stacked if margin is not zero. Note 2: Load the Greensock ThrowPropsPlugin for smoother animations. * @param {number} [opts.stackPadding=10] - The padding for stacked buttons. - * @param {PIXI.Application} [opts.app] - The PixiJS Application. Must be set if you want to use the mousewheel to scroll your button group. Only used when the buttons are stacked (with maxWidth or maxHeight). + * @param {PIXI.Application} [opts.app=window.app] - The PixiJS Application. Must be set if you want to use the mousewheel to scroll your button group. Only used when the buttons are stacked (with maxWidth or maxHeight). * @param {number} [opts.padding=Theme.padding] - Button: The inner spacing (distance from icon and/or label) the the border. * @param {number} [opts.margin=Theme.margin] - The outer spacing (distance from one button to the previous/next button). * @param {string} [opts.iconPosition=left] - Button: The position of the icon in relation to the label. Can be left or right. @@ -1549,7 +1549,7 @@ export default class ButtonGroup extends PIXI.Container { maxWidth: null, maxHeight: null, stackPadding: 10, - app: null, + app: window.app, padding: theme.padding, margin: theme.margin, iconPosition: 'left', // left, right @@ -2153,7 +2153,7 @@ export default class ButtonGroup extends PIXI.Container {
      diff --git a/doc/out/pixi_deepzoom_image.js.html b/doc/out/pixi_deepzoom_image.js.html index 2d957f8..d87a3ac 100644 --- a/doc/out/pixi_deepzoom_image.js.html +++ b/doc/out/pixi_deepzoom_image.js.html @@ -2557,7 +2557,7 @@ export class DeepZoomImage extends PIXI.Container {
      diff --git a/doc/out/pixi_flippable.js.html b/doc/out/pixi_flippable.js.html index 773a71f..12b1507 100644 --- a/doc/out/pixi_flippable.js.html +++ b/doc/out/pixi_flippable.js.html @@ -1912,7 +1912,7 @@ export default class Flippable extends PIXI.projection.Camera3d {
      diff --git a/doc/out/pixi_labeledgraphics.js.html b/doc/out/pixi_labeledgraphics.js.html index e62ce64..9165ae0 100644 --- a/doc/out/pixi_labeledgraphics.js.html +++ b/doc/out/pixi_labeledgraphics.js.html @@ -1861,7 +1861,7 @@ export class BitmapLabeledGraphics extends LabeledGraphics {
      diff --git a/doc/out/pixi_list.js.html b/doc/out/pixi_list.js.html index e3e3e8f..6b57f8b 100644 --- a/doc/out/pixi_list.js.html +++ b/doc/out/pixi_list.js.html @@ -1840,7 +1840,7 @@ export default class List extends PIXI.Container {
      diff --git a/doc/out/pixi_message.js.html b/doc/out/pixi_message.js.html index f0cc2de..8571976 100644 --- a/doc/out/pixi_message.js.html +++ b/doc/out/pixi_message.js.html @@ -1589,7 +1589,7 @@ export default class Message extends InteractivePopup {
      diff --git a/doc/out/pixi_modal.js.html b/doc/out/pixi_modal.js.html index 30ff617..f914c79 100644 --- a/doc/out/pixi_modal.js.html +++ b/doc/out/pixi_modal.js.html @@ -1670,7 +1670,7 @@ export default class Modal extends PIXI.Container {
      diff --git a/doc/out/pixi_popup.js.html b/doc/out/pixi_popup.js.html index e32f2a0..3d21a7c 100644 --- a/doc/out/pixi_popup.js.html +++ b/doc/out/pixi_popup.js.html @@ -1680,7 +1680,7 @@ export default class Popup extends InteractivePopup {
      diff --git a/doc/out/pixi_popupmenu.js.html b/doc/out/pixi_popupmenu.js.html index 6fb8067..2af7442 100644 --- a/doc/out/pixi_popupmenu.js.html +++ b/doc/out/pixi_popupmenu.js.html @@ -1583,7 +1583,7 @@ export default class PopupMenu extends Popup {
      diff --git a/doc/out/pixi_progress.js.html b/doc/out/pixi_progress.js.html index 915bb30..06d0687 100644 --- a/doc/out/pixi_progress.js.html +++ b/doc/out/pixi_progress.js.html @@ -1765,7 +1765,7 @@ export default class Progress extends PIXI.Container {
      diff --git a/doc/out/pixi_scrollview.js.html b/doc/out/pixi_scrollview.js.html index 075bd93..704a93c 100644 --- a/doc/out/pixi_scrollview.js.html +++ b/doc/out/pixi_scrollview.js.html @@ -1524,7 +1524,7 @@ export default class Scrollview extends Scrollbox {
      diff --git a/doc/out/pixi_slider.js.html b/doc/out/pixi_slider.js.html index 223aaad..9bdbc46 100644 --- a/doc/out/pixi_slider.js.html +++ b/doc/out/pixi_slider.js.html @@ -1929,7 +1929,7 @@ export default class Slider extends PIXI.Container {
      diff --git a/doc/out/pixi_switch.js.html b/doc/out/pixi_switch.js.html index 65ef200..584883f 100644 --- a/doc/out/pixi_switch.js.html +++ b/doc/out/pixi_switch.js.html @@ -1983,7 +1983,7 @@ export default class Switch extends PIXI.Container {
      diff --git a/doc/out/pixi_theme.js.html b/doc/out/pixi_theme.js.html index 8b4911e..f916a8f 100644 --- a/doc/out/pixi_theme.js.html +++ b/doc/out/pixi_theme.js.html @@ -1724,7 +1724,7 @@ export class ThemeRed extends Theme {
      diff --git a/doc/out/pixi_tooltip.js.html b/doc/out/pixi_tooltip.js.html index 793d8ed..394d4da 100644 --- a/doc/out/pixi_tooltip.js.html +++ b/doc/out/pixi_tooltip.js.html @@ -1617,7 +1617,7 @@ export default class Tooltip extends AbstractPopup {
      diff --git a/doc/out/pixi_volatile.js.html b/doc/out/pixi_volatile.js.html index 0b14cff..802fd2f 100644 --- a/doc/out/pixi_volatile.js.html +++ b/doc/out/pixi_volatile.js.html @@ -1621,7 +1621,7 @@ export default class Volatile {
      diff --git a/doc/out/uitest.js.html b/doc/out/uitest.js.html index 2f186fd..a57fd9e 100644 --- a/doc/out/uitest.js.html +++ b/doc/out/uitest.js.html @@ -2472,7 +2472,7 @@ class Event {
      diff --git a/lib/pixi/buttongroup.js b/lib/pixi/buttongroup.js index feaec6c..841619a 100644 --- a/lib/pixi/buttongroup.js +++ b/lib/pixi/buttongroup.js @@ -45,7 +45,7 @@ export default class ButtonGroup extends PIXI.Container { * @param {number} [opts.maxWidth] - The maximum width of the button group. If the buttons are wider than the maximum width, the buttons get stacked. Note: The buttons can only be stacked if margin is not zero. Note 2: Load the Greensock ThrowPropsPlugin for smoother animations. * @param {number} [opts.maxHeight] - The maximum height of the button group. If the buttons are higher than the maximum height, the buttons get stacked. Note: The buttons can only be stacked if margin is not zero. Note 2: Load the Greensock ThrowPropsPlugin for smoother animations. * @param {number} [opts.stackPadding=10] - The padding for stacked buttons. - * @param {PIXI.Application} [opts.app] - The PixiJS Application. Must be set if you want to use the mousewheel to scroll your button group. Only used when the buttons are stacked (with maxWidth or maxHeight). + * @param {PIXI.Application} [opts.app=window.app] - The PixiJS Application. Must be set if you want to use the mousewheel to scroll your button group. Only used when the buttons are stacked (with maxWidth or maxHeight). * @param {number} [opts.padding=Theme.padding] - Button: The inner spacing (distance from icon and/or label) the the border. * @param {number} [opts.margin=Theme.margin] - The outer spacing (distance from one button to the previous/next button). * @param {string} [opts.iconPosition=left] - Button: The position of the icon in relation to the label. Can be left or right. @@ -97,7 +97,7 @@ export default class ButtonGroup extends PIXI.Container { maxWidth: null, maxHeight: null, stackPadding: 10, - app: null, + app: window.app, padding: theme.padding, margin: theme.margin, iconPosition: 'left', // left, right From 05c952fbe14c98cf7894536254c942ce8f9cc913 Mon Sep 17 00:00:00 2001 From: Sebastian Kupke Date: Tue, 6 Aug 2019 12:01:32 +0200 Subject: [PATCH 18/30] Added badge content example to button doctest. --- dist/iwmlib.js | 38 ++++----- dist/iwmlib.pixi.js | 78 ++++++++++--------- doc/out/AbstractPopup.html | 2 +- doc/out/Badge.html | 2 +- doc/out/BlurFilter.html | 2 +- doc/out/Button.html | 8 +- doc/out/ButtonGroup.html | 2 +- doc/out/DeepZoomImage.html | 2 +- doc/out/DeepZoomInfo.html | 2 +- doc/out/Flippable.html | 2 +- doc/out/FontInfo.html | 2 +- doc/out/Hypenate.html | 2 +- doc/out/InteractivePopup.html | 2 +- ...beledGraphics.exports.LabeledGraphics.html | 2 +- doc/out/LabeledGraphics.html | 2 +- doc/out/List.html | 2 +- doc/out/Message.html | 2 +- doc/out/MessageInteractivePopup.html | 2 +- doc/out/MessageMessageInteractivePopup.html | 2 +- doc/out/Modal.html | 2 +- doc/out/ModalInteractivePopup.html | 2 +- doc/out/ModalModalInteractivePopup.html | 2 +- doc/out/PIXIApp.html | 2 +- doc/out/Popup.html | 2 +- doc/out/PopupInteractivePopup.html | 2 +- doc/out/PopupMenu.html | 2 +- doc/out/PopupMenuPopupInteractivePopup.html | 2 +- ...pupMenuPopupMenuPopupInteractivePopup.html | 2 +- ...nuPopupMenuPopupPopupInteractivePopup.html | 2 +- .../PopupMenuPopupPopupInteractivePopup.html | 2 +- doc/out/PopupPopupInteractivePopup.html | 2 +- doc/out/Progress.html | 2 +- doc/out/Scrollview.html | 2 +- doc/out/Slider.html | 2 +- doc/out/Switch.html | 2 +- doc/out/TextLabel.TextLabel.html | 2 +- doc/out/Theme.html | 2 +- doc/out/ThemeDark.html | 2 +- doc/out/ThemeLight.html | 2 +- doc/out/ThemeRed.html | 2 +- doc/out/TileQuadNode.html | 2 +- doc/out/Tooltip.html | 2 +- doc/out/UITest.html | 2 +- doc/out/Volatile.html | 2 +- doc/out/global.html | 2 +- doc/out/index.html | 2 +- doc/out/pixi_abstractpopup.js.html | 2 +- doc/out/pixi_app.js.html | 2 +- doc/out/pixi_badge.js.html | 2 +- doc/out/pixi_blurfilter.js.html | 2 +- doc/out/pixi_button.js.html | 61 +++++++++------ doc/out/pixi_buttongroup.js.html | 2 +- doc/out/pixi_deepzoom_image.js.html | 2 +- doc/out/pixi_flippable.js.html | 2 +- doc/out/pixi_labeledgraphics.js.html | 2 +- doc/out/pixi_list.js.html | 2 +- doc/out/pixi_message.js.html | 2 +- doc/out/pixi_modal.js.html | 2 +- doc/out/pixi_popup.js.html | 2 +- doc/out/pixi_popupmenu.js.html | 2 +- doc/out/pixi_progress.js.html | 2 +- doc/out/pixi_scrollview.js.html | 2 +- doc/out/pixi_slider.js.html | 2 +- doc/out/pixi_switch.js.html | 2 +- doc/out/pixi_theme.js.html | 2 +- doc/out/pixi_tooltip.js.html | 2 +- doc/out/pixi_volatile.js.html | 2 +- doc/out/uitest.js.html | 2 +- lib/pixi/button.html | 22 +++++- lib/pixi/button.js | 59 ++++++++------ 70 files changed, 217 insertions(+), 177 deletions(-) diff --git a/dist/iwmlib.js b/dist/iwmlib.js index 480b8b6..98d036b 100644 --- a/dist/iwmlib.js +++ b/dist/iwmlib.js @@ -4457,6 +4457,8 @@ DOMScatter$1.zIndex = 1000; + /* eslint-disable no-unused-vars */ + class CardLoader { constructor( src, @@ -4477,7 +4479,7 @@ this.x = x; this.y = y; this.scale = scale; - this.rotation = 0; + this.rotation = rotation; this.maxScale = maxScale; this.minScale = minScale; this.wantedWidth = width; @@ -4485,12 +4487,6 @@ this.maxWidth = maxWidth != null ? maxWidth : window.innerWidth; this.maxHeight = maxHeight != null ? maxHeight : window.innerHeight; this.addedNode = null; - console.log({ - width, - height, - maxWidth, - maxHeight - }); } unload() { @@ -4575,7 +4571,6 @@ return new Promise((resolve, reject) => { let isFrame = domNode instanceof HTMLIFrameElement; let iframe = isFrame ? domNode : document.createElement('iframe'); - console.log('FrameLoader.load', isFrame, iframe, this.src); iframe.frameBorder = 0; iframe.style.scrolling = false; iframe.width = this.wantedWidth; @@ -4602,14 +4597,9 @@ let xhr = new XMLHttpRequest(); xhr.open('GET', this.src, false); xhr.onload = e => { - domNode.innerHTML = xhr.response; + domNode.innerHTML = this.prepare(xhr.response); this.addedNode = domNode.firstElementChild; let { width, height } = this.size(this.addedNode); - console.log('HTMLLoader.load', { - added: this.addedNode, - width, - height - }); if (width) this.wantedWidth = width || this.wantedWidth; if (height) this.wantedHeight = height || this.wantedHeight; resolve(this); @@ -4621,6 +4611,18 @@ }) } + /** + * Preoares the html before it is assigned with innerHTML. + * Can be overwritten in subclasses. + * + * @param {*} html + * @returns + * @memberof HTMLLoader + */ + prepare(html) { + return html + } + /** * Tries to determine the size of the addedNode. * Checks for explicit width and height style attributes. @@ -4776,7 +4778,6 @@ } setupFlippable(flippable, loader) { - console.log('setupFlippable', loader.wantedWidth); flippable.wantedWidth = loader.wantedWidth; flippable.wantedHeight = loader.wantedHeight; flippable.wantedScale = loader.scale; @@ -4786,7 +4787,6 @@ } start({ targetCenter = null } = {}) { - console.log('DOMFlip.start', targetCenter); if (this.preloadBack) { this.flippable.start({ duration: this.flipDuration, targetCenter }); } else { @@ -4936,7 +4936,6 @@ clickInfo() { this.bringToFront(); - console.log('clickInfo'); this.infoBtn.click(); } @@ -4963,6 +4962,7 @@ let startScale = this.element._gsTransform.scaleX; let w = this.element.style.width; let h = this.element.style.height; + // eslint-disable-next-line no-console console.log(info, startX, startY, startAngle, startScale, w, h); } @@ -5032,14 +5032,12 @@ let y = this.flipped ? yy : this.startY; let onUpdate = this.onUpdate !== null ? () => this.onUpdate(this) : null; - console.log('start', this.flipDuration); TweenLite.to(this.card, this.flipDuration, { rotationY: targetY, ease: Power1.easeOut, transformOrigin: '50% 50%', onUpdate, onComplete: e => { - console.log('start end', this.flipDuration); if (this.flipped) { //this.hide(this.front) this.enable(this.backBtn); @@ -5070,8 +5068,6 @@ }, force3D: true }); - - console.log('start 2', this.wantedWidth, this.startWidth, { w, h }); // See https://greensock.com/forums/topic/7997-rotate-the-shortest-way/ TweenLite.to(this.element, this.flipDuration / 2, { scale: targetScale, diff --git a/dist/iwmlib.pixi.js b/dist/iwmlib.pixi.js index 52dc372..9af57e2 100644 --- a/dist/iwmlib.pixi.js +++ b/dist/iwmlib.pixi.js @@ -2569,34 +2569,12 @@ } const badge = new Badge(opts); - - switch (opts.align) { - case 'left': - badge.x = this.x - badge.width / 2 + opts.offsetLeft; - break - case 'center': - badge.x = this.x + this.width / 2 - badge.width / 2 + opts.offsetLeft; - break - case 'right': - badge.x = this.x + this.width - badge.width / 2 + opts.offsetLeft; - } - - switch (opts.verticalAlign) { - case 'top': - badge.y = this.y - badge.height / 2 + opts.offsetTop; - break - case 'middle': - badge.y = this.y + this.height / 2 - badge.height / 2 + opts.offsetTop; - break - case 'bottom': - badge.y = this.y + this.height - badge.height / 2 + opts.offsetTop; - } - this.addChild(badge); - this.badge = badge; } + this.layout(); + // set position //----------------- this.position.set(this.opts.x, this.opts.y); @@ -2681,6 +2659,40 @@ this.icon = icon; + // badge + //-------------------- + if (this.badge) { + + this.removeChild(this.badge); + const width = this.width; + const height = this.height; + this.addChild(this.badge); + + const badge = this.badge; + + switch (badge.opts.align) { + case 'left': + badge.x = -badge.width / 2 + badge.opts.offsetLeft; + break + case 'center': + badge.x = width / 2 - badge.width / 2 + badge.opts.offsetLeft; + break + case 'right': + badge.x = width - badge.width / 2 + badge.opts.offsetLeft; + } + + switch (badge.opts.verticalAlign) { + case 'top': + badge.y = -badge.height / 2 + badge.opts.offsetTop; + break + case 'middle': + badge.y = height / 2 - badge.height / 2 + badge.opts.offsetTop; + break + case 'bottom': + badge.y = height - badge.height / 2 + badge.opts.offsetTop; + } + } + // draw //----------------- this.draw(); @@ -7859,6 +7871,8 @@ DOMScatter.zIndex = 1000; + /* eslint-disable no-unused-vars */ + class CardLoader { constructor( src, @@ -7879,7 +7893,7 @@ this.x = x; this.y = y; this.scale = scale; - this.rotation = 0; + this.rotation = rotation; this.maxScale = maxScale; this.minScale = minScale; this.wantedWidth = width; @@ -7887,12 +7901,6 @@ this.maxWidth = maxWidth != null ? maxWidth : window.innerWidth; this.maxHeight = maxHeight != null ? maxHeight : window.innerHeight; this.addedNode = null; - console.log({ - width, - height, - maxWidth, - maxHeight - }); } unload() { @@ -8042,7 +8050,6 @@ } setupFlippable(flippable, loader) { - console.log('setupFlippable', loader.wantedWidth); flippable.wantedWidth = loader.wantedWidth; flippable.wantedHeight = loader.wantedHeight; flippable.wantedScale = loader.scale; @@ -8052,7 +8059,6 @@ } start({ targetCenter = null } = {}) { - console.log('DOMFlip.start', targetCenter); if (this.preloadBack) { this.flippable.start({ duration: this.flipDuration, targetCenter }); } else { @@ -8202,7 +8208,6 @@ clickInfo() { this.bringToFront(); - console.log('clickInfo'); this.infoBtn.click(); } @@ -8229,6 +8234,7 @@ let startScale = this.element._gsTransform.scaleX; let w = this.element.style.width; let h = this.element.style.height; + // eslint-disable-next-line no-console console.log(info, startX, startY, startAngle, startScale, w, h); } @@ -8298,14 +8304,12 @@ let y = this.flipped ? yy : this.startY; let onUpdate = this.onUpdate !== null ? () => this.onUpdate(this) : null; - console.log('start', this.flipDuration); TweenLite.to(this.card, this.flipDuration, { rotationY: targetY, ease: Power1.easeOut, transformOrigin: '50% 50%', onUpdate, onComplete: e => { - console.log('start end', this.flipDuration); if (this.flipped) { //this.hide(this.front) this.enable(this.backBtn); @@ -8336,8 +8340,6 @@ }, force3D: true }); - - console.log('start 2', this.wantedWidth, this.startWidth, { w, h }); // See https://greensock.com/forums/topic/7997-rotate-the-shortest-way/ TweenLite.to(this.element, this.flipDuration / 2, { scale: targetScale, diff --git a/doc/out/AbstractPopup.html b/doc/out/AbstractPopup.html index 92e6fc2..53f6f81 100644 --- a/doc/out/AbstractPopup.html +++ b/doc/out/AbstractPopup.html @@ -2924,7 +2924,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/Badge.html b/doc/out/Badge.html index 9ca0a6d..94510bb 100644 --- a/doc/out/Badge.html +++ b/doc/out/Badge.html @@ -2380,7 +2380,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/BlurFilter.html b/doc/out/BlurFilter.html index e7d5fa4..0539813 100644 --- a/doc/out/BlurFilter.html +++ b/doc/out/BlurFilter.html @@ -1804,7 +1804,7 @@ app.scene.filters = [blurFilter]
      diff --git a/doc/out/Button.html b/doc/out/Button.html index c2f1b3d..31d6611 100644 --- a/doc/out/Button.html +++ b/doc/out/Button.html @@ -3505,7 +3505,7 @@ the tint property of the icon sprite.

      @@ -3610,7 +3610,7 @@ the tint property of the icon sprite.

      @@ -3715,7 +3715,7 @@ the tint property of the icon sprite.

      @@ -3822,7 +3822,7 @@ the tint property of the icon sprite.

      diff --git a/doc/out/ButtonGroup.html b/doc/out/ButtonGroup.html index b627c1f..f083136 100644 --- a/doc/out/ButtonGroup.html +++ b/doc/out/ButtonGroup.html @@ -3800,7 +3800,7 @@ app.scene.addChild(buttonGroup)
      diff --git a/doc/out/DeepZoomImage.html b/doc/out/DeepZoomImage.html index ae386ce..ebe9906 100644 --- a/doc/out/DeepZoomImage.html +++ b/doc/out/DeepZoomImage.html @@ -5102,7 +5102,7 @@ i.e. after loading a single tile

      diff --git a/doc/out/DeepZoomInfo.html b/doc/out/DeepZoomInfo.html index 3e0eff4..f806fc5 100644 --- a/doc/out/DeepZoomInfo.html +++ b/doc/out/DeepZoomInfo.html @@ -2615,7 +2615,7 @@ on completion.

      diff --git a/doc/out/Flippable.html b/doc/out/Flippable.html index c6009df..0753009 100644 --- a/doc/out/Flippable.html +++ b/doc/out/Flippable.html @@ -2518,7 +2518,7 @@ front.on('click', event => flippable.toggle())
      diff --git a/doc/out/FontInfo.html b/doc/out/FontInfo.html index 9f41c13..7b323ed 100644 --- a/doc/out/FontInfo.html +++ b/doc/out/FontInfo.html @@ -1565,7 +1565,7 @@
      diff --git a/doc/out/Hypenate.html b/doc/out/Hypenate.html index b7fdafe..51d6c52 100644 --- a/doc/out/Hypenate.html +++ b/doc/out/Hypenate.html @@ -1767,7 +1767,7 @@
      diff --git a/doc/out/InteractivePopup.html b/doc/out/InteractivePopup.html index 7d462ec..3096cf2 100644 --- a/doc/out/InteractivePopup.html +++ b/doc/out/InteractivePopup.html @@ -2349,7 +2349,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/LabeledGraphics.exports.LabeledGraphics.html b/doc/out/LabeledGraphics.exports.LabeledGraphics.html index adfb475..ae30037 100644 --- a/doc/out/LabeledGraphics.exports.LabeledGraphics.html +++ b/doc/out/LabeledGraphics.exports.LabeledGraphics.html @@ -1567,7 +1567,7 @@
      diff --git a/doc/out/LabeledGraphics.html b/doc/out/LabeledGraphics.html index 391c734..6c3aade 100644 --- a/doc/out/LabeledGraphics.html +++ b/doc/out/LabeledGraphics.html @@ -2632,7 +2632,7 @@ than wanted

      diff --git a/doc/out/List.html b/doc/out/List.html index 25deaa3..471c0b0 100644 --- a/doc/out/List.html +++ b/doc/out/List.html @@ -2591,7 +2591,7 @@ app.scene.addChild(list)
      diff --git a/doc/out/Message.html b/doc/out/Message.html index 32ef279..1c0e719 100644 --- a/doc/out/Message.html +++ b/doc/out/Message.html @@ -2447,7 +2447,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/MessageInteractivePopup.html b/doc/out/MessageInteractivePopup.html index d8105de..8689cfd 100644 --- a/doc/out/MessageInteractivePopup.html +++ b/doc/out/MessageInteractivePopup.html @@ -1795,7 +1795,7 @@ like Popup, Message...

      diff --git a/doc/out/MessageMessageInteractivePopup.html b/doc/out/MessageMessageInteractivePopup.html index b18521c..dec2a0b 100644 --- a/doc/out/MessageMessageInteractivePopup.html +++ b/doc/out/MessageMessageInteractivePopup.html @@ -1795,7 +1795,7 @@ like Popup, Message...

      diff --git a/doc/out/Modal.html b/doc/out/Modal.html index d7c2d93..0e6181f 100644 --- a/doc/out/Modal.html +++ b/doc/out/Modal.html @@ -2348,7 +2348,7 @@ a string or a PIXI.Text object.

      diff --git a/doc/out/ModalInteractivePopup.html b/doc/out/ModalInteractivePopup.html index 9decd58..9096373 100644 --- a/doc/out/ModalInteractivePopup.html +++ b/doc/out/ModalInteractivePopup.html @@ -1795,7 +1795,7 @@ like Popup, Message...

      diff --git a/doc/out/ModalModalInteractivePopup.html b/doc/out/ModalModalInteractivePopup.html index 9d58b6e..468b05a 100644 --- a/doc/out/ModalModalInteractivePopup.html +++ b/doc/out/ModalModalInteractivePopup.html @@ -1795,7 +1795,7 @@ like Popup, Message...

      diff --git a/doc/out/PIXIApp.html b/doc/out/PIXIApp.html index ca1a6f5..343817c 100644 --- a/doc/out/PIXIApp.html +++ b/doc/out/PIXIApp.html @@ -5749,7 +5749,7 @@ rejected with an error.
      diff --git a/doc/out/Popup.html b/doc/out/Popup.html index 95072f7..b2bd7d1 100644 --- a/doc/out/Popup.html +++ b/doc/out/Popup.html @@ -2342,7 +2342,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/PopupInteractivePopup.html b/doc/out/PopupInteractivePopup.html index 290058a..0e42048 100644 --- a/doc/out/PopupInteractivePopup.html +++ b/doc/out/PopupInteractivePopup.html @@ -1795,7 +1795,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenu.html b/doc/out/PopupMenu.html index a00f44f..06e683f 100644 --- a/doc/out/PopupMenu.html +++ b/doc/out/PopupMenu.html @@ -2396,7 +2396,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/PopupMenuPopupInteractivePopup.html b/doc/out/PopupMenuPopupInteractivePopup.html index ebff136..31edb4f 100644 --- a/doc/out/PopupMenuPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupInteractivePopup.html @@ -1795,7 +1795,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html b/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html index 5ba9e22..462a88a 100644 --- a/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html @@ -1795,7 +1795,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html b/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html index a202c34..ea09a09 100644 --- a/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html @@ -1795,7 +1795,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenuPopupPopupInteractivePopup.html b/doc/out/PopupMenuPopupPopupInteractivePopup.html index 0b425ae..c18fe02 100644 --- a/doc/out/PopupMenuPopupPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupPopupInteractivePopup.html @@ -1795,7 +1795,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupPopupInteractivePopup.html b/doc/out/PopupPopupInteractivePopup.html index 3d795e0..aafb5e2 100644 --- a/doc/out/PopupPopupInteractivePopup.html +++ b/doc/out/PopupPopupInteractivePopup.html @@ -1795,7 +1795,7 @@ like Popup, Message...

      diff --git a/doc/out/Progress.html b/doc/out/Progress.html index 76ffe52..d5675fb 100644 --- a/doc/out/Progress.html +++ b/doc/out/Progress.html @@ -2881,7 +2881,7 @@ app.scene.addChild(progress)
      diff --git a/doc/out/Scrollview.html b/doc/out/Scrollview.html index 917edcc..f0d2941 100644 --- a/doc/out/Scrollview.html +++ b/doc/out/Scrollview.html @@ -1713,7 +1713,7 @@ app.loader
      diff --git a/doc/out/Slider.html b/doc/out/Slider.html index f7a0519..8e248dc 100644 --- a/doc/out/Slider.html +++ b/doc/out/Slider.html @@ -2972,7 +2972,7 @@ app.scene.addChild(slider)
      diff --git a/doc/out/Switch.html b/doc/out/Switch.html index a39418a..2b4a44f 100644 --- a/doc/out/Switch.html +++ b/doc/out/Switch.html @@ -3402,7 +3402,7 @@ app.scene.addChild(switch1)
      diff --git a/doc/out/TextLabel.TextLabel.html b/doc/out/TextLabel.TextLabel.html index bda6c4f..f2a0cba 100644 --- a/doc/out/TextLabel.TextLabel.html +++ b/doc/out/TextLabel.TextLabel.html @@ -1696,7 +1696,7 @@
      diff --git a/doc/out/Theme.html b/doc/out/Theme.html index b35b789..2727b58 100644 --- a/doc/out/Theme.html +++ b/doc/out/Theme.html @@ -3171,7 +3171,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/ThemeDark.html b/doc/out/ThemeDark.html index 34be186..7d52464 100644 --- a/doc/out/ThemeDark.html +++ b/doc/out/ThemeDark.html @@ -1592,7 +1592,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/ThemeLight.html b/doc/out/ThemeLight.html index 2c43d69..4b99e10 100644 --- a/doc/out/ThemeLight.html +++ b/doc/out/ThemeLight.html @@ -1604,7 +1604,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/ThemeRed.html b/doc/out/ThemeRed.html index f256719..c5c751d 100644 --- a/doc/out/ThemeRed.html +++ b/doc/out/ThemeRed.html @@ -1604,7 +1604,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/TileQuadNode.html b/doc/out/TileQuadNode.html index 30e6b3b..ecf3e3a 100644 --- a/doc/out/TileQuadNode.html +++ b/doc/out/TileQuadNode.html @@ -2056,7 +2056,7 @@ an indicator of tiles to free.

      diff --git a/doc/out/Tooltip.html b/doc/out/Tooltip.html index a2d166a..294a4be 100644 --- a/doc/out/Tooltip.html +++ b/doc/out/Tooltip.html @@ -2518,7 +2518,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/UITest.html b/doc/out/UITest.html index e8bb23c..129fa96 100644 --- a/doc/out/UITest.html +++ b/doc/out/UITest.html @@ -4189,7 +4189,7 @@ test.start()
      diff --git a/doc/out/Volatile.html b/doc/out/Volatile.html index a155ce0..7bc122b 100644 --- a/doc/out/Volatile.html +++ b/doc/out/Volatile.html @@ -2105,7 +2105,7 @@ app.scene.addChild(button)
      diff --git a/doc/out/global.html b/doc/out/global.html index b60d478..76ab0c5 100644 --- a/doc/out/global.html +++ b/doc/out/global.html @@ -3326,7 +3326,7 @@
      diff --git a/doc/out/index.html b/doc/out/index.html index 9f15b12..0164d5c 100644 --- a/doc/out/index.html +++ b/doc/out/index.html @@ -1491,7 +1491,7 @@
      diff --git a/doc/out/pixi_abstractpopup.js.html b/doc/out/pixi_abstractpopup.js.html index 9e6648d..997facd 100644 --- a/doc/out/pixi_abstractpopup.js.html +++ b/doc/out/pixi_abstractpopup.js.html @@ -1814,7 +1814,7 @@ export default class AbstractPopup extends PIXI.Graphics {
      diff --git a/doc/out/pixi_app.js.html b/doc/out/pixi_app.js.html index 000577b..f6da038 100644 --- a/doc/out/pixi_app.js.html +++ b/doc/out/pixi_app.js.html @@ -2195,7 +2195,7 @@ class FpsDisplay extends PIXI.Graphics {
      diff --git a/doc/out/pixi_badge.js.html b/doc/out/pixi_badge.js.html index 132b317..99e9bea 100644 --- a/doc/out/pixi_badge.js.html +++ b/doc/out/pixi_badge.js.html @@ -1575,7 +1575,7 @@ export default class Badge extends AbstractPopup {
      diff --git a/doc/out/pixi_blurfilter.js.html b/doc/out/pixi_blurfilter.js.html index 1cf9b7b..ff4a158 100644 --- a/doc/out/pixi_blurfilter.js.html +++ b/doc/out/pixi_blurfilter.js.html @@ -1733,7 +1733,7 @@ class TiltShiftYFilter extends TiltShiftAxisFilter {
      diff --git a/doc/out/pixi_button.js.html b/doc/out/pixi_button.js.html index 106286e..16e0550 100644 --- a/doc/out/pixi_button.js.html +++ b/doc/out/pixi_button.js.html @@ -1791,34 +1791,12 @@ export default class Button extends PIXI.Container { } const badge = new Badge(opts) - - switch (opts.align) { - case 'left': - badge.x = this.x - badge.width / 2 + opts.offsetLeft - break - case 'center': - badge.x = this.x + this.width / 2 - badge.width / 2 + opts.offsetLeft - break - case 'right': - badge.x = this.x + this.width - badge.width / 2 + opts.offsetLeft - } - - switch (opts.verticalAlign) { - case 'top': - badge.y = this.y - badge.height / 2 + opts.offsetTop - break - case 'middle': - badge.y = this.y + this.height / 2 - badge.height / 2 + opts.offsetTop - break - case 'bottom': - badge.y = this.y + this.height - badge.height / 2 + opts.offsetTop - } - this.addChild(badge) - this.badge = badge } + this.layout() + // set position //----------------- this.position.set(this.opts.x, this.opts.y) @@ -1903,6 +1881,39 @@ export default class Button extends PIXI.Container { this.icon = icon + // badge + //-------------------- + if (this.badge) { + this.removeChild(this.badge) + const width = this.width + const height = this.height + this.addChild(this.badge) + + const badge = this.badge + + switch (badge.opts.align) { + case 'left': + badge.x = -badge.width / 2 + badge.opts.offsetLeft + break + case 'center': + badge.x = width / 2 - badge.width / 2 + badge.opts.offsetLeft + break + case 'right': + badge.x = width - badge.width / 2 + badge.opts.offsetLeft + } + + switch (badge.opts.verticalAlign) { + case 'top': + badge.y = -badge.height / 2 + badge.opts.offsetTop + break + case 'middle': + badge.y = height / 2 - badge.height / 2 + badge.opts.offsetTop + break + case 'bottom': + badge.y = height - badge.height / 2 + badge.opts.offsetTop + } + } + // draw //----------------- this.draw() @@ -2163,7 +2174,7 @@ export default class Button extends PIXI.Container {
      diff --git a/doc/out/pixi_buttongroup.js.html b/doc/out/pixi_buttongroup.js.html index 6d37fd8..5e154f5 100644 --- a/doc/out/pixi_buttongroup.js.html +++ b/doc/out/pixi_buttongroup.js.html @@ -2153,7 +2153,7 @@ export default class ButtonGroup extends PIXI.Container {
      diff --git a/doc/out/pixi_deepzoom_image.js.html b/doc/out/pixi_deepzoom_image.js.html index d87a3ac..2f0777b 100644 --- a/doc/out/pixi_deepzoom_image.js.html +++ b/doc/out/pixi_deepzoom_image.js.html @@ -2557,7 +2557,7 @@ export class DeepZoomImage extends PIXI.Container {
      diff --git a/doc/out/pixi_flippable.js.html b/doc/out/pixi_flippable.js.html index 12b1507..3b8792f 100644 --- a/doc/out/pixi_flippable.js.html +++ b/doc/out/pixi_flippable.js.html @@ -1912,7 +1912,7 @@ export default class Flippable extends PIXI.projection.Camera3d {
      diff --git a/doc/out/pixi_labeledgraphics.js.html b/doc/out/pixi_labeledgraphics.js.html index 9165ae0..67acfce 100644 --- a/doc/out/pixi_labeledgraphics.js.html +++ b/doc/out/pixi_labeledgraphics.js.html @@ -1861,7 +1861,7 @@ export class BitmapLabeledGraphics extends LabeledGraphics {
      diff --git a/doc/out/pixi_list.js.html b/doc/out/pixi_list.js.html index 6b57f8b..724d866 100644 --- a/doc/out/pixi_list.js.html +++ b/doc/out/pixi_list.js.html @@ -1840,7 +1840,7 @@ export default class List extends PIXI.Container {
      diff --git a/doc/out/pixi_message.js.html b/doc/out/pixi_message.js.html index 8571976..1c0f50d 100644 --- a/doc/out/pixi_message.js.html +++ b/doc/out/pixi_message.js.html @@ -1589,7 +1589,7 @@ export default class Message extends InteractivePopup {
      diff --git a/doc/out/pixi_modal.js.html b/doc/out/pixi_modal.js.html index f914c79..5258e05 100644 --- a/doc/out/pixi_modal.js.html +++ b/doc/out/pixi_modal.js.html @@ -1670,7 +1670,7 @@ export default class Modal extends PIXI.Container {
      diff --git a/doc/out/pixi_popup.js.html b/doc/out/pixi_popup.js.html index 3d21a7c..a735a45 100644 --- a/doc/out/pixi_popup.js.html +++ b/doc/out/pixi_popup.js.html @@ -1680,7 +1680,7 @@ export default class Popup extends InteractivePopup {
      diff --git a/doc/out/pixi_popupmenu.js.html b/doc/out/pixi_popupmenu.js.html index 2af7442..1f064b6 100644 --- a/doc/out/pixi_popupmenu.js.html +++ b/doc/out/pixi_popupmenu.js.html @@ -1583,7 +1583,7 @@ export default class PopupMenu extends Popup {
      diff --git a/doc/out/pixi_progress.js.html b/doc/out/pixi_progress.js.html index 06d0687..18c81e2 100644 --- a/doc/out/pixi_progress.js.html +++ b/doc/out/pixi_progress.js.html @@ -1765,7 +1765,7 @@ export default class Progress extends PIXI.Container {
      diff --git a/doc/out/pixi_scrollview.js.html b/doc/out/pixi_scrollview.js.html index 704a93c..4b0de8c 100644 --- a/doc/out/pixi_scrollview.js.html +++ b/doc/out/pixi_scrollview.js.html @@ -1524,7 +1524,7 @@ export default class Scrollview extends Scrollbox {
      diff --git a/doc/out/pixi_slider.js.html b/doc/out/pixi_slider.js.html index 9bdbc46..b29ae90 100644 --- a/doc/out/pixi_slider.js.html +++ b/doc/out/pixi_slider.js.html @@ -1929,7 +1929,7 @@ export default class Slider extends PIXI.Container {
      diff --git a/doc/out/pixi_switch.js.html b/doc/out/pixi_switch.js.html index 584883f..b21356f 100644 --- a/doc/out/pixi_switch.js.html +++ b/doc/out/pixi_switch.js.html @@ -1983,7 +1983,7 @@ export default class Switch extends PIXI.Container {
      diff --git a/doc/out/pixi_theme.js.html b/doc/out/pixi_theme.js.html index f916a8f..8bfa9b1 100644 --- a/doc/out/pixi_theme.js.html +++ b/doc/out/pixi_theme.js.html @@ -1724,7 +1724,7 @@ export class ThemeRed extends Theme {
      diff --git a/doc/out/pixi_tooltip.js.html b/doc/out/pixi_tooltip.js.html index 394d4da..886be01 100644 --- a/doc/out/pixi_tooltip.js.html +++ b/doc/out/pixi_tooltip.js.html @@ -1617,7 +1617,7 @@ export default class Tooltip extends AbstractPopup {
      diff --git a/doc/out/pixi_volatile.js.html b/doc/out/pixi_volatile.js.html index 802fd2f..aa9652d 100644 --- a/doc/out/pixi_volatile.js.html +++ b/doc/out/pixi_volatile.js.html @@ -1621,7 +1621,7 @@ export default class Volatile {
      diff --git a/doc/out/uitest.js.html b/doc/out/uitest.js.html index a57fd9e..6b96098 100644 --- a/doc/out/uitest.js.html +++ b/doc/out/uitest.js.html @@ -2472,7 +2472,7 @@ class Event {
      diff --git a/lib/pixi/button.html b/lib/pixi/button.html index d478174..4286b4c 100644 --- a/lib/pixi/button.html +++ b/lib/pixi/button.html @@ -289,13 +289,33 @@ const button24 = new Button({ } }) +const button25 = new Button({ + x: 300, + y: 460, + icon: 'add', + badge: { + content: 'Click the button', + align: 'center', + verticalAlign: 'top', + offsetTop: -20, + radius: 12, + fill: 0x5856d6 + }, + action: event => { + const countries = ['Tajikistan', 'Zambia', 'Dominica', 'Australia', 'Botswana', 'Mozambique', 'Lesotho', 'Thailand', 'Gabon', 'Cuba', 'Mexico', 'Central African Republic', 'Réunion', 'Montenegro', 'Romania', 'Jamaica', 'Thailand', 'Cameroon', 'French Guiana', 'Nigeria', 'Tokelau', 'Slovenia', 'Kuwait', 'Palestinian Territories', 'Estonia', 'Germany', 'Cameroon', 'Somalia', 'El Salvador', 'San Marino', 'Sierra Leone', 'Sierra Leone', 'Gibraltar', 'Benin', 'Russia', 'Iraq', 'Tunisia', 'Greenland', 'Côte d\'Ivoire', 'Tanzania', 'Zambia', 'Bermuda', 'Somalia', 'Malaysia', 'Croatia', 'Togo', 'Belgium', 'Uruguay', 'Equatorial Guinea', 'Nigeria', 'St. Martin', 'Tuvalu', 'South Africa', 'Hong Kong SAR China', 'Palau', 'Canary Islands', 'Algeria', 'Hong Kong SAR China', 'Brunei', 'Dominican Republic', 'Sierra Leone', 'Moldova', 'Indonesia', 'Central African Republic', 'Anguilla', 'Malaysia', 'Bahrain', 'Indonesia', 'Peru', 'Namibia', 'Congo - Brazzaville', 'Micronesia', 'Cambodia', 'Réunion', 'Honduras', 'Hungary', 'Brazil', 'Trinidad & Tobago', 'Hungary', 'Madagascar', 'Sierra Leone', 'Seychelles', 'St. Martin', 'New Caledonia', 'Tokelau', 'Macedonia', 'Netherlands', 'Panama', 'Venezuela', 'Nepal', 'Guernsey', 'Papua New Guinea', 'Finland', 'Malaysia', 'Hong Kong SAR China', 'Trinidad & Tobago', 'Montserrat', 'Comoros', 'Benin', 'South Korea', 'Peru', 'Botswana', 'Cambodia', 'Isle of Man', 'Mozambique'] + const country = countries[Math.floor(Math.random() * countries.length)] + button25.badge.content = country + button25.layout() + } +}) + app.scene.addChild(button1, button2, button3, button4, button5, button6) app.scene.addChild(button7, button8) app.scene.addChild(button9, button10, button11) app.scene.addChild(button12, button13) app.scene.addChild(button14, button15, button16, button17) app.scene.addChild(button18, button19, button20, button21) -app.scene.addChild(button22, button23, button24) +app.scene.addChild(button22, button23, button24, button25) \ No newline at end of file diff --git a/lib/pixi/button.js b/lib/pixi/button.js index c9674f0..d006f87 100644 --- a/lib/pixi/button.js +++ b/lib/pixi/button.js @@ -339,34 +339,12 @@ export default class Button extends PIXI.Container { } const badge = new Badge(opts) - - switch (opts.align) { - case 'left': - badge.x = this.x - badge.width / 2 + opts.offsetLeft - break - case 'center': - badge.x = this.x + this.width / 2 - badge.width / 2 + opts.offsetLeft - break - case 'right': - badge.x = this.x + this.width - badge.width / 2 + opts.offsetLeft - } - - switch (opts.verticalAlign) { - case 'top': - badge.y = this.y - badge.height / 2 + opts.offsetTop - break - case 'middle': - badge.y = this.y + this.height / 2 - badge.height / 2 + opts.offsetTop - break - case 'bottom': - badge.y = this.y + this.height - badge.height / 2 + opts.offsetTop - } - this.addChild(badge) - this.badge = badge } + this.layout() + // set position //----------------- this.position.set(this.opts.x, this.opts.y) @@ -451,6 +429,39 @@ export default class Button extends PIXI.Container { this.icon = icon + // badge + //-------------------- + if (this.badge) { + this.removeChild(this.badge) + const width = this.width + const height = this.height + this.addChild(this.badge) + + const badge = this.badge + + switch (badge.opts.align) { + case 'left': + badge.x = -badge.width / 2 + badge.opts.offsetLeft + break + case 'center': + badge.x = width / 2 - badge.width / 2 + badge.opts.offsetLeft + break + case 'right': + badge.x = width - badge.width / 2 + badge.opts.offsetLeft + } + + switch (badge.opts.verticalAlign) { + case 'top': + badge.y = -badge.height / 2 + badge.opts.offsetTop + break + case 'middle': + badge.y = height / 2 - badge.height / 2 + badge.opts.offsetTop + break + case 'bottom': + badge.y = height - badge.height / 2 + badge.opts.offsetTop + } + } + // draw //----------------- this.draw() From a42427f987efa0a38f9d79c367dffe1088e75d8e Mon Sep 17 00:00:00 2001 From: Sebastian Kupke Date: Tue, 6 Aug 2019 14:24:50 +0200 Subject: [PATCH 19/30] Improved button doctest. --- lib/pixi/button.html | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/pixi/button.html b/lib/pixi/button.html index 4286b4c..1ef9371 100644 --- a/lib/pixi/button.html +++ b/lib/pixi/button.html @@ -294,21 +294,21 @@ const button25 = new Button({ y: 460, icon: 'add', badge: { - content: 'Click the button', + content: 'Sweden', align: 'center', verticalAlign: 'top', offsetTop: -20, radius: 12, fill: 0x5856d6 - }, - action: event => { - const countries = ['Tajikistan', 'Zambia', 'Dominica', 'Australia', 'Botswana', 'Mozambique', 'Lesotho', 'Thailand', 'Gabon', 'Cuba', 'Mexico', 'Central African Republic', 'Réunion', 'Montenegro', 'Romania', 'Jamaica', 'Thailand', 'Cameroon', 'French Guiana', 'Nigeria', 'Tokelau', 'Slovenia', 'Kuwait', 'Palestinian Territories', 'Estonia', 'Germany', 'Cameroon', 'Somalia', 'El Salvador', 'San Marino', 'Sierra Leone', 'Sierra Leone', 'Gibraltar', 'Benin', 'Russia', 'Iraq', 'Tunisia', 'Greenland', 'Côte d\'Ivoire', 'Tanzania', 'Zambia', 'Bermuda', 'Somalia', 'Malaysia', 'Croatia', 'Togo', 'Belgium', 'Uruguay', 'Equatorial Guinea', 'Nigeria', 'St. Martin', 'Tuvalu', 'South Africa', 'Hong Kong SAR China', 'Palau', 'Canary Islands', 'Algeria', 'Hong Kong SAR China', 'Brunei', 'Dominican Republic', 'Sierra Leone', 'Moldova', 'Indonesia', 'Central African Republic', 'Anguilla', 'Malaysia', 'Bahrain', 'Indonesia', 'Peru', 'Namibia', 'Congo - Brazzaville', 'Micronesia', 'Cambodia', 'Réunion', 'Honduras', 'Hungary', 'Brazil', 'Trinidad & Tobago', 'Hungary', 'Madagascar', 'Sierra Leone', 'Seychelles', 'St. Martin', 'New Caledonia', 'Tokelau', 'Macedonia', 'Netherlands', 'Panama', 'Venezuela', 'Nepal', 'Guernsey', 'Papua New Guinea', 'Finland', 'Malaysia', 'Hong Kong SAR China', 'Trinidad & Tobago', 'Montserrat', 'Comoros', 'Benin', 'South Korea', 'Peru', 'Botswana', 'Cambodia', 'Isle of Man', 'Mozambique'] - const country = countries[Math.floor(Math.random() * countries.length)] - button25.badge.content = country - button25.layout() } }) +const countries = ['Tajikistan', 'Zambia', 'Dominica', 'Australia', 'Botswana', 'Mozambique', 'Lesotho', 'Thailand', 'Gabon', 'Cuba', 'Mexico', 'Central African Republic', 'Réunion', 'Montenegro', 'Romania', 'Jamaica', 'Thailand', 'Cameroon', 'French Guiana', 'Nigeria', 'Tokelau', 'Slovenia', 'Kuwait', 'Palestinian Territories', 'Estonia', 'Germany', 'Cameroon', 'Somalia', 'El Salvador', 'San Marino', 'Sierra Leone', 'Sierra Leone', 'Gibraltar', 'Benin', 'Russia', 'Iraq', 'Tunisia', 'Greenland', 'Côte d\'Ivoire', 'Tanzania', 'Zambia', 'Bermuda', 'Somalia', 'Malaysia', 'Croatia', 'Togo', 'Belgium', 'Uruguay', 'Equatorial Guinea', 'Nigeria', 'St. Martin', 'Tuvalu', 'South Africa', 'Hong Kong SAR China', 'Palau', 'Canary Islands', 'Algeria', 'Hong Kong SAR China', 'Brunei', 'Dominican Republic', 'Sierra Leone', 'Moldova', 'Indonesia', 'Central African Republic', 'Anguilla', 'Malaysia', 'Bahrain', 'Indonesia', 'Peru', 'Namibia', 'Congo - Brazzaville', 'Micronesia', 'Cambodia', 'Réunion', 'Honduras', 'Hungary', 'Brazil', 'Trinidad & Tobago', 'Hungary', 'Madagascar', 'Sierra Leone', 'Seychelles', 'St. Martin', 'New Caledonia', 'Tokelau', 'Macedonia', 'Netherlands', 'Panama', 'Venezuela', 'Nepal', 'Guernsey', 'Papua New Guinea', 'Finland', 'Malaysia', 'Hong Kong SAR China', 'Trinidad & Tobago', 'Montserrat', 'Comoros', 'Benin', 'South Korea', 'Peru', 'Botswana', 'Cambodia', 'Isle of Man', 'Mozambique'] +setInterval(() => { + button25.badge.content = countries[Math.floor(Math.random() * countries.length)] + button25.layout() +}, 1000) + app.scene.addChild(button1, button2, button3, button4, button5, button6) app.scene.addChild(button7, button8) app.scene.addChild(button9, button10, button11) From 141d27d4f138a1c5564b78917a72acce756bd58d Mon Sep 17 00:00:00 2001 From: Sebastian Kupke Date: Tue, 6 Aug 2019 15:34:57 +0200 Subject: [PATCH 20/30] Added path to gulpfile. --- gulpfile.js | 9 ++-- lib/pixi/deepzoom/image.js | 91 ++++++++++----------------------- lib/pixi/deepzoom/loader.js | 46 ++++++----------- lib/pixi/deepzoom/tile.js | 38 ++++++-------- lib/pixi/deepzoom/tileloader.js | 24 ++++----- lib/pixi/deepzoom/tiles.js | 54 +++++++------------ 6 files changed, 96 insertions(+), 166 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 751ce24..f093541 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -50,9 +50,12 @@ function preload() { } function prettify() { - return src(['./lib/*.js', './lib/card/*.js', './lib/pixi/*.js', '!./lib/bootstrap.babel.js'], { - base: './lib' - }) + return src( + ['./lib/*.js', './lib/card/*.js', './lib/pixi/*.js', './lib/pixi/deepzoom/*.js', '!./lib/bootstrap.babel.js'], + { + base: './lib' + } + ) .pipe( prettier({ singleQuote: true, diff --git a/lib/pixi/deepzoom/image.js b/lib/pixi/deepzoom/image.js index a15b576..f49b222 100755 --- a/lib/pixi/deepzoom/image.js +++ b/lib/pixi/deepzoom/image.js @@ -40,15 +40,14 @@ export class DeepZoomInfo { // number in the file system for the folder with tiles this.clip = this.clip || null // e.g. { level: 12, col: 301436, row: 354060 } this.type = this.type || 'dzi' - this.urlTileTemplate = - this.urlTileTemplate || '{path}/{level}/{column}_{row}.{format}' + this.urlTileTemplate = this.urlTileTemplate || '{path}/{level}/{column}_{row}.{format}' this.setupDimensions() } /* Computes the needed number of layers from the width and height - * of the image. Note that this includes the level 0, i.e. 0 ... 4 - * means that 5 levels exist. - **/ + * of the image. Note that this includes the level 0, i.e. 0 ... 4 + * means that 5 levels exist. + **/ numLevels() { let maxDimension = Math.max(this.width, this.height) let boundary = this.type === 'dzi' ? 1 : this.tileSize @@ -231,15 +230,7 @@ export class DeepZoomInfo { test() { //console.log("w=" + this.width + " h=" + this.height + " maxlevel=" + this.maxLevel + " base=" + this.baseLevel) for (let i = 0; i <= this.maxLevel; i++) { - console.log( - ' ' + - i + - ' -> ' + - this.getScale(i) + - ' [' + - this.dimensions(i) + - ']' - ) + console.log(' ' + i + ' -> ' + this.getScale(i) + ' [' + this.dimensions(i) + ']') } console.log(this.urlForTile(this.baseLevel, 0, 0)) } @@ -279,12 +270,7 @@ class TileQuadNode { **/ noQuads() { if (this.previous === null) return false - return ( - this.nw === null && - this.ne === null && - this.sw === null && - this.se === null - ) + return this.nw === null && this.ne === null && this.sw === null && this.se === null } /** Unlink the given quad node @@ -323,7 +309,6 @@ class TileQuadNode { } } - /** * The main class of a deeply zoomable image that is represented by a hierarchy * of tile layers for each zoom level. This gives the user the impression that @@ -341,7 +326,7 @@ export class DeepZoomImage extends PIXI.Container { debug = false, shadow = false, center = false, - world = null, // Defines the world bounds the images lives in + world = null, // Defines the world bounds the images lives in highResolution = true, autoLoadTiles = true, useWorker = '', @@ -356,9 +341,7 @@ export class DeepZoomImage extends PIXI.Container { this.shadow = shadow this.world = world this.useWorker = useWorker - this.resolution = highResolution - ? Math.round(window.devicePixelRatio) - : 1 + this.resolution = highResolution ? Math.round(window.devicePixelRatio) : 1 this.alpha = alpha this.fastLoads = 0 this.active = true @@ -548,7 +531,7 @@ export class DeepZoomImage extends PIXI.Container { **/ get maxScale() { let delta = this.info.maxLevel - this.info.baseLevel - return Math.pow(2, delta) / this.resolution * 2 + return (Math.pow(2, delta) / this.resolution) * 2 } /** Getter for the current width. @@ -563,7 +546,6 @@ export class DeepZoomImage extends PIXI.Container { return this.pixelSize[1] } - /* Overrides PIXI.Container.hitArea() * Allows to optimize the hit testing. Container with hit areas are directly * hit tested without consideration of children. @@ -633,7 +615,7 @@ export class DeepZoomImage extends PIXI.Container { } worldBounds() { - let viewBounds = this.app.scene.bounds || this.app.scene.getBounds() + let viewBounds = this.app.scene.bounds || this.app.scene.getBounds() // Using getBounds extends visible scope after loading tiles and leads // to excessive loading. So we prefer bounds over getBounds() if (this.world != null) { @@ -671,11 +653,7 @@ export class DeepZoomImage extends PIXI.Container { let topLeft = tiles.toLocal(worldTopLeft) let bottomRight = tiles.toLocal(worldBottomRight) tiles._centerPoint = tilesCenter - let bounds = new PIXI.Rectangle( - topLeft.x, - topLeft.y, - bottomRight.x - topLeft.x, - bottomRight.y - topLeft.y) + let bounds = new PIXI.Rectangle(topLeft.x, topLeft.y, bottomRight.x - topLeft.x, bottomRight.y - topLeft.y) tiles._boundsRect = bounds @@ -720,9 +698,6 @@ export class DeepZoomImage extends PIXI.Container { return { centerCol, centerRow, needed } } - - - /** Returns all changed tiles for a given level. * @param {Tiles} tiles - the grid of tiles * @param {number} level - The zoom level of the grid @@ -775,8 +750,7 @@ export class DeepZoomImage extends PIXI.Container { * @param {PIXI.Point} about - point of interaction */ populateTiles(tiles, level, { onlyone = false, about = null } = {}) { - if (tiles.isComplete()) - return + if (tiles.isComplete()) return let referenceCol = -1 let referenceRow = -1 let { centerCol, centerRow, changed } = this.changedTiles(tiles, level) @@ -787,8 +761,7 @@ export class DeepZoomImage extends PIXI.Container { let scaledTileSize = tiles.tileSize * tiles.tileScale referenceCol = Math.floor(refPoint.x / scaledTileSize) referenceRow = Math.floor(refPoint.y / scaledTileSize) - } - else { + } else { referenceCol = centerCol referenceRow = centerRow } @@ -826,17 +799,7 @@ export class DeepZoomImage extends PIXI.Container { let [cols, rows, w, h] = this.info.dimensions(level) let increasedLevels = level - this.info.baseLevel let invScale = Math.pow(0.5, increasedLevels) - let tiles = new Tiles( - level, - this, - invScale, - cols, - rows, - w, - h, - this.info.tileSize, - this.info.overlap - ) + let tiles = new Tiles(level, this, invScale, cols, rows, w, h, this.info.tileSize, this.info.overlap) this.addTiles(key, tiles) if (this.info.clip) { let rest = this.info.rests[level] @@ -939,7 +902,6 @@ export class DeepZoomImage extends PIXI.Container { }) } - /** * Destroy tiles in all layers that are no longer needed * @@ -984,8 +946,8 @@ export class DeepZoomImage extends PIXI.Container { } /* Tint all tiles - * @param {number} level - The zoom level of the grid - */ + * @param {number} level - The zoom level of the grid + */ tintTilesBelowLevel(level) { Object.keys(this.tileLayers).forEach(key => { let tiles = this.tileLayers[key] @@ -997,7 +959,7 @@ export class DeepZoomImage extends PIXI.Container { /** * Ensure that the given tiles layer is the topmost one and visible. - * @param {*} tiles + * @param {*} tiles */ bringTilesToFront(tiles) { this.tileContainer.addChild(tiles) @@ -1031,8 +993,7 @@ export class DeepZoomImage extends PIXI.Container { }) if (this.fastLoads == 3) { this.fastLoads = 0 - } - else { + } else { return } } @@ -1060,10 +1021,10 @@ export class DeepZoomImage extends PIXI.Container { } /** - *Activates the textures on the DeepZoomImage. - * - * @memberof DeepZoomImage - */ + *Activates the textures on the DeepZoomImage. + * + * @memberof DeepZoomImage + */ activate() { this.active = true this.destroyTilesAboveLevel(this.currentLevel) @@ -1072,10 +1033,10 @@ export class DeepZoomImage extends PIXI.Container { } /** - *Dectivates the textures on the DeepZoomImage. - * - * @memberof DeepZoomImage - */ + *Dectivates the textures on the DeepZoomImage. + * + * @memberof DeepZoomImage + */ deactivate() { this.active = false this.destroyAllTiles() diff --git a/lib/pixi/deepzoom/loader.js b/lib/pixi/deepzoom/loader.js index 81a5878..594b9a6 100644 --- a/lib/pixi/deepzoom/loader.js +++ b/lib/pixi/deepzoom/loader.js @@ -62,7 +62,7 @@ export class TileLoader { _textureAvailable(url, col, row, texture) { let tile = this.loaded.get(url) if (tile != null) { - console.warn("Tile already loaded") + console.warn('Tile already loaded') tile.unregister() } try { @@ -70,9 +70,8 @@ export class TileLoader { this.loaded.set(url, tile) this.tiles.tileAvailable(tile, col, row, url) } catch (error) { - console.warn("Tile loading error", error) + console.warn('Tile loading error', error) } - } } @@ -82,7 +81,6 @@ export class TileLoader { * Calls the Tiles.tileAvailable method if the texture is available. **/ export class PIXITileLoader extends TileLoader { - constructor(tiles, compression) { super(tiles) this.destroyed = false @@ -124,15 +122,13 @@ export class PIXITileLoader extends TileLoader { /** Load one and only one of the scheduled tiles **/ loadOneTile() { - if (this.destroyed) - return + if (this.destroyed) return this._loadOneTile() } /** Load all scheduled tiles **/ loadAll() { - if (this.destroyed) - return + if (this.destroyed) return this._loadAllTiles() } @@ -143,7 +139,7 @@ export class PIXITileLoader extends TileLoader { try { this.loader.reset() } catch (error) { - console.warn("Error while resetting loader", error) + console.warn('Error while resetting loader', error) } } @@ -162,15 +158,14 @@ export class PIXITileLoader extends TileLoader { let texture = resource.texture let url = resource.url Tile.lateTexture(url, texture) - console.warn("Received resource after destroy", texture) + console.warn('Received resource after destroy', texture) return } try { let [col, row] = this.map.get(resource.url) this._textureAvailable(resource.url, col, row, resource.texture) - } - catch (err) { - console.warn("Texture unavailable: " + err.message) + } catch (err) { + console.warn('Texture unavailable: ' + err.message) } } @@ -216,9 +211,8 @@ export class PIXITileLoader extends TileLoader { if (!this.loaded.has(url)) { let resource = this.loader.resources[url] if (resource) { - console.log("Resource already added", url) - } - else { + console.log('Resource already added', url) + } else { urls.push(url) i += 1 } @@ -237,7 +231,6 @@ export class PIXITileLoader extends TileLoader { * Calls the Tiles.tileAvailable method if the texture is available. **/ export class RequestTileLoader extends TileLoader { - constructor(tiles, compression) { super(tiles) this.compression = compression @@ -255,10 +248,7 @@ export class RequestTileLoader extends TileLoader { xhr.responseType = 'arraybuffer' xhr.onload = e => { let CompressedImage = PIXI.compressedTextures.CompressedImage - let compressed = CompressedImage.loadFromArrayBuffer( - xhr.response, - url - ) + let compressed = CompressedImage.loadFromArrayBuffer(xhr.response, url) let base = new PIXI.BaseTexture(compressed) let texture = new PIXI.Texture(base) this._textureAvailable(url, col, row, texture) @@ -319,20 +309,18 @@ export class RequestTileLoader extends TileLoader { } } - /** * Uses Workers but can be replaced with other loaders implementing * the public methods without underscore. * Calls the Tiles.tileAvailable method if the texture is available. **/ export class WorkerTileLoader extends TileLoader { - constructor(tiles, workerPath) { super(tiles) - let worker = this.worker = new Worker(workerPath) + let worker = (this.worker = new Worker(workerPath)) - worker.onmessage = (event) => { + worker.onmessage = event => { if (event.data.success) { let { url, col, row, buffer } = event.data //console.log("WorkerTileLoader.loaded", url, buffer) @@ -350,7 +338,7 @@ export class WorkerTileLoader extends TileLoader { let url = this.loadQueue.pop() let [col, row] = this.map.get(url) let tile = [col, row, url] - this.worker.postMessage({ command: "load", tiles: [tile] }) + this.worker.postMessage({ command: 'load', tiles: [tile] }) } } @@ -361,16 +349,16 @@ export class WorkerTileLoader extends TileLoader { let [col, row] = this.map.get(url) tiles.push([col, row, url]) } - this.worker.postMessage({ command: "load", tiles }) + this.worker.postMessage({ command: 'load', tiles }) } cancel() { super.cancel() - this.worker.postMessage({ command: "abort" }) + this.worker.postMessage({ command: 'abort' }) } destroy() { - this.worker.postMessage({ command: "abort" }) + this.worker.postMessage({ command: 'abort' }) this.worker.terminate() this.worker = null super.destroy() diff --git a/lib/pixi/deepzoom/tile.js b/lib/pixi/deepzoom/tile.js index 21186bb..79abd6e 100644 --- a/lib/pixi/deepzoom/tile.js +++ b/lib/pixi/deepzoom/tile.js @@ -77,11 +77,10 @@ export default class Tile extends PIXI.Sprite { if (registeredTiles.has(url)) { let tiles = registeredTiles.get(url) tiles.add(this) - if (debug) console.log("Tile.register", url, tiles.size) - } - else { + if (debug) console.log('Tile.register', url, tiles.size) + } else { registeredTiles.set(url, new Set([this])) - if (debug) console.log("Tile.register", url, 1) + if (debug) console.log('Tile.register', url, 1) } } @@ -114,32 +113,31 @@ export default class Tile extends PIXI.Sprite { keptTextures.push({ url: this.url, texture: this.texture }) let opts = { children: true, texture: false, baseTexture: false } - if (debug) console.log("Tile.destroy", registeredTiles.size, opts) + if (debug) console.log('Tile.destroy', registeredTiles.size, opts) super.destroy(opts) while (keptTextures.length > keepTextures) { let { url, texture } = keptTextures.shift() if (Tile.isObsolete(url)) { texture.destroy(true) // Destroy base as well - if (debug) console.log("Destroying texture and baseTexture", url) + if (debug) console.log('Destroying texture and baseTexture', url) } } - } - else { + } else { // No longer registered and not pending - if (count <= 0) { // && !Tile.isPending(this.url) + if (count <= 0) { + // && !Tile.isPending(this.url) let opts = { children: true, texture: true, baseTexture: true } super.destroy(opts) - if (debug) console.log("Tile.destroy", registeredTiles.size, opts) - } - else { + if (debug) console.log('Tile.destroy', registeredTiles.size, opts) + } else { let opts = { children: true, texture: false, baseTexture: false } - if (debug) console.log("Tile.destroy", registeredTiles.size, opts) + if (debug) console.log('Tile.destroy', registeredTiles.size, opts) super.destroy(opts) } if (this.parent != null) { // UO: Emit warning and remove - console.warn("Destroying tile with parent. Hiding instead") + console.warn('Destroying tile with parent. Hiding instead') this.visible = false } } @@ -172,10 +170,9 @@ export default class Tile extends PIXI.Sprite { renderWebGL(renderer) { try { super.renderWebGL(renderer) - } - catch (e) { + } catch (e) { // We want persistent logging here - Logging.error("Error in Tile.renderWebGL: " + e.message) + Logging.error('Error in Tile.renderWebGL: ' + e.message) } } @@ -201,15 +198,14 @@ export default class Tile extends PIXI.Sprite { } } } - if (count > 0) - console.log("Sweeping textures", count) + if (count > 0) console.log('Sweeping textures', count) } } /** * Texture received too late. We do not need it. - * @param {*} url - * @param {*} texture + * @param {*} url + * @param {*} texture */ static lateTexture(url, texture) { lateTextures.set(url, texture) diff --git a/lib/pixi/deepzoom/tileloader.js b/lib/pixi/deepzoom/tileloader.js index 88215b1..740938e 100644 --- a/lib/pixi/deepzoom/tileloader.js +++ b/lib/pixi/deepzoom/tileloader.js @@ -4,50 +4,48 @@ const batchSize = 8 const debug = false function load() { - - while(loadQueue.length>0 && pendingRequests.size 0 && pendingRequests.size < batchSize) { let tile = loadQueue.shift() let [col, row, url] = tile let xhr = new XMLHttpRequest() xhr.responseType = 'arraybuffer' - xhr.onload = (event) => { + xhr.onload = event => { pendingRequests.delete(url) let buffer = xhr.response - postMessage({ success: true, url, col, row, buffer}, [buffer]) + postMessage({ success: true, url, col, row, buffer }, [buffer]) } - xhr.onerror = (event) => { + xhr.onerror = event => { pendingRequests.delete(url) let buffer = null - postMessage({ success: false, url, col, row, buffer}) + postMessage({ success: false, url, col, row, buffer }) } xhr.open('GET', url, true) xhr.send() pendingRequests.set(url, xhr) } - if (loadQueue.length>0) - setTimeout(load, 1000/120) + if (loadQueue.length > 0) setTimeout(load, 1000 / 120) else { if (debug) console.log('Ready') } } -self.onmessage = (event) => { +self.onmessage = event => { let msg = event.data - switch(msg.command) { + switch (msg.command) { case 'load': - for(let tile of msg.tiles) { + for (let tile of msg.tiles) { loadQueue.push(tile) } load() break case 'abort': loadQueue = [] - for(let xhr of pendingRequests.values()) { + for (let xhr of pendingRequests.values()) { xhr.abort() } if (debug) console.log('Abort') break default: - console.warn('Unknown worker command: ' + msg.command) + console.warn('Unknown worker command: ' + msg.command) } } diff --git a/lib/pixi/deepzoom/tiles.js b/lib/pixi/deepzoom/tiles.js index c0bab2f..c940fe2 100644 --- a/lib/pixi/deepzoom/tiles.js +++ b/lib/pixi/deepzoom/tiles.js @@ -1,6 +1,5 @@ import { Colors } from '../../utils.js' -import { WorkerTileLoader, PIXITileLoader } from "./loader.js" - +import { WorkerTileLoader, PIXITileLoader } from './loader.js' /** * A layer of tiles that represents a zoom level of a DeepZoomImage as a grid @@ -18,18 +17,7 @@ import { WorkerTileLoader, PIXITileLoader } from "./loader.js" * @param {number} fadeInTime - time needed to fade in tiles if TweenLite is set **/ export class Tiles extends PIXI.Container { - constructor( - level, - view, - scale, - cols, - rows, - width, - height, - tileSize, - overlap, - fadeInTime = 0.33 - ) { + constructor(level, view, scale, cols, rows, width, height, tileSize, overlap, fadeInTime = 0.33) { super() this.debug = false this.showGrid = false @@ -66,8 +54,6 @@ export class Tiles extends PIXI.Container { this.destroyed = false } - - /** Tests whether all tiles are loaded. **/ isComplete() { return this.cols * this.rows === this.children.length @@ -106,19 +92,19 @@ export class Tiles extends PIXI.Container { if (this.debug) console.log( 'Tiles level: ' + - this.level + - ' scale: ' + - this.scale.x + - ' cols: ' + - this.cols + - ' rows: ' + - this.rows + - ' w: ' + - this.pixelWidth + - ' h: ' + - this.pixelHeight + - ' tsize:' + - this.tileSize + this.level + + ' scale: ' + + this.scale.x + + ' cols: ' + + this.cols + + ' rows: ' + + this.rows + + ' w: ' + + this.pixelWidth + + ' h: ' + + this.pixelHeight + + ' tsize:' + + this.tileSize ) } @@ -266,8 +252,8 @@ export class Tiles extends PIXI.Container { } /* Destroys the tiles which are not with the bounds of the app to free - * memory. - **/ + * memory. + **/ destroyTiles(quadTrees) { let count = 0 for (let [url, tile] of this.available.entries()) { @@ -276,8 +262,7 @@ export class Tiles extends PIXI.Container { count += 1 } } - if (count && this.debug) - console.log('destroyTiles', this.level, count) + if (count && this.debug) console.log('destroyTiles', this.level, count) } destroyUnneededTiles() { @@ -288,8 +273,7 @@ export class Tiles extends PIXI.Container { count += 1 } } - if (count && this.debug) - console.log('destroyUnneededTiles', this.level, count) + if (count && this.debug) console.log('destroyUnneededTiles', this.level, count) } highlightInfos() { From caffee4b1557cef9e14e21395358ca5e9ac908d5 Mon Sep 17 00:00:00 2001 From: Sebastian Kupke Date: Wed, 7 Aug 2019 14:57:07 +0200 Subject: [PATCH 21/30] Fixed button group bug. --- dist/iwmlib.pixi.js | 263 ++++++++++++++++------------------------ lib/pixi/buttongroup.js | 42 ++++--- 2 files changed, 133 insertions(+), 172 deletions(-) diff --git a/dist/iwmlib.pixi.js b/dist/iwmlib.pixi.js index 9af57e2..c3997c7 100644 --- a/dist/iwmlib.pixi.js +++ b/dist/iwmlib.pixi.js @@ -2662,7 +2662,6 @@ // badge //-------------------- if (this.badge) { - this.removeChild(this.badge); const width = this.width; const height = this.height; @@ -3231,6 +3230,7 @@ this.addChildAt(background, 0); this.__initWidth = this.container.width; + this.__initHeight = this.container.height; } return this @@ -3401,7 +3401,6 @@ onMove(event) { if (this.__dragging) { this.capture(event); - if (this.opts.orientation === 'horizontal') { this.container.position.x = event.data.global.x + this.__delta.x; } else { @@ -3426,20 +3425,34 @@ const throwProps = { x: { velocity: 'auto' }, y: { velocity: 'auto' } }; if (this.opts.orientation === 'horizontal') { - const distanceToLeft = this.container.x; - const distanceToRight = this.opts.maxWidth - this.container.x - this.__initWidth; - if (distanceToLeft > 0 && distanceToLeft > distanceToRight) { + if (this.__initWidth > this.opts.maxWidth) { + // stack! + const distanceToLeft = this.container.x; + const distanceToRight = this.opts.maxWidth - this.container.x - this.__initWidth; + + if (distanceToLeft > 0) { + throwProps.x.end = 0; + } else if (distanceToRight > 0) { + throwProps.x.end = this.opts.maxWidth - this.__initWidth; + } + } else { + // just magnetize throwProps.x.end = 0; - } else if (distanceToRight > 0 && distanceToRight > distanceToLeft) { - throwProps.x.end = this.opts.maxWidth - this.__initWidth; } } else { - const distanceToTop = this.container.y; - const distanceToBottom = this.opts.maxHeight - this.container.y - this.container.height; - if (distanceToTop > 0 && distanceToTop > distanceToBottom) { + if (this.__initHeight > this.opts.maxHeight) { + // stack! + const distanceToTop = this.container.y; + const distanceToBottom = this.opts.maxHeight - this.container.y - this.container.height; + + if (distanceToTop > 0) { + throwProps.y.end = 0; + } else if (distanceToBottom > 0) { + throwProps.y.end = this.opts.maxHeight - this.__initHeight; + } + } else { + // just magnetize throwProps.y.end = 0; - } else if (distanceToBottom > 0 && distanceToBottom > distanceToTop) { - throwProps.y.end = this.opts.maxHeight - this.container.height; } } @@ -3503,7 +3516,7 @@ } /** - * + * @private */ stack() { if (this.opts.maxWidth) { @@ -3514,7 +3527,7 @@ } /** - * + * @private */ _stackHorizontal() { const sorted = []; @@ -3571,7 +3584,7 @@ } /** - * + * @private */ _stackVertical() { const sorted = []; @@ -8442,11 +8455,10 @@ if (registeredTiles.has(url)) { let tiles = registeredTiles.get(url); tiles.add(this); - if (debug) console.log("Tile.register", url, tiles.size); - } - else { + if (debug) console.log('Tile.register', url, tiles.size); + } else { registeredTiles.set(url, new Set([this])); - if (debug) console.log("Tile.register", url, 1); + if (debug) console.log('Tile.register', url, 1); } } @@ -8479,32 +8491,31 @@ keptTextures.push({ url: this.url, texture: this.texture }); let opts = { children: true, texture: false, baseTexture: false }; - if (debug) console.log("Tile.destroy", registeredTiles.size, opts); + if (debug) console.log('Tile.destroy', registeredTiles.size, opts); super.destroy(opts); while (keptTextures.length > keepTextures) { let { url, texture } = keptTextures.shift(); if (Tile.isObsolete(url)) { texture.destroy(true); // Destroy base as well - if (debug) console.log("Destroying texture and baseTexture", url); + if (debug) console.log('Destroying texture and baseTexture', url); } } - } - else { + } else { // No longer registered and not pending - if (count <= 0) { // && !Tile.isPending(this.url) + if (count <= 0) { + // && !Tile.isPending(this.url) let opts = { children: true, texture: true, baseTexture: true }; super.destroy(opts); - if (debug) console.log("Tile.destroy", registeredTiles.size, opts); - } - else { + if (debug) console.log('Tile.destroy', registeredTiles.size, opts); + } else { let opts = { children: true, texture: false, baseTexture: false }; - if (debug) console.log("Tile.destroy", registeredTiles.size, opts); + if (debug) console.log('Tile.destroy', registeredTiles.size, opts); super.destroy(opts); } if (this.parent != null) { // UO: Emit warning and remove - console.warn("Destroying tile with parent. Hiding instead"); + console.warn('Destroying tile with parent. Hiding instead'); this.visible = false; } } @@ -8537,10 +8548,9 @@ renderWebGL(renderer) { try { super.renderWebGL(renderer); - } - catch (e) { + } catch (e) { // We want persistent logging here - Logging.error("Error in Tile.renderWebGL: " + e.message); + Logging.error('Error in Tile.renderWebGL: ' + e.message); } } @@ -8566,15 +8576,14 @@ } } } - if (count > 0) - console.log("Sweeping textures", count); + if (count > 0) console.log('Sweeping textures', count); } } /** * Texture received too late. We do not need it. - * @param {*} url - * @param {*} texture + * @param {*} url + * @param {*} texture */ static lateTexture(url, texture) { lateTextures.set(url, texture); @@ -8660,7 +8669,7 @@ _textureAvailable(url, col, row, texture) { let tile = this.loaded.get(url); if (tile != null) { - console.warn("Tile already loaded"); + console.warn('Tile already loaded'); tile.unregister(); } try { @@ -8668,9 +8677,8 @@ this.loaded.set(url, tile); this.tiles.tileAvailable(tile, col, row, url); } catch (error) { - console.warn("Tile loading error", error); + console.warn('Tile loading error', error); } - } } @@ -8680,7 +8688,6 @@ * Calls the Tiles.tileAvailable method if the texture is available. **/ class PIXITileLoader extends TileLoader { - constructor(tiles, compression) { super(tiles); this.destroyed = false; @@ -8722,15 +8729,13 @@ /** Load one and only one of the scheduled tiles **/ loadOneTile() { - if (this.destroyed) - return + if (this.destroyed) return this._loadOneTile(); } /** Load all scheduled tiles **/ loadAll() { - if (this.destroyed) - return + if (this.destroyed) return this._loadAllTiles(); } @@ -8741,7 +8746,7 @@ try { this.loader.reset(); } catch (error) { - console.warn("Error while resetting loader", error); + console.warn('Error while resetting loader', error); } } @@ -8760,15 +8765,14 @@ let texture = resource.texture; let url = resource.url; Tile.lateTexture(url, texture); - console.warn("Received resource after destroy", texture); + console.warn('Received resource after destroy', texture); return } try { let [col, row] = this.map.get(resource.url); this._textureAvailable(resource.url, col, row, resource.texture); - } - catch (err) { - console.warn("Texture unavailable: " + err.message); + } catch (err) { + console.warn('Texture unavailable: ' + err.message); } } @@ -8814,9 +8818,8 @@ if (!this.loaded.has(url)) { let resource = this.loader.resources[url]; if (resource) { - console.log("Resource already added", url); - } - else { + console.log('Resource already added', url); + } else { urls.push(url); i += 1; } @@ -8829,20 +8832,18 @@ } } - /** * Uses Workers but can be replaced with other loaders implementing * the public methods without underscore. * Calls the Tiles.tileAvailable method if the texture is available. **/ class WorkerTileLoader extends TileLoader { - constructor(tiles, workerPath) { super(tiles); - let worker = this.worker = new Worker(workerPath); + let worker = (this.worker = new Worker(workerPath)); - worker.onmessage = (event) => { + worker.onmessage = event => { if (event.data.success) { let { url, col, row, buffer } = event.data; //console.log("WorkerTileLoader.loaded", url, buffer) @@ -8860,7 +8861,7 @@ let url = this.loadQueue.pop(); let [col, row] = this.map.get(url); let tile = [col, row, url]; - this.worker.postMessage({ command: "load", tiles: [tile] }); + this.worker.postMessage({ command: 'load', tiles: [tile] }); } } @@ -8871,16 +8872,16 @@ let [col, row] = this.map.get(url); tiles.push([col, row, url]); } - this.worker.postMessage({ command: "load", tiles }); + this.worker.postMessage({ command: 'load', tiles }); } cancel() { super.cancel(); - this.worker.postMessage({ command: "abort" }); + this.worker.postMessage({ command: 'abort' }); } destroy() { - this.worker.postMessage({ command: "abort" }); + this.worker.postMessage({ command: 'abort' }); this.worker.terminate(); this.worker = null; super.destroy(); @@ -8903,18 +8904,7 @@ * @param {number} fadeInTime - time needed to fade in tiles if TweenLite is set **/ class Tiles extends PIXI.Container { - constructor( - level, - view, - scale, - cols, - rows, - width, - height, - tileSize, - overlap, - fadeInTime = 0.33 - ) { + constructor(level, view, scale, cols, rows, width, height, tileSize, overlap, fadeInTime = 0.33) { super(); this.debug = false; this.showGrid = false; @@ -8951,8 +8941,6 @@ this.destroyed = false; } - - /** Tests whether all tiles are loaded. **/ isComplete() { return this.cols * this.rows === this.children.length @@ -8991,19 +8979,19 @@ if (this.debug) console.log( 'Tiles level: ' + - this.level + - ' scale: ' + - this.scale.x + - ' cols: ' + - this.cols + - ' rows: ' + - this.rows + - ' w: ' + - this.pixelWidth + - ' h: ' + - this.pixelHeight + - ' tsize:' + - this.tileSize + this.level + + ' scale: ' + + this.scale.x + + ' cols: ' + + this.cols + + ' rows: ' + + this.rows + + ' w: ' + + this.pixelWidth + + ' h: ' + + this.pixelHeight + + ' tsize:' + + this.tileSize ); } @@ -9151,8 +9139,8 @@ } /* Destroys the tiles which are not with the bounds of the app to free - * memory. - **/ + * memory. + **/ destroyTiles(quadTrees) { let count = 0; for (let [url, tile] of this.available.entries()) { @@ -9161,8 +9149,7 @@ count += 1; } } - if (count && this.debug) - console.log('destroyTiles', this.level, count); + if (count && this.debug) console.log('destroyTiles', this.level, count); } destroyUnneededTiles() { @@ -9173,8 +9160,7 @@ count += 1; } } - if (count && this.debug) - console.log('destroyUnneededTiles', this.level, count); + if (count && this.debug) console.log('destroyUnneededTiles', this.level, count); } highlightInfos() { @@ -9256,15 +9242,14 @@ // number in the file system for the folder with tiles this.clip = this.clip || null; // e.g. { level: 12, col: 301436, row: 354060 } this.type = this.type || 'dzi'; - this.urlTileTemplate = - this.urlTileTemplate || '{path}/{level}/{column}_{row}.{format}'; + this.urlTileTemplate = this.urlTileTemplate || '{path}/{level}/{column}_{row}.{format}'; this.setupDimensions(); } /* Computes the needed number of layers from the width and height - * of the image. Note that this includes the level 0, i.e. 0 ... 4 - * means that 5 levels exist. - **/ + * of the image. Note that this includes the level 0, i.e. 0 ... 4 + * means that 5 levels exist. + **/ numLevels() { let maxDimension = Math.max(this.width, this.height); let boundary = this.type === 'dzi' ? 1 : this.tileSize; @@ -9447,15 +9432,7 @@ test() { //console.log("w=" + this.width + " h=" + this.height + " maxlevel=" + this.maxLevel + " base=" + this.baseLevel) for (let i = 0; i <= this.maxLevel; i++) { - console.log( - ' ' + - i + - ' -> ' + - this.getScale(i) + - ' [' + - this.dimensions(i) + - ']' - ); + console.log(' ' + i + ' -> ' + this.getScale(i) + ' [' + this.dimensions(i) + ']'); } console.log(this.urlForTile(this.baseLevel, 0, 0)); } @@ -9495,12 +9472,7 @@ **/ noQuads() { if (this.previous === null) return false - return ( - this.nw === null && - this.ne === null && - this.sw === null && - this.se === null - ) + return this.nw === null && this.ne === null && this.sw === null && this.se === null } /** Unlink the given quad node @@ -9539,7 +9511,6 @@ } } - /** * The main class of a deeply zoomable image that is represented by a hierarchy * of tile layers for each zoom level. This gives the user the impression that @@ -9557,7 +9528,7 @@ debug = false, shadow = false, center = false, - world = null, // Defines the world bounds the images lives in + world = null, // Defines the world bounds the images lives in highResolution = true, autoLoadTiles = true, useWorker = '', @@ -9572,9 +9543,7 @@ this.shadow = shadow; this.world = world; this.useWorker = useWorker; - this.resolution = highResolution - ? Math.round(window.devicePixelRatio) - : 1; + this.resolution = highResolution ? Math.round(window.devicePixelRatio) : 1; this.alpha = alpha; this.fastLoads = 0; this.active = true; @@ -9764,7 +9733,7 @@ **/ get maxScale() { let delta = this.info.maxLevel - this.info.baseLevel; - return Math.pow(2, delta) / this.resolution * 2 + return (Math.pow(2, delta) / this.resolution) * 2 } /** Getter for the current width. @@ -9779,7 +9748,6 @@ return this.pixelSize[1] } - /* Overrides PIXI.Container.hitArea() * Allows to optimize the hit testing. Container with hit areas are directly * hit tested without consideration of children. @@ -9849,7 +9817,7 @@ } worldBounds() { - let viewBounds = this.app.scene.bounds || this.app.scene.getBounds(); + let viewBounds = this.app.scene.bounds || this.app.scene.getBounds(); // Using getBounds extends visible scope after loading tiles and leads // to excessive loading. So we prefer bounds over getBounds() if (this.world != null) { @@ -9887,11 +9855,7 @@ let topLeft = tiles.toLocal(worldTopLeft); let bottomRight = tiles.toLocal(worldBottomRight); tiles._centerPoint = tilesCenter; - let bounds = new PIXI.Rectangle( - topLeft.x, - topLeft.y, - bottomRight.x - topLeft.x, - bottomRight.y - topLeft.y); + let bounds = new PIXI.Rectangle(topLeft.x, topLeft.y, bottomRight.x - topLeft.x, bottomRight.y - topLeft.y); tiles._boundsRect = bounds; @@ -9936,9 +9900,6 @@ return { centerCol, centerRow, needed } } - - - /** Returns all changed tiles for a given level. * @param {Tiles} tiles - the grid of tiles * @param {number} level - The zoom level of the grid @@ -9991,8 +9952,7 @@ * @param {PIXI.Point} about - point of interaction */ populateTiles(tiles, level, { onlyone = false, about = null } = {}) { - if (tiles.isComplete()) - return + if (tiles.isComplete()) return let referenceCol = -1; let referenceRow = -1; let { centerCol, centerRow, changed } = this.changedTiles(tiles, level); @@ -10003,8 +9963,7 @@ let scaledTileSize = tiles.tileSize * tiles.tileScale; referenceCol = Math.floor(refPoint.x / scaledTileSize); referenceRow = Math.floor(refPoint.y / scaledTileSize); - } - else { + } else { referenceCol = centerCol; referenceRow = centerRow; } @@ -10042,17 +10001,7 @@ let [cols, rows, w, h] = this.info.dimensions(level); let increasedLevels = level - this.info.baseLevel; let invScale = Math.pow(0.5, increasedLevels); - let tiles = new Tiles( - level, - this, - invScale, - cols, - rows, - w, - h, - this.info.tileSize, - this.info.overlap - ); + let tiles = new Tiles(level, this, invScale, cols, rows, w, h, this.info.tileSize, this.info.overlap); this.addTiles(key, tiles); if (this.info.clip) { let rest = this.info.rests[level]; @@ -10155,7 +10104,6 @@ }); } - /** * Destroy tiles in all layers that are no longer needed * @@ -10200,8 +10148,8 @@ } /* Tint all tiles - * @param {number} level - The zoom level of the grid - */ + * @param {number} level - The zoom level of the grid + */ tintTilesBelowLevel(level) { Object.keys(this.tileLayers).forEach(key => { let tiles = this.tileLayers[key]; @@ -10213,7 +10161,7 @@ /** * Ensure that the given tiles layer is the topmost one and visible. - * @param {*} tiles + * @param {*} tiles */ bringTilesToFront(tiles) { this.tileContainer.addChild(tiles); @@ -10247,8 +10195,7 @@ }); if (this.fastLoads == 3) { this.fastLoads = 0; - } - else { + } else { return } } @@ -10276,10 +10223,10 @@ } /** - *Activates the textures on the DeepZoomImage. - * - * @memberof DeepZoomImage - */ + *Activates the textures on the DeepZoomImage. + * + * @memberof DeepZoomImage + */ activate() { this.active = true; this.destroyTilesAboveLevel(this.currentLevel); @@ -10288,10 +10235,10 @@ } /** - *Dectivates the textures on the DeepZoomImage. - * - * @memberof DeepZoomImage - */ + *Dectivates the textures on the DeepZoomImage. + * + * @memberof DeepZoomImage + */ deactivate() { this.active = false; this.destroyAllTiles(); diff --git a/lib/pixi/buttongroup.js b/lib/pixi/buttongroup.js index 841619a..76ec22d 100644 --- a/lib/pixi/buttongroup.js +++ b/lib/pixi/buttongroup.js @@ -292,6 +292,7 @@ export default class ButtonGroup extends PIXI.Container { this.addChildAt(background, 0) this.__initWidth = this.container.width + this.__initHeight = this.container.height } return this @@ -462,7 +463,6 @@ export default class ButtonGroup extends PIXI.Container { onMove(event) { if (this.__dragging) { this.capture(event) - if (this.opts.orientation === 'horizontal') { this.container.position.x = event.data.global.x + this.__delta.x } else { @@ -487,20 +487,34 @@ export default class ButtonGroup extends PIXI.Container { const throwProps = { x: { velocity: 'auto' }, y: { velocity: 'auto' } } if (this.opts.orientation === 'horizontal') { - const distanceToLeft = this.container.x - const distanceToRight = this.opts.maxWidth - this.container.x - this.__initWidth - if (distanceToLeft > 0 && distanceToLeft > distanceToRight) { + if (this.__initWidth > this.opts.maxWidth) { + // stack! + const distanceToLeft = this.container.x + const distanceToRight = this.opts.maxWidth - this.container.x - this.__initWidth + + if (distanceToLeft > 0) { + throwProps.x.end = 0 + } else if (distanceToRight > 0) { + throwProps.x.end = this.opts.maxWidth - this.__initWidth + } + } else { + // just magnetize throwProps.x.end = 0 - } else if (distanceToRight > 0 && distanceToRight > distanceToLeft) { - throwProps.x.end = this.opts.maxWidth - this.__initWidth } } else { - const distanceToTop = this.container.y - const distanceToBottom = this.opts.maxHeight - this.container.y - this.container.height - if (distanceToTop > 0 && distanceToTop > distanceToBottom) { + if (this.__initHeight > this.opts.maxHeight) { + // stack! + const distanceToTop = this.container.y + const distanceToBottom = this.opts.maxHeight - this.container.y - this.container.height + + if (distanceToTop > 0) { + throwProps.y.end = 0 + } else if (distanceToBottom > 0) { + throwProps.y.end = this.opts.maxHeight - this.__initHeight + } + } else { + // just magnetize throwProps.y.end = 0 - } else if (distanceToBottom > 0 && distanceToBottom > distanceToTop) { - throwProps.y.end = this.opts.maxHeight - this.container.height } } @@ -564,7 +578,7 @@ export default class ButtonGroup extends PIXI.Container { } /** - * + * @private */ stack() { if (this.opts.maxWidth) { @@ -575,7 +589,7 @@ export default class ButtonGroup extends PIXI.Container { } /** - * + * @private */ _stackHorizontal() { const sorted = [] @@ -632,7 +646,7 @@ export default class ButtonGroup extends PIXI.Container { } /** - * + * @private */ _stackVertical() { const sorted = [] From 56910a8c58df4d4d3d342f5486460145dd65634e Mon Sep 17 00:00:00 2001 From: Sebastian Kupke Date: Wed, 7 Aug 2019 15:03:58 +0200 Subject: [PATCH 22/30] Fixed vertical button group bug. --- dist/iwmlib.pixi.js | 4 ++-- lib/pixi/buttongroup.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dist/iwmlib.pixi.js b/dist/iwmlib.pixi.js index c3997c7..7d9c091 100644 --- a/dist/iwmlib.pixi.js +++ b/dist/iwmlib.pixi.js @@ -3443,8 +3443,8 @@ if (this.__initHeight > this.opts.maxHeight) { // stack! const distanceToTop = this.container.y; - const distanceToBottom = this.opts.maxHeight - this.container.y - this.container.height; - + const distanceToBottom = this.opts.maxHeight - this.container.y - this.__initHeight; + if (distanceToTop > 0) { throwProps.y.end = 0; } else if (distanceToBottom > 0) { diff --git a/lib/pixi/buttongroup.js b/lib/pixi/buttongroup.js index 76ec22d..2eef1a8 100644 --- a/lib/pixi/buttongroup.js +++ b/lib/pixi/buttongroup.js @@ -505,8 +505,8 @@ export default class ButtonGroup extends PIXI.Container { if (this.__initHeight > this.opts.maxHeight) { // stack! const distanceToTop = this.container.y - const distanceToBottom = this.opts.maxHeight - this.container.y - this.container.height - + const distanceToBottom = this.opts.maxHeight - this.container.y - this.__initHeight + if (distanceToTop > 0) { throwProps.y.end = 0 } else if (distanceToBottom > 0) { From cdc6461064300577c660904c76924c231ed3fd2c Mon Sep 17 00:00:00 2001 From: Sebastian Kupke Date: Wed, 7 Aug 2019 15:24:18 +0200 Subject: [PATCH 23/30] Prevent dragging of button group if buttons are not wider than maxWidth. --- dist/iwmlib.pixi.js | 56 ++++++++++++++++++++++----------------- lib/pixi/buttongroup.html | 16 +++++++++-- lib/pixi/buttongroup.js | 56 ++++++++++++++++++++++----------------- 3 files changed, 76 insertions(+), 52 deletions(-) diff --git a/dist/iwmlib.pixi.js b/dist/iwmlib.pixi.js index 7d9c091..e4bf418 100644 --- a/dist/iwmlib.pixi.js +++ b/dist/iwmlib.pixi.js @@ -3378,18 +3378,21 @@ * @param {*} event */ onStart(event) { - this.__dragging = true; - this.capture(event); + if ((this.opts.maxWidth != null && this.__initWidth > this.opts.maxWidth) || (this.opts.maxHeight != null && this.__initHeight > this.opts.maxHeight)) { + this.__dragging = true; - this.__delta = { - x: this.container.position.x - event.data.global.x, - y: this.container.position.y - event.data.global.y - }; + this.capture(event); - TweenLite.killTweensOf(this.container.position, { x: true, y: true }); - if (typeof ThrowPropsPlugin != 'undefined') { - ThrowPropsPlugin.track(this.container.position, 'x,y'); + this.__delta = { + x: this.container.position.x - event.data.global.x, + y: this.container.position.y - event.data.global.y + }; + + TweenLite.killTweensOf(this.container.position, { x: true, y: true }); + if (typeof ThrowPropsPlugin != 'undefined') { + ThrowPropsPlugin.track(this.container.position, 'x,y'); + } } } @@ -3484,25 +3487,28 @@ * @param {*} event */ onScroll(event) { - this.capture(event); - if (this.opts.orientation === 'horizontal') { - this.container.position.x -= event.deltaX; - if (this.container.position.x > 0) { - this.container.position.x = 0; - } else if (this.container.position.x + this.__initWidth < this.opts.maxWidth) { - this.container.position.x = this.opts.maxWidth - this.__initWidth; - } - } else { - this.container.position.y -= event.deltaY; - if (this.container.position.y > 0) { - this.container.position.y = 0; - } else if (this.container.position.y + this.container.height < this.opts.maxHeight) { - this.container.position.y = this.opts.maxHeight - this.container.height; + if ((this.opts.maxWidth != null && this.__initWidth > this.opts.maxWidth) || (this.opts.maxHeight != null && this.__initHeight > this.opts.maxHeight)) { + this.capture(event); + + if (this.opts.orientation === 'horizontal') { + this.container.position.x -= event.deltaX; + if (this.container.position.x > 0) { + this.container.position.x = 0; + } else if (this.container.position.x + this.__initWidth < this.opts.maxWidth) { + this.container.position.x = this.opts.maxWidth - this.__initWidth; + } + } else { + this.container.position.y -= event.deltaY; + if (this.container.position.y > 0) { + this.container.position.y = 0; + } else if (this.container.position.y + this.container.height < this.opts.maxHeight) { + this.container.position.y = this.opts.maxHeight - this.container.height; + } } + + this.stack(); } - - this.stack(); } /** diff --git a/lib/pixi/buttongroup.html b/lib/pixi/buttongroup.html index 3c5a786..360c238 100644 --- a/lib/pixi/buttongroup.html +++ b/lib/pixi/buttongroup.html @@ -30,7 +30,7 @@ const app = new PIXIApp({ view: canvas, width: 1000, - height: 1400 + height: 1700 }).setup().run() const buttonGroup1 = new ButtonGroup({ @@ -324,12 +324,24 @@ const buttonGroup18 = new ButtonGroup({ app }) +const buttonGroup19 = new ButtonGroup({ + x: 10, + y: 1420, + buttons: [ + {label: 'move'}, + {label: 'explanation dried'}, + {label: 'out catch'} + ], + maxWidth: 500, + app +}) + app.scene.addChild(buttonGroup1, buttonGroup2, buttonGroup3) app.scene.addChild(buttonGroup4) app.scene.addChild(buttonGroup5, buttonGroup6) app.scene.addChild(buttonGroup7, buttonGroup8) app.scene.addChild(buttonGroup9, buttonGroup10, buttonGroup11, buttonGroup12, buttonGroup13) -app.scene.addChild(buttonGroup14, buttonGroup15, buttonGroup16, buttonGroup17, buttonGroup18) +app.scene.addChild(buttonGroup14, buttonGroup15, buttonGroup16, buttonGroup17, buttonGroup18, buttonGroup19) diff --git a/lib/pixi/buttongroup.js b/lib/pixi/buttongroup.js index 2eef1a8..a85c94d 100644 --- a/lib/pixi/buttongroup.js +++ b/lib/pixi/buttongroup.js @@ -440,18 +440,21 @@ export default class ButtonGroup extends PIXI.Container { * @param {*} event */ onStart(event) { - this.__dragging = true - this.capture(event) + if ((this.opts.maxWidth != null && this.__initWidth > this.opts.maxWidth) || (this.opts.maxHeight != null && this.__initHeight > this.opts.maxHeight)) { + this.__dragging = true - this.__delta = { - x: this.container.position.x - event.data.global.x, - y: this.container.position.y - event.data.global.y - } + this.capture(event) - TweenLite.killTweensOf(this.container.position, { x: true, y: true }) - if (typeof ThrowPropsPlugin != 'undefined') { - ThrowPropsPlugin.track(this.container.position, 'x,y') + this.__delta = { + x: this.container.position.x - event.data.global.x, + y: this.container.position.y - event.data.global.y + } + + TweenLite.killTweensOf(this.container.position, { x: true, y: true }) + if (typeof ThrowPropsPlugin != 'undefined') { + ThrowPropsPlugin.track(this.container.position, 'x,y') + } } } @@ -546,25 +549,28 @@ export default class ButtonGroup extends PIXI.Container { * @param {*} event */ onScroll(event) { - this.capture(event) - if (this.opts.orientation === 'horizontal') { - this.container.position.x -= event.deltaX - if (this.container.position.x > 0) { - this.container.position.x = 0 - } else if (this.container.position.x + this.__initWidth < this.opts.maxWidth) { - this.container.position.x = this.opts.maxWidth - this.__initWidth - } - } else { - this.container.position.y -= event.deltaY - if (this.container.position.y > 0) { - this.container.position.y = 0 - } else if (this.container.position.y + this.container.height < this.opts.maxHeight) { - this.container.position.y = this.opts.maxHeight - this.container.height + if ((this.opts.maxWidth != null && this.__initWidth > this.opts.maxWidth) || (this.opts.maxHeight != null && this.__initHeight > this.opts.maxHeight)) { + this.capture(event) + + if (this.opts.orientation === 'horizontal') { + this.container.position.x -= event.deltaX + if (this.container.position.x > 0) { + this.container.position.x = 0 + } else if (this.container.position.x + this.__initWidth < this.opts.maxWidth) { + this.container.position.x = this.opts.maxWidth - this.__initWidth + } + } else { + this.container.position.y -= event.deltaY + if (this.container.position.y > 0) { + this.container.position.y = 0 + } else if (this.container.position.y + this.container.height < this.opts.maxHeight) { + this.container.position.y = this.opts.maxHeight - this.container.height + } } + + this.stack() } - - this.stack() } /** From 9aef7bb460fc3e9c1524bcb5c687820314002c9c Mon Sep 17 00:00:00 2001 From: Uwe Oestermeier Date: Thu, 8 Aug 2019 12:06:16 +0200 Subject: [PATCH 24/30] Timeline is now draggable --- dist/iwmlib.pixi.js | 21 +++++++++++---------- lib/pixi/buttongroup.js | 1 - lib/pixi/scatter.js | 3 +-- lib/pixi/timeline.js | 21 ++++++++++++--------- 4 files changed, 24 insertions(+), 22 deletions(-) diff --git a/dist/iwmlib.pixi.js b/dist/iwmlib.pixi.js index 7d9c091..2e0242f 100644 --- a/dist/iwmlib.pixi.js +++ b/dist/iwmlib.pixi.js @@ -3444,7 +3444,6 @@ // stack! const distanceToTop = this.container.y; const distanceToBottom = this.opts.maxHeight - this.container.y - this.__initHeight; - if (distanceToTop > 0) { throwProps.y.end = 0; } else if (distanceToBottom > 0) { @@ -12325,6 +12324,8 @@ } } + /* global ThrowPropsPlugin */ + class Ticks { get reservedPrefixes() { return ['decade', 'year', 'month', 'day', 'hour', 'minute', 'second'] @@ -12983,9 +12984,9 @@ this.killTweens(); this.deltas = []; this.validScroll(); - if (typeof ThrowPropsPlugin != 'undefined') { - ThrowPropsPlugin.track(this, 'delta'); - } + // if (typeof ThrowPropsPlugin != 'undefined') { + // ThrowPropsPlugin.track(this, 'delta') + // } } onMove(event, interaction) { @@ -13005,11 +13006,11 @@ } onEnd(event, interaction) { - if (typeof ThrowPropsPlugin != 'undefined') { - let vel = ThrowPropsPlugin.getVelocity(this, 'delta'); - ThrowPropsPlugin.untrack(this); - } - + // if (typeof ThrowPropsPlugin != 'undefined') { + // let vel = ThrowPropsPlugin.getVelocity(this, 'delta') + // ThrowPropsPlugin.untrack(this) + // } + this.killTweens(); this.redraw(); let delta = 0; @@ -13022,7 +13023,7 @@ this.autoScroll = true; let anchor = interaction.current.mean(); this.keepInBounds(delta, anchor); - + console.log("onEnd", delta); for (let key of interaction.ended.keys()) { if (interaction.isDoubleTap(key)) { this.onDoubleTap(event, interaction, key); diff --git a/lib/pixi/buttongroup.js b/lib/pixi/buttongroup.js index 2eef1a8..3a4723c 100644 --- a/lib/pixi/buttongroup.js +++ b/lib/pixi/buttongroup.js @@ -506,7 +506,6 @@ export default class ButtonGroup extends PIXI.Container { // stack! const distanceToTop = this.container.y const distanceToBottom = this.opts.maxHeight - this.container.y - this.__initHeight - if (distanceToTop > 0) { throwProps.y.end = 0 } else if (distanceToBottom > 0) { diff --git a/lib/pixi/scatter.js b/lib/pixi/scatter.js index 9b43d03..a84f05a 100755 --- a/lib/pixi/scatter.js +++ b/lib/pixi/scatter.js @@ -1,3 +1,4 @@ +/* eslint-disable no-unused-vars */ import Events from '../events.js' import { AbstractScatter } from '../scatter.js' import { Angle, Points, Polygon } from '../utils.js' @@ -333,8 +334,6 @@ export class DisplayObjectScatter extends AbstractScatter { roundPixel(value) { // UO: Should be obsolete because Renderer supports roundPixels by default return value - let res = this.renderer.resolution - return Math.round(value * res) / res } get container() { diff --git a/lib/pixi/timeline.js b/lib/pixi/timeline.js index 209481d..6dbf032 100644 --- a/lib/pixi/timeline.js +++ b/lib/pixi/timeline.js @@ -1,3 +1,4 @@ +/* eslint-disable no-unused-vars */ import { Cycle, Colors, Dates, isEmpty } from '../utils.js' import { Capabilities } from '../capabilities.js' import { BitmapLabeledGraphics, FontInfo } from './labeledgraphics.js' @@ -495,6 +496,7 @@ export default class Timeline extends BitmapLabeledGraphics { this.minZoom = 1 this.maxZoom = 12000 this.scroll = 0 + this.draggable = false this.deltas = [] this.labelDates = [] this.colorRanges = [] @@ -761,9 +763,9 @@ export default class Timeline extends BitmapLabeledGraphics { this.killTweens() this.deltas = [] this.validScroll() - if (typeof ThrowPropsPlugin != 'undefined') { - ThrowPropsPlugin.track(this, 'delta') - } + // if (typeof ThrowPropsPlugin != 'undefined') { + // ThrowPropsPlugin.track(this, 'delta') + // } } onMove(event, interaction) { @@ -772,6 +774,9 @@ export default class Timeline extends BitmapLabeledGraphics { return } this.scroll += delta.x + if (this.draggable) { + this.y += delta.y + } while (this.deltas.length > 10) { this.deltas.pop(0) } @@ -783,11 +788,10 @@ export default class Timeline extends BitmapLabeledGraphics { } onEnd(event, interaction) { - if (typeof ThrowPropsPlugin != 'undefined') { - let vel = ThrowPropsPlugin.getVelocity(this, 'delta') - ThrowPropsPlugin.untrack(this) - } - + // if (typeof ThrowPropsPlugin != 'undefined') { + // let vel = ThrowPropsPlugin.getVelocity(this, 'delta') + // ThrowPropsPlugin.untrack(this) + // } this.killTweens() this.redraw() let delta = 0 @@ -800,7 +804,6 @@ export default class Timeline extends BitmapLabeledGraphics { this.autoScroll = true let anchor = interaction.current.mean() this.keepInBounds(delta, anchor) - for (let key of interaction.ended.keys()) { if (interaction.isDoubleTap(key)) { this.onDoubleTap(event, interaction, key) From 97d33cf17763e8ca7bd2471269e41728908abda3 Mon Sep 17 00:00:00 2001 From: Sebastian Kupke Date: Thu, 8 Aug 2019 13:46:02 +0200 Subject: [PATCH 25/30] Fixed theming bug in button and button group. --- dist/iwmlib.pixi.js | 14 +- doc/out/AbstractPopup.html | 8 +- doc/out/Badge.html | 8 +- doc/out/BlurFilter.html | 8 +- doc/out/Button.html | 16 +- doc/out/ButtonGroup.html | 232 +----------------- doc/out/DeepZoomImage.html | 60 ++--- doc/out/DeepZoomInfo.html | 20 +- doc/out/Flippable.html | 8 +- doc/out/FontInfo.html | 8 +- doc/out/Hypenate.html | 8 +- doc/out/InteractivePopup.html | 8 +- ...beledGraphics.exports.LabeledGraphics.html | 8 +- doc/out/LabeledGraphics.html | 8 +- doc/out/List.html | 8 +- doc/out/Message.html | 8 +- doc/out/MessageInteractivePopup.html | 8 +- doc/out/MessageMessageInteractivePopup.html | 8 +- doc/out/Modal.html | 8 +- doc/out/ModalInteractivePopup.html | 8 +- doc/out/ModalModalInteractivePopup.html | 8 +- doc/out/PIXIApp.html | 8 +- doc/out/Popup.html | 8 +- doc/out/PopupInteractivePopup.html | 8 +- doc/out/PopupMenu.html | 8 +- doc/out/PopupMenuPopupInteractivePopup.html | 8 +- ...pupMenuPopupMenuPopupInteractivePopup.html | 8 +- ...nuPopupMenuPopupPopupInteractivePopup.html | 8 +- .../PopupMenuPopupPopupInteractivePopup.html | 8 +- doc/out/PopupPopupInteractivePopup.html | 8 +- doc/out/Progress.html | 8 +- doc/out/Scrollview.html | 8 +- doc/out/Slider.html | 8 +- doc/out/Switch.html | 8 +- doc/out/TextLabel.TextLabel.html | 8 +- doc/out/Theme.html | 8 +- doc/out/ThemeDark.html | 8 +- doc/out/ThemeLight.html | 8 +- doc/out/ThemeRed.html | 8 +- doc/out/TileQuadNode.html | 16 +- doc/out/Tooltip.html | 8 +- doc/out/UITest.html | 8 +- doc/out/Volatile.html | 8 +- doc/out/global.html | 8 +- doc/out/index.html | 8 +- doc/out/pixi_abstractpopup.js.html | 8 +- doc/out/pixi_app.js.html | 8 +- doc/out/pixi_badge.js.html | 8 +- doc/out/pixi_blurfilter.js.html | 8 +- doc/out/pixi_button.js.html | 15 +- doc/out/pixi_buttongroup.js.html | 117 +++++---- doc/out/pixi_deepzoom_image.js.html | 99 ++------ doc/out/pixi_flippable.js.html | 8 +- doc/out/pixi_labeledgraphics.js.html | 8 +- doc/out/pixi_list.js.html | 8 +- doc/out/pixi_message.js.html | 8 +- doc/out/pixi_modal.js.html | 8 +- doc/out/pixi_popup.js.html | 8 +- doc/out/pixi_popupmenu.js.html | 8 +- doc/out/pixi_progress.js.html | 8 +- doc/out/pixi_scrollview.js.html | 8 +- doc/out/pixi_slider.js.html | 8 +- doc/out/pixi_switch.js.html | 8 +- doc/out/pixi_theme.js.html | 8 +- doc/out/pixi_tooltip.js.html | 8 +- doc/out/pixi_volatile.js.html | 8 +- doc/out/uitest.js.html | 8 +- lib/pixi/button.html | 14 +- lib/pixi/button.js | 7 +- lib/pixi/buttongroup.html | 3 + lib/pixi/buttongroup.js | 21 +- lib/pixi/theme.html | 1 + 72 files changed, 255 insertions(+), 844 deletions(-) diff --git a/dist/iwmlib.pixi.js b/dist/iwmlib.pixi.js index e4bf418..44ac09b 100644 --- a/dist/iwmlib.pixi.js +++ b/dist/iwmlib.pixi.js @@ -2366,8 +2366,8 @@ strokeActive: theme.strokeActive, strokeActiveWidth: theme.strokeActiveWidth, strokeActiveAlpha: theme.strokeActiveAlpha, - textStyle: theme.textStyle, - textStyleActive: theme.textStyleActive, + textStyle: {}, + textStyleActive: {}, style: 'default', radius: theme.radius, disabled: false, @@ -2387,6 +2387,9 @@ this.id = this.opts.id; + this.opts.textStyle = Object.assign({}, theme.textStyle, this.opts.textStyle); + this.opts.textStyleActive = Object.assign({}, theme.textStyleActive, this.opts.textStyleActive); + if (typeof this.opts.icon === 'undefined' && typeof this.opts.iconActive !== 'undefined') { this.opts.icon = this.opts.iconActive; } else if (typeof this.opts.icon !== 'undefined' && typeof this.opts.iconActive === 'undefined') { @@ -3051,8 +3054,8 @@ strokeActive: theme.strokeActive, strokeActiveWidth: theme.strokeActiveWidth, strokeActiveAlpha: theme.strokeActiveAlpha, - textStyle: theme.textStyle, - textStyleActive: theme.textStyleActive, + textStyle: {}, + textStyleActive: {}, style: 'default', radius: theme.radius, disabled: null, @@ -3064,6 +3067,9 @@ }, opts ); + + this.opts.textStyle = Object.assign({}, theme.textStyle, this.opts.textStyle); + this.opts.textStyleActive = Object.assign({}, theme.textStyleActive, this.opts.textStyleActive); this.buttons = []; diff --git a/doc/out/AbstractPopup.html b/doc/out/AbstractPopup.html index 53f6f81..871e50f 100644 --- a/doc/out/AbstractPopup.html +++ b/doc/out/AbstractPopup.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -2924,7 +2918,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/Badge.html b/doc/out/Badge.html index 94510bb..fcce407 100644 --- a/doc/out/Badge.html +++ b/doc/out/Badge.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -2380,7 +2374,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/BlurFilter.html b/doc/out/BlurFilter.html index 0539813..811992e 100644 --- a/doc/out/BlurFilter.html +++ b/doc/out/BlurFilter.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1804,7 +1798,7 @@ app.scene.filters = [blurFilter]
      diff --git a/doc/out/Button.html b/doc/out/Button.html index 31d6611..525cd7f 100644 --- a/doc/out/Button.html +++ b/doc/out/Button.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -3381,7 +3375,7 @@ the tint property of the icon sprite.

      @@ -3505,7 +3499,7 @@ the tint property of the icon sprite.

      @@ -3610,7 +3604,7 @@ the tint property of the icon sprite.

      @@ -3715,7 +3709,7 @@ the tint property of the icon sprite.

      @@ -3822,7 +3816,7 @@ the tint property of the icon sprite.

      diff --git a/doc/out/ButtonGroup.html b/doc/out/ButtonGroup.html index f083136..be3653d 100644 --- a/doc/out/ButtonGroup.html +++ b/doc/out/ButtonGroup.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -3127,150 +3121,6 @@ app.scene.addChild(buttonGroup)
      -
      -
      -

      - - - _stackHorizontal - - () - - - - -

      - - - - -
      - - -
      -
      - - - - - - - - - - -
      - - - - - - - - - - - - - - - - - - - -
      - - - - - - - - - - - - - -
      - - - -
      -
      -

      - - - _stackVertical - - () - - - - -

      - - - - -
      - - -
      -
      - - - - - - - - - - -
      - - - - - - - - - - - - - - - - - - - -
      - - - - - - - - - - - - - -
      - - -

      @@ -3287,7 +3137,7 @@ app.scene.addChild(buttonGroup)

      @@ -3411,7 +3261,7 @@ app.scene.addChild(buttonGroup) @@ -3516,7 +3366,7 @@ app.scene.addChild(buttonGroup) @@ -3621,7 +3471,7 @@ app.scene.addChild(buttonGroup) @@ -3706,78 +3556,6 @@ app.scene.addChild(buttonGroup) - - - - -
      -
      -

      - - - stack - - () - - - - -

      - - - - -
      - - -
      -
      - - - - - - - - - - -
      - - - - - - - - - - - - - - - - - - - -
      - - - - - - - - - - - - -
      @@ -3800,7 +3578,7 @@ app.scene.addChild(buttonGroup)
      diff --git a/doc/out/DeepZoomImage.html b/doc/out/DeepZoomImage.html index ebe9906..2a0a463 100644 --- a/doc/out/DeepZoomImage.html +++ b/doc/out/DeepZoomImage.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1643,7 +1637,7 @@ height and width of the overall image, overlap, and image type.

      @@ -1793,7 +1787,7 @@ height and width of the overall image, overlap, and image type.

      @@ -1943,7 +1937,7 @@ height and width of the overall image, overlap, and image type.

      @@ -2093,7 +2087,7 @@ height and width of the overall image, overlap, and image type.

      @@ -2243,7 +2237,7 @@ height and width of the overall image, overlap, and image type.

      @@ -2417,7 +2411,7 @@ on completion.

      @@ -2615,7 +2609,7 @@ on completion.

      diff --git a/doc/out/Flippable.html b/doc/out/Flippable.html index 0753009..468502b 100644 --- a/doc/out/Flippable.html +++ b/doc/out/Flippable.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -2518,7 +2512,7 @@ front.on('click', event => flippable.toggle())
      diff --git a/doc/out/FontInfo.html b/doc/out/FontInfo.html index 7b323ed..5c11964 100644 --- a/doc/out/FontInfo.html +++ b/doc/out/FontInfo.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1565,7 +1559,7 @@
      diff --git a/doc/out/Hypenate.html b/doc/out/Hypenate.html index 51d6c52..cad289f 100644 --- a/doc/out/Hypenate.html +++ b/doc/out/Hypenate.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1767,7 +1761,7 @@
      diff --git a/doc/out/InteractivePopup.html b/doc/out/InteractivePopup.html index 3096cf2..9798e2f 100644 --- a/doc/out/InteractivePopup.html +++ b/doc/out/InteractivePopup.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -2349,7 +2343,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/LabeledGraphics.exports.LabeledGraphics.html b/doc/out/LabeledGraphics.exports.LabeledGraphics.html index ae30037..c2867b0 100644 --- a/doc/out/LabeledGraphics.exports.LabeledGraphics.html +++ b/doc/out/LabeledGraphics.exports.LabeledGraphics.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1567,7 +1561,7 @@
      diff --git a/doc/out/LabeledGraphics.html b/doc/out/LabeledGraphics.html index 6c3aade..623e0ca 100644 --- a/doc/out/LabeledGraphics.html +++ b/doc/out/LabeledGraphics.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -2632,7 +2626,7 @@ than wanted

      diff --git a/doc/out/List.html b/doc/out/List.html index 471c0b0..d95b4eb 100644 --- a/doc/out/List.html +++ b/doc/out/List.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -2591,7 +2585,7 @@ app.scene.addChild(list)
      diff --git a/doc/out/Message.html b/doc/out/Message.html index 1c0e719..1e0b9dd 100644 --- a/doc/out/Message.html +++ b/doc/out/Message.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -2447,7 +2441,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/MessageInteractivePopup.html b/doc/out/MessageInteractivePopup.html index 8689cfd..9e01c35 100644 --- a/doc/out/MessageInteractivePopup.html +++ b/doc/out/MessageInteractivePopup.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1795,7 +1789,7 @@ like Popup, Message...

      diff --git a/doc/out/MessageMessageInteractivePopup.html b/doc/out/MessageMessageInteractivePopup.html index dec2a0b..d439bd5 100644 --- a/doc/out/MessageMessageInteractivePopup.html +++ b/doc/out/MessageMessageInteractivePopup.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1795,7 +1789,7 @@ like Popup, Message...

      diff --git a/doc/out/Modal.html b/doc/out/Modal.html index 0e6181f..4159322 100644 --- a/doc/out/Modal.html +++ b/doc/out/Modal.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -2348,7 +2342,7 @@ a string or a PIXI.Text object.

      diff --git a/doc/out/ModalInteractivePopup.html b/doc/out/ModalInteractivePopup.html index 9096373..43d90b6 100644 --- a/doc/out/ModalInteractivePopup.html +++ b/doc/out/ModalInteractivePopup.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1795,7 +1789,7 @@ like Popup, Message...

      diff --git a/doc/out/ModalModalInteractivePopup.html b/doc/out/ModalModalInteractivePopup.html index 468b05a..9a5a46a 100644 --- a/doc/out/ModalModalInteractivePopup.html +++ b/doc/out/ModalModalInteractivePopup.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1795,7 +1789,7 @@ like Popup, Message...

      diff --git a/doc/out/PIXIApp.html b/doc/out/PIXIApp.html index 343817c..4fa348b 100644 --- a/doc/out/PIXIApp.html +++ b/doc/out/PIXIApp.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -5749,7 +5743,7 @@ rejected with an error.
      diff --git a/doc/out/Popup.html b/doc/out/Popup.html index b2bd7d1..c385698 100644 --- a/doc/out/Popup.html +++ b/doc/out/Popup.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -2342,7 +2336,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/PopupInteractivePopup.html b/doc/out/PopupInteractivePopup.html index 0e42048..68fcb58 100644 --- a/doc/out/PopupInteractivePopup.html +++ b/doc/out/PopupInteractivePopup.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1795,7 +1789,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenu.html b/doc/out/PopupMenu.html index 06e683f..38e2b50 100644 --- a/doc/out/PopupMenu.html +++ b/doc/out/PopupMenu.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -2396,7 +2390,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/PopupMenuPopupInteractivePopup.html b/doc/out/PopupMenuPopupInteractivePopup.html index 31edb4f..35dfbc7 100644 --- a/doc/out/PopupMenuPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupInteractivePopup.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1795,7 +1789,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html b/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html index 462a88a..462c70b 100644 --- a/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1795,7 +1789,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html b/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html index ea09a09..0492b32 100644 --- a/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1795,7 +1789,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenuPopupPopupInteractivePopup.html b/doc/out/PopupMenuPopupPopupInteractivePopup.html index c18fe02..ec7795a 100644 --- a/doc/out/PopupMenuPopupPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupPopupInteractivePopup.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1795,7 +1789,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupPopupInteractivePopup.html b/doc/out/PopupPopupInteractivePopup.html index aafb5e2..429fae3 100644 --- a/doc/out/PopupPopupInteractivePopup.html +++ b/doc/out/PopupPopupInteractivePopup.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1795,7 +1789,7 @@ like Popup, Message...

      diff --git a/doc/out/Progress.html b/doc/out/Progress.html index d5675fb..03ba6b7 100644 --- a/doc/out/Progress.html +++ b/doc/out/Progress.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -2881,7 +2875,7 @@ app.scene.addChild(progress)
      diff --git a/doc/out/Scrollview.html b/doc/out/Scrollview.html index f0d2941..2b7714e 100644 --- a/doc/out/Scrollview.html +++ b/doc/out/Scrollview.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1713,7 +1707,7 @@ app.loader
      diff --git a/doc/out/Slider.html b/doc/out/Slider.html index 8e248dc..d16913c 100644 --- a/doc/out/Slider.html +++ b/doc/out/Slider.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -2972,7 +2966,7 @@ app.scene.addChild(slider)
      diff --git a/doc/out/Switch.html b/doc/out/Switch.html index 2b4a44f..a95069a 100644 --- a/doc/out/Switch.html +++ b/doc/out/Switch.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -3402,7 +3396,7 @@ app.scene.addChild(switch1)
      diff --git a/doc/out/TextLabel.TextLabel.html b/doc/out/TextLabel.TextLabel.html index f2a0cba..88d1b74 100644 --- a/doc/out/TextLabel.TextLabel.html +++ b/doc/out/TextLabel.TextLabel.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1696,7 +1690,7 @@
      diff --git a/doc/out/Theme.html b/doc/out/Theme.html index 2727b58..93e87e1 100644 --- a/doc/out/Theme.html +++ b/doc/out/Theme.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -3171,7 +3165,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/ThemeDark.html b/doc/out/ThemeDark.html index 7d52464..35ce86e 100644 --- a/doc/out/ThemeDark.html +++ b/doc/out/ThemeDark.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1592,7 +1586,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/ThemeLight.html b/doc/out/ThemeLight.html index 4b99e10..2789c7d 100644 --- a/doc/out/ThemeLight.html +++ b/doc/out/ThemeLight.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1604,7 +1598,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/ThemeRed.html b/doc/out/ThemeRed.html index c5c751d..e3351f2 100644 --- a/doc/out/ThemeRed.html +++ b/doc/out/ThemeRed.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1604,7 +1598,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/TileQuadNode.html b/doc/out/TileQuadNode.html index ecf3e3a..6e33f21 100644 --- a/doc/out/TileQuadNode.html +++ b/doc/out/TileQuadNode.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1484,7 +1478,7 @@ the memory pressure.

      @@ -1688,7 +1682,7 @@ the memory pressure.

      @@ -1856,7 +1850,7 @@ and west flags to address nw, ne, sw, and se.

      @@ -1933,7 +1927,7 @@ an indicator of tiles to free.

      @@ -2056,7 +2050,7 @@ an indicator of tiles to free.

      diff --git a/doc/out/Tooltip.html b/doc/out/Tooltip.html index 294a4be..b7ee308 100644 --- a/doc/out/Tooltip.html +++ b/doc/out/Tooltip.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -2518,7 +2512,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/UITest.html b/doc/out/UITest.html index 129fa96..ead6eb8 100644 --- a/doc/out/UITest.html +++ b/doc/out/UITest.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -4189,7 +4183,7 @@ test.start()
      diff --git a/doc/out/Volatile.html b/doc/out/Volatile.html index 7bc122b..c8e52dd 100644 --- a/doc/out/Volatile.html +++ b/doc/out/Volatile.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -2105,7 +2099,7 @@ app.scene.addChild(button)
      diff --git a/doc/out/global.html b/doc/out/global.html index 76ab0c5..ff8f547 100644 --- a/doc/out/global.html +++ b/doc/out/global.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -3326,7 +3320,7 @@
      diff --git a/doc/out/index.html b/doc/out/index.html index 0164d5c..4d9f41a 100644 --- a/doc/out/index.html +++ b/doc/out/index.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1491,7 +1485,7 @@
      diff --git a/doc/out/pixi_abstractpopup.js.html b/doc/out/pixi_abstractpopup.js.html index 997facd..e6a4305 100644 --- a/doc/out/pixi_abstractpopup.js.html +++ b/doc/out/pixi_abstractpopup.js.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1814,7 +1808,7 @@ export default class AbstractPopup extends PIXI.Graphics {
      diff --git a/doc/out/pixi_app.js.html b/doc/out/pixi_app.js.html index f6da038..8646985 100644 --- a/doc/out/pixi_app.js.html +++ b/doc/out/pixi_app.js.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -2195,7 +2189,7 @@ class FpsDisplay extends PIXI.Graphics {
      diff --git a/doc/out/pixi_badge.js.html b/doc/out/pixi_badge.js.html index 99e9bea..c6153d3 100644 --- a/doc/out/pixi_badge.js.html +++ b/doc/out/pixi_badge.js.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1575,7 +1569,7 @@ export default class Badge extends AbstractPopup {
      diff --git a/doc/out/pixi_blurfilter.js.html b/doc/out/pixi_blurfilter.js.html index ff4a158..4f19944 100644 --- a/doc/out/pixi_blurfilter.js.html +++ b/doc/out/pixi_blurfilter.js.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1733,7 +1727,7 @@ class TiltShiftYFilter extends TiltShiftAxisFilter {
      diff --git a/doc/out/pixi_button.js.html b/doc/out/pixi_button.js.html index 16e0550..ab03e23 100644 --- a/doc/out/pixi_button.js.html +++ b/doc/out/pixi_button.js.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1588,8 +1582,8 @@ export default class Button extends PIXI.Container { strokeActive: theme.strokeActive, strokeActiveWidth: theme.strokeActiveWidth, strokeActiveAlpha: theme.strokeActiveAlpha, - textStyle: theme.textStyle, - textStyleActive: theme.textStyleActive, + textStyle: {}, + textStyleActive: {}, style: 'default', radius: theme.radius, disabled: false, @@ -1609,6 +1603,9 @@ export default class Button extends PIXI.Container { this.id = this.opts.id + this.opts.textStyle = Object.assign({}, theme.textStyle, this.opts.textStyle) + this.opts.textStyleActive = Object.assign({}, theme.textStyleActive, this.opts.textStyleActive) + if (typeof this.opts.icon === 'undefined' && typeof this.opts.iconActive !== 'undefined') { this.opts.icon = this.opts.iconActive } else if (typeof this.opts.icon !== 'undefined' && typeof this.opts.iconActive === 'undefined') { @@ -2174,7 +2171,7 @@ export default class Button extends PIXI.Container {
      diff --git a/doc/out/pixi_buttongroup.js.html b/doc/out/pixi_buttongroup.js.html index 5e154f5..e237973 100644 --- a/doc/out/pixi_buttongroup.js.html +++ b/doc/out/pixi_buttongroup.js.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1565,8 +1559,8 @@ export default class ButtonGroup extends PIXI.Container { strokeActive: theme.strokeActive, strokeActiveWidth: theme.strokeActiveWidth, strokeActiveAlpha: theme.strokeActiveAlpha, - textStyle: theme.textStyle, - textStyleActive: theme.textStyleActive, + textStyle: {}, + textStyleActive: {}, style: 'default', radius: theme.radius, disabled: null, @@ -1579,6 +1573,9 @@ export default class ButtonGroup extends PIXI.Container { opts ) + this.opts.textStyle = Object.assign({}, theme.textStyle, this.opts.textStyle) + this.opts.textStyleActive = Object.assign({}, theme.textStyleActive, this.opts.textStyleActive) + this.buttons = [] this._disabled = null @@ -1744,6 +1741,7 @@ export default class ButtonGroup extends PIXI.Container { this.addChildAt(background, 0) this.__initWidth = this.container.width + this.__initHeight = this.container.height } return this @@ -1891,18 +1889,23 @@ export default class ButtonGroup extends PIXI.Container { * @param {*} event */ onStart(event) { - this.__dragging = true + if ( + (this.opts.maxWidth != null && this.__initWidth > this.opts.maxWidth) || + (this.opts.maxHeight != null && this.__initHeight > this.opts.maxHeight) + ) { + this.__dragging = true - this.capture(event) + this.capture(event) - this.__delta = { - x: this.container.position.x - event.data.global.x, - y: this.container.position.y - event.data.global.y - } + this.__delta = { + x: this.container.position.x - event.data.global.x, + y: this.container.position.y - event.data.global.y + } - TweenLite.killTweensOf(this.container.position, { x: true, y: true }) - if (typeof ThrowPropsPlugin != 'undefined') { - ThrowPropsPlugin.track(this.container.position, 'x,y') + TweenLite.killTweensOf(this.container.position, { x: true, y: true }) + if (typeof ThrowPropsPlugin != 'undefined') { + ThrowPropsPlugin.track(this.container.position, 'x,y') + } } } @@ -1914,7 +1917,6 @@ export default class ButtonGroup extends PIXI.Container { onMove(event) { if (this.__dragging) { this.capture(event) - if (this.opts.orientation === 'horizontal') { this.container.position.x = event.data.global.x + this.__delta.x } else { @@ -1939,20 +1941,34 @@ export default class ButtonGroup extends PIXI.Container { const throwProps = { x: { velocity: 'auto' }, y: { velocity: 'auto' } } if (this.opts.orientation === 'horizontal') { - const distanceToLeft = this.container.x - const distanceToRight = this.opts.maxWidth - this.container.x - this.__initWidth - if (distanceToLeft > 0 && distanceToLeft > distanceToRight) { + if (this.__initWidth > this.opts.maxWidth) { + // stack! + const distanceToLeft = this.container.x + const distanceToRight = this.opts.maxWidth - this.container.x - this.__initWidth + + if (distanceToLeft > 0) { + throwProps.x.end = 0 + } else if (distanceToRight > 0) { + throwProps.x.end = this.opts.maxWidth - this.__initWidth + } + } else { + // just magnetize throwProps.x.end = 0 - } else if (distanceToRight > 0 && distanceToRight > distanceToLeft) { - throwProps.x.end = this.opts.maxWidth - this.__initWidth } } else { - const distanceToTop = this.container.y - const distanceToBottom = this.opts.maxHeight - this.container.y - this.container.height - if (distanceToTop > 0 && distanceToTop > distanceToBottom) { + if (this.__initHeight > this.opts.maxHeight) { + // stack! + const distanceToTop = this.container.y + const distanceToBottom = this.opts.maxHeight - this.container.y - this.__initHeight + + if (distanceToTop > 0) { + throwProps.y.end = 0 + } else if (distanceToBottom > 0) { + throwProps.y.end = this.opts.maxHeight - this.__initHeight + } + } else { + // just magnetize throwProps.y.end = 0 - } else if (distanceToBottom > 0 && distanceToBottom > distanceToTop) { - throwProps.y.end = this.opts.maxHeight - this.container.height } } @@ -1984,25 +2000,30 @@ export default class ButtonGroup extends PIXI.Container { * @param {*} event */ onScroll(event) { - this.capture(event) + if ( + (this.opts.maxWidth != null && this.__initWidth > this.opts.maxWidth) || + (this.opts.maxHeight != null && this.__initHeight > this.opts.maxHeight) + ) { + this.capture(event) - if (this.opts.orientation === 'horizontal') { - this.container.position.x -= event.deltaX - if (this.container.position.x > 0) { - this.container.position.x = 0 - } else if (this.container.position.x + this.__initWidth < this.opts.maxWidth) { - this.container.position.x = this.opts.maxWidth - this.__initWidth - } - } else { - this.container.position.y -= event.deltaY - if (this.container.position.y > 0) { - this.container.position.y = 0 - } else if (this.container.position.y + this.container.height < this.opts.maxHeight) { - this.container.position.y = this.opts.maxHeight - this.container.height + if (this.opts.orientation === 'horizontal') { + this.container.position.x -= event.deltaX + if (this.container.position.x > 0) { + this.container.position.x = 0 + } else if (this.container.position.x + this.__initWidth < this.opts.maxWidth) { + this.container.position.x = this.opts.maxWidth - this.__initWidth + } + } else { + this.container.position.y -= event.deltaY + if (this.container.position.y > 0) { + this.container.position.y = 0 + } else if (this.container.position.y + this.container.height < this.opts.maxHeight) { + this.container.position.y = this.opts.maxHeight - this.container.height + } } + + this.stack() } - - this.stack() } /** @@ -2016,7 +2037,7 @@ export default class ButtonGroup extends PIXI.Container { } /** - * + * @private */ stack() { if (this.opts.maxWidth) { @@ -2027,7 +2048,7 @@ export default class ButtonGroup extends PIXI.Container { } /** - * + * @private */ _stackHorizontal() { const sorted = [] @@ -2084,7 +2105,7 @@ export default class ButtonGroup extends PIXI.Container { } /** - * + * @private */ _stackVertical() { const sorted = [] @@ -2153,7 +2174,7 @@ export default class ButtonGroup extends PIXI.Container {
      diff --git a/doc/out/pixi_deepzoom_image.js.html b/doc/out/pixi_deepzoom_image.js.html index 2f0777b..9fbfa9b 100644 --- a/doc/out/pixi_deepzoom_image.js.html +++ b/doc/out/pixi_deepzoom_image.js.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1492,15 +1486,14 @@ export class DeepZoomInfo { // number in the file system for the folder with tiles this.clip = this.clip || null // e.g. { level: 12, col: 301436, row: 354060 } this.type = this.type || 'dzi' - this.urlTileTemplate = - this.urlTileTemplate || '{path}/{level}/{column}_{row}.{format}' + this.urlTileTemplate = this.urlTileTemplate || '{path}/{level}/{column}_{row}.{format}' this.setupDimensions() } /* Computes the needed number of layers from the width and height - * of the image. Note that this includes the level 0, i.e. 0 ... 4 - * means that 5 levels exist. - **/ + * of the image. Note that this includes the level 0, i.e. 0 ... 4 + * means that 5 levels exist. + **/ numLevels() { let maxDimension = Math.max(this.width, this.height) let boundary = this.type === 'dzi' ? 1 : this.tileSize @@ -1683,15 +1676,7 @@ export class DeepZoomInfo { test() { //console.log("w=" + this.width + " h=" + this.height + " maxlevel=" + this.maxLevel + " base=" + this.baseLevel) for (let i = 0; i <= this.maxLevel; i++) { - console.log( - ' ' + - i + - ' -> ' + - this.getScale(i) + - ' [' + - this.dimensions(i) + - ']' - ) + console.log(' ' + i + ' -> ' + this.getScale(i) + ' [' + this.dimensions(i) + ']') } console.log(this.urlForTile(this.baseLevel, 0, 0)) } @@ -1731,12 +1716,7 @@ class TileQuadNode { **/ noQuads() { if (this.previous === null) return false - return ( - this.nw === null && - this.ne === null && - this.sw === null && - this.se === null - ) + return this.nw === null && this.ne === null && this.sw === null && this.se === null } /** Unlink the given quad node @@ -1775,7 +1755,6 @@ class TileQuadNode { } } - /** * The main class of a deeply zoomable image that is represented by a hierarchy * of tile layers for each zoom level. This gives the user the impression that @@ -1793,7 +1772,7 @@ export class DeepZoomImage extends PIXI.Container { debug = false, shadow = false, center = false, - world = null, // Defines the world bounds the images lives in + world = null, // Defines the world bounds the images lives in highResolution = true, autoLoadTiles = true, useWorker = '', @@ -1808,9 +1787,7 @@ export class DeepZoomImage extends PIXI.Container { this.shadow = shadow this.world = world this.useWorker = useWorker - this.resolution = highResolution - ? Math.round(window.devicePixelRatio) - : 1 + this.resolution = highResolution ? Math.round(window.devicePixelRatio) : 1 this.alpha = alpha this.fastLoads = 0 this.active = true @@ -2000,7 +1977,7 @@ export class DeepZoomImage extends PIXI.Container { **/ get maxScale() { let delta = this.info.maxLevel - this.info.baseLevel - return Math.pow(2, delta) / this.resolution * 2 + return (Math.pow(2, delta) / this.resolution) * 2 } /** Getter for the current width. @@ -2015,7 +1992,6 @@ export class DeepZoomImage extends PIXI.Container { return this.pixelSize[1] } - /* Overrides PIXI.Container.hitArea() * Allows to optimize the hit testing. Container with hit areas are directly * hit tested without consideration of children. @@ -2085,7 +2061,7 @@ export class DeepZoomImage extends PIXI.Container { } worldBounds() { - let viewBounds = this.app.scene.bounds || this.app.scene.getBounds() + let viewBounds = this.app.scene.bounds || this.app.scene.getBounds() // Using getBounds extends visible scope after loading tiles and leads // to excessive loading. So we prefer bounds over getBounds() if (this.world != null) { @@ -2123,11 +2099,7 @@ export class DeepZoomImage extends PIXI.Container { let topLeft = tiles.toLocal(worldTopLeft) let bottomRight = tiles.toLocal(worldBottomRight) tiles._centerPoint = tilesCenter - let bounds = new PIXI.Rectangle( - topLeft.x, - topLeft.y, - bottomRight.x - topLeft.x, - bottomRight.y - topLeft.y) + let bounds = new PIXI.Rectangle(topLeft.x, topLeft.y, bottomRight.x - topLeft.x, bottomRight.y - topLeft.y) tiles._boundsRect = bounds @@ -2172,9 +2144,6 @@ export class DeepZoomImage extends PIXI.Container { return { centerCol, centerRow, needed } } - - - /** Returns all changed tiles for a given level. * @param {Tiles} tiles - the grid of tiles * @param {number} level - The zoom level of the grid @@ -2227,8 +2196,7 @@ export class DeepZoomImage extends PIXI.Container { * @param {PIXI.Point} about - point of interaction */ populateTiles(tiles, level, { onlyone = false, about = null } = {}) { - if (tiles.isComplete()) - return + if (tiles.isComplete()) return let referenceCol = -1 let referenceRow = -1 let { centerCol, centerRow, changed } = this.changedTiles(tiles, level) @@ -2239,8 +2207,7 @@ export class DeepZoomImage extends PIXI.Container { let scaledTileSize = tiles.tileSize * tiles.tileScale referenceCol = Math.floor(refPoint.x / scaledTileSize) referenceRow = Math.floor(refPoint.y / scaledTileSize) - } - else { + } else { referenceCol = centerCol referenceRow = centerRow } @@ -2278,17 +2245,7 @@ export class DeepZoomImage extends PIXI.Container { let [cols, rows, w, h] = this.info.dimensions(level) let increasedLevels = level - this.info.baseLevel let invScale = Math.pow(0.5, increasedLevels) - let tiles = new Tiles( - level, - this, - invScale, - cols, - rows, - w, - h, - this.info.tileSize, - this.info.overlap - ) + let tiles = new Tiles(level, this, invScale, cols, rows, w, h, this.info.tileSize, this.info.overlap) this.addTiles(key, tiles) if (this.info.clip) { let rest = this.info.rests[level] @@ -2391,7 +2348,6 @@ export class DeepZoomImage extends PIXI.Container { }) } - /** * Destroy tiles in all layers that are no longer needed * @@ -2436,8 +2392,8 @@ export class DeepZoomImage extends PIXI.Container { } /* Tint all tiles - * @param {number} level - The zoom level of the grid - */ + * @param {number} level - The zoom level of the grid + */ tintTilesBelowLevel(level) { Object.keys(this.tileLayers).forEach(key => { let tiles = this.tileLayers[key] @@ -2449,7 +2405,7 @@ export class DeepZoomImage extends PIXI.Container { /** * Ensure that the given tiles layer is the topmost one and visible. - * @param {*} tiles + * @param {*} tiles */ bringTilesToFront(tiles) { this.tileContainer.addChild(tiles) @@ -2483,8 +2439,7 @@ export class DeepZoomImage extends PIXI.Container { }) if (this.fastLoads == 3) { this.fastLoads = 0 - } - else { + } else { return } } @@ -2512,10 +2467,10 @@ export class DeepZoomImage extends PIXI.Container { } /** - *Activates the textures on the DeepZoomImage. - * - * @memberof DeepZoomImage - */ + *Activates the textures on the DeepZoomImage. + * + * @memberof DeepZoomImage + */ activate() { this.active = true this.destroyTilesAboveLevel(this.currentLevel) @@ -2524,10 +2479,10 @@ export class DeepZoomImage extends PIXI.Container { } /** - *Dectivates the textures on the DeepZoomImage. - * - * @memberof DeepZoomImage - */ + *Dectivates the textures on the DeepZoomImage. + * + * @memberof DeepZoomImage + */ deactivate() { this.active = false this.destroyAllTiles() @@ -2557,7 +2512,7 @@ export class DeepZoomImage extends PIXI.Container {
      diff --git a/doc/out/pixi_flippable.js.html b/doc/out/pixi_flippable.js.html index 3b8792f..3c24122 100644 --- a/doc/out/pixi_flippable.js.html +++ b/doc/out/pixi_flippable.js.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1912,7 +1906,7 @@ export default class Flippable extends PIXI.projection.Camera3d {
      diff --git a/doc/out/pixi_labeledgraphics.js.html b/doc/out/pixi_labeledgraphics.js.html index 67acfce..988fa8d 100644 --- a/doc/out/pixi_labeledgraphics.js.html +++ b/doc/out/pixi_labeledgraphics.js.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1861,7 +1855,7 @@ export class BitmapLabeledGraphics extends LabeledGraphics {
      diff --git a/doc/out/pixi_list.js.html b/doc/out/pixi_list.js.html index 724d866..a3db605 100644 --- a/doc/out/pixi_list.js.html +++ b/doc/out/pixi_list.js.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1840,7 +1834,7 @@ export default class List extends PIXI.Container {
      diff --git a/doc/out/pixi_message.js.html b/doc/out/pixi_message.js.html index 1c0f50d..01f8a7a 100644 --- a/doc/out/pixi_message.js.html +++ b/doc/out/pixi_message.js.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1589,7 +1583,7 @@ export default class Message extends InteractivePopup {
      diff --git a/doc/out/pixi_modal.js.html b/doc/out/pixi_modal.js.html index 5258e05..d715c1b 100644 --- a/doc/out/pixi_modal.js.html +++ b/doc/out/pixi_modal.js.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1670,7 +1664,7 @@ export default class Modal extends PIXI.Container {
      diff --git a/doc/out/pixi_popup.js.html b/doc/out/pixi_popup.js.html index a735a45..344c2a7 100644 --- a/doc/out/pixi_popup.js.html +++ b/doc/out/pixi_popup.js.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1680,7 +1674,7 @@ export default class Popup extends InteractivePopup {
      diff --git a/doc/out/pixi_popupmenu.js.html b/doc/out/pixi_popupmenu.js.html index 1f064b6..58ecc4e 100644 --- a/doc/out/pixi_popupmenu.js.html +++ b/doc/out/pixi_popupmenu.js.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1583,7 +1577,7 @@ export default class PopupMenu extends Popup {
      diff --git a/doc/out/pixi_progress.js.html b/doc/out/pixi_progress.js.html index 18c81e2..f0da032 100644 --- a/doc/out/pixi_progress.js.html +++ b/doc/out/pixi_progress.js.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1765,7 +1759,7 @@ export default class Progress extends PIXI.Container {
      diff --git a/doc/out/pixi_scrollview.js.html b/doc/out/pixi_scrollview.js.html index 4b0de8c..affaa5b 100644 --- a/doc/out/pixi_scrollview.js.html +++ b/doc/out/pixi_scrollview.js.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1524,7 +1518,7 @@ export default class Scrollview extends Scrollbox {
      diff --git a/doc/out/pixi_slider.js.html b/doc/out/pixi_slider.js.html index b29ae90..addc267 100644 --- a/doc/out/pixi_slider.js.html +++ b/doc/out/pixi_slider.js.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1929,7 +1923,7 @@ export default class Slider extends PIXI.Container {
      diff --git a/doc/out/pixi_switch.js.html b/doc/out/pixi_switch.js.html index b21356f..9b1cf54 100644 --- a/doc/out/pixi_switch.js.html +++ b/doc/out/pixi_switch.js.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1983,7 +1977,7 @@ export default class Switch extends PIXI.Container {
      diff --git a/doc/out/pixi_theme.js.html b/doc/out/pixi_theme.js.html index 8bfa9b1..35a531a 100644 --- a/doc/out/pixi_theme.js.html +++ b/doc/out/pixi_theme.js.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1724,7 +1718,7 @@ export class ThemeRed extends Theme {
      diff --git a/doc/out/pixi_tooltip.js.html b/doc/out/pixi_tooltip.js.html index 886be01..a310d8c 100644 --- a/doc/out/pixi_tooltip.js.html +++ b/doc/out/pixi_tooltip.js.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1617,7 +1611,7 @@ export default class Tooltip extends AbstractPopup {
      diff --git a/doc/out/pixi_volatile.js.html b/doc/out/pixi_volatile.js.html index aa9652d..6595e4f 100644 --- a/doc/out/pixi_volatile.js.html +++ b/doc/out/pixi_volatile.js.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -1621,7 +1615,7 @@ export default class Volatile {
      diff --git a/doc/out/uitest.js.html b/doc/out/uitest.js.html index 6b96098..b40d559 100644 --- a/doc/out/uitest.js.html +++ b/doc/out/uitest.js.html @@ -267,10 +267,6 @@ Methods -
    • _stackHorizontal
    • - -
    • _stackVertical
    • -
    • capture
    • hide
    • @@ -279,8 +275,6 @@
    • show
    • -
    • stack
    • -
      @@ -2472,7 +2466,7 @@ class Event {
      diff --git a/lib/pixi/button.html b/lib/pixi/button.html index 1ef9371..49d9f65 100644 --- a/lib/pixi/button.html +++ b/lib/pixi/button.html @@ -32,7 +32,7 @@ const app = new PIXIApp({ view: canvas, width: 900, - height: 520, + height: 600, transparent: false }).setup().run() @@ -309,6 +309,17 @@ setInterval(() => { button25.layout() }, 1000) +const button26 = new Button({ + x: 10, + y: 520, + label: 'add', + type: 'checkbox', + strokeActive: 0x28a745, + textStyleActive: { + fill: 0x28a745 + } +}) + app.scene.addChild(button1, button2, button3, button4, button5, button6) app.scene.addChild(button7, button8) app.scene.addChild(button9, button10, button11) @@ -316,6 +327,7 @@ app.scene.addChild(button12, button13) app.scene.addChild(button14, button15, button16, button17) app.scene.addChild(button18, button19, button20, button21) app.scene.addChild(button22, button23, button24, button25) +app.scene.addChild(button26) \ No newline at end of file diff --git a/lib/pixi/button.js b/lib/pixi/button.js index d006f87..4af4be0 100644 --- a/lib/pixi/button.js +++ b/lib/pixi/button.js @@ -136,8 +136,8 @@ export default class Button extends PIXI.Container { strokeActive: theme.strokeActive, strokeActiveWidth: theme.strokeActiveWidth, strokeActiveAlpha: theme.strokeActiveAlpha, - textStyle: theme.textStyle, - textStyleActive: theme.textStyleActive, + textStyle: {}, + textStyleActive: {}, style: 'default', radius: theme.radius, disabled: false, @@ -157,6 +157,9 @@ export default class Button extends PIXI.Container { this.id = this.opts.id + this.opts.textStyle = Object.assign({}, theme.textStyle, this.opts.textStyle) + this.opts.textStyleActive = Object.assign({}, theme.textStyleActive, this.opts.textStyleActive) + if (typeof this.opts.icon === 'undefined' && typeof this.opts.iconActive !== 'undefined') { this.opts.icon = this.opts.iconActive } else if (typeof this.opts.icon !== 'undefined' && typeof this.opts.iconActive === 'undefined') { diff --git a/lib/pixi/buttongroup.html b/lib/pixi/buttongroup.html index 360c238..3c8c872 100644 --- a/lib/pixi/buttongroup.html +++ b/lib/pixi/buttongroup.html @@ -101,6 +101,7 @@ const buttonGroup5 = new ButtonGroup({ {label: 'ButtonGroup'}, {label: 'of', active: true}, {label: 'type'}, + {minWidth: 30, style: 'link'}, {label: 'checkbox', active: true} ], margin: 6, @@ -272,6 +273,8 @@ const buttons16 = [] for (let i = 1; i < 101; i++) { buttons16.push({label: `Button ${i}`, stroke: Math.floor(Math.random() * 16777215), strokeWidth: 3, radius: 16}) } + +buttons16.splice(6, 0, {minWidth: 50, style: 'link'}) const buttonGroup16 = new ButtonGroup({ x: 90, y: 1040, diff --git a/lib/pixi/buttongroup.js b/lib/pixi/buttongroup.js index a85c94d..6ec72ad 100644 --- a/lib/pixi/buttongroup.js +++ b/lib/pixi/buttongroup.js @@ -113,8 +113,8 @@ export default class ButtonGroup extends PIXI.Container { strokeActive: theme.strokeActive, strokeActiveWidth: theme.strokeActiveWidth, strokeActiveAlpha: theme.strokeActiveAlpha, - textStyle: theme.textStyle, - textStyleActive: theme.textStyleActive, + textStyle: {}, + textStyleActive: {}, style: 'default', radius: theme.radius, disabled: null, @@ -127,6 +127,9 @@ export default class ButtonGroup extends PIXI.Container { opts ) + this.opts.textStyle = Object.assign({}, theme.textStyle, this.opts.textStyle) + this.opts.textStyleActive = Object.assign({}, theme.textStyleActive, this.opts.textStyleActive) + this.buttons = [] this._disabled = null @@ -440,8 +443,10 @@ export default class ButtonGroup extends PIXI.Container { * @param {*} event */ onStart(event) { - - if ((this.opts.maxWidth != null && this.__initWidth > this.opts.maxWidth) || (this.opts.maxHeight != null && this.__initHeight > this.opts.maxHeight)) { + if ( + (this.opts.maxWidth != null && this.__initWidth > this.opts.maxWidth) || + (this.opts.maxHeight != null && this.__initHeight > this.opts.maxHeight) + ) { this.__dragging = true this.capture(event) @@ -509,7 +514,7 @@ export default class ButtonGroup extends PIXI.Container { // stack! const distanceToTop = this.container.y const distanceToBottom = this.opts.maxHeight - this.container.y - this.__initHeight - + if (distanceToTop > 0) { throwProps.y.end = 0 } else if (distanceToBottom > 0) { @@ -549,8 +554,10 @@ export default class ButtonGroup extends PIXI.Container { * @param {*} event */ onScroll(event) { - - if ((this.opts.maxWidth != null && this.__initWidth > this.opts.maxWidth) || (this.opts.maxHeight != null && this.__initHeight > this.opts.maxHeight)) { + if ( + (this.opts.maxWidth != null && this.__initWidth > this.opts.maxWidth) || + (this.opts.maxHeight != null && this.__initHeight > this.opts.maxHeight) + ) { this.capture(event) if (this.opts.orientation === 'horizontal') { diff --git a/lib/pixi/theme.html b/lib/pixi/theme.html index 83d489b..90f2f0d 100644 --- a/lib/pixi/theme.html +++ b/lib/pixi/theme.html @@ -120,3 +120,4 @@ app.scene.addChild(switchDark, switchLight, switchRed) app.scene.addChild(buttonYellow) + \ No newline at end of file From 05e3c89ca193be6ec1d14e2f886207b9365e50e3 Mon Sep 17 00:00:00 2001 From: Uwe Oestermeier Date: Thu, 8 Aug 2019 14:30:42 +0200 Subject: [PATCH 26/30] Fixed eslint problems --- lib/pixi/buttongroup.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pixi/buttongroup.js b/lib/pixi/buttongroup.js index f312e4a..6ec72ad 100644 --- a/lib/pixi/buttongroup.js +++ b/lib/pixi/buttongroup.js @@ -514,7 +514,7 @@ export default class ButtonGroup extends PIXI.Container { // stack! const distanceToTop = this.container.y const distanceToBottom = this.opts.maxHeight - this.container.y - this.__initHeight - + if (distanceToTop > 0) { throwProps.y.end = 0 } else if (distanceToBottom > 0) { From d48139c40f9d4b17582c9e5956502513ec39c127 Mon Sep 17 00:00:00 2001 From: Sebastian Kupke Date: Thu, 8 Aug 2019 14:32:55 +0200 Subject: [PATCH 27/30] Fixed positioning bug in button. --- dist/iwmlib.pixi.js | 31 ++++++++++++------- doc/out/AbstractPopup.html | 2 +- doc/out/Badge.html | 2 +- doc/out/BlurFilter.html | 2 +- doc/out/Button.html | 2 +- doc/out/ButtonGroup.html | 2 +- doc/out/DeepZoomImage.html | 2 +- doc/out/DeepZoomInfo.html | 2 +- doc/out/Flippable.html | 2 +- doc/out/FontInfo.html | 2 +- doc/out/Hypenate.html | 2 +- doc/out/InteractivePopup.html | 2 +- ...beledGraphics.exports.LabeledGraphics.html | 2 +- doc/out/LabeledGraphics.html | 2 +- doc/out/List.html | 2 +- doc/out/Message.html | 2 +- doc/out/MessageInteractivePopup.html | 2 +- doc/out/MessageMessageInteractivePopup.html | 2 +- doc/out/Modal.html | 2 +- doc/out/ModalInteractivePopup.html | 2 +- doc/out/ModalModalInteractivePopup.html | 2 +- doc/out/PIXIApp.html | 2 +- doc/out/Popup.html | 2 +- doc/out/PopupInteractivePopup.html | 2 +- doc/out/PopupMenu.html | 2 +- doc/out/PopupMenuPopupInteractivePopup.html | 2 +- ...pupMenuPopupMenuPopupInteractivePopup.html | 2 +- ...nuPopupMenuPopupPopupInteractivePopup.html | 2 +- .../PopupMenuPopupPopupInteractivePopup.html | 2 +- doc/out/PopupPopupInteractivePopup.html | 2 +- doc/out/Progress.html | 2 +- doc/out/Scrollview.html | 2 +- doc/out/Slider.html | 2 +- doc/out/Switch.html | 2 +- doc/out/TextLabel.TextLabel.html | 2 +- doc/out/Theme.html | 2 +- doc/out/ThemeDark.html | 2 +- doc/out/ThemeLight.html | 2 +- doc/out/ThemeRed.html | 2 +- doc/out/TileQuadNode.html | 2 +- doc/out/Tooltip.html | 2 +- doc/out/UITest.html | 2 +- doc/out/Volatile.html | 2 +- doc/out/global.html | 2 +- doc/out/index.html | 2 +- doc/out/pixi_abstractpopup.js.html | 2 +- doc/out/pixi_app.js.html | 2 +- doc/out/pixi_badge.js.html | 2 +- doc/out/pixi_blurfilter.js.html | 2 +- doc/out/pixi_button.js.html | 6 ++-- doc/out/pixi_buttongroup.js.html | 2 +- doc/out/pixi_deepzoom_image.js.html | 2 +- doc/out/pixi_flippable.js.html | 2 +- doc/out/pixi_labeledgraphics.js.html | 2 +- doc/out/pixi_list.js.html | 2 +- doc/out/pixi_message.js.html | 2 +- doc/out/pixi_modal.js.html | 2 +- doc/out/pixi_popup.js.html | 2 +- doc/out/pixi_popupmenu.js.html | 2 +- doc/out/pixi_progress.js.html | 2 +- doc/out/pixi_scrollview.js.html | 2 +- doc/out/pixi_slider.js.html | 2 +- doc/out/pixi_switch.js.html | 2 +- doc/out/pixi_theme.js.html | 2 +- doc/out/pixi_tooltip.js.html | 2 +- doc/out/pixi_volatile.js.html | 2 +- doc/out/uitest.js.html | 2 +- lib/pixi/button.js | 4 +-- lib/pixi/buttongroup.js | 2 +- 69 files changed, 90 insertions(+), 83 deletions(-) diff --git a/dist/iwmlib.pixi.js b/dist/iwmlib.pixi.js index 344ce12..22dd2dc 100644 --- a/dist/iwmlib.pixi.js +++ b/dist/iwmlib.pixi.js @@ -2666,8 +2666,8 @@ //-------------------- if (this.badge) { this.removeChild(this.badge); - const width = this.width; - const height = this.height; + const width = this._width; + const height = this._height; this.addChild(this.badge); const badge = this.badge; @@ -3067,7 +3067,7 @@ }, opts ); - + this.opts.textStyle = Object.assign({}, theme.textStyle, this.opts.textStyle); this.opts.textStyleActive = Object.assign({}, theme.textStyleActive, this.opts.textStyleActive); @@ -3384,8 +3384,10 @@ * @param {*} event */ onStart(event) { - - if ((this.opts.maxWidth != null && this.__initWidth > this.opts.maxWidth) || (this.opts.maxHeight != null && this.__initHeight > this.opts.maxHeight)) { + if ( + (this.opts.maxWidth != null && this.__initWidth > this.opts.maxWidth) || + (this.opts.maxHeight != null && this.__initHeight > this.opts.maxHeight) + ) { this.__dragging = true; this.capture(event); @@ -3453,6 +3455,7 @@ // stack! const distanceToTop = this.container.y; const distanceToBottom = this.opts.maxHeight - this.container.y - this.__initHeight; + if (distanceToTop > 0) { throwProps.y.end = 0; } else if (distanceToBottom > 0) { @@ -3492,8 +3495,10 @@ * @param {*} event */ onScroll(event) { - - if ((this.opts.maxWidth != null && this.__initWidth > this.opts.maxWidth) || (this.opts.maxHeight != null && this.__initHeight > this.opts.maxHeight)) { + if ( + (this.opts.maxWidth != null && this.__initWidth > this.opts.maxWidth) || + (this.opts.maxHeight != null && this.__initHeight > this.opts.maxHeight) + ) { this.capture(event); if (this.opts.orientation === 'horizontal') { @@ -11189,6 +11194,8 @@ } } + /* eslint-disable no-unused-vars */ + /** A container for scatter objects, which uses a single InteractionMapper * for all children. This reduces the number of registered event handlers * and covers the common use case that multiple objects are scattered @@ -11519,8 +11526,6 @@ roundPixel(value) { // UO: Should be obsolete because Renderer supports roundPixels by default return value - let res = this.renderer.resolution; - return Math.round(value * res) / res } get container() { @@ -12336,7 +12341,7 @@ } } - /* global ThrowPropsPlugin */ + /* eslint-disable no-unused-vars */ class Ticks { get reservedPrefixes() { @@ -12730,6 +12735,7 @@ this.minZoom = 1; this.maxZoom = 12000; this.scroll = 0; + this.draggable = false; this.deltas = []; this.labelDates = []; this.colorRanges = []; @@ -13007,6 +13013,9 @@ return } this.scroll += delta.x; + if (this.draggable) { + this.y += delta.y; + } while (this.deltas.length > 10) { this.deltas.pop(0); } @@ -13022,7 +13031,6 @@ // let vel = ThrowPropsPlugin.getVelocity(this, 'delta') // ThrowPropsPlugin.untrack(this) // } - this.killTweens(); this.redraw(); let delta = 0; @@ -13035,7 +13043,6 @@ this.autoScroll = true; let anchor = interaction.current.mean(); this.keepInBounds(delta, anchor); - console.log("onEnd", delta); for (let key of interaction.ended.keys()) { if (interaction.isDoubleTap(key)) { this.onDoubleTap(event, interaction, key); diff --git a/doc/out/AbstractPopup.html b/doc/out/AbstractPopup.html index 871e50f..b7ce313 100644 --- a/doc/out/AbstractPopup.html +++ b/doc/out/AbstractPopup.html @@ -2918,7 +2918,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/Badge.html b/doc/out/Badge.html index fcce407..3bb36ce 100644 --- a/doc/out/Badge.html +++ b/doc/out/Badge.html @@ -2374,7 +2374,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/BlurFilter.html b/doc/out/BlurFilter.html index 811992e..73e8970 100644 --- a/doc/out/BlurFilter.html +++ b/doc/out/BlurFilter.html @@ -1798,7 +1798,7 @@ app.scene.filters = [blurFilter]
      diff --git a/doc/out/Button.html b/doc/out/Button.html index 525cd7f..bc7c972 100644 --- a/doc/out/Button.html +++ b/doc/out/Button.html @@ -3816,7 +3816,7 @@ the tint property of the icon sprite.

      diff --git a/doc/out/ButtonGroup.html b/doc/out/ButtonGroup.html index be3653d..cf54f43 100644 --- a/doc/out/ButtonGroup.html +++ b/doc/out/ButtonGroup.html @@ -3578,7 +3578,7 @@ app.scene.addChild(buttonGroup)
      diff --git a/doc/out/DeepZoomImage.html b/doc/out/DeepZoomImage.html index 2a0a463..0599ca7 100644 --- a/doc/out/DeepZoomImage.html +++ b/doc/out/DeepZoomImage.html @@ -5096,7 +5096,7 @@ i.e. after loading a single tile

      diff --git a/doc/out/DeepZoomInfo.html b/doc/out/DeepZoomInfo.html index 4a6dd09..57d0e00 100644 --- a/doc/out/DeepZoomInfo.html +++ b/doc/out/DeepZoomInfo.html @@ -2609,7 +2609,7 @@ on completion.

      diff --git a/doc/out/Flippable.html b/doc/out/Flippable.html index 468502b..0c78dac 100644 --- a/doc/out/Flippable.html +++ b/doc/out/Flippable.html @@ -2512,7 +2512,7 @@ front.on('click', event => flippable.toggle())
      diff --git a/doc/out/FontInfo.html b/doc/out/FontInfo.html index 5c11964..38cdc37 100644 --- a/doc/out/FontInfo.html +++ b/doc/out/FontInfo.html @@ -1559,7 +1559,7 @@
      diff --git a/doc/out/Hypenate.html b/doc/out/Hypenate.html index cad289f..39ea656 100644 --- a/doc/out/Hypenate.html +++ b/doc/out/Hypenate.html @@ -1761,7 +1761,7 @@
      diff --git a/doc/out/InteractivePopup.html b/doc/out/InteractivePopup.html index 9798e2f..0e0a6c4 100644 --- a/doc/out/InteractivePopup.html +++ b/doc/out/InteractivePopup.html @@ -2343,7 +2343,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/LabeledGraphics.exports.LabeledGraphics.html b/doc/out/LabeledGraphics.exports.LabeledGraphics.html index c2867b0..8451acc 100644 --- a/doc/out/LabeledGraphics.exports.LabeledGraphics.html +++ b/doc/out/LabeledGraphics.exports.LabeledGraphics.html @@ -1561,7 +1561,7 @@
      diff --git a/doc/out/LabeledGraphics.html b/doc/out/LabeledGraphics.html index 623e0ca..0ec4242 100644 --- a/doc/out/LabeledGraphics.html +++ b/doc/out/LabeledGraphics.html @@ -2626,7 +2626,7 @@ than wanted

      diff --git a/doc/out/List.html b/doc/out/List.html index d95b4eb..0370460 100644 --- a/doc/out/List.html +++ b/doc/out/List.html @@ -2585,7 +2585,7 @@ app.scene.addChild(list)
      diff --git a/doc/out/Message.html b/doc/out/Message.html index 1e0b9dd..b5c413c 100644 --- a/doc/out/Message.html +++ b/doc/out/Message.html @@ -2441,7 +2441,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/MessageInteractivePopup.html b/doc/out/MessageInteractivePopup.html index 9e01c35..6a132ef 100644 --- a/doc/out/MessageInteractivePopup.html +++ b/doc/out/MessageInteractivePopup.html @@ -1789,7 +1789,7 @@ like Popup, Message...

      diff --git a/doc/out/MessageMessageInteractivePopup.html b/doc/out/MessageMessageInteractivePopup.html index d439bd5..c93037f 100644 --- a/doc/out/MessageMessageInteractivePopup.html +++ b/doc/out/MessageMessageInteractivePopup.html @@ -1789,7 +1789,7 @@ like Popup, Message...

      diff --git a/doc/out/Modal.html b/doc/out/Modal.html index 4159322..53d4504 100644 --- a/doc/out/Modal.html +++ b/doc/out/Modal.html @@ -2342,7 +2342,7 @@ a string or a PIXI.Text object.

      diff --git a/doc/out/ModalInteractivePopup.html b/doc/out/ModalInteractivePopup.html index 43d90b6..e755e36 100644 --- a/doc/out/ModalInteractivePopup.html +++ b/doc/out/ModalInteractivePopup.html @@ -1789,7 +1789,7 @@ like Popup, Message...

      diff --git a/doc/out/ModalModalInteractivePopup.html b/doc/out/ModalModalInteractivePopup.html index 9a5a46a..66eac11 100644 --- a/doc/out/ModalModalInteractivePopup.html +++ b/doc/out/ModalModalInteractivePopup.html @@ -1789,7 +1789,7 @@ like Popup, Message...

      diff --git a/doc/out/PIXIApp.html b/doc/out/PIXIApp.html index 4fa348b..f6102ca 100644 --- a/doc/out/PIXIApp.html +++ b/doc/out/PIXIApp.html @@ -5743,7 +5743,7 @@ rejected with an error.
      diff --git a/doc/out/Popup.html b/doc/out/Popup.html index c385698..f7a3c35 100644 --- a/doc/out/Popup.html +++ b/doc/out/Popup.html @@ -2336,7 +2336,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/PopupInteractivePopup.html b/doc/out/PopupInteractivePopup.html index 68fcb58..8779b1e 100644 --- a/doc/out/PopupInteractivePopup.html +++ b/doc/out/PopupInteractivePopup.html @@ -1789,7 +1789,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenu.html b/doc/out/PopupMenu.html index 38e2b50..707ee85 100644 --- a/doc/out/PopupMenu.html +++ b/doc/out/PopupMenu.html @@ -2390,7 +2390,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/PopupMenuPopupInteractivePopup.html b/doc/out/PopupMenuPopupInteractivePopup.html index 35dfbc7..b82c8a6 100644 --- a/doc/out/PopupMenuPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupInteractivePopup.html @@ -1789,7 +1789,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html b/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html index 462c70b..a4f04c8 100644 --- a/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupMenuPopupInteractivePopup.html @@ -1789,7 +1789,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html b/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html index 0492b32..bc9c457 100644 --- a/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupMenuPopupPopupInteractivePopup.html @@ -1789,7 +1789,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupMenuPopupPopupInteractivePopup.html b/doc/out/PopupMenuPopupPopupInteractivePopup.html index ec7795a..dbf9dd8 100644 --- a/doc/out/PopupMenuPopupPopupInteractivePopup.html +++ b/doc/out/PopupMenuPopupPopupInteractivePopup.html @@ -1789,7 +1789,7 @@ like Popup, Message...

      diff --git a/doc/out/PopupPopupInteractivePopup.html b/doc/out/PopupPopupInteractivePopup.html index 429fae3..119702a 100644 --- a/doc/out/PopupPopupInteractivePopup.html +++ b/doc/out/PopupPopupInteractivePopup.html @@ -1789,7 +1789,7 @@ like Popup, Message...

      diff --git a/doc/out/Progress.html b/doc/out/Progress.html index 03ba6b7..d5b10e0 100644 --- a/doc/out/Progress.html +++ b/doc/out/Progress.html @@ -2875,7 +2875,7 @@ app.scene.addChild(progress)
      diff --git a/doc/out/Scrollview.html b/doc/out/Scrollview.html index 2b7714e..8862c40 100644 --- a/doc/out/Scrollview.html +++ b/doc/out/Scrollview.html @@ -1707,7 +1707,7 @@ app.loader
      diff --git a/doc/out/Slider.html b/doc/out/Slider.html index d16913c..ad8cdd0 100644 --- a/doc/out/Slider.html +++ b/doc/out/Slider.html @@ -2966,7 +2966,7 @@ app.scene.addChild(slider)
      diff --git a/doc/out/Switch.html b/doc/out/Switch.html index a95069a..b798b04 100644 --- a/doc/out/Switch.html +++ b/doc/out/Switch.html @@ -3396,7 +3396,7 @@ app.scene.addChild(switch1)
      diff --git a/doc/out/TextLabel.TextLabel.html b/doc/out/TextLabel.TextLabel.html index 88d1b74..884d5c9 100644 --- a/doc/out/TextLabel.TextLabel.html +++ b/doc/out/TextLabel.TextLabel.html @@ -1690,7 +1690,7 @@
      diff --git a/doc/out/Theme.html b/doc/out/Theme.html index 93e87e1..c824413 100644 --- a/doc/out/Theme.html +++ b/doc/out/Theme.html @@ -3165,7 +3165,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/ThemeDark.html b/doc/out/ThemeDark.html index 35ce86e..c49c5bf 100644 --- a/doc/out/ThemeDark.html +++ b/doc/out/ThemeDark.html @@ -1586,7 +1586,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/ThemeLight.html b/doc/out/ThemeLight.html index 2789c7d..d16c866 100644 --- a/doc/out/ThemeLight.html +++ b/doc/out/ThemeLight.html @@ -1598,7 +1598,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/ThemeRed.html b/doc/out/ThemeRed.html index e3351f2..50c6d00 100644 --- a/doc/out/ThemeRed.html +++ b/doc/out/ThemeRed.html @@ -1598,7 +1598,7 @@ const app = new PIXIApp({
      diff --git a/doc/out/TileQuadNode.html b/doc/out/TileQuadNode.html index 6e33f21..a3551e8 100644 --- a/doc/out/TileQuadNode.html +++ b/doc/out/TileQuadNode.html @@ -2050,7 +2050,7 @@ an indicator of tiles to free.

      diff --git a/doc/out/Tooltip.html b/doc/out/Tooltip.html index b7ee308..d0e7429 100644 --- a/doc/out/Tooltip.html +++ b/doc/out/Tooltip.html @@ -2512,7 +2512,7 @@ a string, a number or a PIXI.Text object.

      diff --git a/doc/out/UITest.html b/doc/out/UITest.html index ead6eb8..38b4782 100644 --- a/doc/out/UITest.html +++ b/doc/out/UITest.html @@ -4183,7 +4183,7 @@ test.start()
      diff --git a/doc/out/Volatile.html b/doc/out/Volatile.html index c8e52dd..a9cf73c 100644 --- a/doc/out/Volatile.html +++ b/doc/out/Volatile.html @@ -2099,7 +2099,7 @@ app.scene.addChild(button)
      diff --git a/doc/out/global.html b/doc/out/global.html index ff8f547..71da6ac 100644 --- a/doc/out/global.html +++ b/doc/out/global.html @@ -3320,7 +3320,7 @@
      diff --git a/doc/out/index.html b/doc/out/index.html index 4d9f41a..817bb14 100644 --- a/doc/out/index.html +++ b/doc/out/index.html @@ -1485,7 +1485,7 @@
      diff --git a/doc/out/pixi_abstractpopup.js.html b/doc/out/pixi_abstractpopup.js.html index e6a4305..f5739e7 100644 --- a/doc/out/pixi_abstractpopup.js.html +++ b/doc/out/pixi_abstractpopup.js.html @@ -1808,7 +1808,7 @@ export default class AbstractPopup extends PIXI.Graphics {
      diff --git a/doc/out/pixi_app.js.html b/doc/out/pixi_app.js.html index 8646985..b22da33 100644 --- a/doc/out/pixi_app.js.html +++ b/doc/out/pixi_app.js.html @@ -2189,7 +2189,7 @@ class FpsDisplay extends PIXI.Graphics {
      diff --git a/doc/out/pixi_badge.js.html b/doc/out/pixi_badge.js.html index c6153d3..7e40f6f 100644 --- a/doc/out/pixi_badge.js.html +++ b/doc/out/pixi_badge.js.html @@ -1569,7 +1569,7 @@ export default class Badge extends AbstractPopup {
      diff --git a/doc/out/pixi_blurfilter.js.html b/doc/out/pixi_blurfilter.js.html index 4f19944..591471d 100644 --- a/doc/out/pixi_blurfilter.js.html +++ b/doc/out/pixi_blurfilter.js.html @@ -1727,7 +1727,7 @@ class TiltShiftYFilter extends TiltShiftAxisFilter {
      diff --git a/doc/out/pixi_button.js.html b/doc/out/pixi_button.js.html index ab03e23..d3fdc1f 100644 --- a/doc/out/pixi_button.js.html +++ b/doc/out/pixi_button.js.html @@ -1882,8 +1882,8 @@ export default class Button extends PIXI.Container { //-------------------- if (this.badge) { this.removeChild(this.badge) - const width = this.width - const height = this.height + const width = this._width + const height = this._height this.addChild(this.badge) const badge = this.badge @@ -2171,7 +2171,7 @@ export default class Button extends PIXI.Container {
      diff --git a/doc/out/pixi_buttongroup.js.html b/doc/out/pixi_buttongroup.js.html index e237973..59225e8 100644 --- a/doc/out/pixi_buttongroup.js.html +++ b/doc/out/pixi_buttongroup.js.html @@ -2174,7 +2174,7 @@ export default class ButtonGroup extends PIXI.Container {
      diff --git a/doc/out/pixi_deepzoom_image.js.html b/doc/out/pixi_deepzoom_image.js.html index 9fbfa9b..0f52010 100644 --- a/doc/out/pixi_deepzoom_image.js.html +++ b/doc/out/pixi_deepzoom_image.js.html @@ -2512,7 +2512,7 @@ export class DeepZoomImage extends PIXI.Container {
      diff --git a/doc/out/pixi_flippable.js.html b/doc/out/pixi_flippable.js.html index 3c24122..74a8d5c 100644 --- a/doc/out/pixi_flippable.js.html +++ b/doc/out/pixi_flippable.js.html @@ -1906,7 +1906,7 @@ export default class Flippable extends PIXI.projection.Camera3d {
      diff --git a/doc/out/pixi_labeledgraphics.js.html b/doc/out/pixi_labeledgraphics.js.html index 988fa8d..a272b7e 100644 --- a/doc/out/pixi_labeledgraphics.js.html +++ b/doc/out/pixi_labeledgraphics.js.html @@ -1855,7 +1855,7 @@ export class BitmapLabeledGraphics extends LabeledGraphics {
      diff --git a/doc/out/pixi_list.js.html b/doc/out/pixi_list.js.html index a3db605..7759be4 100644 --- a/doc/out/pixi_list.js.html +++ b/doc/out/pixi_list.js.html @@ -1834,7 +1834,7 @@ export default class List extends PIXI.Container {
      diff --git a/doc/out/pixi_message.js.html b/doc/out/pixi_message.js.html index 01f8a7a..6371178 100644 --- a/doc/out/pixi_message.js.html +++ b/doc/out/pixi_message.js.html @@ -1583,7 +1583,7 @@ export default class Message extends InteractivePopup {
      diff --git a/doc/out/pixi_modal.js.html b/doc/out/pixi_modal.js.html index d715c1b..5dc074f 100644 --- a/doc/out/pixi_modal.js.html +++ b/doc/out/pixi_modal.js.html @@ -1664,7 +1664,7 @@ export default class Modal extends PIXI.Container {
      diff --git a/doc/out/pixi_popup.js.html b/doc/out/pixi_popup.js.html index 344c2a7..b6c9956 100644 --- a/doc/out/pixi_popup.js.html +++ b/doc/out/pixi_popup.js.html @@ -1674,7 +1674,7 @@ export default class Popup extends InteractivePopup {
      diff --git a/doc/out/pixi_popupmenu.js.html b/doc/out/pixi_popupmenu.js.html index 58ecc4e..880aecb 100644 --- a/doc/out/pixi_popupmenu.js.html +++ b/doc/out/pixi_popupmenu.js.html @@ -1577,7 +1577,7 @@ export default class PopupMenu extends Popup {
      diff --git a/doc/out/pixi_progress.js.html b/doc/out/pixi_progress.js.html index f0da032..b5a4310 100644 --- a/doc/out/pixi_progress.js.html +++ b/doc/out/pixi_progress.js.html @@ -1759,7 +1759,7 @@ export default class Progress extends PIXI.Container {
      diff --git a/doc/out/pixi_scrollview.js.html b/doc/out/pixi_scrollview.js.html index affaa5b..fd005ad 100644 --- a/doc/out/pixi_scrollview.js.html +++ b/doc/out/pixi_scrollview.js.html @@ -1518,7 +1518,7 @@ export default class Scrollview extends Scrollbox {
      diff --git a/doc/out/pixi_slider.js.html b/doc/out/pixi_slider.js.html index addc267..6a7e2be 100644 --- a/doc/out/pixi_slider.js.html +++ b/doc/out/pixi_slider.js.html @@ -1923,7 +1923,7 @@ export default class Slider extends PIXI.Container {
      diff --git a/doc/out/pixi_switch.js.html b/doc/out/pixi_switch.js.html index 9b1cf54..157d208 100644 --- a/doc/out/pixi_switch.js.html +++ b/doc/out/pixi_switch.js.html @@ -1977,7 +1977,7 @@ export default class Switch extends PIXI.Container {
      diff --git a/doc/out/pixi_theme.js.html b/doc/out/pixi_theme.js.html index 35a531a..dc1ed85 100644 --- a/doc/out/pixi_theme.js.html +++ b/doc/out/pixi_theme.js.html @@ -1718,7 +1718,7 @@ export class ThemeRed extends Theme {
      diff --git a/doc/out/pixi_tooltip.js.html b/doc/out/pixi_tooltip.js.html index a310d8c..f680371 100644 --- a/doc/out/pixi_tooltip.js.html +++ b/doc/out/pixi_tooltip.js.html @@ -1611,7 +1611,7 @@ export default class Tooltip extends AbstractPopup {
      diff --git a/doc/out/pixi_volatile.js.html b/doc/out/pixi_volatile.js.html index 6595e4f..8dcbacc 100644 --- a/doc/out/pixi_volatile.js.html +++ b/doc/out/pixi_volatile.js.html @@ -1615,7 +1615,7 @@ export default class Volatile {
      diff --git a/doc/out/uitest.js.html b/doc/out/uitest.js.html index b40d559..ff1b09f 100644 --- a/doc/out/uitest.js.html +++ b/doc/out/uitest.js.html @@ -2466,7 +2466,7 @@ class Event {
      diff --git a/lib/pixi/button.js b/lib/pixi/button.js index 4af4be0..00e3ecb 100644 --- a/lib/pixi/button.js +++ b/lib/pixi/button.js @@ -436,8 +436,8 @@ export default class Button extends PIXI.Container { //-------------------- if (this.badge) { this.removeChild(this.badge) - const width = this.width - const height = this.height + const width = this._width + const height = this._height this.addChild(this.badge) const badge = this.badge diff --git a/lib/pixi/buttongroup.js b/lib/pixi/buttongroup.js index f312e4a..6ec72ad 100644 --- a/lib/pixi/buttongroup.js +++ b/lib/pixi/buttongroup.js @@ -514,7 +514,7 @@ export default class ButtonGroup extends PIXI.Container { // stack! const distanceToTop = this.container.y const distanceToBottom = this.opts.maxHeight - this.container.y - this.__initHeight - + if (distanceToTop > 0) { throwProps.y.end = 0 } else if (distanceToBottom > 0) { From 53654349b5be1b552cb533452605e9ccdd5119b2 Mon Sep 17 00:00:00 2001 From: Sebastian Kupke Date: Fri, 9 Aug 2019 10:27:08 +0200 Subject: [PATCH 28/30] Changed prettier printWidth in build script. --- gulpfile.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gulpfile.js b/gulpfile.js index f093541..0e6466b 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -61,7 +61,8 @@ function prettify() { singleQuote: true, jsxSingleQuote: true, tabWidth: 4, - semi: false + semi: false, + printWidth: 120 }) ) .pipe(dest('./lib')) From 74b5d69389627a5f4865b3533941433d95735f1c Mon Sep 17 00:00:00 2001 From: Sebastian Kupke Date: Mon, 12 Aug 2019 12:16:05 +0200 Subject: [PATCH 29/30] Added EventListener test. --- package.json | 1 + test/chart/Chart.min.js | 7 ++ test/chart/data.js | 75 ++++++++++++++ test/chart/index.html | 97 +++++++++++++++++ test/tests/eventlistener/index.html | 85 +++++++++++++++ test/tests/eventlistener/index.js | 155 ++++++++++++++++++++++++++++ 6 files changed, 420 insertions(+) create mode 100644 test/chart/Chart.min.js create mode 100644 test/chart/data.js create mode 100644 test/chart/index.html create mode 100644 test/tests/eventlistener/index.html create mode 100644 test/tests/eventlistener/index.js diff --git a/package.json b/package.json index ece34d8..0b4eb3b 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ }, "scripts": { "test": "node bin/testrunner.js", + "test-eventlistener": "node ./test/tests/eventlistener/index.js", "build": "rollup --config ./rollup.config.js", "watch": "rollup --watch --config ./rollup.config.js", "3rdparty": "gulp", diff --git a/test/chart/Chart.min.js b/test/chart/Chart.min.js new file mode 100644 index 0000000..c74a791 --- /dev/null +++ b/test/chart/Chart.min.js @@ -0,0 +1,7 @@ +/*! + * Chart.js v2.8.0 + * https://www.chartjs.org + * (c) 2019 Chart.js Contributors + * Released under the MIT License + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(function(){try{return require("moment")}catch(t){}}()):"function"==typeof define&&define.amd?define(["require"],function(t){return e(function(){try{return t("moment")}catch(t){}}())}):t.Chart=e(t.moment)}(this,function(t){"use strict";t=t&&t.hasOwnProperty("default")?t.default:t;var e={rgb2hsl:i,rgb2hsv:n,rgb2hwb:a,rgb2cmyk:o,rgb2keyword:s,rgb2xyz:l,rgb2lab:d,rgb2lch:function(t){return x(d(t))},hsl2rgb:u,hsl2hsv:function(t){var e=t[0],i=t[1]/100,n=t[2]/100;if(0===n)return[0,0,0];return[e,100*(2*(i*=(n*=2)<=1?n:2-n)/(n+i)),100*((n+i)/2)]},hsl2hwb:function(t){return a(u(t))},hsl2cmyk:function(t){return o(u(t))},hsl2keyword:function(t){return s(u(t))},hsv2rgb:h,hsv2hsl:function(t){var e,i,n=t[0],a=t[1]/100,o=t[2]/100;return e=a*o,[n,100*(e=(e/=(i=(2-a)*o)<=1?i:2-i)||0),100*(i/=2)]},hsv2hwb:function(t){return a(h(t))},hsv2cmyk:function(t){return o(h(t))},hsv2keyword:function(t){return s(h(t))},hwb2rgb:c,hwb2hsl:function(t){return i(c(t))},hwb2hsv:function(t){return n(c(t))},hwb2cmyk:function(t){return o(c(t))},hwb2keyword:function(t){return s(c(t))},cmyk2rgb:f,cmyk2hsl:function(t){return i(f(t))},cmyk2hsv:function(t){return n(f(t))},cmyk2hwb:function(t){return a(f(t))},cmyk2keyword:function(t){return s(f(t))},keyword2rgb:w,keyword2hsl:function(t){return i(w(t))},keyword2hsv:function(t){return n(w(t))},keyword2hwb:function(t){return a(w(t))},keyword2cmyk:function(t){return o(w(t))},keyword2lab:function(t){return d(w(t))},keyword2xyz:function(t){return l(w(t))},xyz2rgb:p,xyz2lab:m,xyz2lch:function(t){return x(m(t))},lab2xyz:v,lab2rgb:y,lab2lch:x,lch2lab:k,lch2xyz:function(t){return v(k(t))},lch2rgb:function(t){return y(k(t))}};function i(t){var e,i,n=t[0]/255,a=t[1]/255,o=t[2]/255,r=Math.min(n,a,o),s=Math.max(n,a,o),l=s-r;return s==r?e=0:n==s?e=(a-o)/l:a==s?e=2+(o-n)/l:o==s&&(e=4+(n-a)/l),(e=Math.min(60*e,360))<0&&(e+=360),i=(r+s)/2,[e,100*(s==r?0:i<=.5?l/(s+r):l/(2-s-r)),100*i]}function n(t){var e,i,n=t[0],a=t[1],o=t[2],r=Math.min(n,a,o),s=Math.max(n,a,o),l=s-r;return i=0==s?0:l/s*1e3/10,s==r?e=0:n==s?e=(a-o)/l:a==s?e=2+(o-n)/l:o==s&&(e=4+(n-a)/l),(e=Math.min(60*e,360))<0&&(e+=360),[e,i,s/255*1e3/10]}function a(t){var e=t[0],n=t[1],a=t[2];return[i(t)[0],100*(1/255*Math.min(e,Math.min(n,a))),100*(a=1-1/255*Math.max(e,Math.max(n,a)))]}function o(t){var e,i=t[0]/255,n=t[1]/255,a=t[2]/255;return[100*((1-i-(e=Math.min(1-i,1-n,1-a)))/(1-e)||0),100*((1-n-e)/(1-e)||0),100*((1-a-e)/(1-e)||0),100*e]}function s(t){return _[JSON.stringify(t)]}function l(t){var e=t[0]/255,i=t[1]/255,n=t[2]/255;return[100*(.4124*(e=e>.04045?Math.pow((e+.055)/1.055,2.4):e/12.92)+.3576*(i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92)+.1805*(n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92)),100*(.2126*e+.7152*i+.0722*n),100*(.0193*e+.1192*i+.9505*n)]}function d(t){var e=l(t),i=e[0],n=e[1],a=e[2];return n/=100,a/=108.883,i=(i/=95.047)>.008856?Math.pow(i,1/3):7.787*i+16/116,[116*(n=n>.008856?Math.pow(n,1/3):7.787*n+16/116)-16,500*(i-n),200*(n-(a=a>.008856?Math.pow(a,1/3):7.787*a+16/116))]}function u(t){var e,i,n,a,o,r=t[0]/360,s=t[1]/100,l=t[2]/100;if(0==s)return[o=255*l,o,o];e=2*l-(i=l<.5?l*(1+s):l+s-l*s),a=[0,0,0];for(var d=0;d<3;d++)(n=r+1/3*-(d-1))<0&&n++,n>1&&n--,o=6*n<1?e+6*(i-e)*n:2*n<1?i:3*n<2?e+(i-e)*(2/3-n)*6:e,a[d]=255*o;return a}function h(t){var e=t[0]/60,i=t[1]/100,n=t[2]/100,a=Math.floor(e)%6,o=e-Math.floor(e),r=255*n*(1-i),s=255*n*(1-i*o),l=255*n*(1-i*(1-o));n*=255;switch(a){case 0:return[n,l,r];case 1:return[s,n,r];case 2:return[r,n,l];case 3:return[r,s,n];case 4:return[l,r,n];case 5:return[n,r,s]}}function c(t){var e,i,n,a,o=t[0]/360,s=t[1]/100,l=t[2]/100,d=s+l;switch(d>1&&(s/=d,l/=d),n=6*o-(e=Math.floor(6*o)),0!=(1&e)&&(n=1-n),a=s+n*((i=1-l)-s),e){default:case 6:case 0:r=i,g=a,b=s;break;case 1:r=a,g=i,b=s;break;case 2:r=s,g=i,b=a;break;case 3:r=s,g=a,b=i;break;case 4:r=a,g=s,b=i;break;case 5:r=i,g=s,b=a}return[255*r,255*g,255*b]}function f(t){var e=t[0]/100,i=t[1]/100,n=t[2]/100,a=t[3]/100;return[255*(1-Math.min(1,e*(1-a)+a)),255*(1-Math.min(1,i*(1-a)+a)),255*(1-Math.min(1,n*(1-a)+a))]}function p(t){var e,i,n,a=t[0]/100,o=t[1]/100,r=t[2]/100;return i=-.9689*a+1.8758*o+.0415*r,n=.0557*a+-.204*o+1.057*r,e=(e=3.2406*a+-1.5372*o+-.4986*r)>.0031308?1.055*Math.pow(e,1/2.4)-.055:e*=12.92,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:i*=12.92,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:n*=12.92,[255*(e=Math.min(Math.max(0,e),1)),255*(i=Math.min(Math.max(0,i),1)),255*(n=Math.min(Math.max(0,n),1))]}function m(t){var e=t[0],i=t[1],n=t[2];return i/=100,n/=108.883,e=(e/=95.047)>.008856?Math.pow(e,1/3):7.787*e+16/116,[116*(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116)-16,500*(e-i),200*(i-(n=n>.008856?Math.pow(n,1/3):7.787*n+16/116))]}function v(t){var e,i,n,a,o=t[0],r=t[1],s=t[2];return o<=8?a=(i=100*o/903.3)/100*7.787+16/116:(i=100*Math.pow((o+16)/116,3),a=Math.pow(i/100,1/3)),[e=e/95.047<=.008856?e=95.047*(r/500+a-16/116)/7.787:95.047*Math.pow(r/500+a,3),i,n=n/108.883<=.008859?n=108.883*(a-s/200-16/116)/7.787:108.883*Math.pow(a-s/200,3)]}function x(t){var e,i=t[0],n=t[1],a=t[2];return(e=360*Math.atan2(a,n)/2/Math.PI)<0&&(e+=360),[i,Math.sqrt(n*n+a*a),e]}function y(t){return p(v(t))}function k(t){var e,i=t[0],n=t[1];return e=t[2]/360*2*Math.PI,[i,n*Math.cos(e),n*Math.sin(e)]}function w(t){return M[t]}var M={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},_={};for(var C in M)_[JSON.stringify(M[C])]=C;var S=function(){return new T};for(var P in e){S[P+"Raw"]=function(t){return function(i){return"number"==typeof i&&(i=Array.prototype.slice.call(arguments)),e[t](i)}}(P);var I=/(\w+)2(\w+)/.exec(P),A=I[1],D=I[2];(S[A]=S[A]||{})[D]=S[P]=function(t){return function(i){"number"==typeof i&&(i=Array.prototype.slice.call(arguments));var n=e[t](i);if("string"==typeof n||void 0===n)return n;for(var a=0;a=0&&e<1?H(Math.round(255*e)):"")},rgbString:function(t,e){if(e<1||t[3]&&t[3]<1)return N(t,e);return"rgb("+t[0]+", "+t[1]+", "+t[2]+")"},rgbaString:N,percentString:function(t,e){if(e<1||t[3]&&t[3]<1)return W(t,e);var i=Math.round(t[0]/255*100),n=Math.round(t[1]/255*100),a=Math.round(t[2]/255*100);return"rgb("+i+"%, "+n+"%, "+a+"%)"},percentaString:W,hslString:function(t,e){if(e<1||t[3]&&t[3]<1)return V(t,e);return"hsl("+t[0]+", "+t[1]+"%, "+t[2]+"%)"},hslaString:V,hwbString:function(t,e){void 0===e&&(e=void 0!==t[3]?t[3]:1);return"hwb("+t[0]+", "+t[1]+"%, "+t[2]+"%"+(void 0!==e&&1!==e?", "+e:"")+")"},keyword:function(t){return j[t.slice(0,3)]}};function O(t){if(t){var e=[0,0,0],i=1,n=t.match(/^#([a-fA-F0-9]{3,4})$/i),a="";if(n){a=(n=n[1])[3];for(var o=0;oi?(e+.05)/(i+.05):(i+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb;return(299*t[0]+587*t[1]+114*t[2])/1e3<128},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;e<3;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,i=(e[0]+t)%360;return e[0]=i<0?360+i:i,this.setValues("hsl",e),this},mix:function(t,e){var i=t,n=void 0===e?.5:e,a=2*n-1,o=this.alpha()-i.alpha(),r=((a*o==-1?a:(a+o)/(1+a*o))+1)/2,s=1-r;return this.rgb(r*this.red()+s*i.red(),r*this.green()+s*i.green(),r*this.blue()+s*i.blue()).alpha(this.alpha()*n+i.alpha()*(1-n))},toJSON:function(){return this.rgb()},clone:function(){var t,e,i=new Y,n=this.values,a=i.values;for(var o in n)n.hasOwnProperty(o)&&(t=n[o],"[object Array]"===(e={}.toString.call(t))?a[o]=t.slice(0):"[object Number]"===e?a[o]=t:console.error("unexpected color value:",t));return i}},Y.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},Y.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},Y.prototype.getValues=function(t){for(var e=this.values,i={},n=0;n=0;a--)e.call(i,t[a],a);else for(a=0;a=1?t:-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-(t-=1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,i=0,n=1;return 0===t?0:1===t?1:(i||(i=.3),n<1?(n=1,e=i/4):e=i/(2*Math.PI)*Math.asin(1/n),-n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i))},easeOutElastic:function(t){var e=1.70158,i=0,n=1;return 0===t?0:1===t?1:(i||(i=.3),n<1?(n=1,e=i/4):e=i/(2*Math.PI)*Math.asin(1/n),n*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/i)+1)},easeInOutElastic:function(t){var e=1.70158,i=0,n=1;return 0===t?0:2==(t/=.5)?1:(i||(i=.45),n<1?(n=1,e=i/4):e=i/(2*Math.PI)*Math.asin(1/n),t<1?n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*-.5:n*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*.5+1)},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:function(t){return 1-Z.easeOutBounce(1-t)},easeOutBounce:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},easeInOutBounce:function(t){return t<.5?.5*Z.easeInBounce(2*t):.5*Z.easeOutBounce(2*t-1)+.5}},$={effects:Z};G.easingEffects=Z;var J=Math.PI,Q=J/180,tt=2*J,et=J/2,it=J/4,nt=2*J/3,at={clear:function(t){t.ctx.clearRect(0,0,t.width,t.height)},roundedRect:function(t,e,i,n,a,o){if(o){var r=Math.min(o,a/2,n/2),s=e+r,l=i+r,d=e+n-r,u=i+a-r;t.moveTo(e,l),se.left-1e-6&&t.xe.top-1e-6&&t.y0&&this.requestAnimationFrame()},advance:function(){for(var t,e,i,n,a=this.animations,o=0;o=i?(ut.callback(t.onAnimationComplete,[t],e),e.animating=!1,a.splice(o,1)):++o}},xt=ut.options.resolve,yt=["push","pop","shift","splice","unshift"];function kt(t,e){var i=t._chartjs;if(i){var n=i.listeners,a=n.indexOf(e);-1!==a&&n.splice(a,1),n.length>0||(yt.forEach(function(e){delete t[e]}),delete t._chartjs)}}var wt=function(t,e){this.initialize(t,e)};ut.extend(wt.prototype,{datasetElementType:null,dataElementType:null,initialize:function(t,e){this.chart=t,this.index=e,this.linkScales(),this.addElements()},updateIndex:function(t){this.index=t},linkScales:function(){var t=this,e=t.getMeta(),i=t.getDataset();null!==e.xAxisID&&e.xAxisID in t.chart.scales||(e.xAxisID=i.xAxisID||t.chart.options.scales.xAxes[0].id),null!==e.yAxisID&&e.yAxisID in t.chart.scales||(e.yAxisID=i.yAxisID||t.chart.options.scales.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},_getValueScaleId:function(){return this.getMeta().yAxisID},_getIndexScaleId:function(){return this.getMeta().xAxisID},_getValueScale:function(){return this.getScaleForId(this._getValueScaleId())},_getIndexScale:function(){return this.getScaleForId(this._getIndexScaleId())},reset:function(){this.update(!0)},destroy:function(){this._data&&kt(this._data,this)},createMetaDataset:function(){var t=this.datasetElementType;return t&&new t({_chart:this.chart,_datasetIndex:this.index})},createMetaData:function(t){var e=this.dataElementType;return e&&new e({_chart:this.chart,_datasetIndex:this.index,_index:t})},addElements:function(){var t,e,i=this.getMeta(),n=this.getDataset().data||[],a=i.data;for(t=0,e=n.length;ti&&this.insertElements(i,n-i)},insertElements:function(t,e){for(var i=0;is;)a-=2*Math.PI;for(;a=r&&a<=s,d=o>=i.innerRadius&&o<=i.outerRadius;return l&&d}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,i=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*i,y:t.y+Math.sin(e)*i}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,i=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*i,y:t.y+Math.sin(e)*i}},draw:function(){var t,e=this._chart.ctx,i=this._view,n=i.startAngle,a=i.endAngle,o="inner"===i.borderAlign?.33:0;e.save(),e.beginPath(),e.arc(i.x,i.y,Math.max(i.outerRadius-o,0),n,a),e.arc(i.x,i.y,i.innerRadius,a,n,!0),e.closePath(),e.fillStyle=i.backgroundColor,e.fill(),i.borderWidth&&("inner"===i.borderAlign?(e.beginPath(),t=o/i.outerRadius,e.arc(i.x,i.y,i.outerRadius,n-t,a+t),i.innerRadius>o?(t=o/i.innerRadius,e.arc(i.x,i.y,i.innerRadius-o,a+t,n-t,!0)):e.arc(i.x,i.y,o,a+Math.PI/2,n-Math.PI/2),e.closePath(),e.clip(),e.beginPath(),e.arc(i.x,i.y,i.outerRadius,n,a),e.arc(i.x,i.y,i.innerRadius,a,n,!0),e.closePath(),e.lineWidth=2*i.borderWidth,e.lineJoin="round"):(e.lineWidth=i.borderWidth,e.lineJoin="bevel"),e.strokeStyle=i.borderColor,e.stroke()),e.restore()}}),Ct=ut.valueOrDefault,St=st.global.defaultColor;st._set("global",{elements:{line:{tension:.4,backgroundColor:St,borderWidth:3,borderColor:St,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0}}});var Pt=pt.extend({draw:function(){var t,e,i,n,a=this._view,o=this._chart.ctx,r=a.spanGaps,s=this._children.slice(),l=st.global,d=l.elements.line,u=-1;for(this._loop&&s.length&&s.push(s[0]),o.save(),o.lineCap=a.borderCapStyle||d.borderCapStyle,o.setLineDash&&o.setLineDash(a.borderDash||d.borderDash),o.lineDashOffset=Ct(a.borderDashOffset,d.borderDashOffset),o.lineJoin=a.borderJoinStyle||d.borderJoinStyle,o.lineWidth=Ct(a.borderWidth,d.borderWidth),o.strokeStyle=a.borderColor||l.defaultColor,o.beginPath(),u=-1,t=0;tt.x&&(e=Ot(e,"left","right")):t.basei?i:n,r:l.right||a<0?0:a>e?e:a,b:l.bottom||o<0?0:o>i?i:o,l:l.left||r<0?0:r>e?e:r}}function Bt(t,e,i){var n=null===e,a=null===i,o=!(!t||n&&a)&&Rt(t);return o&&(n||e>=o.left&&e<=o.right)&&(a||i>=o.top&&i<=o.bottom)}st._set("global",{elements:{rectangle:{backgroundColor:Ft,borderColor:Ft,borderSkipped:"bottom",borderWidth:0}}});var Nt=pt.extend({draw:function(){var t=this._chart.ctx,e=this._view,i=function(t){var e=Rt(t),i=e.right-e.left,n=e.bottom-e.top,a=zt(t,i/2,n/2);return{outer:{x:e.left,y:e.top,w:i,h:n},inner:{x:e.left+a.l,y:e.top+a.t,w:i-a.l-a.r,h:n-a.t-a.b}}}(e),n=i.outer,a=i.inner;t.fillStyle=e.backgroundColor,t.fillRect(n.x,n.y,n.w,n.h),n.w===a.w&&n.h===a.h||(t.save(),t.beginPath(),t.rect(n.x,n.y,n.w,n.h),t.clip(),t.fillStyle=e.borderColor,t.rect(a.x,a.y,a.w,a.h),t.fill("evenodd"),t.restore())},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){return Bt(this._view,t,e)},inLabelRange:function(t,e){var i=this._view;return Lt(i)?Bt(i,t,null):Bt(i,null,e)},inXRange:function(t){return Bt(this._view,t,null)},inYRange:function(t){return Bt(this._view,null,t)},getCenterPoint:function(){var t,e,i=this._view;return Lt(i)?(t=i.x,e=(i.y+i.base)/2):(t=(i.x+i.base)/2,e=i.y),{x:t,y:e}},getArea:function(){var t=this._view;return Lt(t)?t.width*Math.abs(t.y-t.base):t.height*Math.abs(t.x-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}}),Wt={},Vt=_t,Et=Pt,Ht=Tt,jt=Nt;Wt.Arc=Vt,Wt.Line=Et,Wt.Point=Ht,Wt.Rectangle=jt;var qt=ut.options.resolve;st._set("bar",{hover:{mode:"label"},scales:{xAxes:[{type:"category",categoryPercentage:.8,barPercentage:.9,offset:!0,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}});var Yt=Mt.extend({dataElementType:Wt.Rectangle,initialize:function(){var t;Mt.prototype.initialize.apply(this,arguments),(t=this.getMeta()).stack=this.getDataset().stack,t.bar=!0},update:function(t){var e,i,n=this.getMeta().data;for(this._ruler=this.getRuler(),e=0,i=n.length;e0?Math.min(r,n-i):r,i=n;return r}(i,l):-1,pixels:l,start:r,end:s,stackCount:n,scale:i}},calculateBarValuePixels:function(t,e){var i,n,a,o,r,s,l=this.chart,d=this.getMeta(),u=this._getValueScale(),h=u.isHorizontal(),c=l.data.datasets,f=+u.getRightValue(c[t].data[e]),g=u.options.minBarLength,p=u.options.stacked,m=d.stack,v=0;if(p||void 0===p&&void 0!==m)for(i=0;i=0&&a>0)&&(v+=a));return o=u.getPixelForValue(v),s=(r=u.getPixelForValue(v+f))-o,void 0!==g&&Math.abs(s)=0&&!h||f<0&&h?o-g:o+g),{size:s,base:o,head:r,center:r+s/2}},calculateBarIndexPixels:function(t,e,i){var n=i.scale.options,a="flex"===n.barThickness?function(t,e,i){var n,a=e.pixels,o=a[t],r=t>0?a[t-1]:null,s=t');var i=t.data,n=i.datasets,a=i.labels;if(n.length)for(var o=0;o'),a[o]&&e.push(a[o]),e.push("");return e.push("
    "),e.join("")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(i,n){var a=t.getDatasetMeta(0),o=e.datasets[0],r=a.data[n],s=r&&r.custom||{},l=t.options.elements.arc;return{text:i,fillStyle:Gt([s.backgroundColor,o.backgroundColor,l.backgroundColor],void 0,n),strokeStyle:Gt([s.borderColor,o.borderColor,l.borderColor],void 0,n),lineWidth:Gt([s.borderWidth,o.borderWidth,l.borderWidth],void 0,n),hidden:isNaN(o.data[n])||a.data[n].hidden,index:n}}):[]}},onClick:function(t,e){var i,n,a,o=e.index,r=this.chart;for(i=0,n=(r.data.datasets||[]).length;i=Math.PI?-1:m<-Math.PI?1:0))+g,b={x:Math.cos(m),y:Math.sin(m)},x={x:Math.cos(v),y:Math.sin(v)},y=m<=0&&v>=0||m<=2*Math.PI&&2*Math.PI<=v,k=m<=.5*Math.PI&&.5*Math.PI<=v||m<=2.5*Math.PI&&2.5*Math.PI<=v,w=m<=-Math.PI&&-Math.PI<=v||m<=Math.PI&&Math.PI<=v,M=m<=.5*-Math.PI&&.5*-Math.PI<=v||m<=1.5*Math.PI&&1.5*Math.PI<=v,_=f/100,C={x:w?-1:Math.min(b.x*(b.x<0?1:_),x.x*(x.x<0?1:_)),y:M?-1:Math.min(b.y*(b.y<0?1:_),x.y*(x.y<0?1:_))},S={x:y?1:Math.max(b.x*(b.x>0?1:_),x.x*(x.x>0?1:_)),y:k?1:Math.max(b.y*(b.y>0?1:_),x.y*(x.y>0?1:_))},P={width:.5*(S.x-C.x),height:.5*(S.y-C.y)};d=Math.min(s/P.width,l/P.height),u={x:-.5*(S.x+C.x),y:-.5*(S.y+C.y)}}for(e=0,i=c.length;e0&&!isNaN(t)?2*Math.PI*(Math.abs(t)/e):0},getMaxBorderWidth:function(t){var e,i,n,a,o,r,s,l,d=0,u=this.chart;if(!t)for(e=0,i=u.data.datasets.length;e(d=s>d?s:d)?l:d);return d},setHoverStyle:function(t){var e=t._model,i=t._options,n=ut.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth},e.backgroundColor=Zt(i.hoverBackgroundColor,n(i.backgroundColor)),e.borderColor=Zt(i.hoverBorderColor,n(i.borderColor)),e.borderWidth=Zt(i.hoverBorderWidth,i.borderWidth)},_resolveElementOptions:function(t,e){var i,n,a,o=this.chart,r=this.getDataset(),s=t.custom||{},l=o.options.elements.arc,d={},u={chart:o,dataIndex:e,dataset:r,datasetIndex:this.index},h=["backgroundColor","borderColor","borderWidth","borderAlign","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth"];for(i=0,n=h.length;i0&&ee(l[t-1]._model,s)&&(i.controlPointPreviousX=d(i.controlPointPreviousX,s.left,s.right),i.controlPointPreviousY=d(i.controlPointPreviousY,s.top,s.bottom)),t');var i=t.data,n=i.datasets,a=i.labels;if(n.length)for(var o=0;o'),a[o]&&e.push(a[o]),e.push("");return e.push(""),e.join("")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(i,n){var a=t.getDatasetMeta(0),o=e.datasets[0],r=a.data[n].custom||{},s=t.options.elements.arc;return{text:i,fillStyle:ae([r.backgroundColor,o.backgroundColor,s.backgroundColor],void 0,n),strokeStyle:ae([r.borderColor,o.borderColor,s.borderColor],void 0,n),lineWidth:ae([r.borderWidth,o.borderWidth,s.borderWidth],void 0,n),hidden:isNaN(o.data[n])||a.data[n].hidden,index:n}}):[]}},onClick:function(t,e){var i,n,a,o=e.index,r=this.chart;for(i=0,n=(r.data.datasets||[]).length;i0&&(o=t.getDatasetMeta(o[0]._datasetIndex).data),o},"x-axis":function(t,e){return me(t,e,{intersect:!1})},point:function(t,e){return fe(t,he(e,t))},nearest:function(t,e,i){var n=he(e,t);i.axis=i.axis||"xy";var a=pe(i.axis);return ge(t,n,i.intersect,a)},x:function(t,e,i){var n=he(e,t),a=[],o=!1;return ce(t,function(t){t.inXRange(n.x)&&a.push(t),t.inRange(n.x,n.y)&&(o=!0)}),i.intersect&&!o&&(a=[]),a},y:function(t,e,i){var n=he(e,t),a=[],o=!1;return ce(t,function(t){t.inYRange(n.y)&&a.push(t),t.inRange(n.x,n.y)&&(o=!0)}),i.intersect&&!o&&(a=[]),a}}};function be(t,e){return ut.where(t,function(t){return t.position===e})}function xe(t,e){t.forEach(function(t,e){return t._tmpIndex_=e,t}),t.sort(function(t,i){var n=e?i:t,a=e?t:i;return n.weight===a.weight?n._tmpIndex_-a._tmpIndex_:n.weight-a.weight}),t.forEach(function(t){delete t._tmpIndex_})}function ye(t,e){ut.each(t,function(t){e[t.position]+=t.isHorizontal()?t.height:t.width})}st._set("global",{layout:{padding:{top:0,right:0,bottom:0,left:0}}});var ke={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),e.fullWidth=e.fullWidth||!1,e.position=e.position||"top",e.weight=e.weight||0,t.boxes.push(e)},removeBox:function(t,e){var i=t.boxes?t.boxes.indexOf(e):-1;-1!==i&&t.boxes.splice(i,1)},configure:function(t,e,i){for(var n,a=["fullWidth","position","weight"],o=a.length,r=0;rdiv{position:absolute;width:1000000px;height:1000000px;left:0;top:0}.chartjs-size-monitor-shrink>div{position:absolute;width:200%;height:200%;left:0;top:0}"}))&&we.default||we,_e="$chartjs",Ce="chartjs-size-monitor",Se="chartjs-render-monitor",Pe="chartjs-render-animation",Ie=["animationstart","webkitAnimationStart"],Ae={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"};function De(t,e){var i=ut.getStyle(t,e),n=i&&i.match(/^(\d+)(\.\d+)?px$/);return n?Number(n[1]):void 0}var Te=!!function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("e",null,e)}catch(t){}return t}()&&{passive:!0};function Fe(t,e,i){t.addEventListener(e,i,Te)}function Le(t,e,i){t.removeEventListener(e,i,Te)}function Re(t,e,i,n,a){return{type:t,chart:e,native:a||null,x:void 0!==i?i:null,y:void 0!==n?n:null}}function Oe(t){var e=document.createElement("div");return e.className=t||"",e}function ze(t,e,i){var n,a,o,r,s=t[_e]||(t[_e]={}),l=s.resizer=function(t){var e=Oe(Ce),i=Oe(Ce+"-expand"),n=Oe(Ce+"-shrink");i.appendChild(Oe()),n.appendChild(Oe()),e.appendChild(i),e.appendChild(n),e._reset=function(){i.scrollLeft=1e6,i.scrollTop=1e6,n.scrollLeft=1e6,n.scrollTop=1e6};var a=function(){e._reset(),t()};return Fe(i,"scroll",a.bind(i,"expand")),Fe(n,"scroll",a.bind(n,"shrink")),e}((n=function(){if(s.resizer){var n=i.options.maintainAspectRatio&&t.parentNode,a=n?n.clientWidth:0;e(Re("resize",i)),n&&n.clientWidth0){var o=t[0];o.label?i=o.label:o.xLabel?i=o.xLabel:a>0&&o.index-1?t.split("\n"):t}function Xe(t){var e=st.global;return{xPadding:t.xPadding,yPadding:t.yPadding,xAlign:t.xAlign,yAlign:t.yAlign,bodyFontColor:t.bodyFontColor,_bodyFontFamily:je(t.bodyFontFamily,e.defaultFontFamily),_bodyFontStyle:je(t.bodyFontStyle,e.defaultFontStyle),_bodyAlign:t.bodyAlign,bodyFontSize:je(t.bodyFontSize,e.defaultFontSize),bodySpacing:t.bodySpacing,titleFontColor:t.titleFontColor,_titleFontFamily:je(t.titleFontFamily,e.defaultFontFamily),_titleFontStyle:je(t.titleFontStyle,e.defaultFontStyle),titleFontSize:je(t.titleFontSize,e.defaultFontSize),_titleAlign:t.titleAlign,titleSpacing:t.titleSpacing,titleMarginBottom:t.titleMarginBottom,footerFontColor:t.footerFontColor,_footerFontFamily:je(t.footerFontFamily,e.defaultFontFamily),_footerFontStyle:je(t.footerFontStyle,e.defaultFontStyle),footerFontSize:je(t.footerFontSize,e.defaultFontSize),_footerAlign:t.footerAlign,footerSpacing:t.footerSpacing,footerMarginTop:t.footerMarginTop,caretSize:t.caretSize,cornerRadius:t.cornerRadius,backgroundColor:t.backgroundColor,opacity:0,legendColorBackground:t.multiKeyBackground,displayColors:t.displayColors,borderColor:t.borderColor,borderWidth:t.borderWidth}}function Ke(t,e){return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-t.xPadding:t.x+t.xPadding}function Ge(t){return Ye([],Ue(t))}var Ze=pt.extend({initialize:function(){this._model=Xe(this._options),this._lastActive=[]},getTitle:function(){var t=this._options.callbacks,e=t.beforeTitle.apply(this,arguments),i=t.title.apply(this,arguments),n=t.afterTitle.apply(this,arguments),a=[];return a=Ye(a,Ue(e)),a=Ye(a,Ue(i)),a=Ye(a,Ue(n))},getBeforeBody:function(){return Ge(this._options.callbacks.beforeBody.apply(this,arguments))},getBody:function(t,e){var i=this,n=i._options.callbacks,a=[];return ut.each(t,function(t){var o={before:[],lines:[],after:[]};Ye(o.before,Ue(n.beforeLabel.call(i,t,e))),Ye(o.lines,n.label.call(i,t,e)),Ye(o.after,Ue(n.afterLabel.call(i,t,e))),a.push(o)}),a},getAfterBody:function(){return Ge(this._options.callbacks.afterBody.apply(this,arguments))},getFooter:function(){var t=this._options.callbacks,e=t.beforeFooter.apply(this,arguments),i=t.footer.apply(this,arguments),n=t.afterFooter.apply(this,arguments),a=[];return a=Ye(a,Ue(e)),a=Ye(a,Ue(i)),a=Ye(a,Ue(n))},update:function(t){var e,i,n,a,o,r,s,l,d,u,h=this,c=h._options,f=h._model,g=h._model=Xe(c),p=h._active,m=h._data,v={xAlign:f.xAlign,yAlign:f.yAlign},b={x:f.x,y:f.y},x={width:f.width,height:f.height},y={x:f.caretX,y:f.caretY};if(p.length){g.opacity=1;var k=[],w=[];y=qe[c.position].call(h,p,h._eventPosition);var M=[];for(e=0,i=p.length;en.width&&(a=n.width-e.width),a<0&&(a=0)),"top"===u?o+=h:o-="bottom"===u?e.height+h:e.height/2,"center"===u?"left"===d?a+=h:"right"===d&&(a-=h):"left"===d?a-=c:"right"===d&&(a+=c),{x:a,y:o}}(g,x,v=function(t,e){var i,n,a,o,r,s=t._model,l=t._chart,d=t._chart.chartArea,u="center",h="center";s.yl.height-e.height&&(h="bottom");var c=(d.left+d.right)/2,f=(d.top+d.bottom)/2;"center"===h?(i=function(t){return t<=c},n=function(t){return t>c}):(i=function(t){return t<=e.width/2},n=function(t){return t>=l.width-e.width/2}),a=function(t){return t+e.width+s.caretSize+s.caretPadding>l.width},o=function(t){return t-e.width-s.caretSize-s.caretPadding<0},r=function(t){return t<=f?"top":"bottom"},i(s.x)?(u="left",a(s.x)&&(u="center",h=r(s.y))):n(s.x)&&(u="right",o(s.x)&&(u="center",h=r(s.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:u,yAlign:g.yAlign?g.yAlign:h}}(this,x),h._chart)}else g.opacity=0;return g.xAlign=v.xAlign,g.yAlign=v.yAlign,g.x=b.x,g.y=b.y,g.width=x.width,g.height=x.height,g.caretX=y.x,g.caretY=y.y,h._model=g,t&&c.custom&&c.custom.call(h,g),h},drawCaret:function(t,e){var i=this._chart.ctx,n=this._view,a=this.getCaretPosition(t,e,n);i.lineTo(a.x1,a.y1),i.lineTo(a.x2,a.y2),i.lineTo(a.x3,a.y3)},getCaretPosition:function(t,e,i){var n,a,o,r,s,l,d=i.caretSize,u=i.cornerRadius,h=i.xAlign,c=i.yAlign,f=t.x,g=t.y,p=e.width,m=e.height;if("center"===c)s=g+m/2,"left"===h?(a=(n=f)-d,o=n,r=s+d,l=s-d):(a=(n=f+p)+d,o=n,r=s-d,l=s+d);else if("left"===h?(n=(a=f+u+d)-d,o=a+d):"right"===h?(n=(a=f+p-u-d)-d,o=a+d):(n=(a=i.caretX)-d,o=a+d),"top"===c)s=(r=g)-d,l=r;else{s=(r=g+m)+d,l=r;var v=o;o=n,n=v}return{x1:n,x2:a,x3:o,y1:r,y2:s,y3:l}},drawTitle:function(t,e,i){var n=e.title;if(n.length){t.x=Ke(e,e._titleAlign),i.textAlign=e._titleAlign,i.textBaseline="top";var a,o,r=e.titleFontSize,s=e.titleSpacing;for(i.fillStyle=e.titleFontColor,i.font=ut.fontString(r,e._titleFontStyle,e._titleFontFamily),a=0,o=n.length;a0&&i.stroke()},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var i={width:e.width,height:e.height},n={x:e.x,y:e.y},a=Math.abs(e.opacity<.001)?0:e.opacity,o=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;this._options.enabled&&o&&(t.save(),t.globalAlpha=a,this.drawBackground(n,e,t,i),n.y+=e.yPadding,this.drawTitle(n,e,t),this.drawBody(n,e,t),this.drawFooter(n,e,t),t.restore())}},handleEvent:function(t){var e,i=this,n=i._options;return i._lastActive=i._lastActive||[],"mouseout"===t.type?i._active=[]:i._active=i._chart.getElementsAtEventForMode(t,n.mode,n),(e=!ut.arrayEquals(i._active,i._lastActive))&&(i._lastActive=i._active,(n.enabled||n.custom)&&(i._eventPosition={x:t.x,y:t.y},i.update(!0),i.pivot())),e}}),$e=qe,Je=Ze;Je.positioners=$e;var Qe=ut.valueOrDefault;function ti(){return ut.merge({},[].slice.call(arguments),{merger:function(t,e,i,n){if("xAxes"===t||"yAxes"===t){var a,o,r,s=i[t].length;for(e[t]||(e[t]=[]),a=0;a=e[t].length&&e[t].push({}),!e[t][a].type||r.type&&r.type!==e[t][a].type?ut.merge(e[t][a],[He.getScaleDefaults(o),r]):ut.merge(e[t][a],r)}else ut._merger(t,e,i,n)}})}function ei(){return ut.merge({},[].slice.call(arguments),{merger:function(t,e,i,n){var a=e[t]||{},o=i[t];"scales"===t?e[t]=ti(a,o):"scale"===t?e[t]=ut.merge(a,[He.getScaleDefaults(o.type),o]):ut._merger(t,e,i,n)}})}function ii(t){return"top"===t||"bottom"===t}st._set("global",{elements:{},events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,maintainAspectRatio:!0,responsive:!0,responsiveAnimationDuration:0});var ni=function(t,e){return this.construct(t,e),this};ut.extend(ni.prototype,{construct:function(t,e){var i=this;e=function(t){var e=(t=t||{}).data=t.data||{};return e.datasets=e.datasets||[],e.labels=e.labels||[],t.options=ei(st.global,st[t.type],t.options||{}),t}(e);var n=Ve.acquireContext(t,e),a=n&&n.canvas,o=a&&a.height,r=a&&a.width;i.id=ut.uid(),i.ctx=n,i.canvas=a,i.config=e,i.width=r,i.height=o,i.aspectRatio=o?r/o:null,i.options=e.options,i._bufferedRender=!1,i.chart=i,i.controller=i,ni.instances[i.id]=i,Object.defineProperty(i,"data",{get:function(){return i.config.data},set:function(t){i.config.data=t}}),n&&a?(i.initialize(),i.update()):console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var t=this;return Ee.notify(t,"beforeInit"),ut.retinaScale(t,t.options.devicePixelRatio),t.bindEvents(),t.options.responsive&&t.resize(!0),t.ensureScalesHaveIDs(),t.buildOrUpdateScales(),t.initToolTip(),Ee.notify(t,"afterInit"),t},clear:function(){return ut.canvas.clear(this),this},stop:function(){return bt.cancelAnimation(this),this},resize:function(t){var e=this,i=e.options,n=e.canvas,a=i.maintainAspectRatio&&e.aspectRatio||null,o=Math.max(0,Math.floor(ut.getMaximumWidth(n))),r=Math.max(0,Math.floor(a?o/a:ut.getMaximumHeight(n)));if((e.width!==o||e.height!==r)&&(n.width=e.width=o,n.height=e.height=r,n.style.width=o+"px",n.style.height=r+"px",ut.retinaScale(e,i.devicePixelRatio),!t)){var s={width:o,height:r};Ee.notify(e,"resize",[s]),i.onResize&&i.onResize(e,s),e.stop(),e.update({duration:i.responsiveAnimationDuration})}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},i=t.scale;ut.each(e.xAxes,function(t,e){t.id=t.id||"x-axis-"+e}),ut.each(e.yAxes,function(t,e){t.id=t.id||"y-axis-"+e}),i&&(i.id=i.id||"scale")},buildOrUpdateScales:function(){var t=this,e=t.options,i=t.scales||{},n=[],a=Object.keys(i).reduce(function(t,e){return t[e]=!1,t},{});e.scales&&(n=n.concat((e.scales.xAxes||[]).map(function(t){return{options:t,dtype:"category",dposition:"bottom"}}),(e.scales.yAxes||[]).map(function(t){return{options:t,dtype:"linear",dposition:"left"}}))),e.scale&&n.push({options:e.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),ut.each(n,function(e){var n=e.options,o=n.id,r=Qe(n.type,e.dtype);ii(n.position)!==ii(e.dposition)&&(n.position=e.dposition),a[o]=!0;var s=null;if(o in i&&i[o].type===r)(s=i[o]).options=n,s.ctx=t.ctx,s.chart=t;else{var l=He.getScaleConstructor(r);if(!l)return;s=new l({id:o,type:r,options:n,ctx:t.ctx,chart:t}),i[s.id]=s}s.mergeTicksOptions(),e.isDefault&&(t.scale=s)}),ut.each(a,function(t,e){t||delete i[e]}),t.scales=i,He.addScalesToLayout(this)},buildOrUpdateControllers:function(){var t=this,e=[];return ut.each(t.data.datasets,function(i,n){var a=t.getDatasetMeta(n),o=i.type||t.config.type;if(a.type&&a.type!==o&&(t.destroyDatasetMeta(n),a=t.getDatasetMeta(n)),a.type=o,a.controller)a.controller.updateIndex(n),a.controller.linkScales();else{var r=ue[a.type];if(void 0===r)throw new Error('"'+a.type+'" is not a chart type.');a.controller=new r(t,n),e.push(a.controller)}},t),e},resetElements:function(){var t=this;ut.each(t.data.datasets,function(e,i){t.getDatasetMeta(i).controller.reset()},t)},reset:function(){this.resetElements(),this.tooltip.initialize()},update:function(t){var e,i,n=this;if(t&&"object"==typeof t||(t={duration:t,lazy:arguments[1]}),i=(e=n).options,ut.each(e.scales,function(t){ke.removeBox(e,t)}),i=ei(st.global,st[e.config.type],i),e.options=e.config.options=i,e.ensureScalesHaveIDs(),e.buildOrUpdateScales(),e.tooltip._options=i.tooltips,e.tooltip.initialize(),Ee._invalidate(n),!1!==Ee.notify(n,"beforeUpdate")){n.tooltip._data=n.data;var a=n.buildOrUpdateControllers();ut.each(n.data.datasets,function(t,e){n.getDatasetMeta(e).controller.buildOrUpdateElements()},n),n.updateLayout(),n.options.animation&&n.options.animation.duration&&ut.each(a,function(t){t.reset()}),n.updateDatasets(),n.tooltip.initialize(),n.lastActive=[],Ee.notify(n,"afterUpdate"),n._bufferedRender?n._bufferedRequest={duration:t.duration,easing:t.easing,lazy:t.lazy}:n.render(t)}},updateLayout:function(){!1!==Ee.notify(this,"beforeLayout")&&(ke.update(this,this.width,this.height),Ee.notify(this,"afterScaleUpdate"),Ee.notify(this,"afterLayout"))},updateDatasets:function(){if(!1!==Ee.notify(this,"beforeDatasetsUpdate")){for(var t=0,e=this.data.datasets.length;t=0;--i)e.isDatasetVisible(i)&&e.drawDataset(i,t);Ee.notify(e,"afterDatasetsDraw",[t])}},drawDataset:function(t,e){var i=this.getDatasetMeta(t),n={meta:i,index:t,easingValue:e};!1!==Ee.notify(this,"beforeDatasetDraw",[n])&&(i.controller.draw(e),Ee.notify(this,"afterDatasetDraw",[n]))},_drawTooltip:function(t){var e=this.tooltip,i={tooltip:e,easingValue:t};!1!==Ee.notify(this,"beforeTooltipDraw",[i])&&(e.draw(),Ee.notify(this,"afterTooltipDraw",[i]))},getElementAtEvent:function(t){return ve.modes.single(this,t)},getElementsAtEvent:function(t){return ve.modes.label(this,t,{intersect:!0})},getElementsAtXAxis:function(t){return ve.modes["x-axis"](this,t,{intersect:!0})},getElementsAtEventForMode:function(t,e,i){var n=ve.modes[e];return"function"==typeof n?n(this,t,i):[]},getDatasetAtEvent:function(t){return ve.modes.dataset(this,t,{intersect:!0})},getDatasetMeta:function(t){var e=this.data.datasets[t];e._meta||(e._meta={});var i=e._meta[this.id];return i||(i=e._meta[this.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null}),i},getVisibleDatasetCount:function(){for(var t=0,e=0,i=this.data.datasets.length;e3?i[2]-i[1]:i[1]-i[0];Math.abs(n)>1&&t!==Math.floor(t)&&(n=t-Math.floor(t));var a=ut.log10(Math.abs(n)),o="";if(0!==t)if(Math.max(Math.abs(i[0]),Math.abs(i[i.length-1]))<1e-4){var r=ut.log10(Math.abs(t));o=t.toExponential(Math.floor(r)-Math.floor(a))}else{var s=-1*Math.floor(a);s=Math.max(Math.min(s,20),0),o=t.toFixed(s)}else o="0";return o},logarithmic:function(t,e,i){var n=t/Math.pow(10,Math.floor(ut.log10(t)));return 0===t?"0":1===n||2===n||5===n||0===e||e===i.length-1?t.toExponential():""}}},di=ut.valueOrDefault,ui=ut.valueAtIndexOrDefault;function hi(t){var e,i,n=[];for(e=0,i=t.length;ed&&ot.maxHeight){o--;break}o++,l=r*s}t.labelRotation=o},afterCalculateTickRotation:function(){ut.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){ut.callback(this.options.beforeFit,[this])},fit:function(){var t=this,e=t.minSize={width:0,height:0},i=hi(t._ticks),n=t.options,a=n.ticks,o=n.scaleLabel,r=n.gridLines,s=t._isVisible(),l=n.position,d=t.isHorizontal(),u=ut.options._parseFont,h=u(a),c=n.gridLines.tickMarkLength;if(e.width=d?t.isFullWidth()?t.maxWidth-t.margins.left-t.margins.right:t.maxWidth:s&&r.drawTicks?c:0,e.height=d?s&&r.drawTicks?c:0:t.maxHeight,o.display&&s){var f=u(o),g=ut.options.toPadding(o.padding),p=f.lineHeight+g.height;d?e.height+=p:e.width+=p}if(a.display&&s){var m=ut.longestText(t.ctx,h.string,i,t.longestTextCache),v=ut.numberOfLabelLines(i),b=.5*h.size,x=t.options.ticks.padding;if(t._maxLabelLines=v,t.longestLabelWidth=m,d){var y=ut.toRadians(t.labelRotation),k=Math.cos(y),w=Math.sin(y)*m+h.lineHeight*v+b;e.height=Math.min(t.maxHeight,e.height+w+x),t.ctx.font=h.string;var M,_,C=ci(t.ctx,i[0],h.string),S=ci(t.ctx,i[i.length-1],h.string),P=t.getPixelForTick(0)-t.left,I=t.right-t.getPixelForTick(i.length-1);0!==t.labelRotation?(M="bottom"===l?k*C:k*b,_="bottom"===l?k*b:k*S):(M=C/2,_=S/2),t.paddingLeft=Math.max(M-P,0)+3,t.paddingRight=Math.max(_-I,0)+3}else a.mirror?m=0:m+=x+b,e.width=Math.min(t.maxWidth,e.width+m),t.paddingTop=h.size/2,t.paddingBottom=h.size/2}t.handleMargins(),t.width=e.width,t.height=e.height},handleMargins:function(){var t=this;t.margins&&(t.paddingLeft=Math.max(t.paddingLeft-t.margins.left,0),t.paddingTop=Math.max(t.paddingTop-t.margins.top,0),t.paddingRight=Math.max(t.paddingRight-t.margins.right,0),t.paddingBottom=Math.max(t.paddingBottom-t.margins.bottom,0))},afterFit:function(){ut.callback(this.options.afterFit,[this])},isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){if(ut.isNullOrUndef(t))return NaN;if(("number"==typeof t||t instanceof Number)&&!isFinite(t))return NaN;if(t)if(this.isHorizontal()){if(void 0!==t.x)return this.getRightValue(t.x)}else if(void 0!==t.y)return this.getRightValue(t.y);return t},getLabelForIndex:ut.noop,getPixelForValue:ut.noop,getValueForPixel:ut.noop,getPixelForTick:function(t){var e=this,i=e.options.offset;if(e.isHorizontal()){var n=(e.width-(e.paddingLeft+e.paddingRight))/Math.max(e._ticks.length-(i?0:1),1),a=n*t+e.paddingLeft;i&&(a+=n/2);var o=e.left+a;return o+=e.isFullWidth()?e.margins.left:0}var r=e.height-(e.paddingTop+e.paddingBottom);return e.top+t*(r/(e._ticks.length-1))},getPixelForDecimal:function(t){var e=this;if(e.isHorizontal()){var i=(e.width-(e.paddingLeft+e.paddingRight))*t+e.paddingLeft,n=e.left+i;return n+=e.isFullWidth()?e.margins.left:0}return e.top+t*e.height},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this.min,e=this.max;return this.beginAtZero?0:t<0&&e<0?e:t>0&&e>0?t:0},_autoSkip:function(t){var e,i,n=this,a=n.isHorizontal(),o=n.options.ticks.minor,r=t.length,s=!1,l=o.maxTicksLimit,d=n._tickSize()*(r-1),u=a?n.width-(n.paddingLeft+n.paddingRight):n.height-(n.paddingTop+n.PaddingBottom),h=[];for(d>u&&(s=1+Math.floor(d/u)),r>l&&(s=Math.max(s,1+Math.floor(r/l))),e=0;e1&&e%s>0&&delete i.label,h.push(i);return h},_tickSize:function(){var t=this,e=t.isHorizontal(),i=t.options.ticks.minor,n=ut.toRadians(t.labelRotation),a=Math.abs(Math.cos(n)),o=Math.abs(Math.sin(n)),r=i.autoSkipPadding||0,s=t.longestLabelWidth+r||0,l=ut.options._parseFont(i),d=t._maxLabelLines*l.lineHeight+r||0;return e?d*a>s*o?s/a:d/o:d*o0&&n>0&&(t.min=0)}var a=void 0!==e.min||void 0!==e.suggestedMin,o=void 0!==e.max||void 0!==e.suggestedMax;void 0!==e.min?t.min=e.min:void 0!==e.suggestedMin&&(null===t.min?t.min=e.suggestedMin:t.min=Math.min(t.min,e.suggestedMin)),void 0!==e.max?t.max=e.max:void 0!==e.suggestedMax&&(null===t.max?t.max=e.suggestedMax:t.max=Math.max(t.max,e.suggestedMax)),a!==o&&t.min>=t.max&&(a?t.max=t.min+1:t.min=t.max-1),t.min===t.max&&(t.max++,e.beginAtZero||t.min--)},getTickLimit:function(){var t,e=this.options.ticks,i=e.stepSize,n=e.maxTicksLimit;return i?t=Math.ceil(this.max/i)-Math.floor(this.min/i)+1:(t=this._computeTickLimit(),n=n||11),n&&(t=Math.min(n,t)),t},_computeTickLimit:function(){return Number.POSITIVE_INFINITY},handleDirectionalChanges:mi,buildTicks:function(){var t=this,e=t.options.ticks,i=t.getTickLimit(),n={maxTicks:i=Math.max(2,i),min:e.min,max:e.max,precision:e.precision,stepSize:ut.valueOrDefault(e.fixedStepSize,e.stepSize)},a=t.ticks=function(t,e){var i,n,a,o,r=[],s=t.stepSize,l=s||1,d=t.maxTicks-1,u=t.min,h=t.max,c=t.precision,f=e.min,g=e.max,p=ut.niceNum((g-f)/d/l)*l;if(p<1e-14&&vi(u)&&vi(h))return[f,g];(o=Math.ceil(g/p)-Math.floor(f/p))>d&&(p=ut.niceNum(o*p/d/l)*l),s||vi(c)?i=Math.pow(10,ut._decimalPlaces(p)):(i=Math.pow(10,c),p=Math.ceil(p*i)/i),n=Math.floor(f/p)*p,a=Math.ceil(g/p)*p,s&&(!vi(u)&&ut.almostWhole(u/p,p/1e3)&&(n=u),!vi(h)&&ut.almostWhole(h/p,p/1e3)&&(a=h)),o=(a-n)/p,o=ut.almostEquals(o,Math.round(o),p/1e3)?Math.round(o):Math.ceil(o),n=Math.round(n*i)/i,a=Math.round(a*i)/i,r.push(vi(u)?n:u);for(var m=1;mt.max&&(t.max=n))})});t.min=isFinite(t.min)&&!isNaN(t.min)?t.min:0,t.max=isFinite(t.max)&&!isNaN(t.max)?t.max:1,this.handleTickRangeOptions()},_computeTickLimit:function(){var t;return this.isHorizontal()?Math.ceil(this.width/40):(t=ut.options._parseFont(this.options.ticks),Math.ceil(this.height/t.lineHeight))},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t){var e=this,i=e.start,n=+e.getRightValue(t),a=e.end-i;return e.isHorizontal()?e.left+e.width/a*(n-i):e.bottom-e.height/a*(n-i)},getValueForPixel:function(t){var e=this,i=e.isHorizontal(),n=i?e.width:e.height,a=(i?t-e.left:e.bottom-t)/n;return e.start+(e.end-e.start)*a},getPixelForTick:function(t){return this.getPixelForValue(this.ticksAsNumbers[t])}}),ki=xi;yi._defaults=ki;var wi=ut.valueOrDefault;var Mi={position:"left",ticks:{callback:li.formatters.logarithmic}};function _i(t,e){return ut.isFinite(t)&&t>=0?t:e}var Ci=fi.extend({determineDataLimits:function(){var t=this,e=t.options,i=t.chart,n=i.data.datasets,a=t.isHorizontal();function o(e){return a?e.xAxisID===t.id:e.yAxisID===t.id}t.min=null,t.max=null,t.minNotZero=null;var r=e.stacked;if(void 0===r&&ut.each(n,function(t,e){if(!r){var n=i.getDatasetMeta(e);i.isDatasetVisible(e)&&o(n)&&void 0!==n.stack&&(r=!0)}}),e.stacked||r){var s={};ut.each(n,function(n,a){var r=i.getDatasetMeta(a),l=[r.type,void 0===e.stacked&&void 0===r.stack?a:"",r.stack].join(".");i.isDatasetVisible(a)&&o(r)&&(void 0===s[l]&&(s[l]=[]),ut.each(n.data,function(e,i){var n=s[l],a=+t.getRightValue(e);isNaN(a)||r.data[i].hidden||a<0||(n[i]=n[i]||0,n[i]+=a)}))}),ut.each(s,function(e){if(e.length>0){var i=ut.min(e),n=ut.max(e);t.min=null===t.min?i:Math.min(t.min,i),t.max=null===t.max?n:Math.max(t.max,n)}})}else ut.each(n,function(e,n){var a=i.getDatasetMeta(n);i.isDatasetVisible(n)&&o(a)&&ut.each(e.data,function(e,i){var n=+t.getRightValue(e);isNaN(n)||a.data[i].hidden||n<0||(null===t.min?t.min=n:nt.max&&(t.max=n),0!==n&&(null===t.minNotZero||n0?t.minNotZero=t.min:t.max<1?t.minNotZero=Math.pow(10,Math.floor(ut.log10(t.max))):t.minNotZero=1)},buildTicks:function(){var t=this,e=t.options.ticks,i=!t.isHorizontal(),n={min:_i(e.min),max:_i(e.max)},a=t.ticks=function(t,e){var i,n,a=[],o=wi(t.min,Math.pow(10,Math.floor(ut.log10(e.min)))),r=Math.floor(ut.log10(e.max)),s=Math.ceil(e.max/Math.pow(10,r));0===o?(i=Math.floor(ut.log10(e.minNotZero)),n=Math.floor(e.minNotZero/Math.pow(10,i)),a.push(o),o=n*Math.pow(10,i)):(i=Math.floor(ut.log10(o)),n=Math.floor(o/Math.pow(10,i)));var l=i<0?Math.pow(10,Math.abs(i)):1;do{a.push(o),10==++n&&(n=1,l=++i>=0?1:l),o=Math.round(n*Math.pow(10,i)*l)/l}while(ia?{start:e-i,end:e}:{start:e,end:e+i}}function Ri(t){return 0===t||180===t?"center":t<180?"left":"right"}function Oi(t,e,i,n){var a,o,r=i.y+n/2;if(ut.isArray(e))for(a=0,o=e.length;a270||t<90)&&(i.y-=e.h)}function Bi(t){return ut.isNumber(t)?t:0}var Ni=bi.extend({setDimensions:function(){var t=this;t.width=t.maxWidth,t.height=t.maxHeight,t.paddingTop=Fi(t.options)/2,t.xCenter=Math.floor(t.width/2),t.yCenter=Math.floor((t.height-t.paddingTop)/2),t.drawingArea=Math.min(t.height-t.paddingTop,t.width)/2},determineDataLimits:function(){var t=this,e=t.chart,i=Number.POSITIVE_INFINITY,n=Number.NEGATIVE_INFINITY;ut.each(e.data.datasets,function(a,o){if(e.isDatasetVisible(o)){var r=e.getDatasetMeta(o);ut.each(a.data,function(e,a){var o=+t.getRightValue(e);isNaN(o)||r.data[a].hidden||(i=Math.min(o,i),n=Math.max(o,n))})}}),t.min=i===Number.POSITIVE_INFINITY?0:i,t.max=n===Number.NEGATIVE_INFINITY?0:n,t.handleTickRangeOptions()},_computeTickLimit:function(){return Math.ceil(this.drawingArea/Fi(this.options))},convertTicksToLabels:function(){var t=this;bi.prototype.convertTicksToLabels.call(t),t.pointLabels=t.chart.data.labels.map(t.options.pointLabels.callback,t)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},fit:function(){var t=this.options;t.display&&t.pointLabels.display?function(t){var e,i,n,a=ut.options._parseFont(t.options.pointLabels),o={l:0,r:t.width,t:0,b:t.height-t.paddingTop},r={};t.ctx.font=a.string,t._pointLabelSizes=[];var s,l,d,u=Ti(t);for(e=0;eo.r&&(o.r=f.end,r.r=h),g.starto.b&&(o.b=g.end,r.b=h)}t.setReductions(t.drawingArea,o,r)}(this):this.setCenterPoint(0,0,0,0)},setReductions:function(t,e,i){var n=this,a=e.l/Math.sin(i.l),o=Math.max(e.r-n.width,0)/Math.sin(i.r),r=-e.t/Math.cos(i.t),s=-Math.max(e.b-(n.height-n.paddingTop),0)/Math.cos(i.b);a=Bi(a),o=Bi(o),r=Bi(r),s=Bi(s),n.drawingArea=Math.min(Math.floor(t-(a+o)/2),Math.floor(t-(r+s)/2)),n.setCenterPoint(a,o,r,s)},setCenterPoint:function(t,e,i,n){var a=this,o=a.width-e-a.drawingArea,r=t+a.drawingArea,s=i+a.drawingArea,l=a.height-a.paddingTop-n-a.drawingArea;a.xCenter=Math.floor((r+o)/2+a.left),a.yCenter=Math.floor((s+l)/2+a.top+a.paddingTop)},getIndexAngle:function(t){return t*(2*Math.PI/Ti(this))+(this.chart.options&&this.chart.options.startAngle?this.chart.options.startAngle:0)*Math.PI*2/360},getDistanceFromCenterForValue:function(t){var e=this;if(null===t)return 0;var i=e.drawingArea/(e.max-e.min);return e.options.ticks.reverse?(e.max-t)*i:(t-e.min)*i},getPointPosition:function(t,e){var i=this.getIndexAngle(t)-Math.PI/2;return{x:Math.cos(i)*e+this.xCenter,y:Math.sin(i)*e+this.yCenter}},getPointPositionForValue:function(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))},getBasePosition:function(){var t=this.min,e=this.max;return this.getPointPositionForValue(0,this.beginAtZero?0:t<0&&e<0?e:t>0&&e>0?t:0)},draw:function(){var t=this,e=t.options,i=e.gridLines,n=e.ticks;if(e.display){var a=t.ctx,o=this.getIndexAngle(0),r=ut.options._parseFont(n);(e.angleLines.display||e.pointLabels.display)&&function(t){var e=t.ctx,i=t.options,n=i.angleLines,a=i.gridLines,o=i.pointLabels,r=Pi(n.lineWidth,a.lineWidth),s=Pi(n.color,a.color),l=Fi(i);e.save(),e.lineWidth=r,e.strokeStyle=s,e.setLineDash&&(e.setLineDash(Ai([n.borderDash,a.borderDash,[]])),e.lineDashOffset=Ai([n.borderDashOffset,a.borderDashOffset,0]));var d=t.getDistanceFromCenterForValue(i.ticks.reverse?t.min:t.max),u=ut.options._parseFont(o);e.font=u.string,e.textBaseline="middle";for(var h=Ti(t)-1;h>=0;h--){if(n.display&&r&&s){var c=t.getPointPosition(h,d);e.beginPath(),e.moveTo(t.xCenter,t.yCenter),e.lineTo(c.x,c.y),e.stroke()}if(o.display){var f=0===h?l/2:0,g=t.getPointPosition(h,d+f+5),p=Ii(o.fontColor,h,st.global.defaultFontColor);e.fillStyle=p;var m=t.getIndexAngle(h),v=ut.toDegrees(m);e.textAlign=Ri(v),zi(v,t._pointLabelSizes[h],g),Oi(e,t.pointLabels[h]||"",g,u.lineHeight)}}e.restore()}(t),ut.each(t.ticks,function(e,s){if(s>0||n.reverse){var l=t.getDistanceFromCenterForValue(t.ticksAsNumbers[s]);if(i.display&&0!==s&&function(t,e,i,n){var a,o=t.ctx,r=e.circular,s=Ti(t),l=Ii(e.color,n-1),d=Ii(e.lineWidth,n-1);if((r||s)&&l&&d){if(o.save(),o.strokeStyle=l,o.lineWidth=d,o.setLineDash&&(o.setLineDash(e.borderDash||[]),o.lineDashOffset=e.borderDashOffset||0),o.beginPath(),r)o.arc(t.xCenter,t.yCenter,i,0,2*Math.PI);else{a=t.getPointPosition(0,i),o.moveTo(a.x,a.y);for(var u=1;u=0&&r<=s;){if(a=t[(n=r+s>>1)-1]||null,o=t[n],!a)return{lo:null,hi:o};if(o[e]i))return{lo:a,hi:o};s=n-1}}return{lo:o,hi:null}}(t,e,i),o=a.lo?a.hi?a.lo:t[t.length-2]:t[0],r=a.lo?a.hi?a.hi:t[t.length-1]:t[1],s=r[e]-o[e],l=s?(i-o[e])/s:0,d=(r[n]-o[n])*l;return o[n]+d}function Ki(t,e){var i=t._adapter,n=t.options.time,a=n.parser,o=a||n.format,r=e;return"function"==typeof a&&(r=a(r)),ut.isFinite(r)||(r="string"==typeof o?i.parse(r,o):i.parse(r)),null!==r?+r:(a||"function"!=typeof o||(r=o(e),ut.isFinite(r)||(r=i.parse(r))),r)}function Gi(t,e){if(ut.isNullOrUndef(e))return null;var i=t.options.time,n=Ki(t,t.getRightValue(e));return null===n?n:(i.round&&(n=+t._adapter.startOf(n,i.round)),n)}function Zi(t){for(var e=qi.indexOf(t)+1,i=qi.length;e=a&&i<=o&&d.push(i);return n.min=a,n.max=o,n._unit=s.unit||function(t,e,i,n,a){var o,r;for(o=qi.length-1;o>=qi.indexOf(i);o--)if(r=qi[o],ji[r].common&&t._adapter.diff(a,n,r)>=e.length)return r;return qi[i?qi.indexOf(i):0]}(n,d,s.minUnit,n.min,n.max),n._majorUnit=Zi(n._unit),n._table=function(t,e,i,n){if("linear"===n||!t.length)return[{time:e,pos:0},{time:i,pos:1}];var a,o,r,s,l,d=[],u=[e];for(a=0,o=t.length;ae&&s=0&&t0?r:1}}),Qi={position:"bottom",distribution:"linear",bounds:"data",adapters:{},time:{parser:!1,format:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{autoSkip:!1,source:"auto",major:{enabled:!1}}};Ji._defaults=Qi;var tn={category:gi,linear:yi,logarithmic:Ci,radialLinear:Ni,time:Ji},en={datetime:"MMM D, YYYY, h:mm:ss a",millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm a",hour:"hA",day:"MMM D",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"};si._date.override("function"==typeof t?{_id:"moment",formats:function(){return en},parse:function(e,i){return"string"==typeof e&&"string"==typeof i?e=t(e,i):e instanceof t||(e=t(e)),e.isValid()?e.valueOf():null},format:function(e,i){return t(e).format(i)},add:function(e,i,n){return t(e).add(i,n).valueOf()},diff:function(e,i,n){return t.duration(t(e).diff(t(i))).as(n)},startOf:function(e,i,n){return e=t(e),"isoWeek"===i?e.isoWeekday(n).valueOf():e.startOf(i).valueOf()},endOf:function(e,i){return t(e).endOf(i).valueOf()},_create:function(e){return t(e)}}:{}),st._set("global",{plugins:{filler:{propagate:!0}}});var nn={dataset:function(t){var e=t.fill,i=t.chart,n=i.getDatasetMeta(e),a=n&&i.isDatasetVisible(e)&&n.dataset._children||[],o=a.length||0;return o?function(t,e){return e=i)&&n;switch(o){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return o;default:return!1}}function on(t){var e,i=t.el._model||{},n=t.el._scale||{},a=t.fill,o=null;if(isFinite(a))return null;if("start"===a?o=void 0===i.scaleBottom?n.bottom:i.scaleBottom:"end"===a?o=void 0===i.scaleTop?n.top:i.scaleTop:void 0!==i.scaleZero?o=i.scaleZero:n.getBasePosition?o=n.getBasePosition():n.getBasePixel&&(o=n.getBasePixel()),null!=o){if(void 0!==o.x&&void 0!==o.y)return o;if(ut.isFinite(o))return{x:(e=n.isHorizontal())?o:null,y:e?null:o}}return null}function rn(t,e,i){var n,a=t[e].fill,o=[e];if(!i)return a;for(;!1!==a&&-1===o.indexOf(a);){if(!isFinite(a))return a;if(!(n=t[a]))return!1;if(n.visible)return a;o.push(a),a=n.fill}return!1}function sn(t){var e=t.fill,i="dataset";return!1===e?null:(isFinite(e)||(i="boundary"),nn[i](t))}function ln(t){return t&&!t.skip}function dn(t,e,i,n,a){var o;if(n&&a){for(t.moveTo(e[0].x,e[0].y),o=1;o0;--o)ut.canvas.lineTo(t,i[o],i[o-1],!0)}}var un={id:"filler",afterDatasetsUpdate:function(t,e){var i,n,a,o,r=(t.data.datasets||[]).length,s=e.propagate,l=[];for(n=0;ne?e:t.boxWidth}st._set("global",{legend:{display:!0,position:"top",fullWidth:!0,reverse:!1,weight:1e3,onClick:function(t,e){var i=e.datasetIndex,n=this.chart,a=n.getDatasetMeta(i);a.hidden=null===a.hidden?!n.data.datasets[i].hidden:null,n.update()},onHover:null,onLeave:null,labels:{boxWidth:40,padding:10,generateLabels:function(t){var e=t.data;return ut.isArray(e.datasets)?e.datasets.map(function(e,i){return{text:e.label,fillStyle:ut.isArray(e.backgroundColor)?e.backgroundColor[0]:e.backgroundColor,hidden:!t.isDatasetVisible(i),lineCap:e.borderCapStyle,lineDash:e.borderDash,lineDashOffset:e.borderDashOffset,lineJoin:e.borderJoinStyle,lineWidth:e.borderWidth,strokeStyle:e.borderColor,pointStyle:e.pointStyle,datasetIndex:i}},this):[]}}},legendCallback:function(t){var e=[];e.push('
      ');for(var i=0;i'),t.data.datasets[i].label&&e.push(t.data.datasets[i].label),e.push("");return e.push("
    "),e.join("")}});var gn=pt.extend({initialize:function(t){ut.extend(this,t),this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1},beforeUpdate:hn,update:function(t,e,i){var n=this;return n.beforeUpdate(),n.maxWidth=t,n.maxHeight=e,n.margins=i,n.beforeSetDimensions(),n.setDimensions(),n.afterSetDimensions(),n.beforeBuildLabels(),n.buildLabels(),n.afterBuildLabels(),n.beforeFit(),n.fit(),n.afterFit(),n.afterUpdate(),n.minSize},afterUpdate:hn,beforeSetDimensions:hn,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:hn,beforeBuildLabels:hn,buildLabels:function(){var t=this,e=t.options.labels||{},i=ut.callback(e.generateLabels,[t.chart],t)||[];e.filter&&(i=i.filter(function(i){return e.filter(i,t.chart.data)})),t.options.reverse&&i.reverse(),t.legendItems=i},afterBuildLabels:hn,beforeFit:hn,fit:function(){var t=this,e=t.options,i=e.labels,n=e.display,a=t.ctx,o=ut.options._parseFont(i),r=o.size,s=t.legendHitBoxes=[],l=t.minSize,d=t.isHorizontal();if(d?(l.width=t.maxWidth,l.height=n?10:0):(l.width=n?10:0,l.height=t.maxHeight),n)if(a.font=o.string,d){var u=t.lineWidths=[0],h=0;a.textAlign="left",a.textBaseline="top",ut.each(t.legendItems,function(t,e){var n=fn(i,r)+r/2+a.measureText(t.text).width;(0===e||u[u.length-1]+n+i.padding>l.width)&&(h+=r+i.padding,u[u.length-(e>0?0:1)]=i.padding),s[e]={left:0,top:0,width:n,height:r},u[u.length-1]+=n+i.padding}),l.height+=h}else{var c=i.padding,f=t.columnWidths=[],g=i.padding,p=0,m=0,v=r+c;ut.each(t.legendItems,function(t,e){var n=fn(i,r)+r/2+a.measureText(t.text).width;e>0&&m+v>l.height-c&&(g+=p+i.padding,f.push(p),p=0,m=0),p=Math.max(p,n),m+=v,s[e]={left:0,top:0,width:n,height:r}}),g+=p,f.push(p),l.width+=g}t.width=l.width,t.height=l.height},afterFit:hn,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var t=this,e=t.options,i=e.labels,n=st.global,a=n.defaultColor,o=n.elements.line,r=t.width,s=t.lineWidths;if(e.display){var l,d=t.ctx,u=cn(i.fontColor,n.defaultFontColor),h=ut.options._parseFont(i),c=h.size;d.textAlign="left",d.textBaseline="middle",d.lineWidth=.5,d.strokeStyle=u,d.fillStyle=u,d.font=h.string;var f=fn(i,c),g=t.legendHitBoxes,p=t.isHorizontal();l=p?{x:t.left+(r-s[0])/2+i.padding,y:t.top+i.padding,line:0}:{x:t.left+i.padding,y:t.top+i.padding,line:0};var m=c+i.padding;ut.each(t.legendItems,function(n,u){var h=d.measureText(n.text).width,v=f+c/2+h,b=l.x,x=l.y;p?u>0&&b+v+i.padding>t.left+t.minSize.width&&(x=l.y+=m,l.line++,b=l.x=t.left+(r-s[l.line])/2+i.padding):u>0&&x+m>t.top+t.minSize.height&&(b=l.x=b+t.columnWidths[l.line]+i.padding,x=l.y=t.top+i.padding,l.line++),function(t,i,n){if(!(isNaN(f)||f<=0)){d.save();var r=cn(n.lineWidth,o.borderWidth);if(d.fillStyle=cn(n.fillStyle,a),d.lineCap=cn(n.lineCap,o.borderCapStyle),d.lineDashOffset=cn(n.lineDashOffset,o.borderDashOffset),d.lineJoin=cn(n.lineJoin,o.borderJoinStyle),d.lineWidth=r,d.strokeStyle=cn(n.strokeStyle,a),d.setLineDash&&d.setLineDash(cn(n.lineDash,o.borderDash)),e.labels&&e.labels.usePointStyle){var s=f*Math.SQRT2/2,l=t+f/2,u=i+c/2;ut.canvas.drawPoint(d,n.pointStyle,s,l,u)}else 0!==r&&d.strokeRect(t,i,f,c),d.fillRect(t,i,f,c);d.restore()}}(b,x,n),g[u].left=b,g[u].top=x,function(t,e,i,n){var a=c/2,o=f+a+t,r=e+a;d.fillText(i.text,o,r),i.hidden&&(d.beginPath(),d.lineWidth=2,d.moveTo(o,r),d.lineTo(o+n,r),d.stroke())}(b,x,n,h),p?l.x+=v+i.padding:l.y+=m})}},_getLegendItemAt:function(t,e){var i,n,a,o=this;if(t>=o.left&&t<=o.right&&e>=o.top&&e<=o.bottom)for(a=o.legendHitBoxes,i=0;i=(n=a[i]).left&&t<=n.left+n.width&&e>=n.top&&e<=n.top+n.height)return o.legendItems[i];return null},handleEvent:function(t){var e,i=this,n=i.options,a="mouseup"===t.type?"click":t.type;if("mousemove"===a){if(!n.onHover&&!n.onLeave)return}else{if("click"!==a)return;if(!n.onClick)return}e=i._getLegendItemAt(t.x,t.y),"click"===a?e&&n.onClick&&n.onClick.call(i,t.native,e):(n.onLeave&&e!==i._hoveredItem&&(i._hoveredItem&&n.onLeave.call(i,t.native,i._hoveredItem),i._hoveredItem=e),n.onHover&&e&&n.onHover.call(i,t.native,e))}});function pn(t,e){var i=new gn({ctx:t.ctx,options:e,chart:t});ke.configure(t,i,e),ke.addBox(t,i),t.legend=i}var mn={id:"legend",_element:gn,beforeInit:function(t){var e=t.options.legend;e&&pn(t,e)},beforeUpdate:function(t){var e=t.options.legend,i=t.legend;e?(ut.mergeIf(e,st.global.legend),i?(ke.configure(t,i,e),i.options=e):pn(t,e)):i&&(ke.removeBox(t,i),delete t.legend)},afterEvent:function(t,e){var i=t.legend;i&&i.handleEvent(e)}},vn=ut.noop;st._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,padding:10,position:"top",text:"",weight:2e3}});var bn=pt.extend({initialize:function(t){ut.extend(this,t),this.legendHitBoxes=[]},beforeUpdate:vn,update:function(t,e,i){var n=this;return n.beforeUpdate(),n.maxWidth=t,n.maxHeight=e,n.margins=i,n.beforeSetDimensions(),n.setDimensions(),n.afterSetDimensions(),n.beforeBuildLabels(),n.buildLabels(),n.afterBuildLabels(),n.beforeFit(),n.fit(),n.afterFit(),n.afterUpdate(),n.minSize},afterUpdate:vn,beforeSetDimensions:vn,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:vn,beforeBuildLabels:vn,buildLabels:vn,afterBuildLabels:vn,beforeFit:vn,fit:function(){var t=this,e=t.options,i=e.display,n=t.minSize,a=ut.isArray(e.text)?e.text.length:1,o=ut.options._parseFont(e),r=i?a*o.lineHeight+2*e.padding:0;t.isHorizontal()?(n.width=t.maxWidth,n.height=r):(n.width=r,n.height=t.maxHeight),t.width=n.width,t.height=n.height},afterFit:vn,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var t=this,e=t.ctx,i=t.options;if(i.display){var n,a,o,r=ut.options._parseFont(i),s=r.lineHeight,l=s/2+i.padding,d=0,u=t.top,h=t.left,c=t.bottom,f=t.right;e.fillStyle=ut.valueOrDefault(i.fontColor,st.global.defaultFontColor),e.font=r.string,t.isHorizontal()?(a=h+(f-h)/2,o=u+l,n=f-h):(a="left"===i.position?h+l:f-l,o=u+(c-u)/2,n=c-u,d=Math.PI*("left"===i.position?-.5:.5)),e.save(),e.translate(a,o),e.rotate(d),e.textAlign="center",e.textBaseline="middle";var g=i.text;if(ut.isArray(g))for(var p=0,m=0;m=0;n--){var a=t[n];if(e(a))return a}},ut.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},ut.almostEquals=function(t,e,i){return Math.abs(t-e)t},ut.max=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.max(t,e)},Number.NEGATIVE_INFINITY)},ut.min=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.min(t,e)},Number.POSITIVE_INFINITY)},ut.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return 0==(t=+t)||isNaN(t)?t:t>0?1:-1},ut.log10=Math.log10?function(t){return Math.log10(t)}:function(t){var e=Math.log(t)*Math.LOG10E,i=Math.round(e);return t===Math.pow(10,i)?i:e},ut.toRadians=function(t){return t*(Math.PI/180)},ut.toDegrees=function(t){return t*(180/Math.PI)},ut._decimalPlaces=function(t){if(ut.isFinite(t)){for(var e=1,i=0;Math.round(t*e)/e!==t;)e*=10,i++;return i}},ut.getAngleFromPoint=function(t,e){var i=e.x-t.x,n=e.y-t.y,a=Math.sqrt(i*i+n*n),o=Math.atan2(n,i);return o<-.5*Math.PI&&(o+=2*Math.PI),{angle:o,distance:a}},ut.distanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},ut.aliasPixel=function(t){return t%2==0?0:.5},ut._alignPixel=function(t,e,i){var n=t.currentDevicePixelRatio,a=i/2;return Math.round((e-a)*n)/n+a},ut.splineCurve=function(t,e,i,n){var a=t.skip?e:t,o=e,r=i.skip?e:i,s=Math.sqrt(Math.pow(o.x-a.x,2)+Math.pow(o.y-a.y,2)),l=Math.sqrt(Math.pow(r.x-o.x,2)+Math.pow(r.y-o.y,2)),d=s/(s+l),u=l/(s+l),h=n*(d=isNaN(d)?0:d),c=n*(u=isNaN(u)?0:u);return{previous:{x:o.x-h*(r.x-a.x),y:o.y-h*(r.y-a.y)},next:{x:o.x+c*(r.x-a.x),y:o.y+c*(r.y-a.y)}}},ut.EPSILON=Number.EPSILON||1e-14,ut.splineCurveMonotone=function(t){var e,i,n,a,o,r,s,l,d,u=(t||[]).map(function(t){return{model:t._model,deltaK:0,mK:0}}),h=u.length;for(e=0;e0?u[e-1]:null,(a=e0?u[e-1]:null,a=e=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},ut.previousItem=function(t,e,i){return i?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},ut.niceNum=function(t,e){var i=Math.floor(ut.log10(t)),n=t/Math.pow(10,i);return(e?n<1.5?1:n<3?2:n<7?5:10:n<=1?1:n<=2?2:n<=5?5:10)*Math.pow(10,i)},ut.requestAnimFrame="undefined"==typeof window?function(t){t()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)},ut.getRelativePosition=function(t,e){var i,n,a=t.originalEvent||t,o=t.target||t.srcElement,r=o.getBoundingClientRect(),s=a.touches;s&&s.length>0?(i=s[0].clientX,n=s[0].clientY):(i=a.clientX,n=a.clientY);var l=parseFloat(ut.getStyle(o,"padding-left")),d=parseFloat(ut.getStyle(o,"padding-top")),u=parseFloat(ut.getStyle(o,"padding-right")),h=parseFloat(ut.getStyle(o,"padding-bottom")),c=r.right-r.left-l-u,f=r.bottom-r.top-d-h;return{x:i=Math.round((i-r.left-l)/c*o.width/e.currentDevicePixelRatio),y:n=Math.round((n-r.top-d)/f*o.height/e.currentDevicePixelRatio)}},ut.getConstraintWidth=function(t){return i(t,"max-width","clientWidth")},ut.getConstraintHeight=function(t){return i(t,"max-height","clientHeight")},ut._calculatePadding=function(t,e,i){return(e=ut.getStyle(t,e)).indexOf("%")>-1?i*parseInt(e,10)/100:parseInt(e,10)},ut._getParentNode=function(t){var e=t.parentNode;return e&&"[object ShadowRoot]"===e.toString()&&(e=e.host),e},ut.getMaximumWidth=function(t){var e=ut._getParentNode(t);if(!e)return t.clientWidth;var i=e.clientWidth,n=i-ut._calculatePadding(e,"padding-left",i)-ut._calculatePadding(e,"padding-right",i),a=ut.getConstraintWidth(t);return isNaN(a)?n:Math.min(n,a)},ut.getMaximumHeight=function(t){var e=ut._getParentNode(t);if(!e)return t.clientHeight;var i=e.clientHeight,n=i-ut._calculatePadding(e,"padding-top",i)-ut._calculatePadding(e,"padding-bottom",i),a=ut.getConstraintHeight(t);return isNaN(a)?n:Math.min(n,a)},ut.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},ut.retinaScale=function(t,e){var i=t.currentDevicePixelRatio=e||"undefined"!=typeof window&&window.devicePixelRatio||1;if(1!==i){var n=t.canvas,a=t.height,o=t.width;n.height=a*i,n.width=o*i,t.ctx.scale(i,i),n.style.height||n.style.width||(n.style.height=a+"px",n.style.width=o+"px")}},ut.fontString=function(t,e,i){return e+" "+t+"px "+i},ut.longestText=function(t,e,i,n){var a=(n=n||{}).data=n.data||{},o=n.garbageCollect=n.garbageCollect||[];n.font!==e&&(a=n.data={},o=n.garbageCollect=[],n.font=e),t.font=e;var r=0;ut.each(i,function(e){null!=e&&!0!==ut.isArray(e)?r=ut.measureText(t,a,o,r,e):ut.isArray(e)&&ut.each(e,function(e){null==e||ut.isArray(e)||(r=ut.measureText(t,a,o,r,e))})});var s=o.length/2;if(s>i.length){for(var l=0;ln&&(n=o),n},ut.numberOfLabelLines=function(t){var e=1;return ut.each(t,function(t){ut.isArray(t)&&t.length>e&&(e=t.length)}),e},ut.color=X?function(t){return t instanceof CanvasGradient&&(t=st.global.defaultColor),X(t)}:function(t){return console.error("Color.js not found!"),t},ut.getHoverColor=function(t){return t instanceof CanvasPattern||t instanceof CanvasGradient?t:ut.color(t).saturate(.5).darken(.1).rgbString()}}(),ai._adapters=si,ai.Animation=vt,ai.animationService=bt,ai.controllers=ue,ai.DatasetController=Mt,ai.defaults=st,ai.Element=pt,ai.elements=Wt,ai.Interaction=ve,ai.layouts=ke,ai.platform=Ve,ai.plugins=Ee,ai.Scale=fi,ai.scaleService=He,ai.Ticks=li,ai.Tooltip=Je,ai.helpers.each(tn,function(t,e){ai.scaleService.registerScaleType(e,t,t._defaults)}),yn)yn.hasOwnProperty(_n)&&ai.plugins.register(yn[_n]);ai.platform.initialize();var Cn=ai;return"undefined"!=typeof window&&(window.Chart=ai),ai.Chart=ai,ai.Legend=yn.legend._element,ai.Title=yn.title._element,ai.pluginService=ai.plugins,ai.PluginBase=ai.Element.extend({}),ai.canvasHelpers=ai.helpers.canvas,ai.layoutService=ai.layouts,ai.LinearScaleBase=bi,ai.helpers.each(["Bar","Bubble","Doughnut","Line","PolarArea","Radar","Scatter"],function(t){ai[t]=function(e,i){return new ai(e,ai.helpers.merge(i||{},{type:t.charAt(0).toLowerCase()+t.slice(1)}))}}),Cn}); diff --git a/test/chart/data.js b/test/chart/data.js new file mode 100644 index 0000000..eaab333 --- /dev/null +++ b/test/chart/data.js @@ -0,0 +1,75 @@ + + var data = [{ + labels: [0, 0.7, 1.3, 1.9, 2.6, 3.5, 4.2, 4.9, 5.5, 6.2, 6.8, 7.4, 8.1, 8.7, 9.3, 10, 10.6, 11.2, 11.9, 12.5, 13.1, 13.8, 14.4, 15, 15.7, 16.3, 16.9, 17.6, 18.2, 18.8, 19.5, 20.1, 20.7, 21.4, 22, 22.6, 23.3, 23.9, 24.6, 25.2, 25.8, 26.5, 27.1, 27.7, 28.4, 29, 29.6, 30.3, 30.9, 31.5], + datasets: [{ + label: 'Documents', + backgroundColor: 'rgba(205, 37, 44, 0.2)', + borderColor: 'rgba(205, 37, 44, 1.00)', + data: [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + label: 'Frames', + backgroundColor: 'rgba(239, 116, 55, 0.2)', + borderColor: 'rgba(239, 116, 55, 1.00)', + data: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }] + }, { + labels: [0, 0.7, 1.3, 1.9, 2.6, 3.5, 4.2, 4.9, 5.5, 6.2, 6.8, 7.4, 8.1, 8.7, 9.3, 10, 10.6, 11.2, 11.9, 12.5, 13.1, 13.8, 14.4, 15, 15.7, 16.3, 16.9, 17.6, 18.2, 18.8, 19.5, 20.1, 20.7, 21.4, 22, 22.6, 23.3, 23.9, 24.6, 25.2, 25.8, 26.5, 27.1, 27.7, 28.4, 29, 29.6, 30.3, 30.9, 31.5], + datasets: [{ + label: 'JSEventListeners', + backgroundColor: 'rgba(248, 189, 64, 0.2)', + borderColor: 'rgba(248, 189, 64, 1.00)', + data: [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 4, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76] + }, { + label: 'Nodes', + backgroundColor: 'rgba(181, 202, 62, 0.2)', + borderColor: 'rgba(181, 202, 62, 1.00)', + data: [75, 183, 291, 399, 507, 615, 723, 831, 939, 1047, 1155, 1263, 111, 111, 219, 327, 435, 543, 651, 759, 867, 975, 1083, 1191, 1299, 1407, 1515, 1623, 1731, 1839, 1947, 2055, 2163, 2271, 2379, 2487, 2595, 2703, 2811, 2919, 3027, 3135, 3243, 3351, 3459, 3567, 3675, 3783, 3891, 3999] + }, { + label: 'LayoutCount', + backgroundColor: 'rgba(50, 184, 79, 0.2)', + borderColor: 'rgba(50, 184, 79, 1.00)', + data: [3, 18, 31, 44, 57, 70, 83, 96, 109, 122, 135, 148, 161, 174, 187, 200, 213, 226, 239, 252, 265, 278, 291, 304, 317, 330, 343, 356, 369, 382, 395, 408, 421, 434, 447, 460, 473, 486, 499, 512, 525, 538, 551, 564, 577, 590, 603, 616, 629, 642] + }, { + label: 'RecalcStyleCount', + backgroundColor: 'rgba(37, 180, 171, 0.2)', + borderColor: 'rgba(37, 180, 171, 1.00)', + data: [2, 31, 60, 89, 119, 148, 179, 228, 257, 286, 315, 344, 373, 402, 431, 460, 489, 518, 547, 576, 605, 634, 663, 692, 721, 750, 779, 808, 837, 866, 895, 924, 953, 982, 1011, 1040, 1069, 1098, 1127, 1156, 1185, 1214, 1243, 1272, 1301, 1330, 1359, 1388, 1417, 1446] + }] + }, { + labels: [0, 0.7, 1.3, 1.9, 2.6, 3.5, 4.2, 4.9, 5.5, 6.2, 6.8, 7.4, 8.1, 8.7, 9.3, 10, 10.6, 11.2, 11.9, 12.5, 13.1, 13.8, 14.4, 15, 15.7, 16.3, 16.9, 17.6, 18.2, 18.8, 19.5, 20.1, 20.7, 21.4, 22, 22.6, 23.3, 23.9, 24.6, 25.2, 25.8, 26.5, 27.1, 27.7, 28.4, 29, 29.6, 30.3, 30.9, 31.5], + datasets: [{ + label: 'LayoutDuration', + backgroundColor: 'rgba(45, 134, 203, 0.2)', + borderColor: 'rgba(45, 134, 203, 1.00)', + data: [0.034717, 0.045234, 0.052591, 0.060077, 0.067149, 0.071509, 0.076464, 0.083082, 0.090573, 0.100478, 0.110227, 0.118513, 0.127812, 0.135397, 0.143446, 0.152105, 0.158883, 0.165507, 0.17236, 0.179002, 0.186141, 0.192941, 0.200185, 0.207068, 0.215006, 0.224683, 0.233793, 0.242402, 0.253824, 0.263647, 0.274202, 0.280719, 0.287725, 0.294708, 0.301861, 0.308844, 0.316033, 0.32277, 0.329336, 0.337564, 0.345527, 0.353553, 0.362964, 0.372258, 0.382831, 0.392567, 0.401285, 0.408552, 0.415288, 0.422008] + }, { + label: 'RecalcStyleDuration', + backgroundColor: 'rgba(100, 58, 195, 0.2)', + borderColor: 'rgba(100, 58, 195, 1.00)', + data: [0.002738, 0.006824, 0.010537, 0.014037, 0.018236, 0.020886, 0.024098, 0.029695, 0.033175, 0.037279, 0.041541, 0.045205, 0.049411, 0.054237, 0.058096, 0.062371, 0.065937, 0.069282, 0.072792, 0.076427, 0.08009, 0.084139, 0.08768, 0.091037, 0.094712, 0.098608, 0.102891, 0.106416, 0.110557, 0.114785, 0.119077, 0.12265, 0.126408, 0.13009, 0.133841, 0.137573, 0.141269, 0.1447, 0.148171, 0.15194, 0.155498, 0.159181, 0.163059, 0.167256, 0.17212, 0.176481, 0.180456, 0.184155, 0.187568, 0.191164] + }, { + label: 'ScriptDuration', + backgroundColor: 'rgba(161, 59, 195, 0.2)', + borderColor: 'rgba(161, 59, 195, 1.00)', + data: [0.011806, 0.01932, 0.024839, 0.029735, 0.035304, 0.039916, 0.044773, 0.049431, 0.053814, 0.058653, 0.062587, 0.066457, 0.070276, 0.074693, 0.079702, 0.083712, 0.088783, 0.093909, 0.098117, 0.104154, 0.108997, 0.114945, 0.118872, 0.122772, 0.127332, 0.131368, 0.135275, 0.138926, 0.143478, 0.147394, 0.151377, 0.15608, 0.161111, 0.165037, 0.169151, 0.173286, 0.177763, 0.182366, 0.186596, 0.190741, 0.194672, 0.199272, 0.203283, 0.207111, 0.211225, 0.215767, 0.219568, 0.224003, 0.228104, 0.232082] + }, { + label: 'TaksDuration', + backgroundColor: 'rgba(221, 65, 150, 0.2)', + borderColor: 'rgba(221, 65, 150, 1.00)', + data: [0.084179, 0.146628, 0.195962, 0.243041, 0.295599, 0.34297, 0.391556, 0.444207, 0.491842, 0.541939, 0.591301, 0.63829, 0.692105, 0.743808, 0.791797, 0.839578, 0.888443, 0.934595, 0.979944, 1.027176, 1.075164, 1.124315, 1.170777, 1.217007, 1.263484, 1.312175, 1.362752, 1.408734, 1.460274, 1.510012, 1.559248, 1.604944, 1.653554, 1.699409, 1.746603, 1.795274, 1.844479, 1.888634, 1.934995, 1.984076, 2.031683, 2.080534, 2.130563, 2.180306, 2.231364, 2.280398, 2.326837, 2.375887, 2.42164, 2.466577] + }] + }, { + labels: [0, 0.7, 1.3, 1.9, 2.6, 3.5, 4.2, 4.9, 5.5, 6.2, 6.8, 7.4, 8.1, 8.7, 9.3, 10, 10.6, 11.2, 11.9, 12.5, 13.1, 13.8, 14.4, 15, 15.7, 16.3, 16.9, 17.6, 18.2, 18.8, 19.5, 20.1, 20.7, 21.4, 22, 22.6, 23.3, 23.9, 24.6, 25.2, 25.8, 26.5, 27.1, 27.7, 28.4, 29, 29.6, 30.3, 30.9, 31.5], + datasets: [{ + label: 'JSHeapUsedSize', + backgroundColor: 'rgba(163, 104, 70, 0.2)', + borderColor: 'rgba(163, 104, 70, 1.00)', + data: [5.3194427490234375, 6.03155517578125, 5.985557556152344, 6.4153289794921875, 5.796791076660156, 6.239433288574219, 6.671974182128906, 6.0579833984375, 6.404762268066406, 6.7397918701171875, 6.041435241699219, 6.315025329589844, 4.508964538574219, 4.4370880126953125, 4.7804718017578125, 5.0569915771484375, 5.3494720458984375, 4.672340393066406, 4.985466003417969, 5.2745513916015625, 5.53814697265625, 4.9271087646484375, 5.1971893310546875, 5.4645843505859375, 4.841468811035156, 5.109764099121094, 5.3697357177734375, 5.626617431640625, 4.9893798828125, 5.25299072265625, 5.529792785644531, 5.773414611816406, 5.109161376953125, 5.3402252197265625, 5.575325012207031, 5.8134765625, 6.044158935546875, 5.3932952880859375, 5.6724395751953125, 5.908287048339844, 6.143058776855469, 5.5333709716796875, 5.774436950683594, 6.010490417480469, 6.24365234375, 5.625343322753906, 5.8661651611328125, 5.6792449951171875, 5.911216735839844, 6.144889831542969] + }, { + label: 'JSHeapTotalSize', + backgroundColor: 'rgba(118, 118, 118, 0.2)', + borderColor: 'rgba(118, 118, 118, 1.00)', + data: [9.87109375, 10.12109375, 10.62109375, 10.62109375, 10.62109375, 10.66796875, 10.66796875, 10.66796875, 10.66796875, 10.66796875, 7.66796875, 7.66796875, 7.5390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.2890625, 7.2890625, 7.2890625, 7.2890625, 7.2890625, 7.2890625, 7.2890625, 7.2890625, 7.2890625] + }] + }] + \ No newline at end of file diff --git a/test/chart/index.html b/test/chart/index.html new file mode 100644 index 0000000..1ed57a6 --- /dev/null +++ b/test/chart/index.html @@ -0,0 +1,97 @@ + + + + + + + Metrics Chart + + + + + + + + + + + + + + + + + + + + diff --git a/test/tests/eventlistener/index.html b/test/tests/eventlistener/index.html new file mode 100644 index 0000000..a2b291d --- /dev/null +++ b/test/tests/eventlistener/index.html @@ -0,0 +1,85 @@ + + + + + + Test EventListener + + + + + +
    +
    +

    + Memory Test EventListener +

    +

    Test EventListener in dynamic content!

    +
    +
    + +
    +
    + +
    +
    + + + + diff --git a/test/tests/eventlistener/index.js b/test/tests/eventlistener/index.js new file mode 100644 index 0000000..e202b9a --- /dev/null +++ b/test/tests/eventlistener/index.js @@ -0,0 +1,155 @@ +/* eslint no-console: ["error", { allow: ["log", "warn", "error"] }] */ + +const puppeteer = require('puppeteer') +const fse = require('fs-extra') +const _ = require('lodash') + +const CYCLES = 50 +const TIMEOUT = 250 + +;(async () => { + const browser = await puppeteer.launch({ + headless: false, + args: ['--disable-web-security'], + defaultViewport: { + width: 1920, + height: 1280, + hasTouch: false + } + }) + const page = await browser.newPage() + await page.goto(`file://${__dirname}/index.html`) + + console.log('App loaded') + + const metrics = [] + + for (let i = 0; i < CYCLES; i++) { + console.log(`Cycle ${i + 1} of ${CYCLES}`) + + await sleep(TIMEOUT) + metrics.push(await page.metrics()) + + await page.click('#add') // button 1 + await sleep(100) + for (let j = 0; j < 10; j++) { + await page.click('#contentRandom') // button in card + } + await sleep(100) + await page.click('#delete') // button 2 + } + + await writeMetrics(metrics) + + await page.setViewport({ + width: 1920, + height: 1280, + deviceScaleFactor: 1 + }) + + await page.goto(`file://${__dirname}/../../chart/index.html`) + + //await browser.close() +})() + +function sleep(milliseconds) { + return new Promise(resolve => setTimeout(resolve, milliseconds)) +} + +async function writeMetrics(metrics) { + const first = metrics[0].Timestamp + const timestamp = metrics.map(it => _.round(it.Timestamp - first, 1)) + const documents = metrics.map(it => it.Documents) + const frames = metrics.map(it => it.Frames) + const jsEventListeners = metrics.map(it => it.JSEventListeners) + const nodes = metrics.map(it => it.Nodes) + const layoutCount = metrics.map(it => it.LayoutCount) + const recalcStyleCount = metrics.map(it => it.RecalcStyleCount) + const layoutDuration = metrics.map(it => it.LayoutDuration) + const recalcStyleDuration = metrics.map(it => it.RecalcStyleDuration) + const scriptDuration = metrics.map(it => it.ScriptDuration) + const taskDuration = metrics.map(it => it.TaskDuration) + const jsHeapUsedSize = metrics.map(it => it.JSHeapUsedSize / 1024 / 1024) + const jsHeapTotalSize = metrics.map(it => it.JSHeapTotalSize / 1024 / 1024) + + const labels = `[${timestamp.join(', ')}]` + + await fse.outputFile( + `${__dirname}/../../chart/data.js`, + ` + var data = [{ + labels: ${labels}, + datasets: [{ + label: 'Documents', + backgroundColor: 'rgba(205, 37, 44, 0.2)', + borderColor: 'rgba(205, 37, 44, 1.00)', + data: [${documents.join(', ')}] + }, { + label: 'Frames', + backgroundColor: 'rgba(239, 116, 55, 0.2)', + borderColor: 'rgba(239, 116, 55, 1.00)', + data: [${frames.join(', ')}] + }] + }, { + labels: ${labels}, + datasets: [{ + label: 'JSEventListeners', + backgroundColor: 'rgba(248, 189, 64, 0.2)', + borderColor: 'rgba(248, 189, 64, 1.00)', + data: [${jsEventListeners.join(', ')}] + }, { + label: 'Nodes', + backgroundColor: 'rgba(181, 202, 62, 0.2)', + borderColor: 'rgba(181, 202, 62, 1.00)', + data: [${nodes.join(', ')}] + }, { + label: 'LayoutCount', + backgroundColor: 'rgba(50, 184, 79, 0.2)', + borderColor: 'rgba(50, 184, 79, 1.00)', + data: [${layoutCount.join(', ')}] + }, { + label: 'RecalcStyleCount', + backgroundColor: 'rgba(37, 180, 171, 0.2)', + borderColor: 'rgba(37, 180, 171, 1.00)', + data: [${recalcStyleCount.join(', ')}] + }] + }, { + labels: ${labels}, + datasets: [{ + label: 'LayoutDuration', + backgroundColor: 'rgba(45, 134, 203, 0.2)', + borderColor: 'rgba(45, 134, 203, 1.00)', + data: [${layoutDuration.join(', ')}] + }, { + label: 'RecalcStyleDuration', + backgroundColor: 'rgba(100, 58, 195, 0.2)', + borderColor: 'rgba(100, 58, 195, 1.00)', + data: [${recalcStyleDuration.join(', ')}] + }, { + label: 'ScriptDuration', + backgroundColor: 'rgba(161, 59, 195, 0.2)', + borderColor: 'rgba(161, 59, 195, 1.00)', + data: [${scriptDuration.join(', ')}] + }, { + label: 'TaksDuration', + backgroundColor: 'rgba(221, 65, 150, 0.2)', + borderColor: 'rgba(221, 65, 150, 1.00)', + data: [${taskDuration.join(', ')}] + }] + }, { + labels: ${labels}, + datasets: [{ + label: 'JSHeapUsedSize', + backgroundColor: 'rgba(163, 104, 70, 0.2)', + borderColor: 'rgba(163, 104, 70, 1.00)', + data: [${jsHeapUsedSize.join(', ')}] + }, { + label: 'JSHeapTotalSize', + backgroundColor: 'rgba(118, 118, 118, 0.2)', + borderColor: 'rgba(118, 118, 118, 1.00)', + data: [${jsHeapTotalSize.join(', ')}] + }] + }] + ` + ) +} From 7f5e0e8e797d0deceb24b9aa8a999bf637b22efb Mon Sep 17 00:00:00 2001 From: Sebastian Kupke Date: Mon, 12 Aug 2019 15:38:03 +0200 Subject: [PATCH 30/30] Added Hammerjs memory test. --- package.json | 2 + test/chart/data.js | 32 ++-- test/tests/eventlistener/hammerjs.html | 92 +++++++++++ test/tests/eventlistener/hammerjs.js | 155 +++++++++++++++++++ test/tests/eventlistener/images/1280x960.png | Bin 0 -> 35880 bytes test/tests/eventlistener/images/96x96.png | Bin 0 -> 3602 bytes test/tests/eventlistener/index.html | 4 +- test/tests/eventlistener/index.js | 2 +- test/tests/eventlistener/remove.html | 91 +++++++++++ test/tests/eventlistener/remove.js | 155 +++++++++++++++++++ 10 files changed, 514 insertions(+), 19 deletions(-) create mode 100644 test/tests/eventlistener/hammerjs.html create mode 100644 test/tests/eventlistener/hammerjs.js create mode 100644 test/tests/eventlistener/images/1280x960.png create mode 100644 test/tests/eventlistener/images/96x96.png create mode 100644 test/tests/eventlistener/remove.html create mode 100644 test/tests/eventlistener/remove.js diff --git a/package.json b/package.json index 0b4eb3b..60c98f0 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,8 @@ "scripts": { "test": "node bin/testrunner.js", "test-eventlistener": "node ./test/tests/eventlistener/index.js", + "test-eventlistener-remove": "node ./test/tests/eventlistener/remove.js", + "test-eventlistener-hammerjs": "node ./test/tests/eventlistener/hammerjs.js", "build": "rollup --config ./rollup.config.js", "watch": "rollup --watch --config ./rollup.config.js", "3rdparty": "gulp", diff --git a/test/chart/data.js b/test/chart/data.js index eaab333..5ba3f8a 100644 --- a/test/chart/data.js +++ b/test/chart/data.js @@ -1,75 +1,75 @@ var data = [{ - labels: [0, 0.7, 1.3, 1.9, 2.6, 3.5, 4.2, 4.9, 5.5, 6.2, 6.8, 7.4, 8.1, 8.7, 9.3, 10, 10.6, 11.2, 11.9, 12.5, 13.1, 13.8, 14.4, 15, 15.7, 16.3, 16.9, 17.6, 18.2, 18.8, 19.5, 20.1, 20.7, 21.4, 22, 22.6, 23.3, 23.9, 24.6, 25.2, 25.8, 26.5, 27.1, 27.7, 28.4, 29, 29.6, 30.3, 30.9, 31.5], + labels: [0, 1.1, 2.1, 3.1, 4.1, 5.2, 6.4, 7.4, 8.4, 9.4, 10.5, 11.5, 12.5, 13.5, 14.5, 15.6, 16.6, 17.6, 18.6, 19.6, 20.7, 21.7, 22.7, 23.7, 24.7, 25.7, 26.7, 27.7, 28.8, 29.8, 30.8, 31.8, 32.8, 33.8, 34.9, 35.9, 36.9, 37.9, 38.9, 39.9, 40.9, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51.1, 52.1, 53.1, 54.1, 55.1, 56.1, 57.2, 58.2, 59.2, 60.2, 61.2, 62.2, 63.2, 64.2, 65.2, 66.2, 67.3, 68.3, 69.3, 70.3, 71.3, 72.3, 73.3, 74.3, 75.3, 76.3, 77.3, 78.3, 79.3, 80.3, 81.3, 82.4, 83.4, 84.4, 85.4, 86.4, 87.5, 88.5, 89.5, 90.5, 91.5, 92.6, 93.6, 94.6, 95.7, 96.7, 97.7, 98.7, 99.8, 100.8, 101.8, 102.9, 103.9, 104.9, 105.9, 107, 108, 109, 110.1, 111.1, 112.1, 113.1, 114.1, 115.2, 116.2, 117.2, 118.2, 119.3, 120.3, 121.3, 122.4, 123.4, 124.4, 125.4, 126.5, 127.5, 128.5, 129.6, 130.6, 131.6, 132.6, 133.7, 134.7, 135.7, 136.7, 137.7, 138.8, 139.8, 140.8, 141.8, 142.8, 143.8, 144.8, 145.8, 146.8, 147.9, 148.9, 149.9, 150.9, 151.9, 152.9, 154, 155, 156, 157, 158, 159, 160, 161.1, 162.1, 163.1, 164.1, 165.1, 166.1, 167.2, 168.2, 169.2, 170.2, 171.2, 172.2, 173.3, 174.3, 175.3, 176.3, 177.4, 178.4, 179.4, 180.4, 181.5, 182.5, 183.5, 184.5, 185.5, 186.6, 187.6, 188.6, 189.7, 190.7, 191.7, 192.8, 193.8, 194.8, 195.8, 196.8, 197.8, 198.9, 199.9, 200.9, 201.9, 203, 204, 205, 206, 207, 208, 209, 210.1, 211.1, 212.1, 213.2, 214.2, 215.2, 216.3, 217.3, 218.3, 219.4, 220.4, 221.4, 222.5, 223.5, 224.5, 225.6, 226.6, 227.6, 228.6, 229.6, 230.7, 231.7, 232.7, 233.7, 234.7, 235.8, 236.8, 237.8, 238.8, 239.9, 240.9, 241.9, 243, 244, 245, 246, 247, 248.1, 249.1, 250.1, 251.1, 252.2, 253.2, 254.3, 255.3, 256.3, 257.3, 258.4, 259.4, 260.4, 261.4, 262.5, 263.5, 264.5, 265.5, 266.5, 267.6, 268.6, 269.6, 270.6, 271.7, 272.7, 273.7, 274.8, 275.8, 276.8, 277.8, 278.9, 279.9, 281, 282, 283, 284, 285, 286, 287.1, 288.1, 289.1, 290.1, 291.2, 292.2, 293.2, 294.3, 295.3, 296.3, 297.3, 298.3, 299.3, 300.4, 301.4, 302.5, 303.5, 304.5, 305.5, 306.5, 307.5, 308.5, 309.5, 310.5, 311.6, 312.6, 313.7, 314.7, 315.7, 316.8, 317.8, 318.8, 319.9, 320.9, 321.9, 322.9, 323.9, 325, 326, 327, 328, 329.1, 330.1, 331.1, 332.2, 333.2, 334.2, 335.2, 336.3, 337.3, 338.3, 339.3, 340.4, 341.4, 342.4, 343.5, 344.5, 345.5, 346.6, 347.6, 348.6, 349.6, 350.6, 351.6, 352.7, 353.7, 354.8, 355.8, 356.8, 357.8, 358.8, 359.9, 360.9, 361.9, 363, 364, 365, 366, 367, 368, 369.1, 370.1, 371.1, 372.2, 373.2, 374.2, 375.3, 376.3, 377.3, 378.4, 379.4, 380.4, 381.4, 382.5, 383.5, 384.6, 385.6, 386.6, 387.6, 388.7, 389.7, 390.7, 391.7, 392.8, 393.8, 394.8, 395.8, 396.8, 397.8, 398.8, 399.8, 400.8, 401.8, 402.8, 403.8, 404.8, 405.8, 406.8, 407.8, 408.8, 409.8, 410.8, 411.8, 412.8, 413.8, 414.8, 415.8, 416.8, 417.8, 418.8, 419.8, 420.8, 421.8, 422.8, 423.8, 424.8, 425.8, 426.8, 427.8, 428.8, 429.8, 430.8, 431.8, 432.8, 433.8, 434.8, 435.8, 436.8, 437.8, 438.8, 439.8, 440.8, 441.8, 442.8, 443.8, 444.8, 445.8, 446.8, 447.8, 448.8, 449.8, 450.9, 451.9, 452.9, 453.9, 454.9, 455.9, 456.9, 457.9, 458.9, 459.9, 460.9, 461.9, 462.9, 463.9, 464.9, 465.9, 466.9, 467.9, 468.9, 469.9, 470.9, 471.9, 472.9, 473.9, 474.9, 475.9, 476.9, 477.9, 478.9, 479.9, 480.9, 481.9, 482.9, 483.9, 484.9, 485.9, 486.9, 487.9, 488.9, 490, 491, 492, 493, 494.1, 495.1, 496.1, 497.2, 498.2, 499.3, 500.3, 501.3, 502.4, 503.4, 504.5, 505.5, 506.5, 507.6, 508.6, 509.6, 510.6, 511.7, 512.7, 513.7, 514.8, 515.8, 516.8, 517.8, 518.9, 519.9, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533.2, 534.2, 535.2, 536.2, 537.2, 538.2, 539.2, 540.2, 541.2, 542.2, 543.2, 544.2, 545.2, 546.2, 547.2, 548.2, 549.2, 550.2, 551.2, 552.2, 553.2, 554.2, 555.2, 556.2, 557.2, 558.2, 559.2, 560.2, 561.3, 562.3, 563.4, 564.4, 565.4, 566.5, 567.5, 568.5, 569.6, 570.6, 571.6, 572.7, 573.7, 574.8, 575.8, 576.8, 577.9, 578.9, 579.9, 581, 582, 583, 584.1, 585.1, 586.2, 587.2, 588.2, 589.3, 590.3, 591.4, 592.5, 593.5, 594.5, 595.6, 596.6, 597.7, 598.7, 599.8, 600.8, 601.8, 602.9, 603.9, 605, 606, 607.1, 608.1, 609.2, 610.2, 611.2, 612.3, 613.3, 614.4, 615.4, 616.5, 617.5, 618.6, 619.6, 620.6, 621.7, 622.7, 623.8, 624.8, 625.9, 626.9, 627.9, 629, 630.1, 631.1, 632.2, 633.2, 634.3, 635.3, 636.4, 637.4, 638.5, 639.5, 640.6, 641.6, 642.7, 643.7, 644.7, 645.8, 646.9, 647.9, 648.9, 650, 651, 652.1, 653.1, 654.2, 655.2, 656.3, 657.3, 658.4, 659.4, 660.4, 661.5, 662.5, 663.6, 664.6, 665.7, 666.7, 667.8, 668.8, 669.9, 670.9, 672, 673, 674, 675.1, 676.1, 677.2, 678.2, 679.3, 680.3, 681.3, 682.3, 683.4, 684.4, 685.5, 686.5, 687.6, 688.6, 689.7, 690.7, 691.7, 692.8, 693.8, 694.9, 696.1, 697.1, 698.2, 699.3, 700.3, 701.4, 702.4, 703.5, 704.5, 705.6, 706.6, 707.7, 708.7, 709.7, 710.8, 711.8, 712.9, 714, 715, 716, 717.1, 718.1, 719.1, 720.2, 721.2, 722.2, 723.3, 724.4, 725.4, 726.5, 727.5, 728.6, 729.6, 730.7, 731.7, 732.7, 733.8, 734.9, 735.9, 737, 738, 739, 740, 741.1, 742.1, 743.2, 744.3, 745.3, 746.4, 747.4, 748.5, 749.5, 750.6, 751.6, 752.7, 753.7, 754.8, 755.9, 756.9, 758, 759, 760.1, 761.1, 762.1, 763.2, 764.3, 765.3, 766.4, 767.4, 768.4, 769.5, 770.5, 771.6, 772.6, 773.7, 774.7, 775.8, 776.8, 777.9, 778.9, 780, 781, 782.1, 783.2, 784.3, 785.4, 786.4, 787.5, 788.5, 789.5, 790.6, 791.6, 792.6, 793.6, 794.6, 795.6, 796.6, 797.6, 798.6, 799.6, 800.7, 801.7, 802.7, 803.7, 804.7, 805.7, 806.8, 807.8, 808.8, 809.9, 811, 812.2, 813.3, 814.3, 815.3, 816.4, 817.5, 818.6, 819.6, 820.7, 821.8, 822.9, 824, 825.2, 826.2, 827.4, 828.4, 829.6, 830.6, 831.8, 832.9, 834, 835.1, 836.2, 837.3, 838.4, 839.4, 840.5, 841.6, 842.7, 843.8, 845, 846.1, 847.2, 848.3, 849.4, 850.5, 851.7, 852.8, 854, 855.1, 856.3, 857.4, 858.5, 859.6, 860.7, 861.8, 862.9, 864, 865, 866, 867, 868.1, 869.1, 870.1, 871.2, 872.2, 873.2, 874.2, 875.2, 876.2, 877.2, 878.2, 879.2, 880.3, 881.3, 882.4, 883.4, 884.5, 885.5, 886.6, 887.6, 888.7, 889.8, 890.9, 892, 893, 894.1, 895.2, 896.3, 897.3, 898.5, 899.5, 900.6, 901.7, 902.7, 903.8, 904.9, 906, 907.1, 908.2, 909.2, 910.3, 911.4, 912.5, 913.6, 914.6, 915.7, 916.8, 917.9, 919, 920.1, 921.2, 922.2, 923.3, 924.4, 925.4, 926.5, 927.6, 928.6, 929.7, 930.8, 931.9, 932.9, 934.1, 935.2, 936.3, 937.4, 938.4, 939.6, 940.7, 941.8, 942.9, 944, 945.1, 946.3, 947.4, 948.4, 949.5, 950.6, 951.8, 952.9, 954.1, 955.2, 956.3, 957.4, 958.6, 959.7, 960.8, 961.9, 963, 964.1, 965.2, 966.4, 967.5, 968.7, 969.8, 970.9, 972.1, 973.2, 974.3, 975.5, 976.6, 977.8, 979, 980.2, 981.3, 982.5, 983.6, 984.8, 986, 987.1, 988.2, 989.3, 990.5, 991.6, 992.8, 994, 995.2, 996.3, 997.5, 998.7, 999.8, 1001, 1002.2, 1003.3, 1004.5, 1005.7, 1006.8, 1008, 1009.2, 1010.3, 1011.5, 1012.6, 1013.8, 1015, 1016.2, 1017.4, 1018.5, 1019.6, 1020.8, 1022, 1023.1, 1024.3, 1025.5, 1026.6, 1027.8, 1028.9, 1030.1, 1031.2, 1032.4, 1033.6, 1034.7, 1035.9, 1037.1, 1038.2, 1039.4, 1040.6, 1041.7, 1042.9, 1044, 1045.2, 1046.4, 1047.6, 1048.7, 1049.9, 1051.1, 1052.2, 1053.2, 1054.4, 1055.6, 1056.7, 1057.9, 1059.1, 1060.3, 1061.4, 1062.6, 1063.8, 1064.9, 1066, 1067.2, 1068.4, 1069.6, 1070.7, 1071.9, 1073, 1074.2, 1075.4, 1076.6, 1077.7, 1078.9, 1080.1, 1081.3, 1082.4, 1083.6, 1084.8, 1086, 1087.2, 1088.3, 1089.5, 1090.7, 1091.9, 1093.1, 1094.3, 1095.4, 1096.6, 1097.8, 1099, 1100.2, 1101.4, 1102.6, 1103.8, 1104.9, 1106.1, 1107.3, 1108.5, 1109.7, 1110.9, 1112.1, 1113.3, 1114.5, 1115.6, 1116.8, 1118, 1119.2, 1120.4, 1121.5, 1122.7, 1123.9, 1125.1, 1126.3, 1127.5, 1128.7, 1129.9, 1131.1, 1132.3, 1133.5, 1134.6, 1135.8, 1137, 1138.1, 1139.3, 1140.5, 1141.7, 1142.9, 1144.1, 1145.3, 1146.4, 1147.6, 1148.8, 1150, 1151.2, 1152.4, 1153.6, 1154.7, 1155.9, 1157.2, 1158.4, 1159.6, 1160.7, 1161.9, 1163.1, 1164.2, 1165.3, 1166.5, 1167.7, 1168.9, 1170, 1171.2, 1172.4, 1173.6, 1174.8, 1176, 1177.2, 1178.4, 1179.6, 1180.8, 1181.9, 1183.1, 1184.3, 1185.3, 1186.5, 1187.7, 1188.9, 1190.1, 1191.3, 1192.4, 1193.6, 1194.8, 1196, 1197.2, 1198.4, 1199.6, 1200.7, 1201.9, 1203, 1204.2, 1205.4, 1206.6, 1207.8, 1209, 1210.1, 1211.3, 1212.5, 1213.6, 1214.8, 1216, 1217.2, 1218.4, 1219.6, 1220.8, 1222, 1223.2, 1224.3, 1225.5, 1226.7, 1227.9, 1229, 1230.2, 1231.4, 1232.6, 1233.8, 1235, 1236.2, 1237.4, 1238.6, 1239.8, 1241, 1242.2, 1243.4, 1244.6, 1245.8, 1247, 1248.2, 1249.4, 1250.6, 1251.8, 1253, 1254.2, 1255.4, 1256.5, 1257.7, 1258.9, 1260, 1261.2, 1262.4, 1263.6, 1264.8, 1266, 1267.2, 1268.4, 1269.6, 1270.8, 1272, 1273.2, 1274.4, 1275.6, 1276.8, 1278, 1279.2, 1280.4, 1281.6, 1282.8, 1284, 1285.2, 1286.4, 1287.6, 1288.8, 1290, 1291.2, 1292.4, 1293.5, 1294.7, 1295.9, 1297.1, 1298.3, 1299.5, 1300.7, 1301.9, 1303, 1304.2, 1305.4, 1306.6, 1307.8, 1309, 1310.2, 1311.3, 1312.5, 1313.7, 1314.9, 1316.1, 1317.3, 1318.3, 1319.5, 1320.7, 1321.9, 1323, 1324.2, 1325.4, 1326.5, 1327.7, 1328.9, 1330.1, 1331.2, 1332.4, 1333.6, 1334.8, 1336, 1337.2, 1338.4, 1339.6, 1340.8, 1342, 1343.1, 1344.3, 1345.5, 1346.7, 1347.9, 1349, 1350.2, 1351.4, 1352.6, 1353.8, 1355, 1356.1, 1357.3, 1358.5, 1359.7, 1360.9, 1362.1, 1363.3, 1364.5, 1365.7, 1366.9, 1368, 1369.2, 1370.4, 1371.5, 1372.7, 1373.8, 1375, 1376.2, 1377.3, 1378.5, 1379.6, 1380.8, 1382, 1383.2, 1384.4, 1385.6, 1386.8, 1388, 1389.2, 1390.4, 1391.6, 1392.8, 1394, 1395.1, 1396.3, 1397.5, 1398.7, 1399.9, 1401.1, 1402.3, 1403.5, 1404.7, 1405.9, 1407.1, 1408.3, 1409.5, 1410.7, 1411.9, 1413.1, 1414.3, 1415.5, 1416.7, 1417.9, 1419.1, 1420.3, 1421.5, 1422.7, 1423.9, 1425.1, 1426.3, 1427.5, 1428.7, 1429.9, 1431.1, 1432.3, 1433.5, 1434.7, 1435.9, 1437.1, 1438.2, 1439.4, 1440.6, 1441.8, 1443, 1444.2, 1445.4, 1446.6, 1447.8, 1449, 1450.2, 1451.4, 1452.6, 1453.7, 1454.9, 1456.1, 1457.3, 1458.5, 1459.7, 1460.9, 1462.1, 1463.3, 1464.5, 1465.7, 1466.9, 1468.1, 1469.3, 1470.5, 1471.7, 1472.9, 1474.1, 1475.3, 1476.5, 1477.6, 1478.8, 1480, 1481.2, 1482.4, 1483.6, 1484.8, 1485.9, 1487.1, 1488.3, 1489.5, 1490.7, 1491.9, 1493.1, 1494.3, 1495.5, 1496.7, 1497.9, 1499.1, 1500.3, 1501.5, 1502.7, 1503.8, 1505, 1506.2, 1507.4, 1508.6, 1509.8, 1511, 1512.1, 1513.3, 1514.5, 1515.7, 1516.9, 1518.1, 1519.3, 1520.5, 1521.7, 1522.9, 1524.1, 1525.2, 1526.4, 1527.6, 1528.8, 1530, 1531.2, 1532.3, 1533.5, 1534.7, 1535.9, 1537.1, 1538.4, 1539.6, 1540.8, 1542, 1543.2, 1544.4, 1545.6, 1546.7, 1547.9, 1549.1, 1550.3, 1551.5, 1552.7, 1553.9, 1555.1, 1556.3, 1557.5, 1558.7, 1559.9, 1561.1, 1562.3, 1563.5, 1564.7, 1565.8, 1567, 1568.2, 1569.4, 1570.6, 1571.8, 1573, 1574.2, 1575.4, 1576.6, 1577.8, 1579, 1580.2, 1581.4, 1582.6, 1583.8, 1585, 1586.2, 1587.4, 1588.6, 1589.8, 1591, 1592.2, 1593.4, 1594.6, 1595.8, 1597, 1598.2, 1599.4, 1600.6, 1601.8, 1603, 1604.2, 1605.4, 1606.6, 1607.8, 1609, 1610.2, 1611.4, 1612.6, 1613.8, 1615, 1616.2, 1617.4, 1618.6, 1619.8, 1621, 1622.2, 1623.4, 1624.6, 1625.8, 1627, 1628.2, 1629.4, 1630.6, 1631.8, 1633, 1634.2, 1635.4, 1636.6, 1637.8, 1639, 1640.2, 1641.4, 1642.6, 1643.8, 1645, 1646.2, 1647.4, 1648.6, 1649.8, 1651, 1652.2, 1653.4, 1654.6, 1655.8, 1657, 1658.2, 1659.4, 1660.6, 1661.8, 1663, 1664.2, 1665.4, 1666.6, 1667.8, 1669, 1670.2, 1671.4, 1672.6, 1673.8, 1675, 1676.2, 1677.4, 1678.5, 1679.8, 1681, 1682.2, 1683.4, 1684.6, 1685.8, 1687, 1688.2, 1689.4, 1690.6, 1691.8, 1693, 1694.2, 1695.4, 1696.6, 1697.8, 1699, 1700.2, 1701.4, 1702.6, 1703.8, 1705, 1706.2, 1707.4, 1708.6, 1709.8, 1711, 1712.2, 1713.4, 1714.6, 1715.8, 1717, 1718.2, 1719.4, 1720.6, 1721.8, 1723, 1724.2, 1725.4, 1726.6, 1727.8, 1729, 1730.2, 1731.4, 1732.6, 1733.8, 1735, 1736.2, 1737.4, 1738.6, 1739.8, 1741, 1742.2, 1743.4, 1744.6, 1745.8, 1747, 1748.2, 1749.4, 1750.6, 1751.8, 1753, 1754.2, 1755.4, 1756.6, 1757.8, 1759, 1760.2, 1761.4, 1762.6, 1763.8, 1765, 1766.2, 1767.4, 1768.6, 1769.8, 1771, 1772.2, 1773.4, 1774.6, 1775.8, 1777, 1778.2, 1779.5, 1780.7, 1781.9, 1783.1, 1784.3, 1785.5, 1786.7, 1787.9, 1789.1, 1790.3, 1791.5, 1792.7, 1793.9, 1795.1, 1796.3, 1797.5, 1798.7, 1799.9, 1801.1, 1802.3, 1803.5, 1804.7, 1805.9, 1807.1, 1808.3, 1809.5, 1810.7, 1811.9, 1813.1, 1814.3, 1815.5, 1816.7, 1817.9, 1819.1, 1820.3, 1821.5, 1822.7, 1823.9, 1825.1, 1826.3, 1827.5, 1828.7, 1829.9, 1831.1, 1832.3, 1833.5, 1834.7, 1835.9, 1837.1, 1838.3, 1839.5, 1840.7, 1841.9, 1843.2, 1844.4, 1845.6, 1846.8, 1848, 1849.2, 1850.4, 1851.6, 1852.8, 1854, 1855.2, 1856.4, 1857.6, 1858.8, 1860, 1861.2, 1862.4, 1863.6, 1864.8, 1866, 1867.2, 1868.4, 1869.6, 1870.8, 1872, 1873.2, 1874.4, 1875.6, 1876.8, 1878, 1879.2, 1880.4, 1881.6, 1882.8, 1884, 1885.2, 1886.4, 1887.6, 1888.8, 1890, 1891.2, 1892.4, 1893.6, 1894.8, 1896, 1897.2, 1898.4, 1899.7, 1900.8, 1902.1, 1903.3, 1904.5, 1905.7, 1906.9, 1908.1, 1909.3, 1910.5, 1911.7, 1912.9, 1914.1, 1915.3, 1916.5, 1917.7, 1918.9, 1920.1, 1921.3, 1922.5, 1923.7, 1924.9, 1926.1, 1927.3, 1928.5, 1929.7, 1930.9, 1932.1, 1933.3, 1934.5, 1935.7, 1936.9, 1938.1, 1939.3, 1940.5, 1941.7, 1943, 1944.2, 1945.4, 1946.6, 1947.8, 1949, 1950.2, 1951.4, 1952.6, 1953.8, 1955, 1956.2, 1957.4, 1958.6, 1959.8, 1961, 1962.2, 1963.4, 1964.6, 1965.8, 1967, 1968.2, 1969.4, 1970.6, 1971.8, 1973, 1974.2, 1975.4, 1976.6, 1977.8, 1979, 1980.2, 1981.4, 1982.6, 1983.8, 1985, 1986.2, 1987.4, 1988.6, 1989.8, 1991, 1992.2, 1993.4, 1994.6, 1995.8, 1997, 1998.2, 1999.4, 2000.6, 2001.9, 2003.1, 2004.3, 2005.5, 2006.7, 2007.9, 2009.1, 2010.3, 2011.5, 2012.7, 2013.9, 2015.1, 2016.3, 2017.5, 2018.7, 2019.9, 2021.1, 2022.3, 2023.5, 2024.7, 2025.9, 2027.1, 2028.3, 2029.5, 2030.7, 2031.9, 2033.1, 2034.3, 2035.5, 2036.7, 2037.9, 2039.1, 2040.3, 2041.5, 2042.7, 2043.9, 2045.1, 2046.3, 2047.5, 2048.7, 2049.9, 2051.1, 2052.3, 2053.5, 2054.7, 2055.9, 2057.1, 2058.4, 2059.5, 2060.7, 2061.9, 2063.2, 2064.4, 2065.6, 2066.8, 2068, 2069.2, 2070.4, 2071.6, 2072.8, 2074, 2075.2, 2076.4, 2077.6, 2078.8, 2080, 2081.2, 2082.4, 2083.6, 2084.8, 2086, 2087.2, 2088.4, 2089.6, 2090.8, 2092, 2093.2, 2094.4, 2095.6, 2096.8, 2098, 2099.2, 2100.4, 2101.6, 2102.8, 2104, 2105.2, 2106.4, 2107.6, 2108.8, 2110, 2111.2, 2112.4, 2113.6, 2114.8, 2116, 2117.2, 2118.4, 2119.6, 2120.8, 2122, 2123.2, 2124.4, 2125.7, 2126.9, 2128.1, 2129.3, 2130.5, 2131.7, 2132.9, 2134.1, 2135.3, 2136.5, 2137.7, 2138.9, 2140.1, 2141.5, 2142.8, 2144, 2145.2, 2146.4, 2147.7, 2148.9, 2150.1, 2151.3, 2152.5, 2153.7, 2154.9, 2156.1, 2157.3, 2158.5, 2159.7, 2160.9, 2162.1, 2163.3, 2164.5, 2165.7, 2166.9, 2168.1, 2169.3, 2170.5, 2171.7, 2172.9, 2174.1, 2175.3, 2176.5, 2177.7, 2179, 2180.1, 2181.3, 2182.6, 2183.8, 2184.9, 2186.2, 2187.4, 2188.6, 2189.8, 2191, 2192.2, 2193.4, 2194.6, 2195.8, 2197, 2198.2, 2199.4, 2200.6, 2201.8, 2203, 2204.2, 2205.4, 2206.6, 2207.8, 2209, 2210.2, 2211.4, 2212.6, 2213.8, 2215, 2216.2, 2217.4, 2218.6, 2219.8, 2221, 2222.2, 2223.4, 2224.6, 2225.8, 2227, 2228.2, 2229.4, 2230.6, 2231.8, 2233, 2234.2, 2235.4, 2236.6, 2237.8, 2239, 2240.2, 2241.5, 2242.7, 2243.9, 2245.1, 2246.3, 2247.5, 2248.7, 2249.9, 2251.1, 2252.3, 2253.5, 2254.7, 2255.9, 2257.1, 2258.3, 2259.5, 2260.7, 2261.9, 2263.1, 2264.3, 2265.5, 2266.7, 2267.9, 2269.1, 2270.3, 2271.5, 2272.7, 2273.9, 2275.1, 2276.3, 2277.5, 2278.7, 2279.9, 2281.1, 2282.3, 2283.5, 2284.7, 2285.9, 2287.1, 2288.4, 2289.6, 2290.8, 2292, 2293.2, 2294.4, 2295.6, 2296.8, 2298, 2299.2, 2300.4, 2301.6, 2302.8, 2304, 2305.2, 2306.4, 2307.6, 2308.8, 2310, 2311.2, 2312.4, 2313.6, 2314.8, 2316, 2317.2, 2318.4, 2319.6, 2320.8, 2322, 2323.2, 2324.4, 2325.6, 2326.8, 2328, 2329.2, 2330.4, 2331.6, 2332.8, 2334, 2335.2, 2336.4, 2337.6, 2338.8, 2340, 2341.2, 2342.4, 2343.6, 2344.8, 2346, 2347.2, 2348.4, 2349.7, 2350.9, 2352.1, 2353.3, 2354.5, 2355.7, 2356.9, 2358.1, 2359.3, 2360.5, 2361.7, 2362.9, 2364.1, 2365.3, 2366.5, 2367.7, 2369, 2370.2, 2371.4, 2372.6, 2373.8, 2375, 2376.2, 2377.4, 2378.6, 2379.8, 2381, 2382.2, 2383.4, 2384.6, 2385.8, 2387, 2388.2, 2389.4, 2390.6, 2391.8, 2393, 2394.2, 2395.4, 2396.6, 2397.8, 2399, 2400.2, 2401.5, 2402.7, 2403.9, 2405.1, 2406.3, 2407.5, 2408.7, 2409.9, 2411.1, 2412.3, 2413.5, 2414.7, 2415.9, 2417.1, 2418.3, 2419.5, 2420.7, 2421.9, 2423.1, 2424.3, 2425.5, 2426.7, 2427.9, 2429.1, 2430.3, 2431.5, 2432.7, 2433.9, 2435.1, 2436.3, 2437.5, 2438.7, 2439.9, 2441.2, 2442.4, 2443.6, 2444.8, 2446, 2447.2, 2448.4, 2449.6, 2450.8, 2452, 2453.2, 2454.4, 2455.6, 2456.8, 2458, 2459.2, 2460.4, 2461.6, 2462.8, 2464, 2465.2, 2466.4, 2467.6, 2468.8, 2470, 2471.2, 2472.5, 2473.7, 2474.9, 2476.1, 2477.3, 2478.5, 2479.7, 2480.9, 2482.1, 2483.3, 2484.5, 2485.7, 2486.9, 2488.1, 2489.3, 2490.5, 2491.7, 2492.9, 2494.1, 2495.3, 2496.5, 2497.7, 2498.9, 2500.1, 2501.3, 2502.5, 2503.7, 2504.9, 2506.1, 2507.3, 2508.5, 2509.7, 2510.9, 2512.1, 2513.3, 2514.5, 2515.7, 2516.9, 2518.1, 2519.3, 2520.5, 2521.8, 2523, 2524.2, 2525.4, 2526.6, 2527.8, 2529, 2530.2, 2531.4, 2532.6, 2533.8, 2535, 2536.2, 2537.4, 2538.6, 2539.8, 2541, 2542.2, 2543.4, 2544.6, 2545.8, 2547, 2548.2, 2549.4, 2550.6, 2551.8, 2553, 2554.2, 2555.4, 2556.7, 2557.9, 2559.1, 2560.3, 2561.5, 2562.7, 2563.9, 2565.1, 2566.3, 2567.5, 2568.7, 2569.9, 2571.1, 2572.3, 2573.5, 2574.7, 2575.9, 2577.1, 2578.3, 2579.5, 2580.8, 2581.9, 2583.2, 2584.4, 2585.6, 2586.8, 2588, 2589.2, 2590.4, 2591.6, 2592.8, 2594, 2595.2, 2596.4, 2597.6, 2598.8, 2600, 2601.2, 2602.4, 2603.6, 2604.8, 2606, 2607.2, 2608.4, 2609.6, 2610.8, 2612, 2613.2, 2614.4, 2615.6, 2616.8, 2618, 2619.2, 2620.4, 2621.6, 2622.9, 2624.1, 2625.3, 2626.5, 2627.7, 2628.9, 2630.1, 2631.3, 2632.5, 2633.7, 2634.9, 2636.1, 2637.3, 2638.5, 2639.7, 2640.9, 2642.2, 2643.4, 2644.5, 2645.8, 2647, 2648.2, 2649.4, 2650.6, 2651.8, 2653, 2654.2, 2655.4, 2656.6, 2657.8, 2659, 2660.2, 2661.4, 2662.6, 2663.9, 2665.1, 2666.3, 2667.5, 2668.7, 2669.9, 2671.1, 2672.3, 2673.5, 2674.7, 2675.9, 2677.1, 2678.3, 2679.5, 2680.8, 2682, 2683.2, 2684.4, 2685.6, 2686.8, 2688, 2689.2, 2690.4, 2691.6, 2692.8, 2694, 2695.2, 2696.4, 2697.6, 2698.9, 2700.1, 2701.3, 2702.5, 2703.7, 2705, 2706.2, 2707.4, 2708.6, 2709.8, 2711, 2712.2, 2713.4, 2714.6, 2715.9, 2717.1, 2718.3, 2719.5, 2720.7, 2721.9, 2723.1, 2724.3, 2725.5, 2726.7, 2727.9, 2729.1, 2730.4, 2731.6, 2732.8, 2734, 2735.2, 2736.4, 2737.6, 2738.8, 2740.1, 2741.3, 2742.5, 2743.7, 2744.9, 2746.2, 2747.4, 2748.6, 2749.8, 2751.1, 2752.3, 2753.5, 2754.7, 2755.9, 2757.1, 2758.3, 2759.5, 2760.7, 2761.9, 2763.1, 2764.4, 2765.6, 2766.8, 2768, 2769.2, 2770.4, 2771.6, 2772.8, 2774, 2775.3, 2776.5, 2777.7, 2778.9, 2780.1, 2781.3, 2782.5, 2783.7, 2784.9, 2786.1, 2787.3, 2788.5, 2789.7, 2790.9, 2792.2, 2793.4, 2794.6, 2795.8, 2797, 2798.2, 2799.4, 2800.6, 2801.8, 2803, 2804.2, 2805.4, 2806.7, 2807.9, 2809.1, 2810.3, 2811.5, 2812.7, 2813.9, 2815.1, 2816.3, 2817.5, 2818.7, 2819.9, 2821.1, 2822.4, 2823.6, 2824.8, 2826, 2827.2, 2828.4, 2829.6, 2830.8, 2832, 2833.2, 2834.5, 2835.7, 2836.9, 2838.1, 2839.3, 2840.5, 2841.7, 2843, 2844.2, 2845.4, 2846.6, 2847.8, 2849, 2850.2, 2851.5, 2852.7, 2853.9, 2855.1, 2856.3, 2857.5, 2858.7, 2860, 2861.2, 2862.4, 2863.6, 2864.8, 2866, 2867.3, 2868.5, 2869.7, 2870.9, 2872.2, 2873.4, 2874.6, 2875.8, 2877, 2878.2, 2879.4, 2880.7, 2881.9, 2883.1, 2884.3, 2885.5, 2886.7, 2887.9, 2889.2, 2890.4, 2891.6, 2892.8, 2894, 2895.2, 2896.4, 2897.7, 2898.9, 2900.1, 2901.3, 2902.5, 2903.7, 2904.9, 2906.2, 2907.4, 2908.6, 2909.8, 2911, 2912.2, 2913.4, 2914.6, 2915.9, 2917.1, 2918.3, 2919.5, 2920.7, 2921.9, 2923.1, 2924.4, 2925.6, 2926.8, 2928, 2929.2, 2930.5, 2931.7, 2932.9, 2934.1, 2935.3, 2936.5, 2937.7, 2939, 2940.2, 2941.4, 2942.6, 2943.8, 2945.1, 2946.3, 2947.5, 2948.7, 2949.9, 2951.2, 2952.4, 2953.6, 2954.8, 2956, 2957.2, 2958.4, 2959.7, 2960.9, 2962.1, 2963.3, 2964.5, 2965.8, 2967, 2968.2, 2969.4, 2970.6, 2971.8, 2973, 2974.3, 2975.5, 2976.7, 2977.9, 2979.1, 2980.3, 2981.5, 2982.8, 2984, 2985.2, 2986.4, 2987.6, 2988.8, 2990.1, 2991.3, 2992.5, 2993.7, 2994.9, 2996.1, 2997.4, 2998.6, 2999.8, 3001, 3002.2, 3003.5, 3004.7, 3005.9, 3007.1, 3008.3, 3009.5, 3010.8, 3012, 3013.2, 3014.4, 3015.6, 3016.8, 3018.1, 3019.3, 3020.5, 3021.7, 3022.9, 3024.1, 3025.3, 3026.6, 3027.8, 3029, 3030.2, 3031.4, 3032.7, 3033.9, 3035.1, 3036.3, 3037.5, 3038.8, 3040, 3041.2, 3042.4, 3043.6, 3044.8, 3046, 3047.2, 3048.5, 3049.7, 3050.9, 3052.2, 3053.4, 3054.7, 3055.9, 3057.1, 3058.3, 3059.5, 3060.7, 3061.9, 3063.1, 3064.4, 3065.6, 3066.8, 3068, 3069.2, 3070.4, 3071.7, 3072.9, 3074.1, 3075.3, 3076.5, 3077.7, 3079, 3080.2, 3081.4, 3082.6, 3083.9, 3085.1, 3086.3, 3087.5, 3088.7, 3089.9, 3091.2, 3092.4, 3093.6, 3094.8, 3096, 3097.2, 3098.5, 3099.7, 3100.9, 3102.2, 3103.4, 3104.6, 3105.8, 3107.1, 3108.3, 3109.5, 3110.8, 3112, 3113.3, 3114.5, 3115.7, 3116.9, 3118.2, 3119.4, 3120.7, 3122, 3123.2, 3124.5, 3125.7, 3126.9, 3128.2, 3129.4, 3130.6, 3131.9, 3133.1, 3134.4, 3135.6, 3136.9, 3138.1, 3139.4, 3140.6, 3141.9, 3143.1, 3144.4, 3145.6, 3146.9, 3148.1, 3149.4, 3150.6, 3151.8, 3153.1, 3154.3, 3155.6, 3156.8, 3158.1, 3159.3, 3160.6, 3161.8, 3163.1, 3164.3, 3165.6, 3166.8, 3168.1, 3169.3, 3170.6, 3171.8, 3173.1, 3174.3, 3175.5, 3176.8, 3178, 3179.3, 3180.5, 3181.8, 3183, 3184.3, 3185.5, 3186.8, 3188, 3189.2, 3190.5, 3191.7, 3193, 3194.2, 3195.5, 3196.8, 3198, 3199.3, 3200.5, 3201.8, 3203, 3204.3, 3205.5, 3206.8, 3208, 3209.3, 3210.5, 3211.7, 3213, 3214.2, 3215.5, 3216.8, 3218, 3219.3, 3220.5, 3221.8, 3223, 3224.2, 3225.5, 3226.7, 3228, 3229.2, 3230.4, 3231.7, 3232.9, 3234.2, 3235.5, 3236.7, 3238, 3239.2, 3240.5, 3241.7, 3243, 3244.2, 3245.4, 3246.7, 3247.9, 3249.1, 3250.4, 3251.6, 3252.9, 3254.2, 3255.4, 3256.7, 3257.9, 3259.1, 3260.4, 3261.6, 3262.9, 3264.1, 3265.4, 3266.6, 3267.9, 3269.1, 3270.4, 3271.7, 3272.9, 3274.1, 3275.4, 3276.6, 3277.9, 3279.2, 3280.4, 3281.6, 3282.9, 3284.1, 3285.4, 3286.6, 3287.9, 3289.1, 3290.3, 3291.6, 3292.9, 3294.1, 3295.4, 3296.6, 3297.9, 3299.1, 3300.4, 3301.6, 3302.9, 3304.1, 3305.4, 3306.6, 3307.9, 3309.1, 3310.4, 3311.7, 3312.9, 3314.1, 3315.4, 3316.6, 3317.9, 3319.1, 3320.4, 3321.6, 3322.9, 3324.1, 3325.4, 3326.6, 3327.8, 3329.1, 3330.4, 3331.6, 3332.9, 3334.1, 3335.4, 3336.6, 3337.9, 3339.1, 3340.4, 3341.6, 3342.9, 3344.1, 3345.4, 3346.6, 3347.9, 3350.1, 3351.4, 3352.6, 3353.8, 3355, 3356.2, 3357.4, 3358.7, 3359.9, 3361.1, 3362.3, 3363.6, 3364.8, 3366.1, 3367.3, 3368.6, 3369.8, 3371, 3372.3, 3373.5, 3374.7, 3375.9, 3377.2, 3378.4, 3379.6, 3380.8, 3382, 3383.3, 3384.5, 3385.7, 3386.9, 3388.2, 3389.4, 3390.7, 3391.9, 3393.1, 3394.4, 3395.6, 3396.8, 3398.1, 3399.3, 3400.5, 3401.8, 3403, 3404.2, 3405.4, 3406.7, 3408, 3409.2, 3410.4, 3411.7, 3412.9, 3414.1, 3415.4, 3416.6, 3417.8, 3419.1, 3420.3, 3421.5, 3422.8, 3424, 3425.2, 3426.4, 3427.7, 3428.9, 3430.1, 3431.4, 3432.6, 3433.9, 3435.1, 3436.3, 3437.6, 3438.8, 3440, 3441.2, 3442.5, 3443.7, 3445, 3446.2, 3447.4, 3448.6, 3449.8, 3451, 3452.3, 3453.5, 3454.7, 3455.9, 3457.1, 3458.3, 3459.5, 3460.7, 3461.9, 3463.1, 3464.4, 3465.6, 3466.9, 3468.1, 3469.3, 3470.5, 3471.7, 3472.9, 3474.1, 3475.3, 3476.5, 3477.7, 3478.9, 3480.1, 3481.3, 3482.6, 3483.8, 3485, 3486.2, 3487.5, 3488.7, 3489.9, 3491.1, 3492.3, 3493.5, 3494.7, 3496, 3497.2, 3498.4, 3499.6, 3500.8, 3502, 3503.2, 3504.4, 3505.7, 3506.9, 3508.1, 3509.3, 3510.5, 3511.7, 3512.9, 3514.1, 3515.3, 3516.6, 3517.8, 3519, 3520.2, 3521.4, 3522.6, 3523.8, 3525.1, 3526.3, 3527.5, 3528.7, 3529.9, 3531.1, 3532.3, 3533.5, 3534.7, 3536, 3537.2, 3538.4, 3539.6, 3540.8, 3542.1, 3543.3, 3544.6, 3545.9, 3547.1, 3548.4, 3549.6, 3550.8, 3552.1, 3553.3, 3554.5, 3555.7, 3557, 3558.2, 3559.4, 3560.7, 3561.9, 3563.1, 3564.4, 3565.6, 3566.9, 3568.1, 3569.4, 3570.6, 3571.9, 3573.1, 3574.3, 3575.6, 3576.8, 3578, 3579.3, 3580.5, 3581.8, 3583, 3584.2, 3585.5, 3586.7, 3587.9, 3589.2, 3590.4, 3591.6, 3592.9, 3594.1, 3595.3, 3596.6, 3597.8, 3599, 3600.3, 3601.5, 3602.7, 3603.9, 3605.2, 3606.5, 3607.7, 3609, 3610.2, 3611.5, 3612.7, 3613.9, 3615.1, 3616.4, 3617.6, 3618.8, 3620.1, 3621.3, 3622.5, 3623.8, 3625, 3626.3, 3627.6, 3628.8, 3630, 3631.3, 3632.5, 3633.7, 3635, 3636.2, 3637.4, 3638.6, 3639.9, 3641.1, 3642.3, 3643.6, 3644.8, 3646.1, 3647.3, 3648.6, 3649.8, 3651.1, 3652.3, 3653.5, 3654.8, 3656, 3657.3, 3658.5, 3659.7, 3661, 3662.2, 3663.5, 3664.7, 3666, 3667.2, 3668.5, 3669.8, 3671, 3672.2, 3673.5, 3674.7, 3676, 3677.2, 3678.5, 3679.7, 3681, 3682.2, 3683.5, 3684.7, 3686, 3687.2, 3688.5, 3689.7, 3691.1, 3692.3, 3693.6, 3694.8, 3696.1, 3697.3, 3698.6, 3699.8, 3701, 3702.3, 3703.5, 3704.7, 3705.9, 3707.2, 3708.4, 3709.7, 3711.2, 3712.7, 3714, 3715.2, 3716.7, 3718, 3719.2, 3720.4, 3721.7, 3722.9, 3724.1, 3725.4, 3726.6, 3727.9, 3729.1, 3730.4, 3731.6, 3732.9, 3734.1, 3735.4, 3736.6, 3737.9, 3739.1, 3740.3, 3741.6, 3742.8, 3744.1, 3745.3, 3746.6, 3747.8, 3749.6, 3751.3, 3752.6, 3753.9, 3755.3, 3756.5, 3757.7, 3759, 3760.4, 3761.6, 3762.9, 3764.1, 3765.3, 3766.7, 3768, 3769.2, 3770.5, 3771.8, 3773, 3774.2, 3775.5, 3776.9, 3778.3, 3780, 3781.4, 3782.9, 3784.1, 3785.6, 3786.9, 3788.4, 3789.7, 3791, 3792.4, 3793.7, 3795.1, 3796.6, 3797.8, 3799.1, 3800.3, 3801.6, 3803, 3804.3, 3805.7, 3807.1, 3808.4, 3809.7, 3811, 3812.3, 3813.7, 3815, 3816.4, 3817.7, 3819.1, 3820.5, 3821.8, 3823.3, 3824.7, 3826, 3827.5, 3828.8, 3830, 3831.3, 3832.5, 3833.8, 3835, 3836.3, 3837.5, 3838.8, 3840, 3841.3, 3842.5, 3843.8, 3845, 3846.2, 3847.5, 3848.8, 3850, 3851.3, 3852.5, 3853.8, 3855, 3856.2, 3857.5, 3858.7, 3860, 3861.2, 3862.5, 3863.7, 3865, 3866.3, 3867.5, 3868.7, 3870, 3871.4, 3872.7, 3873.9, 3875.2, 3876.4, 3877.7, 3879, 3880.2, 3881.5, 3882.8, 3884.1, 3885.3, 3886.5, 3887.7, 3888.9, 3890.2, 3891.4, 3892.7, 3894, 3895.3, 3896.5, 3897.8, 3899, 3900.3, 3901.6, 3902.8, 3904.2, 3905.4, 3906.7, 3908, 3909.3, 3910.6, 3911.9, 3913.2, 3914.5, 3915.8, 3917, 3918.3, 3919.6, 3920.9, 3922.2, 3923.4, 3924.7, 3925.9, 3927.2, 3928.5, 3929.7, 3931, 3932.3, 3933.5, 3934.8, 3936, 3937.3, 3938.6, 3939.8, 3941.1, 3942.3, 3943.6, 3944.8, 3946.1, 3947.3, 3948.6, 3949.8, 3951.1, 3952.3, 3953.6, 3954.8, 3956.1, 3957.3, 3958.6, 3959.8, 3961.2, 3962.4, 3963.7, 3965, 3966.2, 3967.5, 3968.7, 3970, 3971.2, 3972.5, 3973.7, 3975, 3976.4, 3977.6, 3978.9, 3980.1, 3981.4, 3982.7, 3984, 3985.2, 3986.5, 3987.8, 3989, 3990.3, 3991.5, 3992.8, 3994, 3995.3, 3996.5, 3997.8, 3999, 4000.3, 4001.6, 4002.8, 4004.1, 4005.4, 4006.7, 4008, 4009.3, 4010.6, 4011.9, 4013.1, 4014.4, 4015.6, 4016.9, 4018.1, 4019.4, 4021.5, 4023, 4024.3, 4025.6, 4026.9, 4028.1, 4029.5, 4030.8, 4032.1, 4033.4, 4034.6, 4035.9, 4037.2, 4038.4, 4039.7, 4040.9, 4042.2, 4043.4, 4044.7, 4046, 4047.2, 4048.5, 4049.7, 4051, 4052.3, 4053.5, 4054.7, 4056, 4057.2, 4058.5, 4059.8, 4061, 4062.3, 4063.6, 4064.9, 4066.1, 4067.4, 4068.7, 4069.9, 4071.2, 4072.4, 4073.8, 4075, 4076.3, 4077.6, 4078.8, 4080.1, 4081.3, 4082.6, 4083.8, 4085.1, 4086.4, 4087.6, 4088.8, 4090.1, 4091.4, 4092.7, 4094, 4095.2, 4096.5, 4097.7, 4099.1, 4100.4, 4101.7, 4103.1, 4104.4, 4105.7, 4107, 4108.2, 4109.5, 4110.8, 4112, 4113.3, 4114.5, 4115.8, 4117.1, 4118.3, 4119.6, 4120.8, 4122.2, 4123.4, 4124.7, 4126, 4127.2, 4128.4, 4129.7, 4131, 4132.2, 4133.5, 4134.7, 4136, 4137.3, 4138.5, 4139.8, 4141.1, 4142.3, 4143.6, 4144.9, 4146.2, 4147.5, 4148.7, 4150, 4151.2, 4152.5, 4153.8, 4155, 4156.3, 4157.5, 4158.8, 4160, 4161.3, 4162.6, 4163.8, 4165.1, 4166.3, 4167.6, 4168.9, 4170.2, 4171.4, 4172.7, 4174, 4175.3, 4176.5, 4177.8, 4179, 4180.3, 4181.5, 4182.8, 4184, 4185.3, 4186.5, 4187.8, 4189.1, 4190.3, 4191.6, 4192.9, 4194.1, 4195.4, 4196.6, 4197.9, 4199.1, 4200.4, 4201.7, 4202.9, 4204.2, 4205.5, 4206.7, 4208, 4209.3, 4210.5, 4211.8, 4213, 4214.3, 4215.6, 4216.9, 4218.1, 4219.4, 4220.7, 4221.9, 4223.2, 4224.6, 4225.9, 4227.1, 4228.4, 4229.7, 4230.9, 4232.2, 4233.5, 4234.8, 4236.1, 4237.5, 4238.8, 4240.2, 4241.4, 4242.7, 4244, 4245.2, 4246.6, 4247.9, 4249.2, 4250.6, 4251.9, 4253.2, 4254.5, 4255.8, 4257, 4258.3, 4259.6, 4261, 4262.2, 4263.5, 4264.9, 4266.2, 4267.4, 4268.7, 4270, 4271.2, 4272.5, 4273.7, 4275, 4276.3, 4277.6, 4278.8, 4280.1, 4281.4, 4282.7, 4284, 4285.2, 4286.6, 4287.9, 4289.2, 4290.5, 4291.8, 4293.1, 4294.3, 4295.6, 4296.9, 4298.1, 4299.4, 4300.7, 4302, 4303.2, 4304.5, 4305.8, 4307, 4308.3, 4309.6, 4310.8, 4312.1, 4313.4, 4314.7, 4316, 4317.2, 4318.5, 4319.7, 4321, 4322.3, 4323.6, 4324.8, 4326.1, 4327.3, 4328.7, 4330, 4331.3, 4332.7, 4334, 4335.3, 4336.5, 4337.8, 4339.1, 4340.4, 4341.7, 4343, 4344.2, 4345.5, 4346.9, 4348.2, 4349.4, 4350.7, 4352.1, 4353.4, 4354.7, 4355.9, 4357.2, 4358.5, 4359.8, 4361.1, 4362.4, 4363.7, 4364.9, 4366.2, 4367.5, 4368.8, 4370, 4371.4, 4372.6, 4373.9, 4375.2, 4376.4, 4377.8, 4379, 4380.3, 4381.5, 4382.8, 4384.1, 4385.4, 4386.8, 4388.1, 4389.4, 4390.7, 4392, 4393.3, 4394.6, 4395.8, 4397.1, 4398.4, 4399.7, 4401.1, 4402.3, 4403.6, 4404.9, 4406.3, 4407.6, 4408.9, 4410.3, 4411.6, 4412.8, 4414.2, 4415.4, 4416.7, 4418, 4419.3, 4420.7, 4422, 4423.3, 4424.6, 4425.9, 4427.3, 4428.7, 4430, 4431.3, 4432.7, 4434, 4435.4, 4436.8, 4438.1, 4439.5, 4440.8, 4442.2, 4443.5, 4444.9, 4446.1, 4447.4, 4448.7, 4450, 4451.4, 4452.7, 4453.9, 4455.3, 4456.6, 4457.9, 4459.2, 4460.5, 4461.9, 4463.2, 4464.6, 4466, 4467.3, 4468.7, 4470, 4471.3, 4472.7, 4474.1, 4475.4, 4476.7, 4478.1, 4479.4, 4480.8, 4482.2, 4483.5, 4484.9, 4486.3, 4487.6, 4488.9, 4490.3, 4491.8, 4493.1, 4494.4, 4495.7, 4497, 4498.3, 4499.6, 4501, 4502.3, 4503.7, 4505, 4506.3, 4507.6, 4508.9, 4510.2, 4511.5, 4512.8, 4514.1, 4515.4, 4516.8, 4518.1, 4519.5, 4520.8, 4522.2, 4523.4, 4524.8, 4526.1, 4527.5, 4528.8, 4530.1, 4531.4, 4532.8, 4534, 4535.3, 4536.7, 4538.1, 4539.4, 4540.7, 4542, 4543.4, 4544.7, 4546.1, 4547.4, 4548.7, 4550.1, 4551.4, 4552.8, 4554.1, 4555.4, 4556.8, 4558.1, 4559.4, 4560.7, 4562, 4563.3, 4564.6, 4566, 4567.3, 4568.7, 4570.1, 4571.4, 4572.7, 4574, 4575.5, 4576.9, 4578.3, 4579.6, 4581, 4582.3, 4583.7, 4585.1, 4586.4, 4587.7, 4589, 4590.3, 4591.7, 4593, 4594.3, 4595.7, 4597, 4598.3, 4599.6, 4601, 4602.3, 4603.6, 4604.9, 4606.3, 4607.7, 4609, 4610.4, 4611.8, 4613.1, 4614.5, 4616, 4617.3, 4618.6, 4619.9, 4621.2, 4622.5, 4623.9, 4625.3, 4626.7, 4628, 4629.4, 4630.8, 4632.2, 4633.5, 4634.8, 4636.2, 4637.5, 4638.8, 4640.2, 4641.5, 4642.9, 4644.2, 4645.6, 4646.9, 4648.3, 4649.6, 4650.9, 4652.2, 4653.6, 4654.9, 4656.3, 4657.7, 4659.1, 4660.5, 4661.9, 4663.3, 4664.6, 4665.9, 4667.3, 4668.7, 4670.1, 4671.4, 4672.7, 4674.1, 4675.5, 4676.9, 4678.2, 4679.6, 4681, 4682.4, 4683.7, 4685.1, 4686.4, 4687.8, 4689.1, 4690.4, 4691.8, 4693.2, 4694.5, 4695.9, 4697.3, 4698.8, 4700.1, 4701.5, 4702.9, 4704.2, 4705.5, 4706.9, 4708.3, 4709.7, 4711, 4712.4, 4713.8, 4715.2, 4716.6, 4717.9, 4719.3, 4720.6, 4722, 4723.3, 4724.6, 4726, 4727.5, 4728.8, 4730.2, 4731.5, 4732.9, 4734.3, 4735.7, 4737.1, 4738.5, 4739.8, 4741.2, 4742.5, 4743.9, 4745.3, 4746.6, 4747.9, 4749.3, 4750.6, 4752, 4753.4, 4754.8, 4756.2, 4757.5, 4758.9, 4760.3, 4761.6, 4762.9, 4764.3, 4765.6, 4767, 4768.3, 4769.6, 4771, 4772.4, 4773.7, 4775, 4776.4, 4777.8, 4779.2, 4780.6, 4782, 4783.4, 4784.8, 4786.2, 4787.5, 4788.9, 4790.3, 4791.7, 4793, 4794.4, 4795.7, 4797.1, 4798.4, 4799.8, 4801.3, 4802.6, 4804, 4805.4, 4806.8, 4808.2, 4809.6, 4811, 4812.4, 4813.8, 4815.2, 4816.6, 4818, 4819.4, 4820.8, 4822.2, 4823.6, 4824.9, 4826.4, 4827.7, 4829.1, 4830.5, 4831.9, 4833.3, 4834.7, 4836.1, 4837.5, 4838.9, 4840.2, 4841.6, 4843, 4844.4, 4845.8, 4847.2, 4848.6, 4850, 4851.4, 4852.8, 4854.2, 4855.6, 4856.9, 4858.3, 4859.7, 4861.1, 4862.5, 4863.9, 4865.3, 4866.7, 4868.1, 4869.5, 4870.9, 4872.3, 4873.7, 4875.1, 4876.5, 4877.8, 4879.2, 4880.6, 4882, 4883.3, 4884.6, 4886, 4887.4, 4888.8, 4890.1, 4891.6, 4893, 4894.4, 4895.7, 4897.1, 4898.6, 4900, 4901.4, 4902.8, 4904.2, 4905.6, 4907, 4908.4, 4909.8, 4911.2, 4912.6, 4914, 4915.3, 4916.7, 4918.1, 4919.5, 4920.9, 4922.3, 4923.7, 4925.1, 4926.5, 4927.9, 4929.3, 4930.7, 4932.1, 4933.5, 4934.9, 4936.3, 4937.7, 4939.1, 4940.5, 4941.9, 4943.3, 4944.7, 4946.1, 4947.5, 4948.9, 4950.3, 4951.7, 4953.1, 4954.5, 4955.9, 4957.3, 4958.7, 4960.1, 4961.5, 4962.9, 4964.3, 4965.7, 4967.1, 4968.4, 4969.8, 4971.2, 4972.6, 4974, 4975.4, 4976.8, 4978.2, 4979.6, 4981, 4982.4, 4983.8, 4985.2, 4986.6, 4988, 4989.4, 4990.9, 4992.3, 4993.7, 4995.1, 4996.5, 4997.9, 4999.3, 5000.9, 5002.4, 5003.8, 5005.2, 5006.6, 5008, 5009.4, 5010.8, 5012.2, 5013.6, 5015, 5016.4, 5017.8, 5019.2, 5020.6, 5022.1, 5023.5, 5025, 5026.5, 5028, 5029.4, 5030.9, 5032.3, 5033.7, 5035.1, 5036.5, 5037.9, 5039.3, 5040.7, 5042.1, 5043.5, 5044.9, 5046.3, 5047.7, 5049.1, 5050.5, 5051.9, 5053.4, 5054.8, 5056.2, 5057.6, 5059, 5060.4, 5061.8, 5063.2, 5064.6, 5066, 5067.4, 5068.8, 5070.2, 5071.6, 5073, 5074.4, 5075.8, 5077.2, 5078.6, 5080, 5081.4, 5082.8, 5084.2, 5085.6, 5087, 5088.4, 5089.8, 5091.3, 5092.7, 5094.1, 5095.5, 5096.9, 5098.3, 5099.7, 5101.1, 5102.5, 5103.9, 5105.3, 5106.7, 5108.1, 5109.5, 5110.9, 5112.3, 5113.7, 5115.1, 5116.5, 5117.9, 5119.3, 5120.7, 5122.1, 5123.5, 5124.9, 5126.3, 5127.7, 5129.1, 5130.6, 5131.9, 5133.4, 5134.8, 5136.2, 5137.6, 5139, 5140.4, 5141.8, 5143.2, 5144.6, 5146, 5147.4, 5148.8, 5150.3, 5151.6, 5153.1, 5154.5, 5155.9, 5157.3, 5158.7, 5160.1, 5161.5, 5162.9, 5164.3, 5165.7, 5167.1, 5168.5, 5169.9, 5171.3, 5172.7, 5174.1, 5175.5, 5177, 5178.4, 5179.8, 5181.2, 5182.6, 5184, 5185.4, 5186.8, 5188.2, 5189.6, 5191, 5192.4, 5193.8, 5195.2, 5196.6, 5198, 5199.4, 5200.8, 5202.2, 5203.6, 5205, 5206.4, 5207.9, 5209.3, 5210.7, 5212.1, 5213.5, 5214.9, 5216.3, 5217.7, 5219.1, 5220.5, 5221.9, 5223.3, 5224.7, 5226.1, 5227.5, 5228.9, 5230.3, 5231.7, 5233.1, 5234.5, 5235.9, 5237.4, 5238.9, 5240.3, 5241.7, 5243.1, 5244.5, 5246, 5247.6, 5249, 5250.4, 5251.8, 5253.2, 5254.6, 5256, 5257.4, 5259, 5260.4, 5261.9, 5263.3, 5264.7, 5266.2, 5267.6, 5269, 5270.4, 5271.8, 5273.2, 5274.6, 5276.1, 5277.5, 5278.9, 5280.3, 5281.7, 5283.1, 5284.5, 5285.9, 5287.3, 5288.8, 5290.2, 5291.6, 5293, 5294.4, 5295.9, 5297.3, 5298.7, 5300.1, 5301.5, 5303, 5304.5, 5305.9, 5307.3, 5308.7, 5310.1, 5311.5, 5312.9, 5314.3, 5315.7, 5317.1, 5318.5, 5319.9, 5321.3, 5322.7, 5324.1, 5325.5, 5326.9, 5328.3, 5329.7, 5331.1, 5332.5, 5333.9, 5335.4, 5336.8, 5338.2, 5339.6, 5341, 5342.4, 5343.8, 5345.2, 5346.6, 5348, 5349.4, 5350.8, 5352.2, 5353.6, 5355, 5356.4, 5357.8, 5359.2, 5360.6, 5362, 5363.4, 5364.8, 5366.3, 5367.7, 5369.1, 5370.5, 5371.9, 5373.3, 5374.7, 5376.1, 5377.5, 5378.9, 5380.3, 5381.7, 5383.1, 5384.5, 5386, 5387.3, 5388.7, 5390.2, 5391.6, 5393, 5394.3, 5395.8, 5397.2, 5398.6, 5400, 5401.4, 5402.8, 5404.2, 5405.6, 5407, 5408.4, 5409.9, 5411.2, 5412.7, 5414.1, 5415.5, 5416.9, 5418.3, 5419.7, 5421.1, 5422.5, 5423.9, 5425.3, 5426.7, 5428.1, 5429.5, 5431, 5432.3, 5433.7, 5435.1, 5436.6, 5438, 5439.4, 5440.8, 5442.2, 5443.6, 5445, 5446.4, 5447.8, 5449.2, 5450.6, 5452, 5453.4, 5454.8, 5456.2, 5457.6, 5459, 5460.4, 5461.8, 5463.3, 5464.7, 5466.1, 5467.5, 5468.9, 5470.3, 5471.7, 5473.1, 5474.5, 5475.9, 5477.3, 5478.7, 5480.1, 5481.5, 5482.9, 5484.3, 5485.7, 5487.1, 5488.5, 5489.9, 5491.3, 5492.7, 5494.1, 5495.6, 5497, 5498.4, 5499.8, 5501.2, 5502.6, 5504, 5505.4, 5506.8, 5508.2, 5509.6, 5511, 5512.4, 5513.8, 5515.2, 5516.6, 5518, 5519.4, 5520.8, 5522.2, 5523.6, 5525, 5526.4, 5527.8, 5529.4, 5530.8, 5532.2, 5533.6, 5535.1, 5536.5, 5537.9, 5539.3, 5540.7, 5542.2, 5543.6, 5545, 5546.4, 5547.8, 5549.3, 5550.7, 5552.1, 5553.5, 5555.1, 5556.5, 5558, 5559.4, 5560.8, 5562.3, 5563.8, 5565.2, 5566.6, 5568, 5569.4, 5570.8, 5572.2, 5573.6, 5575, 5576.4, 5577.8, 5579.3, 5580.7, 5582.1, 5583.5, 5584.9, 5586.3, 5587.7, 5589.1, 5590.5, 5591.9, 5593.3, 5594.7, 5596.2, 5597.6, 5599, 5600.4, 5601.8, 5603.2, 5604.6, 5606, 5607.4, 5608.8, 5610.2, 5611.6, 5613, 5614.4, 5615.8, 5617.2, 5618.6, 5620, 5621.4, 5622.8, 5624.2, 5625.6, 5627, 5628.5, 5629.9, 5631.3, 5632.7, 5634.1, 5635.5, 5636.9, 5638.3, 5639.7, 5641.1, 5642.5, 5643.9, 5645.3, 5646.7, 5648.1, 5649.5, 5650.9, 5652.3, 5653.7, 5655.2, 5656.6, 5658, 5659.4, 5660.8, 5662.2, 5663.6, 5665, 5666.4, 5667.8, 5669.2, 5670.6, 5672, 5673.4, 5674.8, 5676.2, 5677.6, 5679, 5680.4, 5681.8, 5683.2, 5684.6, 5686, 5687.4, 5688.8, 5690.2, 5691.6, 5693, 5694.5, 5695.9, 5697.3, 5698.7, 5700.1, 5701.5, 5702.9, 5704.3, 5705.7, 5707.1, 5708.5, 5709.9, 5711.3, 5712.7, 5714.1, 5715.5, 5716.9, 5718.3, 5719.7, 5721.1, 5722.5, 5723.9, 5725.3, 5726.7, 5728.1, 5729.5, 5730.9, 5732.3, 5733.7, 5735.2, 5736.5, 5738, 5739.4, 5740.8, 5742.2, 5743.6, 5745, 5746.4, 5747.8, 5749.2, 5750.6, 5752, 5753.4, 5754.8, 5756.2, 5757.6, 5759, 5760.4, 5761.8, 5763.2, 5764.6, 5766, 5767.4, 5768.8, 5770.2, 5771.6, 5773, 5774.4, 5775.8, 5777.3, 5778.7, 5780.1, 5781.5, 5782.9, 5784.3, 5785.7, 5787.1, 5788.5, 5789.9, 5791.3, 5792.7, 5794.1, 5795.5, 5796.9, 5798.4, 5799.8, 5801.2, 5802.6, 5804, 5805.4, 5806.8, 5808.2, 5809.6, 5811, 5812.4, 5813.8, 5815.2, 5816.6, 5818, 5819.4, 5820.8, 5822.2, 5823.6, 5825, 5826.4, 5827.8, 5829.2, 5830.6, 5832.1, 5833.5, 5834.9, 5836.3, 5837.8, 5839.2, 5840.6, 5842, 5843.4, 5844.8, 5846.2, 5847.6, 5849, 5850.4, 5851.8, 5853.2, 5854.6, 5856, 5857.4, 5858.8, 5860.2, 5861.6, 5863, 5864.4, 5865.8, 5867.3, 5868.7, 5870.1, 5871.5, 5872.9, 5874.3, 5875.8, 5877.2, 5878.6, 5880, 5881.4, 5882.8, 5884.2, 5885.6, 5887, 5888.4, 5889.8, 5891.2, 5892.6, 5894.1, 5895.5, 5896.9, 5898.3, 5899.7, 5901.1, 5902.5, 5903.9, 5905.3, 5906.7, 5908.1, 5909.6, 5911, 5912.4, 5913.8, 5915.2, 5916.6, 5918, 5919.4, 5920.8, 5922.3, 5923.7, 5925.1, 5926.5, 5928, 5929.4, 5930.8, 5932.3, 5933.7, 5935.1, 5936.6, 5938, 5939.4, 5940.8, 5942.2, 5943.7, 5945.1, 5946.5, 5947.9, 5949.4, 5950.8, 5952.2, 5953.7, 5955.1, 5956.5, 5957.9, 5959.4, 5960.8, 5962.2, 5963.7, 5965.1, 5966.5, 5967.9, 5969.4, 5970.8, 5972.3, 5973.7, 5975.2, 5976.6, 5978, 5979.4, 5980.8, 5982.2, 5983.7, 5985.1, 5986.5, 5987.9, 5989.4, 5990.8, 5992.2, 5993.6, 5995, 5996.4, 5997.8, 5999.3, 6000.7, 6002.1, 6003.5, 6005, 6006.4, 6007.9, 6009.3, 6010.8, 6012.2, 6013.6, 6015.1, 6016.5, 6017.9, 6019.4, 6020.8, 6022.2, 6023.6, 6025.1, 6026.5, 6028, 6029.4, 6030.8, 6032.2, 6033.7, 6035.1, 6036.5, 6037.9, 6039.4, 6040.8, 6042.2, 6043.6, 6045.1, 6046.5, 6047.9, 6049.4, 6050.8, 6052.3, 6053.7, 6055.1, 6056.5, 6057.9, 6059.4, 6060.8, 6062.2, 6063.7, 6065.1, 6066.5, 6068, 6069.4, 6070.8, 6072.3, 6073.7, 6075.2, 6076.6, 6078, 6079.4, 6081, 6082.4, 6083.8, 6085.2, 6086.6, 6088, 6089.5, 6090.9, 6092.3, 6093.7, 6095.1, 6096.6, 6098, 6099.4, 6100.8, 6102.2, 6103.6, 6105.1, 6106.5, 6107.9, 6109.3, 6110.7, 6112.2, 6113.6, 6115, 6116.5, 6117.9, 6119.3, 6120.7, 6122.2, 6123.6, 6125, 6126.4, 6127.8, 6129.2, 6130.6, 6132, 6133.5, 6134.9, 6136.3, 6137.7, 6139.2, 6140.6, 6142, 6143.4, 6144.9, 6146.3, 6147.7, 6149.1, 6150.5, 6152, 6153.5], datasets: [{ label: 'Documents', backgroundColor: 'rgba(205, 37, 44, 0.2)', borderColor: 'rgba(205, 37, 44, 1.00)', - data: [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + data: [4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] }, { label: 'Frames', backgroundColor: 'rgba(239, 116, 55, 0.2)', borderColor: 'rgba(239, 116, 55, 1.00)', - data: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + data: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] }] }, { - labels: [0, 0.7, 1.3, 1.9, 2.6, 3.5, 4.2, 4.9, 5.5, 6.2, 6.8, 7.4, 8.1, 8.7, 9.3, 10, 10.6, 11.2, 11.9, 12.5, 13.1, 13.8, 14.4, 15, 15.7, 16.3, 16.9, 17.6, 18.2, 18.8, 19.5, 20.1, 20.7, 21.4, 22, 22.6, 23.3, 23.9, 24.6, 25.2, 25.8, 26.5, 27.1, 27.7, 28.4, 29, 29.6, 30.3, 30.9, 31.5], + labels: [0, 1.1, 2.1, 3.1, 4.1, 5.2, 6.4, 7.4, 8.4, 9.4, 10.5, 11.5, 12.5, 13.5, 14.5, 15.6, 16.6, 17.6, 18.6, 19.6, 20.7, 21.7, 22.7, 23.7, 24.7, 25.7, 26.7, 27.7, 28.8, 29.8, 30.8, 31.8, 32.8, 33.8, 34.9, 35.9, 36.9, 37.9, 38.9, 39.9, 40.9, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51.1, 52.1, 53.1, 54.1, 55.1, 56.1, 57.2, 58.2, 59.2, 60.2, 61.2, 62.2, 63.2, 64.2, 65.2, 66.2, 67.3, 68.3, 69.3, 70.3, 71.3, 72.3, 73.3, 74.3, 75.3, 76.3, 77.3, 78.3, 79.3, 80.3, 81.3, 82.4, 83.4, 84.4, 85.4, 86.4, 87.5, 88.5, 89.5, 90.5, 91.5, 92.6, 93.6, 94.6, 95.7, 96.7, 97.7, 98.7, 99.8, 100.8, 101.8, 102.9, 103.9, 104.9, 105.9, 107, 108, 109, 110.1, 111.1, 112.1, 113.1, 114.1, 115.2, 116.2, 117.2, 118.2, 119.3, 120.3, 121.3, 122.4, 123.4, 124.4, 125.4, 126.5, 127.5, 128.5, 129.6, 130.6, 131.6, 132.6, 133.7, 134.7, 135.7, 136.7, 137.7, 138.8, 139.8, 140.8, 141.8, 142.8, 143.8, 144.8, 145.8, 146.8, 147.9, 148.9, 149.9, 150.9, 151.9, 152.9, 154, 155, 156, 157, 158, 159, 160, 161.1, 162.1, 163.1, 164.1, 165.1, 166.1, 167.2, 168.2, 169.2, 170.2, 171.2, 172.2, 173.3, 174.3, 175.3, 176.3, 177.4, 178.4, 179.4, 180.4, 181.5, 182.5, 183.5, 184.5, 185.5, 186.6, 187.6, 188.6, 189.7, 190.7, 191.7, 192.8, 193.8, 194.8, 195.8, 196.8, 197.8, 198.9, 199.9, 200.9, 201.9, 203, 204, 205, 206, 207, 208, 209, 210.1, 211.1, 212.1, 213.2, 214.2, 215.2, 216.3, 217.3, 218.3, 219.4, 220.4, 221.4, 222.5, 223.5, 224.5, 225.6, 226.6, 227.6, 228.6, 229.6, 230.7, 231.7, 232.7, 233.7, 234.7, 235.8, 236.8, 237.8, 238.8, 239.9, 240.9, 241.9, 243, 244, 245, 246, 247, 248.1, 249.1, 250.1, 251.1, 252.2, 253.2, 254.3, 255.3, 256.3, 257.3, 258.4, 259.4, 260.4, 261.4, 262.5, 263.5, 264.5, 265.5, 266.5, 267.6, 268.6, 269.6, 270.6, 271.7, 272.7, 273.7, 274.8, 275.8, 276.8, 277.8, 278.9, 279.9, 281, 282, 283, 284, 285, 286, 287.1, 288.1, 289.1, 290.1, 291.2, 292.2, 293.2, 294.3, 295.3, 296.3, 297.3, 298.3, 299.3, 300.4, 301.4, 302.5, 303.5, 304.5, 305.5, 306.5, 307.5, 308.5, 309.5, 310.5, 311.6, 312.6, 313.7, 314.7, 315.7, 316.8, 317.8, 318.8, 319.9, 320.9, 321.9, 322.9, 323.9, 325, 326, 327, 328, 329.1, 330.1, 331.1, 332.2, 333.2, 334.2, 335.2, 336.3, 337.3, 338.3, 339.3, 340.4, 341.4, 342.4, 343.5, 344.5, 345.5, 346.6, 347.6, 348.6, 349.6, 350.6, 351.6, 352.7, 353.7, 354.8, 355.8, 356.8, 357.8, 358.8, 359.9, 360.9, 361.9, 363, 364, 365, 366, 367, 368, 369.1, 370.1, 371.1, 372.2, 373.2, 374.2, 375.3, 376.3, 377.3, 378.4, 379.4, 380.4, 381.4, 382.5, 383.5, 384.6, 385.6, 386.6, 387.6, 388.7, 389.7, 390.7, 391.7, 392.8, 393.8, 394.8, 395.8, 396.8, 397.8, 398.8, 399.8, 400.8, 401.8, 402.8, 403.8, 404.8, 405.8, 406.8, 407.8, 408.8, 409.8, 410.8, 411.8, 412.8, 413.8, 414.8, 415.8, 416.8, 417.8, 418.8, 419.8, 420.8, 421.8, 422.8, 423.8, 424.8, 425.8, 426.8, 427.8, 428.8, 429.8, 430.8, 431.8, 432.8, 433.8, 434.8, 435.8, 436.8, 437.8, 438.8, 439.8, 440.8, 441.8, 442.8, 443.8, 444.8, 445.8, 446.8, 447.8, 448.8, 449.8, 450.9, 451.9, 452.9, 453.9, 454.9, 455.9, 456.9, 457.9, 458.9, 459.9, 460.9, 461.9, 462.9, 463.9, 464.9, 465.9, 466.9, 467.9, 468.9, 469.9, 470.9, 471.9, 472.9, 473.9, 474.9, 475.9, 476.9, 477.9, 478.9, 479.9, 480.9, 481.9, 482.9, 483.9, 484.9, 485.9, 486.9, 487.9, 488.9, 490, 491, 492, 493, 494.1, 495.1, 496.1, 497.2, 498.2, 499.3, 500.3, 501.3, 502.4, 503.4, 504.5, 505.5, 506.5, 507.6, 508.6, 509.6, 510.6, 511.7, 512.7, 513.7, 514.8, 515.8, 516.8, 517.8, 518.9, 519.9, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533.2, 534.2, 535.2, 536.2, 537.2, 538.2, 539.2, 540.2, 541.2, 542.2, 543.2, 544.2, 545.2, 546.2, 547.2, 548.2, 549.2, 550.2, 551.2, 552.2, 553.2, 554.2, 555.2, 556.2, 557.2, 558.2, 559.2, 560.2, 561.3, 562.3, 563.4, 564.4, 565.4, 566.5, 567.5, 568.5, 569.6, 570.6, 571.6, 572.7, 573.7, 574.8, 575.8, 576.8, 577.9, 578.9, 579.9, 581, 582, 583, 584.1, 585.1, 586.2, 587.2, 588.2, 589.3, 590.3, 591.4, 592.5, 593.5, 594.5, 595.6, 596.6, 597.7, 598.7, 599.8, 600.8, 601.8, 602.9, 603.9, 605, 606, 607.1, 608.1, 609.2, 610.2, 611.2, 612.3, 613.3, 614.4, 615.4, 616.5, 617.5, 618.6, 619.6, 620.6, 621.7, 622.7, 623.8, 624.8, 625.9, 626.9, 627.9, 629, 630.1, 631.1, 632.2, 633.2, 634.3, 635.3, 636.4, 637.4, 638.5, 639.5, 640.6, 641.6, 642.7, 643.7, 644.7, 645.8, 646.9, 647.9, 648.9, 650, 651, 652.1, 653.1, 654.2, 655.2, 656.3, 657.3, 658.4, 659.4, 660.4, 661.5, 662.5, 663.6, 664.6, 665.7, 666.7, 667.8, 668.8, 669.9, 670.9, 672, 673, 674, 675.1, 676.1, 677.2, 678.2, 679.3, 680.3, 681.3, 682.3, 683.4, 684.4, 685.5, 686.5, 687.6, 688.6, 689.7, 690.7, 691.7, 692.8, 693.8, 694.9, 696.1, 697.1, 698.2, 699.3, 700.3, 701.4, 702.4, 703.5, 704.5, 705.6, 706.6, 707.7, 708.7, 709.7, 710.8, 711.8, 712.9, 714, 715, 716, 717.1, 718.1, 719.1, 720.2, 721.2, 722.2, 723.3, 724.4, 725.4, 726.5, 727.5, 728.6, 729.6, 730.7, 731.7, 732.7, 733.8, 734.9, 735.9, 737, 738, 739, 740, 741.1, 742.1, 743.2, 744.3, 745.3, 746.4, 747.4, 748.5, 749.5, 750.6, 751.6, 752.7, 753.7, 754.8, 755.9, 756.9, 758, 759, 760.1, 761.1, 762.1, 763.2, 764.3, 765.3, 766.4, 767.4, 768.4, 769.5, 770.5, 771.6, 772.6, 773.7, 774.7, 775.8, 776.8, 777.9, 778.9, 780, 781, 782.1, 783.2, 784.3, 785.4, 786.4, 787.5, 788.5, 789.5, 790.6, 791.6, 792.6, 793.6, 794.6, 795.6, 796.6, 797.6, 798.6, 799.6, 800.7, 801.7, 802.7, 803.7, 804.7, 805.7, 806.8, 807.8, 808.8, 809.9, 811, 812.2, 813.3, 814.3, 815.3, 816.4, 817.5, 818.6, 819.6, 820.7, 821.8, 822.9, 824, 825.2, 826.2, 827.4, 828.4, 829.6, 830.6, 831.8, 832.9, 834, 835.1, 836.2, 837.3, 838.4, 839.4, 840.5, 841.6, 842.7, 843.8, 845, 846.1, 847.2, 848.3, 849.4, 850.5, 851.7, 852.8, 854, 855.1, 856.3, 857.4, 858.5, 859.6, 860.7, 861.8, 862.9, 864, 865, 866, 867, 868.1, 869.1, 870.1, 871.2, 872.2, 873.2, 874.2, 875.2, 876.2, 877.2, 878.2, 879.2, 880.3, 881.3, 882.4, 883.4, 884.5, 885.5, 886.6, 887.6, 888.7, 889.8, 890.9, 892, 893, 894.1, 895.2, 896.3, 897.3, 898.5, 899.5, 900.6, 901.7, 902.7, 903.8, 904.9, 906, 907.1, 908.2, 909.2, 910.3, 911.4, 912.5, 913.6, 914.6, 915.7, 916.8, 917.9, 919, 920.1, 921.2, 922.2, 923.3, 924.4, 925.4, 926.5, 927.6, 928.6, 929.7, 930.8, 931.9, 932.9, 934.1, 935.2, 936.3, 937.4, 938.4, 939.6, 940.7, 941.8, 942.9, 944, 945.1, 946.3, 947.4, 948.4, 949.5, 950.6, 951.8, 952.9, 954.1, 955.2, 956.3, 957.4, 958.6, 959.7, 960.8, 961.9, 963, 964.1, 965.2, 966.4, 967.5, 968.7, 969.8, 970.9, 972.1, 973.2, 974.3, 975.5, 976.6, 977.8, 979, 980.2, 981.3, 982.5, 983.6, 984.8, 986, 987.1, 988.2, 989.3, 990.5, 991.6, 992.8, 994, 995.2, 996.3, 997.5, 998.7, 999.8, 1001, 1002.2, 1003.3, 1004.5, 1005.7, 1006.8, 1008, 1009.2, 1010.3, 1011.5, 1012.6, 1013.8, 1015, 1016.2, 1017.4, 1018.5, 1019.6, 1020.8, 1022, 1023.1, 1024.3, 1025.5, 1026.6, 1027.8, 1028.9, 1030.1, 1031.2, 1032.4, 1033.6, 1034.7, 1035.9, 1037.1, 1038.2, 1039.4, 1040.6, 1041.7, 1042.9, 1044, 1045.2, 1046.4, 1047.6, 1048.7, 1049.9, 1051.1, 1052.2, 1053.2, 1054.4, 1055.6, 1056.7, 1057.9, 1059.1, 1060.3, 1061.4, 1062.6, 1063.8, 1064.9, 1066, 1067.2, 1068.4, 1069.6, 1070.7, 1071.9, 1073, 1074.2, 1075.4, 1076.6, 1077.7, 1078.9, 1080.1, 1081.3, 1082.4, 1083.6, 1084.8, 1086, 1087.2, 1088.3, 1089.5, 1090.7, 1091.9, 1093.1, 1094.3, 1095.4, 1096.6, 1097.8, 1099, 1100.2, 1101.4, 1102.6, 1103.8, 1104.9, 1106.1, 1107.3, 1108.5, 1109.7, 1110.9, 1112.1, 1113.3, 1114.5, 1115.6, 1116.8, 1118, 1119.2, 1120.4, 1121.5, 1122.7, 1123.9, 1125.1, 1126.3, 1127.5, 1128.7, 1129.9, 1131.1, 1132.3, 1133.5, 1134.6, 1135.8, 1137, 1138.1, 1139.3, 1140.5, 1141.7, 1142.9, 1144.1, 1145.3, 1146.4, 1147.6, 1148.8, 1150, 1151.2, 1152.4, 1153.6, 1154.7, 1155.9, 1157.2, 1158.4, 1159.6, 1160.7, 1161.9, 1163.1, 1164.2, 1165.3, 1166.5, 1167.7, 1168.9, 1170, 1171.2, 1172.4, 1173.6, 1174.8, 1176, 1177.2, 1178.4, 1179.6, 1180.8, 1181.9, 1183.1, 1184.3, 1185.3, 1186.5, 1187.7, 1188.9, 1190.1, 1191.3, 1192.4, 1193.6, 1194.8, 1196, 1197.2, 1198.4, 1199.6, 1200.7, 1201.9, 1203, 1204.2, 1205.4, 1206.6, 1207.8, 1209, 1210.1, 1211.3, 1212.5, 1213.6, 1214.8, 1216, 1217.2, 1218.4, 1219.6, 1220.8, 1222, 1223.2, 1224.3, 1225.5, 1226.7, 1227.9, 1229, 1230.2, 1231.4, 1232.6, 1233.8, 1235, 1236.2, 1237.4, 1238.6, 1239.8, 1241, 1242.2, 1243.4, 1244.6, 1245.8, 1247, 1248.2, 1249.4, 1250.6, 1251.8, 1253, 1254.2, 1255.4, 1256.5, 1257.7, 1258.9, 1260, 1261.2, 1262.4, 1263.6, 1264.8, 1266, 1267.2, 1268.4, 1269.6, 1270.8, 1272, 1273.2, 1274.4, 1275.6, 1276.8, 1278, 1279.2, 1280.4, 1281.6, 1282.8, 1284, 1285.2, 1286.4, 1287.6, 1288.8, 1290, 1291.2, 1292.4, 1293.5, 1294.7, 1295.9, 1297.1, 1298.3, 1299.5, 1300.7, 1301.9, 1303, 1304.2, 1305.4, 1306.6, 1307.8, 1309, 1310.2, 1311.3, 1312.5, 1313.7, 1314.9, 1316.1, 1317.3, 1318.3, 1319.5, 1320.7, 1321.9, 1323, 1324.2, 1325.4, 1326.5, 1327.7, 1328.9, 1330.1, 1331.2, 1332.4, 1333.6, 1334.8, 1336, 1337.2, 1338.4, 1339.6, 1340.8, 1342, 1343.1, 1344.3, 1345.5, 1346.7, 1347.9, 1349, 1350.2, 1351.4, 1352.6, 1353.8, 1355, 1356.1, 1357.3, 1358.5, 1359.7, 1360.9, 1362.1, 1363.3, 1364.5, 1365.7, 1366.9, 1368, 1369.2, 1370.4, 1371.5, 1372.7, 1373.8, 1375, 1376.2, 1377.3, 1378.5, 1379.6, 1380.8, 1382, 1383.2, 1384.4, 1385.6, 1386.8, 1388, 1389.2, 1390.4, 1391.6, 1392.8, 1394, 1395.1, 1396.3, 1397.5, 1398.7, 1399.9, 1401.1, 1402.3, 1403.5, 1404.7, 1405.9, 1407.1, 1408.3, 1409.5, 1410.7, 1411.9, 1413.1, 1414.3, 1415.5, 1416.7, 1417.9, 1419.1, 1420.3, 1421.5, 1422.7, 1423.9, 1425.1, 1426.3, 1427.5, 1428.7, 1429.9, 1431.1, 1432.3, 1433.5, 1434.7, 1435.9, 1437.1, 1438.2, 1439.4, 1440.6, 1441.8, 1443, 1444.2, 1445.4, 1446.6, 1447.8, 1449, 1450.2, 1451.4, 1452.6, 1453.7, 1454.9, 1456.1, 1457.3, 1458.5, 1459.7, 1460.9, 1462.1, 1463.3, 1464.5, 1465.7, 1466.9, 1468.1, 1469.3, 1470.5, 1471.7, 1472.9, 1474.1, 1475.3, 1476.5, 1477.6, 1478.8, 1480, 1481.2, 1482.4, 1483.6, 1484.8, 1485.9, 1487.1, 1488.3, 1489.5, 1490.7, 1491.9, 1493.1, 1494.3, 1495.5, 1496.7, 1497.9, 1499.1, 1500.3, 1501.5, 1502.7, 1503.8, 1505, 1506.2, 1507.4, 1508.6, 1509.8, 1511, 1512.1, 1513.3, 1514.5, 1515.7, 1516.9, 1518.1, 1519.3, 1520.5, 1521.7, 1522.9, 1524.1, 1525.2, 1526.4, 1527.6, 1528.8, 1530, 1531.2, 1532.3, 1533.5, 1534.7, 1535.9, 1537.1, 1538.4, 1539.6, 1540.8, 1542, 1543.2, 1544.4, 1545.6, 1546.7, 1547.9, 1549.1, 1550.3, 1551.5, 1552.7, 1553.9, 1555.1, 1556.3, 1557.5, 1558.7, 1559.9, 1561.1, 1562.3, 1563.5, 1564.7, 1565.8, 1567, 1568.2, 1569.4, 1570.6, 1571.8, 1573, 1574.2, 1575.4, 1576.6, 1577.8, 1579, 1580.2, 1581.4, 1582.6, 1583.8, 1585, 1586.2, 1587.4, 1588.6, 1589.8, 1591, 1592.2, 1593.4, 1594.6, 1595.8, 1597, 1598.2, 1599.4, 1600.6, 1601.8, 1603, 1604.2, 1605.4, 1606.6, 1607.8, 1609, 1610.2, 1611.4, 1612.6, 1613.8, 1615, 1616.2, 1617.4, 1618.6, 1619.8, 1621, 1622.2, 1623.4, 1624.6, 1625.8, 1627, 1628.2, 1629.4, 1630.6, 1631.8, 1633, 1634.2, 1635.4, 1636.6, 1637.8, 1639, 1640.2, 1641.4, 1642.6, 1643.8, 1645, 1646.2, 1647.4, 1648.6, 1649.8, 1651, 1652.2, 1653.4, 1654.6, 1655.8, 1657, 1658.2, 1659.4, 1660.6, 1661.8, 1663, 1664.2, 1665.4, 1666.6, 1667.8, 1669, 1670.2, 1671.4, 1672.6, 1673.8, 1675, 1676.2, 1677.4, 1678.5, 1679.8, 1681, 1682.2, 1683.4, 1684.6, 1685.8, 1687, 1688.2, 1689.4, 1690.6, 1691.8, 1693, 1694.2, 1695.4, 1696.6, 1697.8, 1699, 1700.2, 1701.4, 1702.6, 1703.8, 1705, 1706.2, 1707.4, 1708.6, 1709.8, 1711, 1712.2, 1713.4, 1714.6, 1715.8, 1717, 1718.2, 1719.4, 1720.6, 1721.8, 1723, 1724.2, 1725.4, 1726.6, 1727.8, 1729, 1730.2, 1731.4, 1732.6, 1733.8, 1735, 1736.2, 1737.4, 1738.6, 1739.8, 1741, 1742.2, 1743.4, 1744.6, 1745.8, 1747, 1748.2, 1749.4, 1750.6, 1751.8, 1753, 1754.2, 1755.4, 1756.6, 1757.8, 1759, 1760.2, 1761.4, 1762.6, 1763.8, 1765, 1766.2, 1767.4, 1768.6, 1769.8, 1771, 1772.2, 1773.4, 1774.6, 1775.8, 1777, 1778.2, 1779.5, 1780.7, 1781.9, 1783.1, 1784.3, 1785.5, 1786.7, 1787.9, 1789.1, 1790.3, 1791.5, 1792.7, 1793.9, 1795.1, 1796.3, 1797.5, 1798.7, 1799.9, 1801.1, 1802.3, 1803.5, 1804.7, 1805.9, 1807.1, 1808.3, 1809.5, 1810.7, 1811.9, 1813.1, 1814.3, 1815.5, 1816.7, 1817.9, 1819.1, 1820.3, 1821.5, 1822.7, 1823.9, 1825.1, 1826.3, 1827.5, 1828.7, 1829.9, 1831.1, 1832.3, 1833.5, 1834.7, 1835.9, 1837.1, 1838.3, 1839.5, 1840.7, 1841.9, 1843.2, 1844.4, 1845.6, 1846.8, 1848, 1849.2, 1850.4, 1851.6, 1852.8, 1854, 1855.2, 1856.4, 1857.6, 1858.8, 1860, 1861.2, 1862.4, 1863.6, 1864.8, 1866, 1867.2, 1868.4, 1869.6, 1870.8, 1872, 1873.2, 1874.4, 1875.6, 1876.8, 1878, 1879.2, 1880.4, 1881.6, 1882.8, 1884, 1885.2, 1886.4, 1887.6, 1888.8, 1890, 1891.2, 1892.4, 1893.6, 1894.8, 1896, 1897.2, 1898.4, 1899.7, 1900.8, 1902.1, 1903.3, 1904.5, 1905.7, 1906.9, 1908.1, 1909.3, 1910.5, 1911.7, 1912.9, 1914.1, 1915.3, 1916.5, 1917.7, 1918.9, 1920.1, 1921.3, 1922.5, 1923.7, 1924.9, 1926.1, 1927.3, 1928.5, 1929.7, 1930.9, 1932.1, 1933.3, 1934.5, 1935.7, 1936.9, 1938.1, 1939.3, 1940.5, 1941.7, 1943, 1944.2, 1945.4, 1946.6, 1947.8, 1949, 1950.2, 1951.4, 1952.6, 1953.8, 1955, 1956.2, 1957.4, 1958.6, 1959.8, 1961, 1962.2, 1963.4, 1964.6, 1965.8, 1967, 1968.2, 1969.4, 1970.6, 1971.8, 1973, 1974.2, 1975.4, 1976.6, 1977.8, 1979, 1980.2, 1981.4, 1982.6, 1983.8, 1985, 1986.2, 1987.4, 1988.6, 1989.8, 1991, 1992.2, 1993.4, 1994.6, 1995.8, 1997, 1998.2, 1999.4, 2000.6, 2001.9, 2003.1, 2004.3, 2005.5, 2006.7, 2007.9, 2009.1, 2010.3, 2011.5, 2012.7, 2013.9, 2015.1, 2016.3, 2017.5, 2018.7, 2019.9, 2021.1, 2022.3, 2023.5, 2024.7, 2025.9, 2027.1, 2028.3, 2029.5, 2030.7, 2031.9, 2033.1, 2034.3, 2035.5, 2036.7, 2037.9, 2039.1, 2040.3, 2041.5, 2042.7, 2043.9, 2045.1, 2046.3, 2047.5, 2048.7, 2049.9, 2051.1, 2052.3, 2053.5, 2054.7, 2055.9, 2057.1, 2058.4, 2059.5, 2060.7, 2061.9, 2063.2, 2064.4, 2065.6, 2066.8, 2068, 2069.2, 2070.4, 2071.6, 2072.8, 2074, 2075.2, 2076.4, 2077.6, 2078.8, 2080, 2081.2, 2082.4, 2083.6, 2084.8, 2086, 2087.2, 2088.4, 2089.6, 2090.8, 2092, 2093.2, 2094.4, 2095.6, 2096.8, 2098, 2099.2, 2100.4, 2101.6, 2102.8, 2104, 2105.2, 2106.4, 2107.6, 2108.8, 2110, 2111.2, 2112.4, 2113.6, 2114.8, 2116, 2117.2, 2118.4, 2119.6, 2120.8, 2122, 2123.2, 2124.4, 2125.7, 2126.9, 2128.1, 2129.3, 2130.5, 2131.7, 2132.9, 2134.1, 2135.3, 2136.5, 2137.7, 2138.9, 2140.1, 2141.5, 2142.8, 2144, 2145.2, 2146.4, 2147.7, 2148.9, 2150.1, 2151.3, 2152.5, 2153.7, 2154.9, 2156.1, 2157.3, 2158.5, 2159.7, 2160.9, 2162.1, 2163.3, 2164.5, 2165.7, 2166.9, 2168.1, 2169.3, 2170.5, 2171.7, 2172.9, 2174.1, 2175.3, 2176.5, 2177.7, 2179, 2180.1, 2181.3, 2182.6, 2183.8, 2184.9, 2186.2, 2187.4, 2188.6, 2189.8, 2191, 2192.2, 2193.4, 2194.6, 2195.8, 2197, 2198.2, 2199.4, 2200.6, 2201.8, 2203, 2204.2, 2205.4, 2206.6, 2207.8, 2209, 2210.2, 2211.4, 2212.6, 2213.8, 2215, 2216.2, 2217.4, 2218.6, 2219.8, 2221, 2222.2, 2223.4, 2224.6, 2225.8, 2227, 2228.2, 2229.4, 2230.6, 2231.8, 2233, 2234.2, 2235.4, 2236.6, 2237.8, 2239, 2240.2, 2241.5, 2242.7, 2243.9, 2245.1, 2246.3, 2247.5, 2248.7, 2249.9, 2251.1, 2252.3, 2253.5, 2254.7, 2255.9, 2257.1, 2258.3, 2259.5, 2260.7, 2261.9, 2263.1, 2264.3, 2265.5, 2266.7, 2267.9, 2269.1, 2270.3, 2271.5, 2272.7, 2273.9, 2275.1, 2276.3, 2277.5, 2278.7, 2279.9, 2281.1, 2282.3, 2283.5, 2284.7, 2285.9, 2287.1, 2288.4, 2289.6, 2290.8, 2292, 2293.2, 2294.4, 2295.6, 2296.8, 2298, 2299.2, 2300.4, 2301.6, 2302.8, 2304, 2305.2, 2306.4, 2307.6, 2308.8, 2310, 2311.2, 2312.4, 2313.6, 2314.8, 2316, 2317.2, 2318.4, 2319.6, 2320.8, 2322, 2323.2, 2324.4, 2325.6, 2326.8, 2328, 2329.2, 2330.4, 2331.6, 2332.8, 2334, 2335.2, 2336.4, 2337.6, 2338.8, 2340, 2341.2, 2342.4, 2343.6, 2344.8, 2346, 2347.2, 2348.4, 2349.7, 2350.9, 2352.1, 2353.3, 2354.5, 2355.7, 2356.9, 2358.1, 2359.3, 2360.5, 2361.7, 2362.9, 2364.1, 2365.3, 2366.5, 2367.7, 2369, 2370.2, 2371.4, 2372.6, 2373.8, 2375, 2376.2, 2377.4, 2378.6, 2379.8, 2381, 2382.2, 2383.4, 2384.6, 2385.8, 2387, 2388.2, 2389.4, 2390.6, 2391.8, 2393, 2394.2, 2395.4, 2396.6, 2397.8, 2399, 2400.2, 2401.5, 2402.7, 2403.9, 2405.1, 2406.3, 2407.5, 2408.7, 2409.9, 2411.1, 2412.3, 2413.5, 2414.7, 2415.9, 2417.1, 2418.3, 2419.5, 2420.7, 2421.9, 2423.1, 2424.3, 2425.5, 2426.7, 2427.9, 2429.1, 2430.3, 2431.5, 2432.7, 2433.9, 2435.1, 2436.3, 2437.5, 2438.7, 2439.9, 2441.2, 2442.4, 2443.6, 2444.8, 2446, 2447.2, 2448.4, 2449.6, 2450.8, 2452, 2453.2, 2454.4, 2455.6, 2456.8, 2458, 2459.2, 2460.4, 2461.6, 2462.8, 2464, 2465.2, 2466.4, 2467.6, 2468.8, 2470, 2471.2, 2472.5, 2473.7, 2474.9, 2476.1, 2477.3, 2478.5, 2479.7, 2480.9, 2482.1, 2483.3, 2484.5, 2485.7, 2486.9, 2488.1, 2489.3, 2490.5, 2491.7, 2492.9, 2494.1, 2495.3, 2496.5, 2497.7, 2498.9, 2500.1, 2501.3, 2502.5, 2503.7, 2504.9, 2506.1, 2507.3, 2508.5, 2509.7, 2510.9, 2512.1, 2513.3, 2514.5, 2515.7, 2516.9, 2518.1, 2519.3, 2520.5, 2521.8, 2523, 2524.2, 2525.4, 2526.6, 2527.8, 2529, 2530.2, 2531.4, 2532.6, 2533.8, 2535, 2536.2, 2537.4, 2538.6, 2539.8, 2541, 2542.2, 2543.4, 2544.6, 2545.8, 2547, 2548.2, 2549.4, 2550.6, 2551.8, 2553, 2554.2, 2555.4, 2556.7, 2557.9, 2559.1, 2560.3, 2561.5, 2562.7, 2563.9, 2565.1, 2566.3, 2567.5, 2568.7, 2569.9, 2571.1, 2572.3, 2573.5, 2574.7, 2575.9, 2577.1, 2578.3, 2579.5, 2580.8, 2581.9, 2583.2, 2584.4, 2585.6, 2586.8, 2588, 2589.2, 2590.4, 2591.6, 2592.8, 2594, 2595.2, 2596.4, 2597.6, 2598.8, 2600, 2601.2, 2602.4, 2603.6, 2604.8, 2606, 2607.2, 2608.4, 2609.6, 2610.8, 2612, 2613.2, 2614.4, 2615.6, 2616.8, 2618, 2619.2, 2620.4, 2621.6, 2622.9, 2624.1, 2625.3, 2626.5, 2627.7, 2628.9, 2630.1, 2631.3, 2632.5, 2633.7, 2634.9, 2636.1, 2637.3, 2638.5, 2639.7, 2640.9, 2642.2, 2643.4, 2644.5, 2645.8, 2647, 2648.2, 2649.4, 2650.6, 2651.8, 2653, 2654.2, 2655.4, 2656.6, 2657.8, 2659, 2660.2, 2661.4, 2662.6, 2663.9, 2665.1, 2666.3, 2667.5, 2668.7, 2669.9, 2671.1, 2672.3, 2673.5, 2674.7, 2675.9, 2677.1, 2678.3, 2679.5, 2680.8, 2682, 2683.2, 2684.4, 2685.6, 2686.8, 2688, 2689.2, 2690.4, 2691.6, 2692.8, 2694, 2695.2, 2696.4, 2697.6, 2698.9, 2700.1, 2701.3, 2702.5, 2703.7, 2705, 2706.2, 2707.4, 2708.6, 2709.8, 2711, 2712.2, 2713.4, 2714.6, 2715.9, 2717.1, 2718.3, 2719.5, 2720.7, 2721.9, 2723.1, 2724.3, 2725.5, 2726.7, 2727.9, 2729.1, 2730.4, 2731.6, 2732.8, 2734, 2735.2, 2736.4, 2737.6, 2738.8, 2740.1, 2741.3, 2742.5, 2743.7, 2744.9, 2746.2, 2747.4, 2748.6, 2749.8, 2751.1, 2752.3, 2753.5, 2754.7, 2755.9, 2757.1, 2758.3, 2759.5, 2760.7, 2761.9, 2763.1, 2764.4, 2765.6, 2766.8, 2768, 2769.2, 2770.4, 2771.6, 2772.8, 2774, 2775.3, 2776.5, 2777.7, 2778.9, 2780.1, 2781.3, 2782.5, 2783.7, 2784.9, 2786.1, 2787.3, 2788.5, 2789.7, 2790.9, 2792.2, 2793.4, 2794.6, 2795.8, 2797, 2798.2, 2799.4, 2800.6, 2801.8, 2803, 2804.2, 2805.4, 2806.7, 2807.9, 2809.1, 2810.3, 2811.5, 2812.7, 2813.9, 2815.1, 2816.3, 2817.5, 2818.7, 2819.9, 2821.1, 2822.4, 2823.6, 2824.8, 2826, 2827.2, 2828.4, 2829.6, 2830.8, 2832, 2833.2, 2834.5, 2835.7, 2836.9, 2838.1, 2839.3, 2840.5, 2841.7, 2843, 2844.2, 2845.4, 2846.6, 2847.8, 2849, 2850.2, 2851.5, 2852.7, 2853.9, 2855.1, 2856.3, 2857.5, 2858.7, 2860, 2861.2, 2862.4, 2863.6, 2864.8, 2866, 2867.3, 2868.5, 2869.7, 2870.9, 2872.2, 2873.4, 2874.6, 2875.8, 2877, 2878.2, 2879.4, 2880.7, 2881.9, 2883.1, 2884.3, 2885.5, 2886.7, 2887.9, 2889.2, 2890.4, 2891.6, 2892.8, 2894, 2895.2, 2896.4, 2897.7, 2898.9, 2900.1, 2901.3, 2902.5, 2903.7, 2904.9, 2906.2, 2907.4, 2908.6, 2909.8, 2911, 2912.2, 2913.4, 2914.6, 2915.9, 2917.1, 2918.3, 2919.5, 2920.7, 2921.9, 2923.1, 2924.4, 2925.6, 2926.8, 2928, 2929.2, 2930.5, 2931.7, 2932.9, 2934.1, 2935.3, 2936.5, 2937.7, 2939, 2940.2, 2941.4, 2942.6, 2943.8, 2945.1, 2946.3, 2947.5, 2948.7, 2949.9, 2951.2, 2952.4, 2953.6, 2954.8, 2956, 2957.2, 2958.4, 2959.7, 2960.9, 2962.1, 2963.3, 2964.5, 2965.8, 2967, 2968.2, 2969.4, 2970.6, 2971.8, 2973, 2974.3, 2975.5, 2976.7, 2977.9, 2979.1, 2980.3, 2981.5, 2982.8, 2984, 2985.2, 2986.4, 2987.6, 2988.8, 2990.1, 2991.3, 2992.5, 2993.7, 2994.9, 2996.1, 2997.4, 2998.6, 2999.8, 3001, 3002.2, 3003.5, 3004.7, 3005.9, 3007.1, 3008.3, 3009.5, 3010.8, 3012, 3013.2, 3014.4, 3015.6, 3016.8, 3018.1, 3019.3, 3020.5, 3021.7, 3022.9, 3024.1, 3025.3, 3026.6, 3027.8, 3029, 3030.2, 3031.4, 3032.7, 3033.9, 3035.1, 3036.3, 3037.5, 3038.8, 3040, 3041.2, 3042.4, 3043.6, 3044.8, 3046, 3047.2, 3048.5, 3049.7, 3050.9, 3052.2, 3053.4, 3054.7, 3055.9, 3057.1, 3058.3, 3059.5, 3060.7, 3061.9, 3063.1, 3064.4, 3065.6, 3066.8, 3068, 3069.2, 3070.4, 3071.7, 3072.9, 3074.1, 3075.3, 3076.5, 3077.7, 3079, 3080.2, 3081.4, 3082.6, 3083.9, 3085.1, 3086.3, 3087.5, 3088.7, 3089.9, 3091.2, 3092.4, 3093.6, 3094.8, 3096, 3097.2, 3098.5, 3099.7, 3100.9, 3102.2, 3103.4, 3104.6, 3105.8, 3107.1, 3108.3, 3109.5, 3110.8, 3112, 3113.3, 3114.5, 3115.7, 3116.9, 3118.2, 3119.4, 3120.7, 3122, 3123.2, 3124.5, 3125.7, 3126.9, 3128.2, 3129.4, 3130.6, 3131.9, 3133.1, 3134.4, 3135.6, 3136.9, 3138.1, 3139.4, 3140.6, 3141.9, 3143.1, 3144.4, 3145.6, 3146.9, 3148.1, 3149.4, 3150.6, 3151.8, 3153.1, 3154.3, 3155.6, 3156.8, 3158.1, 3159.3, 3160.6, 3161.8, 3163.1, 3164.3, 3165.6, 3166.8, 3168.1, 3169.3, 3170.6, 3171.8, 3173.1, 3174.3, 3175.5, 3176.8, 3178, 3179.3, 3180.5, 3181.8, 3183, 3184.3, 3185.5, 3186.8, 3188, 3189.2, 3190.5, 3191.7, 3193, 3194.2, 3195.5, 3196.8, 3198, 3199.3, 3200.5, 3201.8, 3203, 3204.3, 3205.5, 3206.8, 3208, 3209.3, 3210.5, 3211.7, 3213, 3214.2, 3215.5, 3216.8, 3218, 3219.3, 3220.5, 3221.8, 3223, 3224.2, 3225.5, 3226.7, 3228, 3229.2, 3230.4, 3231.7, 3232.9, 3234.2, 3235.5, 3236.7, 3238, 3239.2, 3240.5, 3241.7, 3243, 3244.2, 3245.4, 3246.7, 3247.9, 3249.1, 3250.4, 3251.6, 3252.9, 3254.2, 3255.4, 3256.7, 3257.9, 3259.1, 3260.4, 3261.6, 3262.9, 3264.1, 3265.4, 3266.6, 3267.9, 3269.1, 3270.4, 3271.7, 3272.9, 3274.1, 3275.4, 3276.6, 3277.9, 3279.2, 3280.4, 3281.6, 3282.9, 3284.1, 3285.4, 3286.6, 3287.9, 3289.1, 3290.3, 3291.6, 3292.9, 3294.1, 3295.4, 3296.6, 3297.9, 3299.1, 3300.4, 3301.6, 3302.9, 3304.1, 3305.4, 3306.6, 3307.9, 3309.1, 3310.4, 3311.7, 3312.9, 3314.1, 3315.4, 3316.6, 3317.9, 3319.1, 3320.4, 3321.6, 3322.9, 3324.1, 3325.4, 3326.6, 3327.8, 3329.1, 3330.4, 3331.6, 3332.9, 3334.1, 3335.4, 3336.6, 3337.9, 3339.1, 3340.4, 3341.6, 3342.9, 3344.1, 3345.4, 3346.6, 3347.9, 3350.1, 3351.4, 3352.6, 3353.8, 3355, 3356.2, 3357.4, 3358.7, 3359.9, 3361.1, 3362.3, 3363.6, 3364.8, 3366.1, 3367.3, 3368.6, 3369.8, 3371, 3372.3, 3373.5, 3374.7, 3375.9, 3377.2, 3378.4, 3379.6, 3380.8, 3382, 3383.3, 3384.5, 3385.7, 3386.9, 3388.2, 3389.4, 3390.7, 3391.9, 3393.1, 3394.4, 3395.6, 3396.8, 3398.1, 3399.3, 3400.5, 3401.8, 3403, 3404.2, 3405.4, 3406.7, 3408, 3409.2, 3410.4, 3411.7, 3412.9, 3414.1, 3415.4, 3416.6, 3417.8, 3419.1, 3420.3, 3421.5, 3422.8, 3424, 3425.2, 3426.4, 3427.7, 3428.9, 3430.1, 3431.4, 3432.6, 3433.9, 3435.1, 3436.3, 3437.6, 3438.8, 3440, 3441.2, 3442.5, 3443.7, 3445, 3446.2, 3447.4, 3448.6, 3449.8, 3451, 3452.3, 3453.5, 3454.7, 3455.9, 3457.1, 3458.3, 3459.5, 3460.7, 3461.9, 3463.1, 3464.4, 3465.6, 3466.9, 3468.1, 3469.3, 3470.5, 3471.7, 3472.9, 3474.1, 3475.3, 3476.5, 3477.7, 3478.9, 3480.1, 3481.3, 3482.6, 3483.8, 3485, 3486.2, 3487.5, 3488.7, 3489.9, 3491.1, 3492.3, 3493.5, 3494.7, 3496, 3497.2, 3498.4, 3499.6, 3500.8, 3502, 3503.2, 3504.4, 3505.7, 3506.9, 3508.1, 3509.3, 3510.5, 3511.7, 3512.9, 3514.1, 3515.3, 3516.6, 3517.8, 3519, 3520.2, 3521.4, 3522.6, 3523.8, 3525.1, 3526.3, 3527.5, 3528.7, 3529.9, 3531.1, 3532.3, 3533.5, 3534.7, 3536, 3537.2, 3538.4, 3539.6, 3540.8, 3542.1, 3543.3, 3544.6, 3545.9, 3547.1, 3548.4, 3549.6, 3550.8, 3552.1, 3553.3, 3554.5, 3555.7, 3557, 3558.2, 3559.4, 3560.7, 3561.9, 3563.1, 3564.4, 3565.6, 3566.9, 3568.1, 3569.4, 3570.6, 3571.9, 3573.1, 3574.3, 3575.6, 3576.8, 3578, 3579.3, 3580.5, 3581.8, 3583, 3584.2, 3585.5, 3586.7, 3587.9, 3589.2, 3590.4, 3591.6, 3592.9, 3594.1, 3595.3, 3596.6, 3597.8, 3599, 3600.3, 3601.5, 3602.7, 3603.9, 3605.2, 3606.5, 3607.7, 3609, 3610.2, 3611.5, 3612.7, 3613.9, 3615.1, 3616.4, 3617.6, 3618.8, 3620.1, 3621.3, 3622.5, 3623.8, 3625, 3626.3, 3627.6, 3628.8, 3630, 3631.3, 3632.5, 3633.7, 3635, 3636.2, 3637.4, 3638.6, 3639.9, 3641.1, 3642.3, 3643.6, 3644.8, 3646.1, 3647.3, 3648.6, 3649.8, 3651.1, 3652.3, 3653.5, 3654.8, 3656, 3657.3, 3658.5, 3659.7, 3661, 3662.2, 3663.5, 3664.7, 3666, 3667.2, 3668.5, 3669.8, 3671, 3672.2, 3673.5, 3674.7, 3676, 3677.2, 3678.5, 3679.7, 3681, 3682.2, 3683.5, 3684.7, 3686, 3687.2, 3688.5, 3689.7, 3691.1, 3692.3, 3693.6, 3694.8, 3696.1, 3697.3, 3698.6, 3699.8, 3701, 3702.3, 3703.5, 3704.7, 3705.9, 3707.2, 3708.4, 3709.7, 3711.2, 3712.7, 3714, 3715.2, 3716.7, 3718, 3719.2, 3720.4, 3721.7, 3722.9, 3724.1, 3725.4, 3726.6, 3727.9, 3729.1, 3730.4, 3731.6, 3732.9, 3734.1, 3735.4, 3736.6, 3737.9, 3739.1, 3740.3, 3741.6, 3742.8, 3744.1, 3745.3, 3746.6, 3747.8, 3749.6, 3751.3, 3752.6, 3753.9, 3755.3, 3756.5, 3757.7, 3759, 3760.4, 3761.6, 3762.9, 3764.1, 3765.3, 3766.7, 3768, 3769.2, 3770.5, 3771.8, 3773, 3774.2, 3775.5, 3776.9, 3778.3, 3780, 3781.4, 3782.9, 3784.1, 3785.6, 3786.9, 3788.4, 3789.7, 3791, 3792.4, 3793.7, 3795.1, 3796.6, 3797.8, 3799.1, 3800.3, 3801.6, 3803, 3804.3, 3805.7, 3807.1, 3808.4, 3809.7, 3811, 3812.3, 3813.7, 3815, 3816.4, 3817.7, 3819.1, 3820.5, 3821.8, 3823.3, 3824.7, 3826, 3827.5, 3828.8, 3830, 3831.3, 3832.5, 3833.8, 3835, 3836.3, 3837.5, 3838.8, 3840, 3841.3, 3842.5, 3843.8, 3845, 3846.2, 3847.5, 3848.8, 3850, 3851.3, 3852.5, 3853.8, 3855, 3856.2, 3857.5, 3858.7, 3860, 3861.2, 3862.5, 3863.7, 3865, 3866.3, 3867.5, 3868.7, 3870, 3871.4, 3872.7, 3873.9, 3875.2, 3876.4, 3877.7, 3879, 3880.2, 3881.5, 3882.8, 3884.1, 3885.3, 3886.5, 3887.7, 3888.9, 3890.2, 3891.4, 3892.7, 3894, 3895.3, 3896.5, 3897.8, 3899, 3900.3, 3901.6, 3902.8, 3904.2, 3905.4, 3906.7, 3908, 3909.3, 3910.6, 3911.9, 3913.2, 3914.5, 3915.8, 3917, 3918.3, 3919.6, 3920.9, 3922.2, 3923.4, 3924.7, 3925.9, 3927.2, 3928.5, 3929.7, 3931, 3932.3, 3933.5, 3934.8, 3936, 3937.3, 3938.6, 3939.8, 3941.1, 3942.3, 3943.6, 3944.8, 3946.1, 3947.3, 3948.6, 3949.8, 3951.1, 3952.3, 3953.6, 3954.8, 3956.1, 3957.3, 3958.6, 3959.8, 3961.2, 3962.4, 3963.7, 3965, 3966.2, 3967.5, 3968.7, 3970, 3971.2, 3972.5, 3973.7, 3975, 3976.4, 3977.6, 3978.9, 3980.1, 3981.4, 3982.7, 3984, 3985.2, 3986.5, 3987.8, 3989, 3990.3, 3991.5, 3992.8, 3994, 3995.3, 3996.5, 3997.8, 3999, 4000.3, 4001.6, 4002.8, 4004.1, 4005.4, 4006.7, 4008, 4009.3, 4010.6, 4011.9, 4013.1, 4014.4, 4015.6, 4016.9, 4018.1, 4019.4, 4021.5, 4023, 4024.3, 4025.6, 4026.9, 4028.1, 4029.5, 4030.8, 4032.1, 4033.4, 4034.6, 4035.9, 4037.2, 4038.4, 4039.7, 4040.9, 4042.2, 4043.4, 4044.7, 4046, 4047.2, 4048.5, 4049.7, 4051, 4052.3, 4053.5, 4054.7, 4056, 4057.2, 4058.5, 4059.8, 4061, 4062.3, 4063.6, 4064.9, 4066.1, 4067.4, 4068.7, 4069.9, 4071.2, 4072.4, 4073.8, 4075, 4076.3, 4077.6, 4078.8, 4080.1, 4081.3, 4082.6, 4083.8, 4085.1, 4086.4, 4087.6, 4088.8, 4090.1, 4091.4, 4092.7, 4094, 4095.2, 4096.5, 4097.7, 4099.1, 4100.4, 4101.7, 4103.1, 4104.4, 4105.7, 4107, 4108.2, 4109.5, 4110.8, 4112, 4113.3, 4114.5, 4115.8, 4117.1, 4118.3, 4119.6, 4120.8, 4122.2, 4123.4, 4124.7, 4126, 4127.2, 4128.4, 4129.7, 4131, 4132.2, 4133.5, 4134.7, 4136, 4137.3, 4138.5, 4139.8, 4141.1, 4142.3, 4143.6, 4144.9, 4146.2, 4147.5, 4148.7, 4150, 4151.2, 4152.5, 4153.8, 4155, 4156.3, 4157.5, 4158.8, 4160, 4161.3, 4162.6, 4163.8, 4165.1, 4166.3, 4167.6, 4168.9, 4170.2, 4171.4, 4172.7, 4174, 4175.3, 4176.5, 4177.8, 4179, 4180.3, 4181.5, 4182.8, 4184, 4185.3, 4186.5, 4187.8, 4189.1, 4190.3, 4191.6, 4192.9, 4194.1, 4195.4, 4196.6, 4197.9, 4199.1, 4200.4, 4201.7, 4202.9, 4204.2, 4205.5, 4206.7, 4208, 4209.3, 4210.5, 4211.8, 4213, 4214.3, 4215.6, 4216.9, 4218.1, 4219.4, 4220.7, 4221.9, 4223.2, 4224.6, 4225.9, 4227.1, 4228.4, 4229.7, 4230.9, 4232.2, 4233.5, 4234.8, 4236.1, 4237.5, 4238.8, 4240.2, 4241.4, 4242.7, 4244, 4245.2, 4246.6, 4247.9, 4249.2, 4250.6, 4251.9, 4253.2, 4254.5, 4255.8, 4257, 4258.3, 4259.6, 4261, 4262.2, 4263.5, 4264.9, 4266.2, 4267.4, 4268.7, 4270, 4271.2, 4272.5, 4273.7, 4275, 4276.3, 4277.6, 4278.8, 4280.1, 4281.4, 4282.7, 4284, 4285.2, 4286.6, 4287.9, 4289.2, 4290.5, 4291.8, 4293.1, 4294.3, 4295.6, 4296.9, 4298.1, 4299.4, 4300.7, 4302, 4303.2, 4304.5, 4305.8, 4307, 4308.3, 4309.6, 4310.8, 4312.1, 4313.4, 4314.7, 4316, 4317.2, 4318.5, 4319.7, 4321, 4322.3, 4323.6, 4324.8, 4326.1, 4327.3, 4328.7, 4330, 4331.3, 4332.7, 4334, 4335.3, 4336.5, 4337.8, 4339.1, 4340.4, 4341.7, 4343, 4344.2, 4345.5, 4346.9, 4348.2, 4349.4, 4350.7, 4352.1, 4353.4, 4354.7, 4355.9, 4357.2, 4358.5, 4359.8, 4361.1, 4362.4, 4363.7, 4364.9, 4366.2, 4367.5, 4368.8, 4370, 4371.4, 4372.6, 4373.9, 4375.2, 4376.4, 4377.8, 4379, 4380.3, 4381.5, 4382.8, 4384.1, 4385.4, 4386.8, 4388.1, 4389.4, 4390.7, 4392, 4393.3, 4394.6, 4395.8, 4397.1, 4398.4, 4399.7, 4401.1, 4402.3, 4403.6, 4404.9, 4406.3, 4407.6, 4408.9, 4410.3, 4411.6, 4412.8, 4414.2, 4415.4, 4416.7, 4418, 4419.3, 4420.7, 4422, 4423.3, 4424.6, 4425.9, 4427.3, 4428.7, 4430, 4431.3, 4432.7, 4434, 4435.4, 4436.8, 4438.1, 4439.5, 4440.8, 4442.2, 4443.5, 4444.9, 4446.1, 4447.4, 4448.7, 4450, 4451.4, 4452.7, 4453.9, 4455.3, 4456.6, 4457.9, 4459.2, 4460.5, 4461.9, 4463.2, 4464.6, 4466, 4467.3, 4468.7, 4470, 4471.3, 4472.7, 4474.1, 4475.4, 4476.7, 4478.1, 4479.4, 4480.8, 4482.2, 4483.5, 4484.9, 4486.3, 4487.6, 4488.9, 4490.3, 4491.8, 4493.1, 4494.4, 4495.7, 4497, 4498.3, 4499.6, 4501, 4502.3, 4503.7, 4505, 4506.3, 4507.6, 4508.9, 4510.2, 4511.5, 4512.8, 4514.1, 4515.4, 4516.8, 4518.1, 4519.5, 4520.8, 4522.2, 4523.4, 4524.8, 4526.1, 4527.5, 4528.8, 4530.1, 4531.4, 4532.8, 4534, 4535.3, 4536.7, 4538.1, 4539.4, 4540.7, 4542, 4543.4, 4544.7, 4546.1, 4547.4, 4548.7, 4550.1, 4551.4, 4552.8, 4554.1, 4555.4, 4556.8, 4558.1, 4559.4, 4560.7, 4562, 4563.3, 4564.6, 4566, 4567.3, 4568.7, 4570.1, 4571.4, 4572.7, 4574, 4575.5, 4576.9, 4578.3, 4579.6, 4581, 4582.3, 4583.7, 4585.1, 4586.4, 4587.7, 4589, 4590.3, 4591.7, 4593, 4594.3, 4595.7, 4597, 4598.3, 4599.6, 4601, 4602.3, 4603.6, 4604.9, 4606.3, 4607.7, 4609, 4610.4, 4611.8, 4613.1, 4614.5, 4616, 4617.3, 4618.6, 4619.9, 4621.2, 4622.5, 4623.9, 4625.3, 4626.7, 4628, 4629.4, 4630.8, 4632.2, 4633.5, 4634.8, 4636.2, 4637.5, 4638.8, 4640.2, 4641.5, 4642.9, 4644.2, 4645.6, 4646.9, 4648.3, 4649.6, 4650.9, 4652.2, 4653.6, 4654.9, 4656.3, 4657.7, 4659.1, 4660.5, 4661.9, 4663.3, 4664.6, 4665.9, 4667.3, 4668.7, 4670.1, 4671.4, 4672.7, 4674.1, 4675.5, 4676.9, 4678.2, 4679.6, 4681, 4682.4, 4683.7, 4685.1, 4686.4, 4687.8, 4689.1, 4690.4, 4691.8, 4693.2, 4694.5, 4695.9, 4697.3, 4698.8, 4700.1, 4701.5, 4702.9, 4704.2, 4705.5, 4706.9, 4708.3, 4709.7, 4711, 4712.4, 4713.8, 4715.2, 4716.6, 4717.9, 4719.3, 4720.6, 4722, 4723.3, 4724.6, 4726, 4727.5, 4728.8, 4730.2, 4731.5, 4732.9, 4734.3, 4735.7, 4737.1, 4738.5, 4739.8, 4741.2, 4742.5, 4743.9, 4745.3, 4746.6, 4747.9, 4749.3, 4750.6, 4752, 4753.4, 4754.8, 4756.2, 4757.5, 4758.9, 4760.3, 4761.6, 4762.9, 4764.3, 4765.6, 4767, 4768.3, 4769.6, 4771, 4772.4, 4773.7, 4775, 4776.4, 4777.8, 4779.2, 4780.6, 4782, 4783.4, 4784.8, 4786.2, 4787.5, 4788.9, 4790.3, 4791.7, 4793, 4794.4, 4795.7, 4797.1, 4798.4, 4799.8, 4801.3, 4802.6, 4804, 4805.4, 4806.8, 4808.2, 4809.6, 4811, 4812.4, 4813.8, 4815.2, 4816.6, 4818, 4819.4, 4820.8, 4822.2, 4823.6, 4824.9, 4826.4, 4827.7, 4829.1, 4830.5, 4831.9, 4833.3, 4834.7, 4836.1, 4837.5, 4838.9, 4840.2, 4841.6, 4843, 4844.4, 4845.8, 4847.2, 4848.6, 4850, 4851.4, 4852.8, 4854.2, 4855.6, 4856.9, 4858.3, 4859.7, 4861.1, 4862.5, 4863.9, 4865.3, 4866.7, 4868.1, 4869.5, 4870.9, 4872.3, 4873.7, 4875.1, 4876.5, 4877.8, 4879.2, 4880.6, 4882, 4883.3, 4884.6, 4886, 4887.4, 4888.8, 4890.1, 4891.6, 4893, 4894.4, 4895.7, 4897.1, 4898.6, 4900, 4901.4, 4902.8, 4904.2, 4905.6, 4907, 4908.4, 4909.8, 4911.2, 4912.6, 4914, 4915.3, 4916.7, 4918.1, 4919.5, 4920.9, 4922.3, 4923.7, 4925.1, 4926.5, 4927.9, 4929.3, 4930.7, 4932.1, 4933.5, 4934.9, 4936.3, 4937.7, 4939.1, 4940.5, 4941.9, 4943.3, 4944.7, 4946.1, 4947.5, 4948.9, 4950.3, 4951.7, 4953.1, 4954.5, 4955.9, 4957.3, 4958.7, 4960.1, 4961.5, 4962.9, 4964.3, 4965.7, 4967.1, 4968.4, 4969.8, 4971.2, 4972.6, 4974, 4975.4, 4976.8, 4978.2, 4979.6, 4981, 4982.4, 4983.8, 4985.2, 4986.6, 4988, 4989.4, 4990.9, 4992.3, 4993.7, 4995.1, 4996.5, 4997.9, 4999.3, 5000.9, 5002.4, 5003.8, 5005.2, 5006.6, 5008, 5009.4, 5010.8, 5012.2, 5013.6, 5015, 5016.4, 5017.8, 5019.2, 5020.6, 5022.1, 5023.5, 5025, 5026.5, 5028, 5029.4, 5030.9, 5032.3, 5033.7, 5035.1, 5036.5, 5037.9, 5039.3, 5040.7, 5042.1, 5043.5, 5044.9, 5046.3, 5047.7, 5049.1, 5050.5, 5051.9, 5053.4, 5054.8, 5056.2, 5057.6, 5059, 5060.4, 5061.8, 5063.2, 5064.6, 5066, 5067.4, 5068.8, 5070.2, 5071.6, 5073, 5074.4, 5075.8, 5077.2, 5078.6, 5080, 5081.4, 5082.8, 5084.2, 5085.6, 5087, 5088.4, 5089.8, 5091.3, 5092.7, 5094.1, 5095.5, 5096.9, 5098.3, 5099.7, 5101.1, 5102.5, 5103.9, 5105.3, 5106.7, 5108.1, 5109.5, 5110.9, 5112.3, 5113.7, 5115.1, 5116.5, 5117.9, 5119.3, 5120.7, 5122.1, 5123.5, 5124.9, 5126.3, 5127.7, 5129.1, 5130.6, 5131.9, 5133.4, 5134.8, 5136.2, 5137.6, 5139, 5140.4, 5141.8, 5143.2, 5144.6, 5146, 5147.4, 5148.8, 5150.3, 5151.6, 5153.1, 5154.5, 5155.9, 5157.3, 5158.7, 5160.1, 5161.5, 5162.9, 5164.3, 5165.7, 5167.1, 5168.5, 5169.9, 5171.3, 5172.7, 5174.1, 5175.5, 5177, 5178.4, 5179.8, 5181.2, 5182.6, 5184, 5185.4, 5186.8, 5188.2, 5189.6, 5191, 5192.4, 5193.8, 5195.2, 5196.6, 5198, 5199.4, 5200.8, 5202.2, 5203.6, 5205, 5206.4, 5207.9, 5209.3, 5210.7, 5212.1, 5213.5, 5214.9, 5216.3, 5217.7, 5219.1, 5220.5, 5221.9, 5223.3, 5224.7, 5226.1, 5227.5, 5228.9, 5230.3, 5231.7, 5233.1, 5234.5, 5235.9, 5237.4, 5238.9, 5240.3, 5241.7, 5243.1, 5244.5, 5246, 5247.6, 5249, 5250.4, 5251.8, 5253.2, 5254.6, 5256, 5257.4, 5259, 5260.4, 5261.9, 5263.3, 5264.7, 5266.2, 5267.6, 5269, 5270.4, 5271.8, 5273.2, 5274.6, 5276.1, 5277.5, 5278.9, 5280.3, 5281.7, 5283.1, 5284.5, 5285.9, 5287.3, 5288.8, 5290.2, 5291.6, 5293, 5294.4, 5295.9, 5297.3, 5298.7, 5300.1, 5301.5, 5303, 5304.5, 5305.9, 5307.3, 5308.7, 5310.1, 5311.5, 5312.9, 5314.3, 5315.7, 5317.1, 5318.5, 5319.9, 5321.3, 5322.7, 5324.1, 5325.5, 5326.9, 5328.3, 5329.7, 5331.1, 5332.5, 5333.9, 5335.4, 5336.8, 5338.2, 5339.6, 5341, 5342.4, 5343.8, 5345.2, 5346.6, 5348, 5349.4, 5350.8, 5352.2, 5353.6, 5355, 5356.4, 5357.8, 5359.2, 5360.6, 5362, 5363.4, 5364.8, 5366.3, 5367.7, 5369.1, 5370.5, 5371.9, 5373.3, 5374.7, 5376.1, 5377.5, 5378.9, 5380.3, 5381.7, 5383.1, 5384.5, 5386, 5387.3, 5388.7, 5390.2, 5391.6, 5393, 5394.3, 5395.8, 5397.2, 5398.6, 5400, 5401.4, 5402.8, 5404.2, 5405.6, 5407, 5408.4, 5409.9, 5411.2, 5412.7, 5414.1, 5415.5, 5416.9, 5418.3, 5419.7, 5421.1, 5422.5, 5423.9, 5425.3, 5426.7, 5428.1, 5429.5, 5431, 5432.3, 5433.7, 5435.1, 5436.6, 5438, 5439.4, 5440.8, 5442.2, 5443.6, 5445, 5446.4, 5447.8, 5449.2, 5450.6, 5452, 5453.4, 5454.8, 5456.2, 5457.6, 5459, 5460.4, 5461.8, 5463.3, 5464.7, 5466.1, 5467.5, 5468.9, 5470.3, 5471.7, 5473.1, 5474.5, 5475.9, 5477.3, 5478.7, 5480.1, 5481.5, 5482.9, 5484.3, 5485.7, 5487.1, 5488.5, 5489.9, 5491.3, 5492.7, 5494.1, 5495.6, 5497, 5498.4, 5499.8, 5501.2, 5502.6, 5504, 5505.4, 5506.8, 5508.2, 5509.6, 5511, 5512.4, 5513.8, 5515.2, 5516.6, 5518, 5519.4, 5520.8, 5522.2, 5523.6, 5525, 5526.4, 5527.8, 5529.4, 5530.8, 5532.2, 5533.6, 5535.1, 5536.5, 5537.9, 5539.3, 5540.7, 5542.2, 5543.6, 5545, 5546.4, 5547.8, 5549.3, 5550.7, 5552.1, 5553.5, 5555.1, 5556.5, 5558, 5559.4, 5560.8, 5562.3, 5563.8, 5565.2, 5566.6, 5568, 5569.4, 5570.8, 5572.2, 5573.6, 5575, 5576.4, 5577.8, 5579.3, 5580.7, 5582.1, 5583.5, 5584.9, 5586.3, 5587.7, 5589.1, 5590.5, 5591.9, 5593.3, 5594.7, 5596.2, 5597.6, 5599, 5600.4, 5601.8, 5603.2, 5604.6, 5606, 5607.4, 5608.8, 5610.2, 5611.6, 5613, 5614.4, 5615.8, 5617.2, 5618.6, 5620, 5621.4, 5622.8, 5624.2, 5625.6, 5627, 5628.5, 5629.9, 5631.3, 5632.7, 5634.1, 5635.5, 5636.9, 5638.3, 5639.7, 5641.1, 5642.5, 5643.9, 5645.3, 5646.7, 5648.1, 5649.5, 5650.9, 5652.3, 5653.7, 5655.2, 5656.6, 5658, 5659.4, 5660.8, 5662.2, 5663.6, 5665, 5666.4, 5667.8, 5669.2, 5670.6, 5672, 5673.4, 5674.8, 5676.2, 5677.6, 5679, 5680.4, 5681.8, 5683.2, 5684.6, 5686, 5687.4, 5688.8, 5690.2, 5691.6, 5693, 5694.5, 5695.9, 5697.3, 5698.7, 5700.1, 5701.5, 5702.9, 5704.3, 5705.7, 5707.1, 5708.5, 5709.9, 5711.3, 5712.7, 5714.1, 5715.5, 5716.9, 5718.3, 5719.7, 5721.1, 5722.5, 5723.9, 5725.3, 5726.7, 5728.1, 5729.5, 5730.9, 5732.3, 5733.7, 5735.2, 5736.5, 5738, 5739.4, 5740.8, 5742.2, 5743.6, 5745, 5746.4, 5747.8, 5749.2, 5750.6, 5752, 5753.4, 5754.8, 5756.2, 5757.6, 5759, 5760.4, 5761.8, 5763.2, 5764.6, 5766, 5767.4, 5768.8, 5770.2, 5771.6, 5773, 5774.4, 5775.8, 5777.3, 5778.7, 5780.1, 5781.5, 5782.9, 5784.3, 5785.7, 5787.1, 5788.5, 5789.9, 5791.3, 5792.7, 5794.1, 5795.5, 5796.9, 5798.4, 5799.8, 5801.2, 5802.6, 5804, 5805.4, 5806.8, 5808.2, 5809.6, 5811, 5812.4, 5813.8, 5815.2, 5816.6, 5818, 5819.4, 5820.8, 5822.2, 5823.6, 5825, 5826.4, 5827.8, 5829.2, 5830.6, 5832.1, 5833.5, 5834.9, 5836.3, 5837.8, 5839.2, 5840.6, 5842, 5843.4, 5844.8, 5846.2, 5847.6, 5849, 5850.4, 5851.8, 5853.2, 5854.6, 5856, 5857.4, 5858.8, 5860.2, 5861.6, 5863, 5864.4, 5865.8, 5867.3, 5868.7, 5870.1, 5871.5, 5872.9, 5874.3, 5875.8, 5877.2, 5878.6, 5880, 5881.4, 5882.8, 5884.2, 5885.6, 5887, 5888.4, 5889.8, 5891.2, 5892.6, 5894.1, 5895.5, 5896.9, 5898.3, 5899.7, 5901.1, 5902.5, 5903.9, 5905.3, 5906.7, 5908.1, 5909.6, 5911, 5912.4, 5913.8, 5915.2, 5916.6, 5918, 5919.4, 5920.8, 5922.3, 5923.7, 5925.1, 5926.5, 5928, 5929.4, 5930.8, 5932.3, 5933.7, 5935.1, 5936.6, 5938, 5939.4, 5940.8, 5942.2, 5943.7, 5945.1, 5946.5, 5947.9, 5949.4, 5950.8, 5952.2, 5953.7, 5955.1, 5956.5, 5957.9, 5959.4, 5960.8, 5962.2, 5963.7, 5965.1, 5966.5, 5967.9, 5969.4, 5970.8, 5972.3, 5973.7, 5975.2, 5976.6, 5978, 5979.4, 5980.8, 5982.2, 5983.7, 5985.1, 5986.5, 5987.9, 5989.4, 5990.8, 5992.2, 5993.6, 5995, 5996.4, 5997.8, 5999.3, 6000.7, 6002.1, 6003.5, 6005, 6006.4, 6007.9, 6009.3, 6010.8, 6012.2, 6013.6, 6015.1, 6016.5, 6017.9, 6019.4, 6020.8, 6022.2, 6023.6, 6025.1, 6026.5, 6028, 6029.4, 6030.8, 6032.2, 6033.7, 6035.1, 6036.5, 6037.9, 6039.4, 6040.8, 6042.2, 6043.6, 6045.1, 6046.5, 6047.9, 6049.4, 6050.8, 6052.3, 6053.7, 6055.1, 6056.5, 6057.9, 6059.4, 6060.8, 6062.2, 6063.7, 6065.1, 6066.5, 6068, 6069.4, 6070.8, 6072.3, 6073.7, 6075.2, 6076.6, 6078, 6079.4, 6081, 6082.4, 6083.8, 6085.2, 6086.6, 6088, 6089.5, 6090.9, 6092.3, 6093.7, 6095.1, 6096.6, 6098, 6099.4, 6100.8, 6102.2, 6103.6, 6105.1, 6106.5, 6107.9, 6109.3, 6110.7, 6112.2, 6113.6, 6115, 6116.5, 6117.9, 6119.3, 6120.7, 6122.2, 6123.6, 6125, 6126.4, 6127.8, 6129.2, 6130.6, 6132, 6133.5, 6134.9, 6136.3, 6137.7, 6139.2, 6140.6, 6142, 6143.4, 6144.9, 6146.3, 6147.7, 6149.1, 6150.5, 6152, 6153.5], datasets: [{ label: 'JSEventListeners', backgroundColor: 'rgba(248, 189, 64, 0.2)', borderColor: 'rgba(248, 189, 64, 1.00)', - data: [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 4, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76] + data: [8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128, 136, 144, 152, 160, 168, 176, 184, 192, 200, 208, 216, 224, 232, 240, 248, 256, 264, 272, 280, 288, 296, 304, 312, 320, 328, 336, 344, 352, 360, 368, 376, 384, 392, 400, 408, 416, 424, 432, 440, 448, 456, 464, 472, 480, 488, 496, 504, 512, 520, 528, 536, 544, 552, 560, 568, 576, 584, 592, 600, 608, 616, 624, 632, 640, 648, 656, 664, 672, 680, 688, 696, 704, 712, 720, 728, 736, 744, 752, 760, 768, 776, 784, 792, 800, 808, 816, 824, 832, 840, 848, 856, 864, 872, 880, 888, 896, 904, 912, 920, 928, 936, 944, 952, 960, 968, 976, 984, 992, 1000, 1008, 1016, 1024, 1032, 1040, 1048, 1056, 1064, 1072, 1080, 1088, 1096, 1104, 1112, 1120, 1128, 1136, 1144, 1152, 1160, 1168, 1176, 1184, 1192, 1200, 1208, 1216, 1224, 1232, 1240, 1248, 1256, 1264, 1272, 1280, 1288, 1296, 1304, 1312, 1320, 1328, 1336, 1344, 1352, 1360, 1368, 1376, 1384, 1392, 1400, 1408, 1416, 1424, 1432, 1440, 1448, 1456, 1464, 1472, 1480, 1488, 1496, 1504, 1512, 1520, 1528, 1536, 1544, 1552, 1560, 1568, 1576, 1584, 1592, 1600, 1608, 1616, 1624, 1632, 1640, 1648, 1656, 1664, 1672, 1680, 1688, 1696, 1704, 1712, 1720, 1728, 1736, 1744, 1752, 1760, 1768, 1776, 1784, 1792, 1800, 1808, 1816, 1824, 1832, 1840, 1848, 1856, 1864, 1872, 1880, 1888, 1896, 1904, 1912, 1920, 1928, 1936, 1944, 1952, 1960, 1968, 1976, 1984, 1992, 2000, 2008, 2016, 2024, 2032, 2040, 2048, 2056, 2064, 2072, 2080, 2088, 2096, 2104, 2112, 2120, 2128, 2136, 2144, 2152, 2160, 2168, 2176, 2184, 2192, 2200, 2208, 2216, 2224, 2232, 2240, 2248, 2256, 2264, 2272, 2280, 2288, 2296, 2304, 2312, 2320, 2328, 2336, 2344, 2352, 2360, 2368, 2376, 2384, 2392, 2400, 2408, 2416, 2424, 2432, 2440, 2448, 2456, 2464, 2472, 2480, 2488, 2496, 2504, 2512, 2520, 2528, 2536, 2544, 2552, 2560, 2568, 2576, 2584, 2592, 2600, 2608, 2616, 2624, 2632, 2640, 2648, 2656, 2664, 2672, 2680, 2688, 2696, 2704, 2712, 2720, 2728, 2736, 2744, 2752, 2760, 2768, 2776, 2784, 2792, 2800, 2808, 2816, 2824, 2832, 2840, 2848, 2856, 2864, 2872, 2880, 2888, 2896, 2904, 2912, 2920, 2928, 2936, 2944, 2952, 2960, 2968, 2976, 2984, 2992, 3000, 3008, 3016, 3024, 3032, 3040, 3048, 3056, 3064, 3072, 3080, 3088, 3096, 3104, 3112, 3120, 3128, 3136, 3144, 3152, 3160, 3168, 3176, 3184, 3192, 3200, 3208, 3216, 3224, 3232, 3240, 3248, 3256, 3264, 3272, 3280, 3288, 3296, 3304, 3312, 3320, 3328, 3336, 3344, 3352, 3360, 3368, 3376, 3384, 3392, 3400, 3408, 3416, 3424, 3432, 3440, 3448, 3456, 3464, 3472, 3480, 3488, 3496, 3504, 3512, 3520, 3528, 3536, 3544, 3552, 3560, 3568, 3576, 3584, 3592, 3600, 3608, 3616, 3624, 3632, 3640, 3648, 3656, 3664, 3672, 3680, 3688, 3696, 3704, 3712, 3720, 3728, 3736, 3744, 3752, 3760, 3768, 3776, 3784, 3792, 3800, 3808, 3816, 3824, 3832, 3840, 3848, 3856, 3864, 3872, 3880, 3888, 3896, 3904, 3912, 3920, 3928, 3936, 3944, 3952, 3960, 3968, 3976, 3984, 3992, 4000, 4008, 4016, 4024, 4032, 4040, 4048, 4056, 4064, 4072, 4080, 4088, 4096, 4104, 4112, 4120, 4128, 4136, 4144, 4152, 4160, 4168, 4176, 4184, 4192, 4200, 4208, 4216, 4224, 4232, 4240, 4248, 4256, 4264, 4272, 4280, 4288, 4296, 4304, 4312, 4320, 4328, 4336, 4344, 4352, 4360, 4368, 4376, 4384, 4392, 4400, 4408, 4416, 4424, 4432, 4440, 4448, 4456, 4464, 4472, 4480, 4488, 4496, 4504, 4512, 4520, 4528, 4536, 4544, 4552, 4560, 4568, 4576, 4584, 4592, 4600, 4608, 4616, 4624, 4632, 4640, 4648, 4656, 4664, 4672, 4680, 4688, 4696, 4704, 4712, 4720, 4728, 4736, 4744, 4752, 4760, 4768, 4776, 4784, 4792, 4800, 4808, 4816, 4824, 4832, 4840, 4848, 4856, 4864, 4872, 4880, 4888, 4896, 4904, 4912, 4920, 4928, 4936, 4944, 4952, 4960, 4968, 4976, 4984, 4992, 5000, 5008, 5016, 5024, 5032, 5040, 5048, 5056, 5064, 5072, 5080, 5088, 5096, 5104, 5112, 5120, 5128, 5136, 5144, 5152, 5160, 5168, 5176, 5184, 5192, 5200, 5208, 5216, 5224, 5232, 5240, 5248, 5256, 5264, 5272, 5280, 5288, 5296, 5304, 5312, 5320, 5328, 5336, 5344, 5352, 5360, 5368, 5376, 5384, 5392, 5400, 5408, 5416, 5424, 5432, 5440, 5448, 5456, 5464, 5472, 5480, 5488, 5496, 5504, 5512, 5520, 5528, 5536, 5544, 5552, 5560, 5568, 5576, 5584, 5592, 5600, 5608, 5616, 5624, 5632, 5640, 5648, 5656, 5664, 5672, 5680, 5688, 5696, 5704, 5712, 5720, 5728, 5736, 5744, 5752, 5760, 5768, 5776, 5784, 5792, 5800, 5808, 5816, 5824, 5832, 5840, 5848, 5856, 5864, 5872, 5880, 5888, 5896, 5904, 5912, 5920, 5928, 5936, 5944, 5952, 5960, 5968, 5976, 5984, 5992, 6000, 6008, 6016, 6024, 6032, 6040, 6048, 6056, 6064, 6072, 6080, 6088, 6096, 6104, 6112, 6120, 6128, 6136, 6144, 6152, 6160, 6168, 6176, 6184, 6192, 6200, 6208, 6216, 6224, 6232, 6240, 6248, 6256, 6264, 6272, 6280, 6288, 6296, 6304, 6312, 6320, 6328, 6336, 6344, 6352, 6360, 6368, 6376, 6384, 6392, 6400, 6408, 6416, 6424, 6432, 6440, 6448, 6456, 6464, 6472, 6480, 6488, 6496, 6504, 6512, 6520, 6528, 6536, 6544, 6552, 6560, 6568, 6576, 6584, 6592, 6600, 6608, 6616, 6624, 6632, 6640, 6648, 6656, 6664, 6672, 6680, 6688, 6696, 6704, 6712, 6720, 6728, 6736, 6744, 6752, 6760, 6768, 6776, 6784, 6792, 6800, 6808, 6816, 6824, 6832, 6840, 6848, 6856, 6864, 6872, 6880, 6888, 6896, 6904, 6912, 6920, 6928, 6936, 6944, 6952, 6960, 6968, 6976, 6984, 6992, 7000, 7008, 7016, 7024, 7032, 7040, 7048, 7056, 7064, 7072, 7080, 7088, 7096, 7104, 7112, 7120, 7128, 7136, 7144, 7152, 7160, 7168, 7176, 7184, 7192, 7200, 7208, 7216, 7224, 7232, 7240, 7248, 7256, 7264, 7272, 7280, 7288, 7296, 7304, 7312, 7320, 7328, 7336, 7344, 7352, 7360, 7368, 7376, 7384, 7392, 7400, 7408, 7416, 7424, 7432, 7440, 7448, 7456, 7464, 7472, 7480, 7488, 7496, 7504, 7512, 7520, 7528, 7536, 7544, 7552, 7560, 7568, 7576, 7584, 7592, 7600, 7608, 7616, 7624, 7632, 7640, 7648, 7656, 7664, 7672, 7680, 7688, 7696, 7704, 7712, 7720, 7728, 7736, 7744, 7752, 7760, 7768, 7776, 7784, 7792, 7800, 7808, 7816, 7824, 7832, 7840, 7848, 7856, 7864, 7872, 7880, 7888, 7896, 7904, 7912, 7920, 7928, 7936, 7944, 7952, 7960, 7968, 7976, 7984, 7992, 8000, 8008, 8016, 8024, 8032, 8040, 8048, 8056, 8064, 8072, 8080, 8088, 8096, 8104, 8112, 8120, 8128, 8136, 8144, 8152, 8160, 8168, 8176, 8184, 8192, 8200, 8208, 8216, 8224, 8232, 8240, 8248, 8256, 8264, 8272, 8280, 8288, 8296, 8304, 8312, 8320, 8328, 8336, 8344, 8352, 8360, 8368, 8376, 8384, 8392, 8400, 8408, 8416, 8424, 8432, 8440, 8448, 8456, 8464, 8472, 8480, 8488, 8496, 8504, 8512, 8520, 8528, 8536, 8544, 8552, 8560, 8568, 8576, 8584, 8592, 8600, 8608, 8616, 8624, 8632, 8640, 8648, 8656, 8664, 8672, 8680, 8688, 8696, 8704, 8712, 8720, 8728, 8736, 8744, 8752, 8760, 8768, 8776, 8784, 8792, 8800, 8808, 8816, 8824, 8832, 8840, 8848, 8856, 8864, 8872, 8880, 8888, 8896, 8904, 8912, 8920, 8928, 8936, 8944, 8952, 8960, 8968, 8976, 8984, 8992, 9000, 9008, 9016, 9024, 9032, 9040, 9048, 9056, 9064, 9072, 9080, 9088, 9096, 9104, 9112, 9120, 9128, 9136, 9144, 9152, 9160, 9168, 9176, 9184, 9192, 9200, 9208, 9216, 9224, 9232, 9240, 9248, 9256, 9264, 9272, 9280, 9288, 9296, 9304, 9312, 9320, 9328, 9336, 9344, 9352, 9360, 9368, 9376, 9384, 9392, 9400, 9408, 9416, 9424, 9432, 9440, 9448, 9456, 9464, 9472, 9480, 9488, 9496, 9504, 9512, 9520, 9528, 9536, 9544, 9552, 9560, 9568, 9576, 9584, 9592, 9600, 9608, 9616, 9624, 9632, 9640, 9648, 9656, 9664, 9672, 9680, 9688, 9696, 9704, 9712, 9720, 9728, 9736, 9744, 9752, 9760, 9768, 9776, 9784, 9792, 9800, 9808, 9816, 9824, 9832, 9840, 9848, 9856, 9864, 9872, 9880, 9888, 9896, 9904, 9912, 9920, 9928, 9936, 9944, 9952, 9960, 9968, 9976, 9984, 9992, 10000, 10008, 10016, 10024, 10032, 10040, 10048, 10056, 10064, 10072, 10080, 10088, 10096, 10104, 10112, 10120, 10128, 10136, 10144, 10152, 10160, 10168, 10176, 10184, 10192, 10200, 10208, 10216, 10224, 10232, 10240, 10248, 10256, 10264, 10272, 10280, 10288, 10296, 10304, 10312, 10320, 10328, 10336, 10344, 10352, 10360, 10368, 10376, 10384, 10392, 10400, 10408, 10416, 10424, 10432, 10440, 10448, 10456, 10464, 10472, 10480, 10488, 10496, 10504, 10512, 10520, 10528, 10536, 10544, 10552, 10560, 10568, 10576, 10584, 10592, 10600, 10608, 10616, 10624, 10632, 10640, 10648, 10656, 10664, 10672, 10680, 10688, 10696, 10704, 10712, 10720, 10728, 10736, 10744, 10752, 10760, 10768, 10776, 10784, 10792, 10800, 10808, 10816, 10824, 10832, 10840, 10848, 10856, 10864, 10872, 10880, 10888, 10896, 10904, 10912, 10920, 10928, 10936, 10944, 10952, 10960, 10968, 10976, 10984, 10992, 11000, 11008, 11016, 11024, 11032, 11040, 11048, 11056, 11064, 11072, 11080, 11088, 11096, 11104, 11112, 11120, 11128, 11136, 11144, 11152, 11160, 11168, 11176, 11184, 11192, 11200, 11208, 11216, 11224, 11232, 11240, 11248, 11256, 11264, 11272, 11280, 11288, 11296, 11304, 11312, 11320, 11328, 11336, 11344, 11352, 11360, 11368, 11376, 11384, 11392, 11400, 11408, 11416, 11424, 11432, 11440, 11448, 11456, 11464, 11472, 11480, 11488, 11496, 11504, 11512, 11520, 11528, 11536, 11544, 11552, 11560, 11568, 11576, 11584, 11592, 11600, 11608, 11616, 11624, 11632, 11640, 11648, 11656, 11664, 11672, 11680, 11688, 11696, 11704, 11712, 11720, 11728, 11736, 11744, 11752, 11760, 11768, 11776, 11784, 11792, 11800, 11808, 11816, 11824, 11832, 11840, 11848, 11856, 11864, 11872, 11880, 11888, 11896, 11904, 11912, 11920, 11928, 11936, 11944, 11952, 11960, 11968, 11976, 11984, 11992, 12000, 12008, 12016, 12024, 12032, 12040, 12048, 12056, 12064, 12072, 12080, 12088, 12096, 12104, 12112, 12120, 12128, 12136, 12144, 12152, 12160, 12168, 12176, 12184, 12192, 12200, 12208, 12216, 12224, 12232, 12240, 12248, 12256, 12264, 12272, 12280, 12288, 12296, 12304, 12312, 12320, 12328, 12336, 12344, 12352, 12360, 12368, 12376, 12384, 12392, 12400, 12408, 12416, 12424, 12432, 12440, 12448, 12456, 12464, 12472, 12480, 12488, 12496, 12504, 12512, 12520, 12528, 12536, 12544, 12552, 12560, 12568, 12576, 12584, 12592, 12600, 12608, 12616, 12624, 12632, 12640, 12648, 12656, 12664, 12672, 12680, 12688, 12696, 12704, 12712, 12720, 12728, 12736, 12744, 12752, 12760, 12768, 12776, 12784, 12792, 12800, 12808, 12816, 12824, 12832, 12840, 12848, 12856, 12864, 12872, 12880, 12888, 12896, 12904, 12912, 12920, 12928, 12936, 12944, 12952, 12960, 12968, 12976, 12984, 12992, 13000, 13008, 13016, 13024, 13032, 13040, 13048, 13056, 13064, 13072, 13080, 13088, 13096, 13104, 13112, 13120, 13128, 13136, 13144, 13152, 13160, 13168, 13176, 13184, 13192, 13200, 13208, 13216, 13224, 13232, 13240, 13248, 13256, 13264, 13272, 13280, 13288, 13296, 13304, 13312, 13320, 13328, 13336, 13344, 13352, 13360, 13368, 13376, 13384, 13392, 13400, 13408, 13416, 13424, 13432, 13440, 13448, 13456, 13464, 13472, 13480, 13488, 13496, 13504, 13512, 13520, 13528, 13536, 13544, 13552, 13560, 13568, 13576, 13584, 13592, 13600, 13608, 13616, 13624, 13632, 13640, 13648, 13656, 13664, 13672, 13680, 13688, 13696, 13704, 13712, 13720, 13728, 13736, 13744, 13752, 13760, 13768, 13776, 13784, 13792, 13800, 13808, 13816, 13824, 13832, 13840, 13848, 13856, 13864, 13872, 13880, 13888, 13896, 13904, 13912, 13920, 13928, 13936, 13944, 13952, 13960, 13968, 13976, 13984, 13992, 14000, 14008, 14016, 14024, 14032, 14040, 14048, 14056, 14064, 14072, 14080, 14088, 14096, 14104, 14112, 14120, 14128, 14136, 14144, 14152, 14160, 14168, 14176, 14184, 14192, 14200, 14208, 14216, 14224, 14232, 14240, 14248, 14256, 14264, 14272, 14280, 14288, 14296, 14304, 14312, 14320, 14328, 14336, 14344, 14352, 14360, 14368, 14376, 14384, 14392, 14400, 14408, 14416, 14424, 14432, 14440, 14448, 14456, 14464, 14472, 14480, 14488, 14496, 14504, 14512, 14520, 14528, 14536, 14544, 14552, 14560, 14568, 14576, 14584, 14592, 14600, 14608, 14616, 14624, 14632, 14640, 14648, 14656, 14664, 14672, 14680, 14688, 14696, 14704, 14712, 14720, 14728, 14736, 14744, 14752, 14760, 14768, 14776, 14784, 14792, 14800, 14808, 14816, 14824, 14832, 14840, 14848, 14856, 14864, 14872, 14880, 14888, 14896, 14904, 14912, 14920, 14928, 14936, 14944, 14952, 14960, 14968, 14976, 14984, 14992, 15000, 15008, 15016, 15024, 15032, 15040, 15048, 15056, 15064, 15072, 15080, 15088, 15096, 15104, 15112, 15120, 15128, 15136, 15144, 15152, 15160, 15168, 15176, 15184, 15192, 15200, 15208, 15216, 15224, 15232, 15240, 15248, 15256, 15264, 15272, 15280, 15288, 15296, 15304, 15312, 15320, 15328, 15336, 15344, 15352, 15360, 15368, 15376, 15384, 15392, 15400, 15408, 15416, 15424, 15432, 15440, 15448, 15456, 15464, 15472, 15480, 15488, 15496, 15504, 15512, 15520, 15528, 15536, 15544, 15552, 15560, 15568, 15576, 15584, 15592, 15600, 15608, 15616, 15624, 15632, 15640, 15648, 15656, 15664, 15672, 15680, 15688, 15696, 15704, 15712, 15720, 15728, 15736, 15744, 15752, 15760, 15768, 15776, 15784, 15792, 15800, 15808, 15816, 15824, 15832, 15840, 15848, 15856, 15864, 15872, 15880, 15888, 15896, 15904, 15912, 15920, 15928, 15936, 15944, 15952, 15960, 15968, 15976, 15984, 15992, 16000, 16008, 16016, 16024, 16032, 16040, 16048, 16056, 16064, 16072, 16080, 16088, 16096, 16104, 16112, 16120, 16128, 16136, 16144, 16152, 16160, 16168, 16176, 16184, 16192, 16200, 16208, 16216, 16224, 16232, 16240, 16248, 16256, 16264, 16272, 16280, 16288, 16296, 16304, 16312, 16320, 16328, 16336, 16344, 16352, 16360, 16368, 16376, 16384, 16392, 16400, 16408, 16416, 16424, 16432, 16440, 16448, 16456, 16464, 16472, 16480, 16488, 16496, 16504, 16512, 16520, 16528, 16536, 16544, 16552, 16560, 16568, 16576, 16584, 16592, 16600, 16608, 16616, 16624, 16632, 16640, 16648, 16656, 16664, 16672, 16680, 16688, 16696, 16704, 16712, 16720, 16728, 16736, 16744, 16752, 16760, 16768, 16776, 16784, 16792, 16800, 16808, 16816, 16824, 16832, 16840, 16848, 16856, 16864, 16872, 16880, 16888, 16896, 16904, 16912, 16920, 16928, 16936, 16944, 16952, 16960, 16968, 16976, 16984, 16992, 17000, 17008, 17016, 17024, 17032, 17040, 17048, 17056, 17064, 17072, 17080, 17088, 17096, 17104, 17112, 17120, 17128, 17136, 17144, 17152, 17160, 17168, 17176, 17184, 17192, 17200, 17208, 17216, 17224, 17232, 17240, 17248, 17256, 17264, 17272, 17280, 17288, 17296, 17304, 17312, 17320, 17328, 17336, 17344, 17352, 17360, 17368, 17376, 17384, 17392, 17400, 17408, 17416, 17424, 17432, 17440, 17448, 17456, 17464, 17472, 17480, 17488, 17496, 17504, 17512, 17520, 17528, 17536, 17544, 17552, 17560, 17568, 17576, 17584, 17592, 17600, 17608, 17616, 17624, 17632, 17640, 17648, 17656, 17664, 17672, 17680, 17688, 17696, 17704, 17712, 17720, 17728, 17736, 17744, 17752, 17760, 17768, 17776, 17784, 17792, 17800, 17808, 17816, 17824, 17832, 17840, 17848, 17856, 17864, 17872, 17880, 17888, 17896, 17904, 17912, 17920, 17928, 17936, 17944, 17952, 17960, 17968, 17976, 17984, 17992, 18000, 18008, 18016, 18024, 18032, 18040, 18048, 18056, 18064, 18072, 18080, 18088, 18096, 18104, 18112, 18120, 18128, 18136, 18144, 18152, 18160, 18168, 18176, 18184, 18192, 18200, 18208, 18216, 18224, 18232, 18240, 18248, 18256, 18264, 18272, 18280, 18288, 18296, 18304, 18312, 18320, 18328, 18336, 18344, 18352, 18360, 18368, 18376, 18384, 18392, 18400, 18408, 18416, 18424, 18432, 18440, 18448, 18456, 18464, 18472, 18480, 18488, 18496, 18504, 18512, 18520, 18528, 18536, 18544, 18552, 18560, 18568, 18576, 18584, 18592, 18600, 18608, 18616, 18624, 18632, 18640, 18648, 18656, 18664, 18672, 18680, 18688, 18696, 18704, 18712, 18720, 18728, 18736, 18744, 18752, 18760, 18768, 18776, 18784, 18792, 18800, 18808, 18816, 18824, 18832, 18840, 18848, 18856, 18864, 18872, 18880, 18888, 18896, 18904, 18912, 18920, 18928, 18936, 18944, 18952, 18960, 18968, 18976, 18984, 18992, 19000, 19008, 19016, 19024, 19032, 19040, 19048, 19056, 19064, 19072, 19080, 19088, 19096, 19104, 19112, 19120, 19128, 19136, 19144, 19152, 19160, 19168, 19176, 19184, 19192, 19200, 19208, 19216, 19224, 19232, 19240, 19248, 19256, 19264, 19272, 19280, 19288, 19296, 19304, 19312, 19320, 19328, 19336, 19344, 19352, 19360, 19368, 19376, 19384, 19392, 19400, 19408, 19416, 19424, 19432, 19440, 19448, 19456, 19464, 19472, 19480, 19488, 19496, 19504, 19512, 19520, 19528, 19536, 19544, 19552, 19560, 19568, 19576, 19584, 19592, 19600, 19608, 19616, 19624, 19632, 19640, 19648, 19656, 19664, 19672, 19680, 19688, 19696, 19704, 19712, 19720, 19728, 19736, 19744, 19752, 19760, 19768, 19776, 19784, 19792, 19800, 19808, 19816, 19824, 19832, 19840, 19848, 19856, 19864, 19872, 19880, 19888, 19896, 19904, 19912, 19920, 19928, 19936, 19944, 19952, 19960, 19968, 19976, 19984, 19992, 20000, 20008, 20016, 20024, 20032, 20040, 20048, 20056, 20064, 20072, 20080, 20088, 20096, 20104, 20112, 20120, 20128, 20136, 20144, 20152, 20160, 20168, 20176, 20184, 20192, 20200, 20208, 20216, 20224, 20232, 20240, 20248, 20256, 20264, 20272, 20280, 20288, 20296, 20304, 20312, 20320, 20328, 20336, 20344, 20352, 20360, 20368, 20376, 20384, 20392, 20400, 20408, 20416, 20424, 20432, 20440, 20448, 20456, 20464, 20472, 20480, 20488, 20496, 20504, 20512, 20520, 20528, 20536, 20544, 20552, 20560, 20568, 20576, 20584, 20592, 20600, 20608, 20616, 20624, 20632, 20640, 20648, 20656, 20664, 20672, 20680, 20688, 20696, 20704, 20712, 20720, 20728, 20736, 20744, 20752, 20760, 20768, 20776, 20784, 20792, 20800, 20808, 20816, 20824, 20832, 20840, 20848, 20856, 20864, 20872, 20880, 20888, 20896, 20904, 20912, 20920, 20928, 20936, 20944, 20952, 20960, 20968, 20976, 20984, 20992, 21000, 21008, 21016, 21024, 21032, 21040, 21048, 21056, 21064, 21072, 21080, 21088, 21096, 21104, 21112, 21120, 21128, 21136, 21144, 21152, 21160, 21168, 21176, 21184, 21192, 21200, 21208, 21216, 21224, 21232, 21240, 21248, 21256, 21264, 21272, 21280, 21288, 21296, 21304, 21312, 21320, 21328, 21336, 21344, 21352, 21360, 21368, 21376, 21384, 21392, 21400, 21408, 21416, 21424, 21432, 21440, 21448, 21456, 21464, 21472, 21480, 21488, 21496, 21504, 21512, 21520, 21528, 21536, 21544, 21552, 21560, 21568, 21576, 21584, 21592, 21600, 21608, 21616, 21624, 21632, 21640, 21648, 21656, 21664, 21672, 21680, 21688, 21696, 21704, 21712, 21720, 21728, 21736, 21744, 21752, 21760, 21768, 21776, 21784, 21792, 21800, 21808, 21816, 21824, 21832, 21840, 21848, 21856, 21864, 21872, 21880, 21888, 21896, 21904, 21912, 21920, 21928, 21936, 21944, 21952, 21960, 21968, 21976, 21984, 21992, 22000, 22008, 22016, 22024, 22032, 22040, 22048, 22056, 22064, 22072, 22080, 22088, 22096, 22104, 22112, 22120, 22128, 22136, 22144, 22152, 22160, 22168, 22176, 22184, 22192, 22200, 22208, 22216, 22224, 22232, 22240, 22248, 22256, 22264, 22272, 22280, 22288, 22296, 22304, 22312, 22320, 22328, 22336, 22344, 22352, 22360, 22368, 22376, 22384, 22392, 22400, 22408, 22416, 22424, 22432, 22440, 22448, 22456, 22464, 22472, 22480, 22488, 22496, 22504, 22512, 22520, 22528, 22536, 22544, 22552, 22560, 22568, 22576, 22584, 22592, 22600, 22608, 22616, 22624, 22632, 22640, 22648, 22656, 22664, 22672, 22680, 22688, 22696, 22704, 22712, 22720, 22728, 22736, 22744, 22752, 22760, 22768, 22776, 22784, 22792, 22800, 22808, 22816, 22824, 22832, 22840, 22848, 22856, 22864, 22872, 22880, 22888, 22896, 22904, 22912, 22920, 22928, 22936, 22944, 22952, 22960, 22968, 22976, 22984, 22992, 23000, 23008, 23016, 23024, 23032, 23040, 23048, 23056, 23064, 23072, 23080, 23088, 23096, 23104, 23112, 23120, 23128, 23136, 23144, 23152, 23160, 23168, 23176, 23184, 23192, 23200, 23208, 23216, 23224, 23232, 23240, 23248, 23256, 23264, 23272, 23280, 23288, 23296, 23304, 23312, 23320, 23328, 23336, 23344, 23352, 23360, 23368, 23376, 23384, 23392, 23400, 23408, 23416, 23424, 23432, 23440, 23448, 23456, 23464, 23472, 23480, 23488, 23496, 23504, 23512, 23520, 23528, 23536, 23544, 23552, 23560, 23568, 23576, 23584, 23592, 23600, 23608, 23616, 23624, 23632, 23640, 23648, 23656, 23664, 23672, 23680, 23688, 23696, 23704, 23712, 23720, 23728, 23736, 23744, 23752, 23760, 23768, 23776, 23784, 23792, 23800, 23808, 23816, 23824, 23832, 23840, 23848, 23856, 23864, 23872, 23880, 23888, 23896, 23904, 23912, 23920, 23928, 23936, 23944, 23952, 23960, 23968, 23976, 23984, 23992, 24000, 24008, 24016, 24024, 24032, 24040, 24048, 24056, 24064, 24072, 24080, 24088, 24096, 24104, 24112, 24120, 24128, 24136, 24144, 24152, 24160, 24168, 24176, 24184, 24192, 24200, 24208, 24216, 24224, 24232, 24240, 24248, 24256, 24264, 24272, 24280, 24288, 24296, 24304, 24312, 24320, 24328, 24336, 24344, 24352, 24360, 24368, 24376, 24384, 24392, 24400, 24408, 24416, 24424, 24432, 24440, 24448, 24456, 24464, 24472, 24480, 24488, 24496, 24504, 24512, 24520, 24528, 24536, 24544, 24552, 24560, 24568, 24576, 24584, 24592, 24600, 24608, 24616, 24624, 24632, 24640, 24648, 24656, 24664, 24672, 24680, 24688, 24696, 24704, 24712, 24720, 24728, 24736, 24744, 24752, 24760, 24768, 24776, 24784, 24792, 24800, 24808, 24816, 24824, 24832, 24840, 24848, 24856, 24864, 24872, 24880, 24888, 24896, 24904, 24912, 24920, 24928, 24936, 24944, 24952, 24960, 24968, 24976, 24984, 24992, 25000, 25008, 25016, 25024, 25032, 25040, 25048, 25056, 25064, 25072, 25080, 25088, 25096, 25104, 25112, 25120, 25128, 25136, 25144, 25152, 25160, 25168, 25176, 25184, 25192, 25200, 25208, 25216, 25224, 25232, 25240, 25248, 25256, 25264, 25272, 25280, 25288, 25296, 25304, 25312, 25320, 25328, 25336, 25344, 25352, 25360, 25368, 25376, 25384, 25392, 25400, 25408, 25416, 25424, 25432, 25440, 25448, 25456, 25464, 25472, 25480, 25488, 25496, 25504, 25512, 25520, 25528, 25536, 25544, 25552, 25560, 25568, 25576, 25584, 25592, 25600, 25608, 25616, 25624, 25632, 25640, 25648, 25656, 25664, 25672, 25680, 25688, 25696, 25704, 25712, 25720, 25728, 25736, 25744, 25752, 25760, 25768, 25776, 25784, 25792, 25800, 25808, 25816, 25824, 25832, 25840, 25848, 25856, 25864, 25872, 25880, 25888, 25896, 25904, 25912, 25920, 25928, 25936, 25944, 25952, 25960, 25968, 25976, 25984, 25992, 26000, 26008, 26016, 26024, 26032, 26040, 26048, 26056, 26064, 26072, 26080, 26088, 26096, 26104, 26112, 26120, 26128, 26136, 26144, 26152, 26160, 26168, 26176, 26184, 26192, 26200, 26208, 26216, 26224, 26232, 26240, 26248, 26256, 26264, 26272, 26280, 26288, 26296, 26304, 26312, 26320, 26328, 26336, 26344, 26352, 26360, 26368, 26376, 26384, 26392, 26400, 26408, 26416, 26424, 26432, 26440, 26448, 26456, 26464, 26472, 26480, 26488, 26496, 26504, 26512, 26520, 26528, 26536, 26544, 26552, 26560, 26568, 26576, 26584, 26592, 26600, 26608, 26616, 26624, 26632, 26640, 26648, 26656, 26664, 26672, 26680, 26688, 26696, 26704, 26712, 26720, 26728, 26736, 26744, 26752, 26760, 26768, 26776, 26784, 26792, 26800, 26808, 26816, 26824, 26832, 26840, 26848, 26856, 26864, 26872, 26880, 26888, 26896, 26904, 26912, 26920, 26928, 26936, 26944, 26952, 26960, 26968, 26976, 26984, 26992, 27000, 27008, 27016, 27024, 27032, 27040, 27048, 27056, 27064, 27072, 27080, 27088, 27096, 27104, 27112, 27120, 27128, 27136, 27144, 27152, 27160, 27168, 27176, 27184, 27192, 27200, 27208, 27216, 27224, 27232, 27240, 27248, 27256, 27264, 27272, 27280, 27288, 27296, 27304, 27312, 27320, 27328, 27336, 27344, 27352, 27360, 27368, 27376, 27384, 27392, 27400, 27408, 27416, 27424, 27432, 27440, 27448, 27456, 27464, 27472, 27480, 27488, 27496, 27504, 27512, 27520, 27528, 27536, 27544, 27552, 27560, 27568, 27576, 27584, 27592, 27600, 27608, 27616, 27624, 27632, 27640, 27648, 27656, 27664, 27672, 27680, 27688, 27696, 27704, 27712, 27720, 27728, 27736, 27744, 27752, 27760, 27768, 27776, 27784, 27792, 27800, 27808, 27816, 27824, 27832, 27840, 27848, 27856, 27864, 27872, 27880, 27888, 27896, 27904, 27912, 27920, 27928, 27936, 27944, 27952, 27960, 27968, 27976, 27984, 27992, 28000, 28008, 28016, 28024, 28032, 28040, 28048, 28056, 28064, 28072, 28080, 28088, 28096, 28104, 28112, 28120, 28128, 28136, 28144, 28152, 28160, 28168, 28176, 28184, 28192, 28200, 28208, 28216, 28224, 28232, 28240, 28248, 28256, 28264, 28272, 28280, 28288, 28296, 28304, 28312, 28320, 28328, 28336, 28344, 28352, 28360, 28368, 28376, 28384, 28392, 28400, 28408, 28416, 28424, 28432, 28440, 28448, 28456, 28464, 28472, 28480, 28488, 28496, 28504, 28512, 28520, 28528, 28536, 28544, 28552, 28560, 28568, 28576, 28584, 28592, 28600, 28608, 28616, 28624, 28632, 28640, 28648, 28656, 28664, 28672, 28680, 28688, 28696, 28704, 28712, 28720, 28728, 28736, 28744, 28752, 28760, 28768, 28776, 28784, 28792, 28800, 28808, 28816, 28824, 28832, 28840, 28848, 28856, 28864, 28872, 28880, 28888, 28896, 28904, 28912, 28920, 28928, 28936, 28944, 28952, 28960, 28968, 28976, 28984, 28992, 29000, 29008, 29016, 29024, 29032, 29040, 29048, 29056, 29064, 29072, 29080, 29088, 29096, 29104, 29112, 29120, 29128, 29136, 29144, 29152, 29160, 29168, 29176, 29184, 29192, 29200, 29208, 29216, 29224, 29232, 29240, 29248, 29256, 29264, 29272, 29280, 29288, 29296, 29304, 29312, 29320, 29328, 29336, 29344, 29352, 29360, 29368, 29376, 29384, 29392, 29400, 29408, 29416, 29424, 29432, 29440, 29448, 29456, 29464, 29472, 29480, 29488, 29496, 29504, 29512, 29520, 29528, 29536, 29544, 29552, 29560, 29568, 29576, 29584, 29592, 29600, 29608, 29616, 29624, 29632, 29640, 29648, 29656, 29664, 29672, 29680, 29688, 29696, 29704, 29712, 29720, 29728, 29736, 29744, 29752, 29760, 29768, 29776, 29784, 29792, 29800, 29808, 29816, 29824, 29832, 29840, 29848, 29856, 29864, 29872, 29880, 29888, 29896, 29904, 29912, 29920, 29928, 29936, 29944, 29952, 29960, 29968, 29976, 29984, 29992, 30000, 30008, 30016, 30024, 30032, 30040, 30048, 30056, 30064, 30072, 30080, 30088, 30096, 30104, 30112, 30120, 30128, 30136, 30144, 30152, 30160, 30168, 30176, 30184, 30192, 30200, 30208, 30216, 30224, 30232, 30240, 30248, 30256, 30264, 30272, 30280, 30288, 30296, 30304, 30312, 30320, 30328, 30336, 30344, 30352, 30360, 30368, 30376, 30384, 30392, 30400, 30408, 30416, 30424, 30432, 30440, 30448, 30456, 30464, 30472, 30480, 30488, 30496, 30504, 30512, 30520, 30528, 30536, 30544, 30552, 30560, 30568, 30576, 30584, 30592, 30600, 30608, 30616, 30624, 30632, 30640, 30648, 30656, 30664, 30672, 30680, 30688, 30696, 30704, 30712, 30720, 30728, 30736, 30744, 30752, 30760, 30768, 30776, 30784, 30792, 30800, 30808, 30816, 30824, 30832, 30840, 30848, 30856, 30864, 30872, 30880, 30888, 30896, 30904, 30912, 30920, 30928, 30936, 30944, 30952, 30960, 30968, 30976, 30984, 30992, 31000, 31008, 31016, 31024, 31032, 31040, 31048, 31056, 31064, 31072, 31080, 31088, 31096, 31104, 31112, 31120, 31128, 31136, 31144, 31152, 31160, 31168, 31176, 31184, 31192, 31200, 31208, 31216, 31224, 31232, 31240, 31248, 31256, 31264, 31272, 31280, 31288, 31296, 31304, 31312, 31320, 31328, 31336, 31344, 31352, 31360, 31368, 31376, 31384, 31392, 31400, 31408, 31416, 31424, 31432, 31440, 31448, 31456, 31464, 31472, 31480, 31488, 31496, 31504, 31512, 31520, 31528, 31536, 31544, 31552, 31560, 31568, 31576, 31584, 31592, 31600, 31608, 31616, 31624, 31632, 31640, 31648, 31656, 31664, 31672, 31680, 31688, 31696, 31704, 31712, 31720, 31728, 31736, 31744, 31752, 31760, 31768, 31776, 31784, 31792, 31800, 31808, 31816, 31824, 31832, 31840, 31848, 31856, 31864, 31872, 31880, 31888, 31896, 31904, 31912, 31920, 31928, 31936, 31944, 31952, 31960, 31968, 31976, 31984, 31992, 32000, 32008, 32016, 32024, 32032, 32040, 32048, 32056, 32064, 32072, 32080, 32088, 32096, 32104, 32112, 32120, 32128, 32136, 32144, 32152, 32160, 32168, 32176, 32184, 32192, 32200, 32208, 32216, 32224, 32232, 32240, 32248, 32256, 32264, 32272, 32280, 32288, 32296, 32304, 32312, 32320, 32328, 32336, 32344, 32352, 32360, 32368, 32376, 32384, 32392, 32400, 32408, 32416, 32424, 32432, 32440, 32448, 32456, 32464, 32472, 32480, 32488, 32496, 32504, 32512, 32520, 32528, 32536, 32544, 32552, 32560, 32568, 32576, 32584, 32592, 32600, 32608, 32616, 32624, 32632, 32640, 32648, 32656, 32664, 32672, 32680, 32688, 32696, 32704, 32712, 32720, 32728, 32736, 32744, 32752, 32760, 32768, 32776, 32784, 32792, 32800, 32808, 32816, 32824, 32832, 32840, 32848, 32856, 32864, 32872, 32880, 32888, 32896, 32904, 32912, 32920, 32928, 32936, 32944, 32952, 32960, 32968, 32976, 32984, 32992, 33000, 33008, 33016, 33024, 33032, 33040, 33048, 33056, 33064, 33072, 33080, 33088, 33096, 33104, 33112, 33120, 33128, 33136, 33144, 33152, 33160, 33168, 33176, 33184, 33192, 33200, 33208, 33216, 33224, 33232, 33240, 33248, 33256, 33264, 33272, 33280, 33288, 33296, 33304, 33312, 33320, 33328, 33336, 33344, 33352, 33360, 33368, 33376, 33384, 33392, 33400, 33408, 33416, 33424, 33432, 33440, 33448, 33456, 33464, 33472, 33480, 33488, 33496, 33504, 33512, 33520, 33528, 33536, 33544, 33552, 33560, 33568, 33576, 33584, 33592, 33600, 33608, 33616, 33624, 33632, 33640, 33648, 33656, 33664, 33672, 33680, 33688, 33696, 33704, 33712, 33720, 33728, 33736, 33744, 33752, 33760, 33768, 33776, 33784, 33792, 33800, 33808, 33816, 33824, 33832, 33840, 33848, 33856, 33864, 33872, 33880, 33888, 33896, 33904, 33912, 33920, 33928, 33936, 33944, 33952, 33960, 33968, 33976, 33984, 33992, 34000, 34008, 34016, 34024, 34032, 34040, 34048, 34056, 34064, 34072, 34080, 34088, 34096, 34104, 34112, 34120, 34128, 34136, 34144, 34152, 34160, 34168, 34176, 34184, 34192, 34200, 34208, 34216, 34224, 34232, 34240, 34248, 34256, 34264, 34272, 34280, 34288, 34296, 34304, 34312, 34320, 34328, 34336, 34344, 34352, 34360, 34368, 34376, 34384, 34392, 34400, 34408, 34416, 34424, 34432, 34440, 34448, 34456, 34464, 34472, 34480, 34488, 34496, 34504, 34512, 34520, 34528, 34536, 34544, 34552, 34560, 34568, 34576, 34584, 34592, 34600, 34608, 34616, 34624, 34632, 34640, 34648, 34656, 34664, 34672, 34680, 34688, 34696, 34704, 34712, 34720, 34728, 34736, 34744, 34752, 34760, 34768, 34776, 34784, 34792, 34800, 34808, 34816, 34824, 34832, 34840, 34848, 34856, 34864, 34872, 34880, 34888, 34896, 34904, 34912, 34920, 34928, 34936, 34944, 34952, 34960, 34968, 34976, 34984, 34992, 35000, 35008, 35016, 35024, 35032, 35040, 35048, 35056, 35064, 35072, 35080, 35088, 35096, 35104, 35112, 35120, 35128, 35136, 35144, 35152, 35160, 35168, 35176, 35184, 35192, 35200, 35208, 35216, 35224, 35232, 35240, 35248, 35256, 35264, 35272, 35280, 35288, 35296, 35304, 35312, 35320, 35328, 35336, 35344, 35352, 35360, 35368, 35376, 35384, 35392, 35400, 35408, 35416, 35424, 35432, 35440, 35448, 35456, 35464, 35472, 35480, 35488, 35496, 35504, 35512, 35520, 35528, 35536, 35544, 35552, 35560, 35568, 35576, 35584, 35592, 35600, 35608, 35616, 35624, 35632, 35640, 35648, 35656, 35664, 35672, 35680, 35688, 35696, 35704, 35712, 35720, 35728, 35736, 35744, 35752, 35760, 35768, 35776, 35784, 35792, 35800, 35808, 35816, 35824, 35832, 35840, 35848, 35856, 35864, 35872, 35880, 35888, 35896, 35904, 35912, 35920, 35928, 35936, 35944, 35952, 35960, 35968, 35976, 35984, 35992, 36000, 36008, 36016, 36024, 36032, 36040, 36048, 36056, 36064, 36072, 36080, 36088, 36096, 36104, 36112, 36120, 36128, 36136, 36144, 36152, 36160, 36168, 36176, 36184, 36192, 36200, 36208, 36216, 36224, 36232, 36240, 36248, 36256, 36264, 36272, 36280, 36288, 36296, 36304, 36312, 36320, 36328, 36336, 36344, 36352, 36360, 36368, 36376, 36384, 36392, 36400, 36408, 36416, 36424, 36432, 36440, 36448, 36456, 36464, 36472, 36480, 36488, 36496, 36504, 36512, 36520, 36528, 36536, 36544, 36552, 36560, 36568, 36576, 36584, 36592, 36600, 36608, 36616, 36624, 36632, 36640, 36648, 36656, 36664, 36672, 36680, 36688, 36696, 36704, 36712, 36720, 36728, 36736, 36744, 36752, 36760, 36768, 36776, 36784, 36792, 36800, 36808, 36816, 36824, 36832, 36840, 36848, 36856, 36864, 36872, 36880, 36888, 36896, 36904, 36912, 36920, 36928, 36936, 36944, 36952, 36960, 36968, 36976, 36984, 36992, 37000, 37008, 37016, 37024, 37032, 37040, 37048, 37056, 37064, 37072, 37080, 37088, 37096, 37104, 37112, 37120, 37128, 37136, 37144, 37152, 37160, 37168, 37176, 37184, 37192, 37200, 37208, 37216, 37224, 37232, 37240, 37248, 37256, 37264, 37272, 37280, 37288, 37296, 37304, 37312, 37320, 37328, 37336, 37344, 37352, 37360, 37368, 37376, 37384, 37392, 37400, 37408, 37416, 37424, 37432, 37440, 37448, 37456, 37464, 37472, 37480, 37488, 37496, 37504, 37512, 37520, 37528, 37536, 37544, 37552, 37560, 37568, 37576, 37584, 37592, 37600, 37608, 37616, 37624, 37632, 37640, 37648, 37656, 37664, 37672, 37680, 37688, 37696, 37704, 37712, 37720, 37728, 37736, 37744, 37752, 37760, 37768, 37776, 37784, 37792, 37800, 37808, 37816, 37824, 37832, 37840, 37848, 37856, 37864, 37872, 37880, 37888, 37896, 37904, 37912, 37920, 37928, 37936, 37944, 37952, 37960, 37968, 37976, 37984, 37992, 38000, 38008, 38016, 38024, 38032, 38040, 38048, 38056, 38064, 38072, 38080, 38088, 38096, 38104, 38112, 38120, 38128, 38136, 38144, 38152, 38160, 38168, 38176, 38184, 38192, 38200, 38208, 38216, 38224, 38232, 38240, 38248, 38256, 38264, 38272, 38280, 38288, 38296, 38304, 38312, 38320, 38328, 38336, 38344, 38352, 38360, 38368, 38376, 38384, 38392, 38400, 38408, 38416, 38424, 38432, 38440, 38448, 38456, 38464, 38472, 38480, 38488, 38496, 38504, 38512, 38520, 38528, 38536, 38544, 38552, 38560, 38568, 38576, 38584, 38592, 38600, 38608, 38616, 38624, 38632, 38640, 38648, 38656, 38664, 38672, 38680, 38688, 38696, 38704, 38712, 38720, 38728, 38736, 38744, 38752, 38760, 38768, 38776, 38784, 38792, 38800, 38808, 38816, 38824, 38832, 38840, 38848, 38856, 38864, 38872, 38880, 38888, 38896, 38904, 38912, 38920, 38928, 38936, 38944, 38952, 38960, 38968, 38976, 38984, 38992, 39000, 39008, 39016, 39024, 39032, 39040, 39048, 39056, 39064, 39072, 39080, 39088, 39096, 39104, 39112, 39120, 39128, 39136, 39144, 39152, 39160, 39168, 39176, 39184, 39192, 39200, 39208, 39216, 39224, 39232, 39240, 39248, 39256, 39264, 39272, 39280, 39288, 39296, 39304, 39312, 39320, 39328, 39336, 39344, 39352, 39360, 39368, 39376, 39384, 39392, 39400, 39408, 39416, 39424, 39432, 39440, 39448, 39456, 39464, 39472, 39480, 39488, 39496, 39504, 39512, 39520, 39528, 39536, 39544, 39552, 39560, 39568, 39576, 39584, 39592, 39600, 39608, 39616, 39624, 39632, 39640, 39648, 39656, 39664, 39672, 39680, 39688, 39696, 39704, 39712, 39720, 39728, 39736, 39744, 39752, 39760, 39768, 39776, 39784, 39792, 39800, 39808, 39816, 39824, 39832, 39840, 39848, 39856, 39864, 39872, 39880, 39888, 39896, 39904, 39912, 39920, 39928, 39936, 39944, 39952, 39960, 39968, 39976, 39984, 39992, 40000] }, { label: 'Nodes', backgroundColor: 'rgba(181, 202, 62, 0.2)', borderColor: 'rgba(181, 202, 62, 1.00)', - data: [75, 183, 291, 399, 507, 615, 723, 831, 939, 1047, 1155, 1263, 111, 111, 219, 327, 435, 543, 651, 759, 867, 975, 1083, 1191, 1299, 1407, 1515, 1623, 1731, 1839, 1947, 2055, 2163, 2271, 2379, 2487, 2595, 2703, 2811, 2919, 3027, 3135, 3243, 3351, 3459, 3567, 3675, 3783, 3891, 3999] + data: [82, 190, 298, 406, 514, 622, 730, 838, 426, 534, 642, 750, 858, 966, 1074, 1182, 1290, 1398, 1506, 1614, 1722, 1830, 1938, 2046, 1148, 1256, 1364, 1472, 1580, 1688, 1796, 1904, 2012, 2120, 2228, 2336, 2444, 2552, 2660, 1859, 1967, 2075, 2183, 2291, 2399, 2507, 2615, 2723, 2831, 2939, 3047, 2405, 2513, 2621, 2729, 2837, 2945, 3053, 3161, 3269, 3377, 2873, 2981, 3089, 3197, 3305, 3413, 3521, 3629, 3737, 3845, 3953, 4061, 3353, 3461, 3569, 3677, 3785, 3893, 4001, 4109, 4217, 4325, 4433, 4541, 4649, 4757, 4865, 4973, 5081, 5189, 5297, 5405, 5513, 5621, 4341, 4449, 4557, 4665, 4773, 4881, 4989, 5097, 5205, 5313, 5421, 5529, 5637, 5745, 4985, 5093, 5201, 5309, 5417, 5525, 5633, 5741, 5849, 5957, 6065, 6173, 6281, 6389, 5633, 5741, 5849, 5957, 6065, 6173, 6281, 6389, 6497, 6605, 6713, 6821, 6929, 7037, 6287, 6395, 6503, 6611, 6719, 6827, 6935, 7043, 7151, 7259, 7367, 7475, 7583, 6824, 6932, 7040, 7148, 7256, 7364, 7472, 7580, 7688, 7796, 7904, 8012, 8120, 8228, 7502, 7610, 7718, 7826, 7934, 8042, 8150, 8258, 8366, 8474, 8582, 8690, 8798, 8906, 8138, 8246, 8354, 8462, 8570, 8678, 8786, 8894, 9002, 9110, 9218, 9326, 9434, 8681, 8789, 8897, 9005, 9113, 9221, 9329, 9437, 9545, 9653, 9761, 9869, 9251, 9359, 9467, 9575, 9683, 9791, 9899, 10007, 10115, 10223, 10331, 10439, 10547, 10655, 10763, 9902, 10010, 10118, 10226, 10334, 10442, 10550, 10658, 10766, 10874, 10982, 11090, 11198, 11306, 10520, 10628, 10736, 10844, 10952, 11060, 11168, 11276, 11384, 11492, 11600, 11708, 11816, 11924, 12032, 11244, 11352, 11460, 11568, 11676, 11784, 11892, 12000, 12108, 12216, 12324, 12432, 12540, 11768, 11876, 11984, 12092, 12200, 12308, 12416, 12524, 12632, 12740, 12848, 12956, 13064, 13172, 12398, 12506, 12614, 12722, 12830, 12938, 13046, 13154, 13262, 13370, 13478, 13586, 13694, 13802, 13028, 13136, 13244, 13352, 13460, 13568, 13676, 13784, 13892, 14000, 14108, 14216, 14324, 14432, 14540, 14648, 13796, 13904, 14012, 14120, 14228, 14336, 14444, 14552, 14660, 14768, 14876, 14243, 14351, 14459, 14567, 14675, 14783, 14891, 14999, 15107, 15215, 15323, 15431, 15539, 15647, 14873, 14981, 15089, 15197, 15305, 15413, 15521, 15629, 15239, 15332, 15440, 15548, 15656, 15764, 15872, 15980, 16088, 16196, 16304, 16412, 16520, 15842, 15950, 16058, 16166, 16274, 16382, 16490, 16598, 16706, 16814, 16922, 17030, 17138, 17246, 16466, 16574, 16682, 16790, 16898, 17006, 17114, 17222, 17330, 17438, 17546, 16985, 17093, 17201, 17309, 17417, 17525, 17633, 17741, 17849, 17957, 18065, 18173, 18281, 18389, 17621, 17729, 17837, 17945, 18053, 18161, 18269, 18377, 18485, 18593, 18701, 18809, 18917, 19025, 18227, 18335, 18443, 18551, 18659, 18767, 18875, 18983, 19091, 19199, 19307, 19415, 19523, 19631, 18833, 18941, 19049, 19157, 19265, 19373, 19481, 19589, 19697, 19805, 19913, 20021, 20129, 20237, 19469, 19577, 19685, 19793, 19901, 20009, 20117, 20225, 19847, 19955, 20063, 20171, 20279, 20387, 20495, 20603, 20711, 20819, 20927, 21035, 21143, 21251, 21359, 20558, 20666, 20774, 20882, 20990, 21098, 21206, 21314, 21422, 21530, 21638, 21746, 21854, 21962, 21164, 21272, 21380, 21488, 21596, 21704, 21812, 21920, 22028, 22136, 22244, 22352, 22460, 22568, 21806, 21914, 22022, 22130, 22238, 22346, 22454, 22562, 22670, 22778, 22886, 22994, 23102, 23210, 22412, 22520, 22628, 22736, 22844, 22952, 23060, 23168, 23276, 23384, 23492, 23600, 23708, 23816, 23924, 23123, 23231, 23339, 23447, 23555, 23663, 23771, 23879, 23987, 24095, 24203, 24311, 24419, 24527, 23753, 23861, 23969, 24077, 24185, 24293, 24401, 24509, 24617, 24725, 24833, 24941, 25049, 25157, 24371, 24479, 24587, 24695, 24803, 24911, 25019, 25127, 25235, 25343, 25451, 25559, 25667, 25775, 24951, 25059, 25167, 25275, 25383, 25491, 25599, 25707, 25815, 25923, 26031, 26139, 26247, 26355, 26463, 25646, 25754, 25862, 25970, 26078, 26186, 26294, 26402, 26510, 26618, 26726, 26834, 26942, 27050, 27158, 26357, 26465, 26573, 26681, 26789, 26576, 26684, 26792, 26900, 27008, 27116, 27224, 27332, 27440, 27548, 27656, 27764, 27872, 27980, 27164, 27272, 27380, 27488, 27596, 27704, 27812, 27920, 28028, 28136, 28244, 28352, 28460, 28568, 28676, 27851, 27959, 28067, 28175, 28283, 28391, 28499, 28607, 28715, 28823, 28931, 29039, 29147, 29255, 29363, 28544, 28652, 28760, 28868, 28976, 29084, 29192, 29300, 29408, 29516, 29624, 29732, 29840, 29948, 30056, 29243, 29351, 29459, 29567, 29675, 29783, 29891, 29999, 30107, 30215, 30323, 30431, 30539, 30647, 29819, 29927, 30035, 30143, 30251, 30359, 30467, 30575, 30683, 30791, 30899, 31007, 31115, 31223, 31331, 30512, 30620, 30728, 30836, 30944, 31052, 31160, 31268, 31376, 31484, 31592, 31700, 31808, 31916, 31116, 31224, 31332, 31440, 31548, 31656, 31764, 31872, 31980, 32088, 32196, 32304, 32412, 32520, 32628, 31817, 31925, 32033, 32141, 32249, 32357, 32465, 32573, 32681, 32789, 32897, 33005, 33113, 33221, 32484, 32592, 32700, 32808, 32916, 33024, 33132, 33240, 33348, 33456, 33564, 33672, 33780, 33888, 33071, 33179, 33287, 33395, 33503, 33611, 33719, 33827, 33935, 34043, 34151, 34259, 34367, 34475, 34583, 33764, 33872, 33980, 34088, 34196, 34304, 34412, 34520, 34628, 34736, 34844, 34952, 35060, 35168, 35276, 34464, 34572, 34680, 34788, 34896, 35004, 35112, 35220, 35328, 35436, 35544, 35652, 35760, 35868, 35039, 35147, 35255, 35363, 35471, 35579, 35687, 35795, 35903, 36011, 36119, 36227, 36335, 36443, 36551, 35732, 35840, 35948, 36056, 36164, 36272, 36380, 36488, 36596, 36704, 36812, 36920, 37028, 37136, 37244, 36431, 36539, 36647, 36755, 36863, 36971, 37079, 37187, 37295, 37403, 37511, 37619, 37727, 37835, 37019, 37127, 37235, 37343, 37451, 37559, 37667, 37775, 37883, 37991, 38099, 38207, 38315, 38423, 38531, 37688, 37796, 37904, 38012, 38120, 38228, 38336, 38444, 38552, 38660, 38768, 38876, 38984, 39092, 39200, 39308, 38469, 38577, 38685, 38793, 38901, 39009, 39117, 39225, 39333, 39441, 39549, 39657, 39765, 39873, 39044, 39152, 39260, 39368, 39476, 39584, 39692, 39800, 39908, 40016, 40124, 40232, 40340, 40448, 40556, 40664, 39819, 39927, 40035, 40143, 40251, 40359, 40467, 40575, 40683, 40791, 40899, 41007, 41115, 41223, 41331, 40487, 40595, 40703, 40811, 40919, 41027, 41135, 41243, 41351, 41459, 41567, 41675, 41783, 41891, 41999, 41156, 41264, 41372, 41480, 41588, 41696, 41804, 41912, 42020, 42128, 42236, 42344, 42452, 42560, 42668, 41843, 41951, 42059, 42167, 42275, 42383, 42491, 42599, 42707, 42815, 42923, 43031, 43139, 43247, 43355, 42494, 42602, 42710, 42818, 42926, 43034, 43142, 43250, 43358, 43466, 43574, 43682, 43790, 43898, 44006, 43169, 43277, 43385, 43493, 43601, 43709, 43817, 43925, 44033, 44141, 44249, 44357, 44465, 44573, 44681, 43838, 43946, 44054, 44162, 44270, 44378, 44486, 44594, 44702, 44810, 44918, 45026, 45134, 45242, 45350, 44531, 44639, 44747, 44855, 44963, 45071, 45179, 45287, 45395, 45503, 45611, 45719, 45827, 45935, 46043, 45219, 45327, 45435, 45543, 45651, 45759, 45867, 45975, 46083, 46191, 46299, 46407, 46515, 46623, 45806, 45914, 46022, 46130, 46238, 46346, 46454, 46562, 46670, 46778, 46886, 46994, 47102, 47210, 47318, 46505, 46613, 46721, 46829, 46937, 47045, 47153, 47261, 47369, 47477, 47585, 47693, 47801, 47909, 48017, 47198, 47306, 47414, 47522, 47630, 47738, 47846, 47954, 48062, 48170, 48278, 48386, 48494, 48602, 47768, 47876, 47984, 48092, 48200, 48308, 48416, 48524, 48632, 48740, 48848, 48956, 49064, 49172, 49280, 48467, 48575, 48683, 48791, 48899, 49007, 49115, 48756, 48864, 48972, 49080, 49188, 49296, 49404, 49512, 49620, 49728, 49836, 49944, 50052, 50160, 49412, 49520, 49628, 49736, 49844, 49952, 50060, 50168, 50276, 50384, 50492, 50600, 50708, 50816, 50054, 50162, 50270, 50378, 50486, 50594, 50702, 50810, 50918, 51026, 51134, 50573, 50681, 50789, 50897, 51005, 51113, 51221, 51329, 51437, 51545, 51653, 51761, 51869, 51977, 51167, 51275, 51383, 51491, 51599, 51707, 51815, 51923, 52031, 52139, 52247, 52355, 52463, 52571, 51785, 51893, 52001, 52109, 52217, 52325, 52433, 52541, 52649, 52757, 52865, 52973, 53081, 53189, 53297, 52508, 52616, 52724, 52832, 52940, 53048, 53156, 53264, 53372, 53480, 53588, 53696, 52988, 53096, 53204, 53312, 53420, 53528, 53636, 53744, 53852, 53960, 54068, 54176, 54284, 54392, 54500, 53705, 53813, 53921, 54029, 54137, 54245, 54353, 54461, 54569, 54677, 54785, 54893, 55001, 55109, 54291, 54399, 54507, 54615, 54723, 54831, 54939, 55047, 55155, 55263, 55371, 55479, 55587, 55695, 55803, 55010, 55118, 55226, 55334, 55442, 55550, 55658, 55766, 55874, 55982, 56090, 56198, 56306, 56414, 55610, 55718, 55826, 55934, 56042, 56150, 56258, 56366, 56474, 56582, 56690, 56798, 56906, 57014, 57122, 56315, 56423, 56531, 56639, 56747, 56855, 56963, 57071, 57179, 57287, 57395, 57503, 57611, 57719, 56909, 57017, 57125, 57233, 57341, 57449, 57557, 57665, 57773, 57881, 57989, 58097, 58205, 58313, 58421, 57638, 57746, 57854, 57962, 58070, 58178, 58286, 58394, 58502, 58610, 58718, 58826, 58934, 59042, 58226, 58334, 58442, 58550, 58658, 58766, 58874, 58982, 59090, 59198, 59306, 59414, 59522, 59630, 59738, 58925, 59033, 59141, 59249, 59357, 59465, 59573, 59681, 59789, 59897, 60005, 60113, 60221, 60329, 59513, 59621, 59729, 59837, 59945, 60053, 60161, 60269, 60377, 60485, 60593, 60701, 60809, 60917, 61025, 60200, 60308, 60416, 60524, 60632, 60740, 60848, 60956, 61064, 61172, 61280, 61388, 61496, 61604, 61712, 60899, 61007, 61115, 61223, 61331, 61439, 61547, 61655, 61763, 61871, 61979, 62087, 62195, 62303, 62411, 61598, 61706, 61814, 61922, 62030, 62138, 62246, 62354, 62462, 62570, 62678, 62786, 62894, 63002, 62180, 62288, 62396, 62504, 62612, 62720, 62828, 62936, 63044, 63152, 63260, 63368, 63476, 63584, 63692, 62867, 62975, 63083, 63191, 63299, 63407, 63515, 63623, 63731, 63839, 63947, 64055, 64163, 64271, 64379, 63554, 63662, 63770, 63878, 63986, 64094, 64202, 64310, 64418, 64526, 64634, 64742, 64850, 64958, 65066, 64241, 64349, 64457, 64565, 64673, 64781, 64889, 64997, 65105, 65213, 65321, 65429, 65537, 65645, 64823, 64931, 65039, 65147, 65255, 65363, 65471, 65579, 65687, 65795, 65903, 66011, 66119, 66227, 66335, 65510, 65618, 65726, 65834, 65942, 66050, 66158, 66266, 66374, 66482, 66590, 66698, 66806, 66914, 67022, 66197, 66305, 66413, 66521, 66629, 66737, 66845, 66953, 67061, 67169, 67277, 67385, 67493, 67601, 67709, 66896, 67004, 67112, 67220, 67328, 67436, 67544, 67652, 67760, 67868, 67976, 68084, 68192, 68300, 67478, 67586, 67694, 67802, 67910, 68018, 68126, 68234, 68342, 68450, 68558, 68666, 68774, 68882, 68990, 68195, 68303, 68411, 68519, 68627, 68735, 68843, 68951, 69059, 69167, 69275, 69383, 69491, 69599, 69707, 68888, 68996, 69104, 69212, 69320, 69428, 69536, 69644, 69752, 69860, 69968, 70076, 70184, 70292, 69476, 69584, 69692, 69800, 69908, 70016, 70124, 70232, 70340, 70448, 70556, 70664, 70772, 70880, 70988, 70169, 70277, 70385, 70493, 70601, 70709, 70817, 70925, 71033, 71141, 71249, 71357, 71465, 71573, 71681, 70868, 70976, 71084, 71192, 71300, 71408, 71516, 71624, 71732, 71840, 71948, 72056, 72164, 72272, 71438, 71546, 71654, 71762, 71870, 71978, 72086, 72194, 72302, 72410, 72518, 72626, 72734, 72842, 72950, 72137, 72245, 72353, 72461, 72569, 72677, 72785, 72893, 73001, 73109, 73217, 73325, 73433, 73541, 73649, 72842, 72950, 73058, 73166, 73274, 73382, 73490, 73598, 73706, 73814, 73922, 74030, 73352, 73460, 73568, 73676, 73784, 73892, 74000, 74108, 74216, 74324, 74432, 74540, 74648, 74756, 74864, 74063, 74171, 74279, 74387, 74495, 74603, 74711, 74819, 74927, 75035, 75143, 75251, 75359, 75467, 74681, 74789, 74897, 75005, 75113, 75221, 75329, 75437, 75545, 75653, 75761, 75869, 75977, 76085, 75293, 75401, 75509, 75617, 75725, 75833, 75941, 76049, 76157, 76265, 76373, 76481, 76589, 76697, 76805, 75999, 76107, 76215, 76323, 76431, 76539, 76647, 76755, 76863, 76971, 77079, 77187, 77295, 77403, 76598, 76706, 76814, 76922, 77030, 77138, 77246, 77354, 77462, 77570, 77678, 77786, 77894, 78002, 77198, 77306, 77414, 77522, 77630, 77738, 77846, 77954, 78062, 78170, 78278, 78386, 78494, 78602, 78710, 77909, 78017, 78125, 78233, 78341, 78449, 78557, 78665, 78773, 78881, 78989, 79097, 79205, 79313, 79421, 78596, 78704, 78812, 78920, 79028, 79136, 79244, 79352, 79460, 79568, 79676, 79784, 79892, 80000, 79178, 79286, 79394, 79502, 79610, 79718, 79826, 79934, 80042, 80150, 80258, 80366, 80474, 80582, 80690, 79871, 79979, 80087, 80195, 80303, 80411, 80519, 80627, 80735, 80843, 80951, 81059, 81167, 81275, 81383, 80558, 80666, 80774, 80882, 80990, 81098, 81206, 81314, 81422, 81530, 81638, 81746, 81854, 81962, 82070, 81257, 81365, 81473, 81581, 81689, 81797, 81905, 82013, 82121, 82229, 82337, 82445, 82553, 82661, 82769, 81939, 82047, 82155, 82263, 82371, 82479, 82587, 82695, 82803, 82911, 83019, 83127, 83235, 83343, 82526, 82634, 82742, 82850, 82958, 83066, 83174, 83282, 83390, 83498, 83606, 83714, 83822, 83930, 84038, 83243, 83351, 83459, 83567, 83675, 83783, 83891, 83999, 84107, 84215, 84323, 84431, 84539, 84647, 83813, 83921, 84029, 84137, 84245, 84353, 84461, 84569, 84677, 84785, 84893, 85001, 85109, 85217, 85325, 84518, 84626, 84734, 84842, 84950, 85058, 85166, 85274, 85382, 85490, 85598, 85706, 85814, 85922, 86030, 85217, 85325, 85433, 85541, 85649, 85757, 85865, 85973, 86081, 86189, 86297, 86405, 86513, 86621, 85791, 85899, 86007, 86115, 86223, 86331, 86439, 86547, 86655, 86763, 86871, 86979, 87087, 87195, 87303, 86492, 86600, 86708, 86816, 86924, 87032, 87140, 87248, 87356, 87464, 87572, 87680, 87788, 87896, 88004, 87191, 87299, 87407, 87515, 87623, 87731, 87839, 87947, 88055, 88163, 88271, 88379, 88487, 88595, 88703, 87878, 87986, 88094, 88202, 88310, 88418, 88526, 88634, 88742, 88850, 88958, 89066, 89174, 89282, 88448, 88556, 88664, 88772, 88880, 88988, 89096, 89204, 89312, 88913, 89021, 89129, 89237, 89345, 89453, 89561, 89669, 89777, 89885, 89993, 90101, 90209, 90317, 89489, 89597, 89705, 89813, 89921, 90029, 90137, 90245, 90353, 90461, 90569, 90008, 90116, 90224, 90332, 90440, 90548, 90656, 90764, 90872, 90980, 91088, 91196, 91304, 91412, 91520, 90713, 90821, 90929, 91037, 91145, 91253, 91361, 91469, 91577, 91685, 91793, 91901, 92009, 92117, 91319, 91427, 91535, 91643, 91751, 91859, 91967, 92075, 92183, 92291, 92399, 92507, 92615, 92723, 91925, 92033, 92141, 92249, 92357, 92465, 92573, 92681, 92285, 92393, 92501, 92609, 92717, 92825, 92933, 93041, 93149, 93257, 93365, 93473, 93581, 93689, 92903, 93011, 93119, 93227, 93335, 93443, 93551, 93659, 93767, 93875, 93983, 94091, 94199, 94307, 94415, 93620, 93728, 93836, 93944, 94052, 94160, 94268, 94376, 94484, 94592, 94700, 94808, 94916, 95024, 94214, 94322, 94430, 94538, 94646, 94754, 94862, 94970, 95078, 95186, 95294, 95402, 95510, 95618, 95726, 94937, 95045, 95153, 95261, 95369, 95477, 95585, 95693, 95801, 95909, 96017, 96125, 96233, 96341, 95567, 95675, 95783, 95891, 95999, 96107, 96215, 96323, 96431, 96539, 96647, 96755, 96863, 96971, 96185, 96293, 96401, 96509, 96617, 96725, 96833, 96941, 97049, 97157, 97265, 97373, 97481, 97589, 96785, 96893, 97001, 97109, 97217, 97325, 97433, 97541, 97649, 97757, 97865, 97973, 98081, 98189, 98297, 97508, 97616, 97724, 97832, 97940, 98048, 98156, 98264, 98372, 98480, 98588, 98696, 98012, 98120, 98228, 98336, 98444, 98552, 98660, 98768, 98876, 98984, 99092, 99200, 99308, 99416, 99524, 98717, 98825, 98933, 99041, 99149, 99257, 99365, 99473, 99581, 99689, 99797, 99905, 100013, 100121, 100229, 99399, 99507, 99615, 99723, 99831, 99939, 100047, 100155, 100263, 100371, 100479, 100587, 100695, 100803, 99986, 100094, 100202, 100310, 100418, 100526, 100634, 100742, 100850, 100958, 101066, 101174, 101282, 101390, 101498, 100673, 100781, 100889, 100997, 101105, 101213, 101321, 101429, 101537, 101645, 101753, 101861, 101969, 102077, 102185, 101372, 101480, 101588, 101696, 101804, 101912, 102020, 102128, 102236, 102344, 102452, 102560, 102668, 102776, 101960, 102068, 102176, 102284, 102392, 102500, 102608, 102716, 102824, 102932, 103040, 103148, 103256, 103364, 103472, 102659, 102767, 102875, 102983, 103091, 103199, 103307, 103415, 103523, 103631, 103739, 103847, 103955, 104063, 104171, 103346, 103454, 103562, 103670, 103778, 103886, 103994, 104102, 104210, 104318, 104426, 104534, 104642, 104750, 103928, 104036, 104144, 104252, 104360, 104468, 104576, 104684, 104792, 104900, 105008, 105116, 105224, 105332, 105440, 104621, 104729, 104837, 104945, 105053, 105161, 105269, 105377, 105485, 105593, 105701, 105809, 105917, 106025, 106133, 105314, 105422, 105530, 105638, 105746, 105854, 105962, 106070, 106178, 106286, 106394, 106502, 106610, 106718, 105906, 106014, 106122, 106230, 106338, 106446, 106554, 106662, 106770, 106878, 106986, 107094, 107202, 107310, 107418, 106601, 106709, 106817, 106925, 107033, 107141, 107249, 107357, 107465, 107573, 107681, 107789, 107897, 108005, 108113, 107300, 107408, 107516, 107624, 107732, 107840, 107948, 108056, 108164, 108272, 108380, 108488, 108596, 108704, 107888, 107996, 108104, 108212, 108320, 108428, 108536, 108644, 108752, 108860, 108968, 109076, 109184, 109292, 109400, 108587, 108695, 108803, 108911, 109019, 109127, 109235, 109343, 109451, 109559, 109667, 109775, 109883, 109991, 110099, 109298, 109406, 109514, 109622, 109730, 109838, 109946, 110054, 110162, 110270, 110378, 110486, 110594, 110702, 109886, 109994, 110102, 110210, 110318, 110426, 110534, 110642, 110750, 110858, 110966, 111074, 111182, 111290, 110522, 110630, 110738, 110846, 110954, 111062, 111170, 110861, 110969, 111077, 111185, 111293, 111401, 111509, 111617, 111725, 111833, 111941, 112049, 112157, 112265, 111449, 111557, 111665, 111773, 111881, 111989, 112097, 112205, 112313, 112421, 112529, 111974, 112082, 112190, 112298, 112406, 112514, 112622, 112730, 112838, 112946, 113054, 113162, 113270, 113378, 112574, 112682, 112790, 112898, 113006, 113114, 113222, 113330, 113438, 113546, 113654, 113762, 113870, 113978, 114086, 113285, 113393, 113501, 113609, 113717, 113825, 113933, 114041, 114149, 114257, 114365, 114473, 114581, 114689, 114797, 113979, 114087, 114195, 114303, 114411, 114519, 114627, 114287, 114395, 114503, 114611, 114719, 114827, 114935, 115043, 115151, 115259, 115367, 115475, 115583, 115691, 114887, 114995, 115103, 115211, 115319, 115427, 115535, 115643, 115751, 115859, 115967, 116075, 116183, 116291, 116399, 115598, 115706, 115814, 115922, 116030, 116138, 116246, 116354, 116462, 116570, 116678, 116786, 116894, 117002, 116204, 116312, 116420, 116528, 116636, 116744, 116852, 116960, 117068, 117176, 117284, 117392, 117500, 117608, 116798, 116906, 117014, 117122, 117230, 117338, 117446, 117554, 117662, 117770, 117878, 117986, 118094, 118202, 118310, 117509, 117617, 117725, 117833, 117941, 118049, 118157, 118265, 118373, 118481, 118589, 118697, 118805, 118913, 119021, 118208, 118316, 118424, 118532, 118640, 118748, 118856, 118964, 119072, 119180, 119288, 119396, 119504, 119612, 118784, 118892, 119000, 119108, 119216, 119324, 119432, 119540, 119648, 119756, 119864, 119972, 120080, 120188, 120296, 119495, 119603, 119567, 119675, 119783, 119891, 119999, 120107, 120215, 120323, 120431, 120539, 120647, 120755, 120863, 120971, 121079, 120272, 120380, 120488, 120596, 120704, 120812, 120920, 121028, 121136, 121244, 121352, 121460, 121568, 121676, 120846, 120954, 121062, 121170, 121278, 121386, 121494, 121602, 121710, 121818, 121926, 122034, 122142, 122250, 122358, 121529, 121637, 121745, 121853, 121961, 122069, 122177, 122285, 122393, 122501, 122609, 122717, 122825, 122933, 123041, 122210, 122318, 122426, 122534, 122642, 122750, 122858, 122966, 123074, 123182, 123290, 123398, 123506, 123614, 123722, 122891, 122999, 123107, 123215, 123323, 123431, 123539, 123647, 123755, 123863, 123971, 124079, 124187, 124295, 124403, 123560, 123668, 123776, 123884, 123992, 124100, 124208, 124316, 124424, 124532, 124640, 124748, 124856, 124964, 125072, 125180, 124328, 124436, 124544, 124652, 124760, 124868, 124976, 125084, 125192, 125300, 125408, 125516, 125624, 125732, 124898, 125006, 125114, 125222, 125330, 125438, 125546, 125654, 125762, 125870, 125978, 126086, 126194, 126302, 126410, 126518, 125678, 125786, 125894, 126002, 126110, 126218, 126326, 126434, 126542, 126650, 126758, 126866, 126974, 127082, 127190, 126311, 126419, 126527, 126635, 126743, 126851, 126959, 127067, 127175, 127283, 127391, 127499, 127607, 127715, 127823, 126974, 127082, 127190, 127298, 127406, 127514, 127622, 127730, 127838, 127946, 128054, 128162, 128270, 128378, 128486, 127679, 127787, 127895, 128003, 128111, 128219, 128327, 128435, 128543, 128651, 128759, 128867, 128975, 129083, 129191, 128336, 128444, 128552, 128660, 128768, 128876, 128984, 129092, 129200, 129308, 129416, 129524, 129632, 129740, 129848, 129956, 129086, 129194, 129302, 129410, 129518, 129626, 129734, 129842, 129950, 130058, 130166, 130274, 130382, 130490, 130598, 129743, 129851, 129959, 130067, 130175, 130283, 130391, 130499, 130607, 130715, 130823, 130931, 131039, 131147, 131255, 130412, 130520, 130628, 130736, 130844, 130952, 131060, 131168, 131276, 131384, 131492, 131600, 131708, 131816, 131924, 132032, 131168, 131276, 131384, 131492, 131600, 131708, 131816, 131924, 132032, 132140, 132248, 132356, 132464, 132572, 132680, 131807, 131915, 132023, 132131, 132239, 132347, 132455, 132563, 132671, 132779, 132887, 132995, 133103, 133211, 133319, 133427, 132564, 132672, 132780, 132888, 132996, 133104, 133212, 133320, 133428, 133536, 133644, 133752, 133860, 133968, 134076, 133190, 133298, 133406, 133514, 133622, 133730, 133838, 133946, 134054, 134162, 134270, 134378, 134486, 134594, 134702, 134810, 134918, 134003, 134111, 134219, 134327, 134435, 134543, 134651, 134759, 134867, 134975, 135083, 135191, 135299, 135407, 135515, 135623, 134723, 134831, 134939, 135047, 135155, 135263, 135371, 135479, 135587, 135695, 135803, 135911, 136019, 136127, 136235, 136343, 135425, 135533, 135641, 135749, 135857, 135965, 136073, 136181, 136289, 136397, 136505, 136613, 136721, 136829, 136937, 137045, 136133, 136241, 136349, 136457, 136565, 136673, 136781, 136889, 136997, 137105, 137213, 137321, 137429, 137537, 137645, 137753, 136835, 136943, 137051, 137159, 137267, 137375, 137483, 137591, 137699, 137807, 137915, 138023, 138131, 138239, 138347, 138455, 137543, 137651, 137759, 137867, 137975, 138083, 138191, 138299, 138407, 138515, 138623, 138731, 138839, 138947, 139055, 139163, 139271, 138362, 138470, 138578, 138686, 138794, 138902, 139010, 139118, 139226, 139334, 139442, 139550, 139658, 139766, 139874, 139982, 139064, 139172, 139280, 139388, 139496, 139604, 139712, 139820, 139928, 140036, 140144, 140252, 140360, 140468, 140576, 140684, 139748, 139856, 139964, 140072, 140180, 140288, 140396, 140504, 140612, 140720, 140828, 140936, 141044, 141152, 141260, 141368, 141476, 140543, 140651, 140759, 140867, 140975, 141083, 141191, 141299, 141407, 141515, 141623, 141731, 141839, 141947, 142055, 142163, 142271, 141314, 141422, 141530, 141638, 141746, 141854, 141962, 142070, 142178, 142286, 142394, 142502, 142610, 142718, 142826, 142934, 143042, 142103, 142211, 142319, 142427, 142535, 142643, 142751, 142859, 142967, 143075, 143183, 143291, 143399, 143507, 143615, 143723, 143831, 142856, 142964, 143072, 143180, 143288, 143396, 143504, 143612, 143720, 143828, 143936, 144044, 144152, 144260, 144368, 144476, 144584, 143609, 143717, 143825, 143933, 144041, 144149, 144257, 144365, 144473, 144581, 144689, 144797, 144905, 145013, 145121, 145229, 145337, 144362, 144470, 144578, 144686, 144794, 144902, 145010, 145118, 145226, 145334, 145442, 145550, 145658, 145766, 145874, 145982, 146090, 145133, 145241, 145349, 145457, 145565, 145673, 145781, 145889, 145997, 146105, 146213, 146321, 146429, 146537, 146645, 146753, 146861, 145868, 145976, 146084, 146192, 146300, 146408, 146516, 146624, 146732, 146840, 146948, 147056, 147164, 147272, 147380, 147488, 147596, 147704, 146726, 146834, 146942, 147050, 147158, 147266, 147374, 147482, 147590, 147698, 147806, 147914, 148022, 148130, 148238, 148346, 148454, 148562, 147542, 147650, 147758, 147866, 147974, 148082, 148190, 148298, 148406, 148514, 148622, 148730, 148838, 148946, 149054, 149162, 149270, 148271, 148379, 148487, 148595, 148703, 148811, 148919, 149027, 149135, 149243, 149351, 149459, 149567, 149675, 149783, 149891, 149999, 150107, 149123, 149231, 149339, 149447, 149555, 149663, 149771, 149879, 149987, 150095, 150203, 150311, 150419, 150527, 150635, 150743, 150851, 149846, 149954, 150062, 150170, 150278, 150386, 150494, 150602, 150710, 150818, 150926, 151034, 151142, 151250, 151358, 151466, 151574, 151682, 150680, 150788, 150896, 151004, 151112, 151220, 151328, 151436, 151544, 151652, 151760, 151868, 151976, 152084, 152192, 152300, 152408, 151403, 151511, 151619, 151727, 151835, 151943, 152051, 152159, 152267, 152375, 152483, 152591, 152699, 152807, 152915, 153023, 153131, 153239, 152237, 152345, 152453, 152561, 152669, 152777, 152885, 152993, 153101, 153209, 153317, 153425, 153533, 153641, 153749, 153857, 153965, 154073, 153083, 153191, 153299, 153407, 153515, 153623, 153731, 153839, 153947, 154055, 154163, 154271, 154379, 154487, 154595, 154703, 154811, 153818, 153926, 154034, 154142, 154250, 154358, 154466, 154574, 154682, 154790, 154898, 155006, 155114, 155222, 155330, 155438, 155546, 155654, 154634, 154742, 154850, 154958, 155066, 155174, 155282, 155390, 155498, 155606, 155714, 155822, 155924, 156032, 156140, 156248, 156356, 156464, 155420, 155528, 155636, 155744, 155852, 155960, 156068, 156176, 156284, 156392, 156500, 156608, 156716, 156824, 156932, 157040, 157148, 157256, 156224, 156332, 156440, 156548, 156656, 156764, 156872, 156980, 157088, 157196, 157304, 157412, 157520, 157628, 157736, 157844, 157952, 158060, 158168, 157127, 157235, 157343, 157451, 157559, 157667, 157775, 157883, 157991, 158099, 158207, 158315, 158423, 158531, 158639, 158747, 158855, 158963, 157925, 158033, 158141, 158249, 158357, 158465, 158573, 158681, 158789, 158897, 159005, 159113, 159221, 159329, 159437, 159545, 159653, 159761, 158723, 158831, 158939, 159047, 159155, 159263, 159371, 159479, 159587, 159695, 159803, 159911, 160019, 160127, 160235, 160343, 160451, 160559, 159521, 159629, 159737, 159845, 159953, 160061, 160169, 160277, 160385, 160493, 160601, 160709, 160817, 160925, 161033, 161141, 161249, 161357, 161465, 160412, 160520, 160628, 160736, 160844, 160952, 161060, 161168, 161276, 161384, 161492, 161600, 161708, 161816, 161924, 162032, 162140, 162248, 161168, 161276, 161384, 161492, 161600, 161708, 161816, 161924, 162032, 162140, 162248, 162356, 162464, 162572, 162680, 162788, 162896, 163004, 163112, 162053, 162161, 162269, 162377, 162485, 162593, 162701, 162809, 162917, 163025, 163133, 163241, 163349, 163457, 163565, 163673, 163781, 163889, 163997, 162908, 163016, 163124, 163232, 163340, 163448, 163556, 163664, 163772, 163880, 163988, 164096, 164204, 164312, 164420, 164528, 164636, 164744, 164852, 163781, 163889, 163997, 164105, 164213, 164321, 164429, 164537, 164645, 164753, 164861, 164969, 165077, 165185, 165293, 165401, 165509, 165617, 165725, 164648, 164756, 164864, 164972, 165080, 165188, 165296, 165404, 165512, 165620, 165728, 165836, 165944, 166052, 166160, 166268, 166376, 166484, 166592, 165497, 165605, 165713, 165821, 165929, 166037, 166145, 166253, 166361, 166469, 166577, 165938, 166019, 166127, 166235, 166343, 166451, 166559, 166667, 166775, 166883, 166991, 167099, 167207, 167315, 167423, 167531, 167639, 167747, 167855, 166847, 166955, 167063, 167171, 167279, 167387, 167495, 167603, 167711, 167819, 167927, 168035, 168143, 168251, 168359, 167474, 167582, 167690, 167798, 167906, 168014, 168122, 168230, 168338, 168446, 168554, 168662, 168770, 168878, 168986, 169094, 169202, 169310, 169418, 169526, 168428, 168536, 168644, 168752, 168860, 168968, 169076, 169184, 169292, 169400, 169508, 169616, 169724, 169832, 169940, 170048, 170156, 170264, 170372, 169235, 169343, 169451, 169559, 169667, 169775, 169883, 169991, 170099, 170207, 170315, 170423, 169769, 169877, 169985, 170093, 170201, 170309, 170417, 170525, 170633, 170741, 170849, 170957, 171065, 171173, 171281, 171389, 171497, 171605, 171713, 171821, 170723, 170831, 170939, 171047, 171155, 171263, 171371, 171479, 171587, 171695, 171803, 171911, 172019, 172127, 172235, 172343, 172451, 172559, 172667, 172775, 171623, 171731, 171839, 171947, 172055, 172163, 172271, 172379, 172487, 172595, 172703, 172811, 172919, 173027, 173135, 173243, 173351, 173459, 173567, 172430, 172538, 172646, 172754, 172862, 172970, 173078, 173186, 173294, 173402, 173510, 173618, 173726, 173834, 173942, 174050, 174158, 174266, 174374, 174482, 173336, 173444, 173552, 173660, 173768, 173876, 173984, 174092, 174200, 174308, 174416, 174524, 174632, 174740, 174848, 174956, 175064, 175172, 175280, 175388, 174230, 174338, 174446, 174554, 174662, 174770, 174878, 174986, 175094, 175202, 175310, 175418, 175526, 174803, 174911, 175019, 175127, 175235, 175343, 175451, 175559, 175667, 175775, 175883, 175991, 176099, 176207, 176315, 176423, 176531, 176639, 176747, 176855, 176963, 175796, 175904, 176012, 176120, 176228, 176336, 176444, 176552, 176660, 176768, 176876, 176984, 177092, 177200, 177308, 177416, 177524, 177632, 177740, 177848, 176660, 176768, 176876, 176984, 177092, 177200, 177308, 177416, 177524, 177632, 177740, 177848, 177956, 178064, 178172, 178280, 178388, 178496, 178604, 178712, 178820, 177647, 177755, 177863, 177971, 178079, 178187, 178295, 178403, 178511, 178619, 178727, 178835, 178943, 179051, 179159, 179267, 179375, 179483, 179591, 179699, 178511, 178619, 178727, 178835, 178943, 179051, 179159, 179267, 179375, 179483, 179591, 179699, 179807, 179915, 180023, 180131, 180239, 180347, 180455, 180563, 180671, 179480, 179588, 179696, 179804, 179912, 180020, 180128, 180236, 180344, 180452, 180560, 180668, 180776, 180884, 180992, 181100, 181208, 181316, 181424, 181532, 180338, 180446, 180554, 180662, 180770, 180878, 180986, 181094, 181202, 181310, 181418, 181526, 181634, 181742, 181850, 181958, 182066, 182174, 182282, 182390, 182498, 181283, 181391, 181499, 181607, 181715, 181823, 181931, 182039, 182147, 182255, 182363, 182471, 182579, 182687, 182795, 182903, 183011, 183119, 183227, 183335, 183443, 182246, 182354, 182462, 182570, 182678, 182786, 182894, 183002, 183110, 183218, 183326, 183434, 183542, 183650, 183758, 183866, 183974, 184082, 184190, 184298, 184406, 183171, 183279, 183387, 183495, 183603, 183711, 183819, 183927, 184035, 184143, 184251, 184359, 184467, 184575, 184683, 184791, 184899, 185007, 185115, 185223, 185331, 185439, 184211, 184319, 184427, 184535, 184643, 184751, 184859, 184967, 185075, 185183, 185291, 185399, 185507, 185615, 185723, 185831, 185939, 186047, 186155, 185036, 185144, 185252, 185360, 185468, 185576, 185684, 185792, 185900, 186008, 186116, 186224, 186332, 186440, 186548, 186656, 186764, 186872, 186980, 187088, 187196, 187304, 186062, 186170, 186278, 186386, 186494, 186602, 186710, 186818, 186926, 187034, 187142, 187250, 187358, 187466, 187574, 187682, 187790, 187898, 188006, 188114, 188222, 186953, 187061, 187169, 187277, 187385, 187493, 187601, 187709, 187817, 187925, 188033, 188141, 188249, 188357, 188465, 188573, 188681, 188789, 188897, 189005, 189113, 189221, 189329, 188049, 188157, 188265, 188373, 188481, 188589, 188697, 188805, 188913, 189021, 189129, 189237, 189345, 189453, 189561, 189669, 189777, 189885, 189993, 190101, 190209, 190317, 189032, 189140, 189248, 189356, 189464, 189572, 189680, 189788, 189896, 190004, 190112, 190220, 190328, 190436, 190544, 190652, 190760, 190868, 190976, 191084, 191192, 191300, 190016, 190124, 190232, 190340, 190448, 190556, 190664, 190772, 190880, 190988, 191096, 191204, 191312, 191420, 191528, 191636, 191744, 191852, 191960, 192068, 192176, 192284, 191006, 191114, 191222, 191330, 191438, 191546, 191654, 191762, 191870, 191978, 192086, 192194, 192302, 192410, 192518, 192626, 192734, 192842, 192950, 193058, 193166, 193274, 191996, 192104, 192212, 192320, 192428, 192536, 192644, 192752, 192860, 192968, 193076, 193184, 193292, 193400, 193508, 193616, 193724, 193832, 193940, 194048, 194156, 194264, 192992, 193100, 193208, 193316, 193424, 193532, 193640, 193748, 193856, 193964, 194072, 194180, 194288, 194396, 194504, 194612, 194720, 194828, 194936, 195044, 195152, 195260, 193970, 194078, 194186, 194294, 194402, 194510, 194618, 194726, 194834, 194942, 195050, 195158, 195266, 195374, 195482, 195590, 195698, 195806, 195914, 196022, 196130, 196238, 194948, 195056, 195164, 195272, 195380, 195488, 195596, 195704, 195812, 195920, 196028, 196136, 196244, 196352, 196460, 196568, 196676, 196784, 196892, 197000, 197108, 197216, 195920, 196028, 196136, 196244, 196352, 196460, 196568, 196676, 196784, 196892, 197000, 197108, 197216, 197324, 197432, 197540, 197648, 197756, 197864, 197972, 198080, 198188, 198296, 197003, 197111, 197219, 197327, 197435, 197543, 197651, 197759, 197867, 197975, 198083, 198191, 198299, 198407, 198515, 198623, 198731, 198839, 198947, 199055, 199163, 199271, 197951, 198059, 198167, 198275, 198383, 198491, 198599, 198707, 198815, 198923, 199031, 199139, 199247, 199355, 199463, 199571, 199679, 199787, 199895, 200003, 200111, 200219, 200327, 199028, 199136, 199244, 199352, 199460, 199568, 199676, 199784, 199892, 200000, 200108, 200216, 200324, 200432, 200540, 200648, 200756, 200864, 200972, 201080, 201188, 201296, 199982, 200090, 200198, 200306, 200414, 200522, 200630, 200738, 200846, 200954, 201062, 201170, 201278, 201386, 201494, 201602, 201710, 201818, 201926, 202034, 202142, 202250, 202358, 201017, 201125, 201233, 201341, 201449, 201557, 201665, 201773, 201881, 201989, 202097, 202205, 202313, 202421, 202529, 202637, 202745, 202853, 202961, 203069, 203177, 203285, 203393, 202070, 202178, 202286, 202394, 202502, 202610, 202718, 202826, 202934, 203042, 203150, 203258, 203366, 203474, 203582, 203690, 203798, 203906, 204014, 204122, 204230, 204338, 204446, 203087, 203195, 203303, 203411, 203519, 203627, 203735, 203843, 203951, 204059, 204167, 204275, 204383, 204491, 204599, 204707, 204815, 204923, 205031, 205139, 205247, 205355, 205463, 204116, 204224, 204332, 204440, 204548, 204656, 204764, 204872, 204980, 205088, 205196, 205304, 205412, 205520, 205628, 205736, 205844, 205952, 206060, 206168, 206276, 206384, 206492, 206600, 205232, 205340, 205448, 205556, 205664, 205772, 205880, 205988, 206096, 206204, 206312, 206420, 206528, 206636, 206744, 206852, 206960, 207068, 207176, 207284, 207392, 207500, 207608, 206225, 206333, 206441, 206549, 206657, 206765, 206873, 206981, 207089, 207197, 207305, 207413, 207521, 207629, 207737, 207845, 207953, 208061, 208169, 208277, 208385, 208493, 208601, 208709, 207353, 207461, 207569, 207677, 207785, 207893, 208001, 208109, 208217, 208325, 208433, 208541, 208649, 208757, 208865, 208973, 209081, 209189, 209297, 209405, 209513, 209621, 209729, 208334, 208442, 208550, 208658, 208766, 208874, 208982, 209090, 209198, 209306, 209414, 209522, 209630, 209738, 209846, 209954, 210062, 210170, 210278, 210386, 210494, 210602, 210710, 210818, 210926, 209513, 209621, 209729, 209837, 209945, 210053, 210161, 210269, 210377, 210485, 210593, 210701, 210809, 210917, 211025, 211133, 211241, 211349, 211457, 211565, 211673, 211781, 211889, 211997, 210593, 210701, 210809, 210917, 211025, 211133, 211241, 211349, 211457, 211565, 211673, 211781, 211889, 211997, 212105, 212213, 212321, 212429, 212537, 212645, 212753, 212861, 212969, 211568, 211676, 211784, 211892, 212000, 212108, 212216, 212324, 212432, 212540, 212648, 212756, 212864, 212972, 213080, 213188, 213296, 213404, 213512, 213620, 213728, 213836, 213944, 214052, 214160, 212753, 212861, 212969, 213077, 213185, 213293, 213401, 213509, 213617, 213725, 213833, 213941, 214049, 214157, 214265, 214373, 214481, 214589, 214697, 214805, 214913, 215021, 215129, 215237, 213821, 213929, 214037, 214145, 214253, 214361, 214469, 214577, 214685, 214793, 214901, 215009, 215117, 215225, 215333, 215441, 215549, 215657, 215765, 215873, 215981, 216089, 216197, 216305, 214871, 214979, 215087, 215195, 215303, 215411, 215519, 215627, 215735, 215843, 215951, 216059, 216167, 216275, 216383, 216491, 216599, 216707, 216815, 216923, 217031, 217139, 217247, 217355, 217463, 216026, 216134, 216242, 216350, 216458, 216566, 216674, 216782, 216890, 216998, 217106, 217214, 217322, 217430, 217538, 217646, 217754, 217862, 217970, 218078, 218186, 218294, 218402, 218510, 218618, 217157, 217265, 217373, 217481, 217589, 217697, 217805, 217913, 218021, 218129, 218237, 218345, 218453, 218561, 218669, 218777, 218885, 218993, 219101, 219209, 219317, 219425, 219533, 219641, 218183, 218291, 218399, 218507, 218615, 218723, 218831, 218939, 219047, 219155, 219263, 219371, 219479, 219587, 219695, 219803, 219911, 220019, 220127, 220235, 220343, 220451, 220559, 220667, 220775, 220883, 219413, 219521, 219629, 219737, 219845, 219953, 220061, 220169, 220277, 220385, 220493, 220601, 220709, 220817, 220925, 221033, 221141, 221249, 221357, 221465, 221573, 221681, 221789, 221897, 222005, 220538, 220646, 220754, 220862, 220970, 221078, 221186, 221294, 221402, 221510, 221618, 221726, 221834, 221942, 222050, 222158, 222266, 222374, 222482, 222590, 222698, 222806, 222914, 223022, 223130, 221663, 221771, 221879, 221987, 222095, 222203, 222311, 222419, 222527, 222635, 222743, 222851, 222959, 223067, 223175, 223283, 223391, 223499, 223607, 223715, 223823, 223931, 224039, 224147, 224255, 222771, 222879, 222987, 223095, 223203, 223311, 223419, 223527, 223635, 223743, 223851, 223959, 224067, 224175, 224283, 224391, 224499, 224607, 224715, 224823, 224931, 225039, 225147, 225255, 225363, 223889, 223997, 224105, 224213, 224321, 224429, 224537, 224645, 224753, 224861, 224969, 225077, 225185, 225293, 225401, 225509, 225617, 225725, 225833, 225941, 226049, 226157, 226265, 226373, 226481, 224978, 225086] }, { label: 'LayoutCount', backgroundColor: 'rgba(50, 184, 79, 0.2)', borderColor: 'rgba(50, 184, 79, 1.00)', - data: [3, 18, 31, 44, 57, 70, 83, 96, 109, 122, 135, 148, 161, 174, 187, 200, 213, 226, 239, 252, 265, 278, 291, 304, 317, 330, 343, 356, 369, 382, 395, 408, 421, 434, 447, 460, 473, 486, 499, 512, 525, 538, 551, 564, 577, 590, 603, 616, 629, 642] + data: [4, 19, 31, 43, 56, 69, 82, 95, 107, 119, 131, 143, 155, 167, 179, 191, 203, 215, 227, 239, 252, 264, 276, 288, 300, 312, 324, 336, 348, 360, 372, 384, 396, 408, 420, 432, 444, 456, 468, 480, 492, 504, 516, 528, 540, 552, 564, 576, 588, 600, 612, 624, 636, 648, 660, 672, 684, 696, 708, 720, 732, 744, 756, 768, 780, 792, 804, 816, 828, 840, 852, 864, 876, 888, 900, 912, 924, 936, 948, 960, 972, 984, 996, 1008, 1020, 1032, 1044, 1056, 1068, 1080, 1092, 1104, 1116, 1128, 1140, 1152, 1164, 1176, 1188, 1200, 1212, 1224, 1236, 1248, 1260, 1272, 1284, 1296, 1308, 1320, 1332, 1344, 1356, 1368, 1380, 1392, 1404, 1416, 1428, 1440, 1452, 1464, 1476, 1488, 1500, 1512, 1524, 1536, 1548, 1560, 1572, 1584, 1596, 1609, 1621, 1633, 1645, 1657, 1669, 1681, 1693, 1705, 1717, 1729, 1741, 1753, 1765, 1777, 1789, 1801, 1813, 1825, 1837, 1849, 1861, 1873, 1885, 1897, 1909, 1921, 1933, 1945, 1957, 1969, 1981, 1993, 2005, 2017, 2029, 2041, 2053, 2065, 2077, 2089, 2101, 2113, 2125, 2137, 2149, 2161, 2173, 2185, 2197, 2209, 2221, 2233, 2245, 2257, 2269, 2281, 2293, 2305, 2317, 2329, 2341, 2353, 2365, 2377, 2389, 2401, 2413, 2425, 2437, 2449, 2461, 2473, 2485, 2497, 2509, 2521, 2533, 2545, 2557, 2569, 2581, 2593, 2605, 2617, 2629, 2641, 2653, 2665, 2677, 2689, 2701, 2713, 2725, 2737, 2749, 2761, 2773, 2785, 2797, 2809, 2821, 2833, 2845, 2857, 2869, 2881, 2893, 2905, 2917, 2929, 2941, 2953, 2965, 2977, 2989, 3001, 3013, 3025, 3037, 3049, 3061, 3073, 3085, 3097, 3109, 3121, 3133, 3145, 3157, 3169, 3181, 3193, 3205, 3217, 3229, 3241, 3253, 3265, 3277, 3289, 3301, 3313, 3325, 3337, 3349, 3361, 3373, 3385, 3397, 3409, 3421, 3433, 3445, 3457, 3469, 3481, 3493, 3505, 3517, 3529, 3541, 3553, 3565, 3577, 3589, 3601, 3613, 3625, 3637, 3649, 3661, 3673, 3685, 3697, 3709, 3721, 3733, 3745, 3757, 3769, 3781, 3793, 3805, 3817, 3829, 3841, 3853, 3865, 3877, 3889, 3901, 3913, 3925, 3937, 3949, 3961, 3973, 3985, 3997, 4009, 4021, 4033, 4045, 4057, 4069, 4081, 4093, 4105, 4117, 4129, 4141, 4153, 4165, 4177, 4189, 4201, 4213, 4225, 4237, 4249, 4261, 4273, 4285, 4297, 4309, 4321, 4333, 4345, 4357, 4369, 4381, 4393, 4405, 4417, 4429, 4441, 4453, 4465, 4477, 4489, 4501, 4513, 4525, 4537, 4549, 4561, 4573, 4585, 4597, 4609, 4621, 4633, 4645, 4657, 4669, 4681, 4693, 4705, 4717, 4729, 4741, 4753, 4765, 4777, 4789, 4801, 4813, 4825, 4837, 4849, 4861, 4873, 4885, 4897, 4909, 4921, 4933, 4945, 4957, 4969, 4981, 4993, 5005, 5017, 5029, 5041, 5053, 5065, 5077, 5089, 5101, 5113, 5125, 5137, 5149, 5161, 5173, 5185, 5197, 5209, 5221, 5233, 5245, 5257, 5269, 5281, 5293, 5305, 5317, 5329, 5341, 5353, 5365, 5377, 5389, 5401, 5413, 5425, 5437, 5449, 5461, 5473, 5485, 5497, 5509, 5521, 5533, 5545, 5557, 5569, 5581, 5593, 5605, 5617, 5629, 5641, 5653, 5665, 5677, 5689, 5701, 5713, 5725, 5737, 5749, 5761, 5773, 5785, 5797, 5809, 5821, 5833, 5845, 5857, 5869, 5881, 5893, 5905, 5917, 5929, 5941, 5953, 5965, 5977, 5989, 6001, 6013, 6025, 6037, 6049, 6061, 6073, 6085, 6097, 6109, 6121, 6133, 6145, 6157, 6169, 6181, 6193, 6205, 6217, 6229, 6242, 6254, 6266, 6279, 6292, 6304, 6316, 6328, 6340, 6352, 6364, 6376, 6388, 6400, 6412, 6424, 6436, 6448, 6460, 6472, 6484, 6496, 6508, 6520, 6532, 6544, 6556, 6568, 6580, 6592, 6604, 6616, 6628, 6640, 6652, 6664, 6676, 6688, 6700, 6712, 6724, 6736, 6748, 6760, 6772, 6784, 6796, 6808, 6820, 6832, 6844, 6856, 6868, 6880, 6892, 6904, 6916, 6928, 6940, 6952, 6964, 6976, 6988, 7000, 7012, 7024, 7036, 7048, 7060, 7072, 7084, 7096, 7108, 7120, 7132, 7144, 7156, 7168, 7180, 7192, 7204, 7216, 7228, 7240, 7252, 7264, 7276, 7288, 7300, 7312, 7324, 7336, 7348, 7360, 7372, 7384, 7396, 7408, 7420, 7432, 7444, 7456, 7468, 7480, 7492, 7504, 7516, 7528, 7540, 7552, 7564, 7576, 7588, 7600, 7612, 7624, 7636, 7648, 7660, 7672, 7684, 7696, 7708, 7720, 7732, 7744, 7756, 7768, 7780, 7792, 7804, 7816, 7828, 7840, 7852, 7864, 7876, 7888, 7900, 7912, 7924, 7936, 7948, 7960, 7972, 7984, 7996, 8008, 8020, 8032, 8044, 8056, 8068, 8080, 8092, 8104, 8116, 8128, 8140, 8152, 8164, 8177, 8189, 8201, 8214, 8226, 8238, 8250, 8262, 8274, 8286, 8298, 8310, 8322, 8334, 8346, 8358, 8370, 8382, 8394, 8406, 8418, 8430, 8442, 8454, 8466, 8478, 8490, 8502, 8514, 8526, 8538, 8550, 8562, 8574, 8586, 8598, 8610, 8622, 8635, 8647, 8659, 8672, 8684, 8696, 8708, 8720, 8733, 8745, 8757, 8769, 8781, 8793, 8805, 8817, 8830, 8842, 8854, 8866, 8878, 8890, 8902, 8914, 8926, 8938, 8950, 8962, 8974, 8987, 8999, 9011, 9023, 9035, 9047, 9059, 9071, 9083, 9095, 9107, 9119, 9131, 9143, 9155, 9167, 9179, 9191, 9204, 9216, 9228, 9240, 9252, 9264, 9276, 9288, 9300, 9313, 9325, 9337, 9349, 9361, 9373, 9385, 9397, 9409, 9421, 9433, 9445, 9457, 9469, 9482, 9494, 9506, 9518, 9530, 9542, 9554, 9566, 9578, 9590, 9602, 9614, 9626, 9638, 9650, 9662, 9674, 9686, 9698, 9710, 9722, 9734, 9746, 9758, 9770, 9782, 9794, 9806, 9818, 9830, 9842, 9854, 9866, 9878, 9890, 9902, 9914, 9926, 9938, 9950, 9962, 9974, 9987, 9999, 10011, 10023, 10035, 10048, 10060, 10072, 10084, 10096, 10108, 10120, 10132, 10144, 10156, 10168, 10180, 10192, 10204, 10216, 10228, 10240, 10252, 10264, 10276, 10288, 10300, 10312, 10324, 10336, 10348, 10360, 10372, 10384, 10396, 10408, 10420, 10432, 10444, 10456, 10468, 10480, 10492, 10504, 10516, 10528, 10540, 10552, 10564, 10576, 10588, 10600, 10612, 10624, 10636, 10648, 10660, 10672, 10684, 10696, 10708, 10720, 10732, 10744, 10756, 10768, 10780, 10792, 10804, 10816, 10828, 10840, 10852, 10864, 10876, 10888, 10900, 10912, 10924, 10936, 10948, 10960, 10972, 10984, 10996, 11008, 11020, 11032, 11044, 11056, 11068, 11080, 11092, 11104, 11116, 11128, 11140, 11152, 11164, 11176, 11188, 11200, 11212, 11224, 11236, 11248, 11260, 11272, 11284, 11296, 11308, 11320, 11332, 11344, 11356, 11368, 11380, 11392, 11404, 11416, 11428, 11440, 11452, 11464, 11476, 11488, 11500, 11512, 11524, 11536, 11548, 11560, 11572, 11584, 11596, 11608, 11620, 11632, 11644, 11656, 11668, 11680, 11692, 11704, 11716, 11728, 11740, 11752, 11764, 11776, 11788, 11800, 11812, 11824, 11836, 11848, 11860, 11872, 11884, 11896, 11908, 11920, 11932, 11944, 11956, 11968, 11980, 11992, 12004, 12016, 12028, 12040, 12052, 12064, 12076, 12088, 12100, 12112, 12124, 12136, 12148, 12160, 12172, 12184, 12196, 12208, 12220, 12232, 12244, 12256, 12268, 12280, 12292, 12304, 12316, 12328, 12340, 12352, 12364, 12376, 12388, 12400, 12412, 12424, 12436, 12448, 12460, 12472, 12484, 12496, 12508, 12520, 12532, 12544, 12556, 12568, 12580, 12592, 12604, 12616, 12628, 12640, 12652, 12664, 12676, 12688, 12700, 12712, 12724, 12736, 12748, 12760, 12772, 12784, 12796, 12808, 12820, 12832, 12844, 12856, 12868, 12880, 12892, 12904, 12916, 12928, 12940, 12952, 12964, 12976, 12988, 13000, 13012, 13024, 13036, 13048, 13060, 13072, 13084, 13096, 13108, 13120, 13132, 13144, 13156, 13168, 13180, 13192, 13204, 13216, 13228, 13240, 13252, 13264, 13276, 13288, 13300, 13312, 13324, 13336, 13348, 13360, 13372, 13384, 13396, 13408, 13420, 13432, 13444, 13456, 13468, 13480, 13492, 13504, 13516, 13528, 13540, 13552, 13564, 13576, 13588, 13600, 13612, 13624, 13636, 13648, 13660, 13672, 13684, 13696, 13708, 13720, 13732, 13744, 13756, 13768, 13780, 13792, 13804, 13816, 13828, 13840, 13852, 13864, 13876, 13888, 13900, 13912, 13924, 13936, 13948, 13960, 13972, 13984, 13996, 14008, 14020, 14032, 14044, 14056, 14068, 14080, 14092, 14104, 14116, 14128, 14140, 14152, 14164, 14176, 14188, 14200, 14212, 14224, 14236, 14248, 14260, 14272, 14284, 14296, 14308, 14320, 14332, 14344, 14356, 14368, 14380, 14392, 14404, 14416, 14428, 14440, 14452, 14464, 14476, 14488, 14500, 14512, 14524, 14536, 14548, 14560, 14572, 14584, 14596, 14608, 14620, 14632, 14644, 14656, 14668, 14680, 14692, 14704, 14716, 14728, 14740, 14752, 14764, 14776, 14788, 14800, 14812, 14824, 14836, 14848, 14860, 14872, 14884, 14896, 14908, 14920, 14932, 14944, 14956, 14968, 14980, 14992, 15004, 15016, 15028, 15040, 15052, 15064, 15076, 15088, 15100, 15112, 15124, 15136, 15148, 15160, 15172, 15184, 15196, 15208, 15220, 15232, 15244, 15256, 15268, 15280, 15292, 15304, 15316, 15328, 15340, 15352, 15364, 15376, 15388, 15400, 15412, 15424, 15436, 15448, 15460, 15472, 15484, 15496, 15508, 15520, 15532, 15544, 15556, 15568, 15580, 15592, 15604, 15616, 15628, 15640, 15652, 15664, 15676, 15688, 15700, 15712, 15724, 15736, 15748, 15760, 15772, 15784, 15796, 15808, 15820, 15832, 15844, 15856, 15868, 15880, 15892, 15904, 15916, 15928, 15940, 15952, 15964, 15976, 15988, 16000, 16012, 16024, 16036, 16048, 16060, 16072, 16084, 16096, 16108, 16120, 16132, 16144, 16156, 16168, 16180, 16192, 16204, 16216, 16228, 16240, 16252, 16264, 16276, 16288, 16300, 16312, 16324, 16336, 16348, 16360, 16372, 16384, 16396, 16408, 16420, 16432, 16444, 16456, 16468, 16480, 16492, 16504, 16516, 16528, 16540, 16552, 16564, 16576, 16588, 16600, 16612, 16624, 16636, 16648, 16660, 16672, 16684, 16696, 16708, 16720, 16732, 16744, 16756, 16768, 16780, 16792, 16804, 16816, 16828, 16840, 16852, 16864, 16876, 16888, 16900, 16912, 16924, 16936, 16948, 16960, 16972, 16984, 16996, 17008, 17020, 17032, 17044, 17056, 17068, 17080, 17092, 17104, 17116, 17128, 17140, 17152, 17164, 17176, 17188, 17200, 17212, 17224, 17236, 17248, 17260, 17272, 17284, 17296, 17308, 17320, 17332, 17344, 17356, 17368, 17380, 17392, 17404, 17416, 17428, 17440, 17452, 17464, 17476, 17488, 17500, 17512, 17524, 17536, 17548, 17560, 17572, 17584, 17596, 17608, 17620, 17632, 17644, 17656, 17668, 17680, 17692, 17704, 17716, 17728, 17740, 17752, 17764, 17776, 17788, 17800, 17812, 17824, 17836, 17848, 17860, 17872, 17884, 17896, 17908, 17920, 17932, 17944, 17956, 17968, 17980, 17992, 18004, 18016, 18028, 18040, 18052, 18064, 18076, 18088, 18100, 18112, 18124, 18136, 18148, 18160, 18172, 18184, 18196, 18208, 18221, 18233, 18245, 18257, 18269, 18281, 18293, 18305, 18317, 18329, 18341, 18353, 18365, 18377, 18389, 18401, 18413, 18425, 18437, 18449, 18461, 18473, 18485, 18497, 18509, 18521, 18533, 18545, 18557, 18569, 18581, 18593, 18605, 18617, 18629, 18641, 18653, 18665, 18677, 18689, 18701, 18713, 18725, 18737, 18749, 18761, 18773, 18785, 18797, 18809, 18821, 18833, 18845, 18857, 18869, 18881, 18893, 18905, 18917, 18929, 18941, 18953, 18965, 18977, 18989, 19001, 19013, 19025, 19037, 19049, 19061, 19073, 19085, 19097, 19109, 19121, 19133, 19145, 19157, 19169, 19181, 19193, 19205, 19217, 19229, 19241, 19253, 19265, 19277, 19289, 19301, 19313, 19325, 19337, 19349, 19361, 19373, 19385, 19397, 19409, 19421, 19433, 19445, 19457, 19469, 19481, 19493, 19505, 19517, 19529, 19541, 19553, 19565, 19577, 19589, 19601, 19613, 19625, 19637, 19649, 19661, 19673, 19685, 19697, 19709, 19721, 19733, 19745, 19757, 19769, 19781, 19793, 19805, 19817, 19829, 19841, 19853, 19865, 19877, 19889, 19901, 19913, 19925, 19937, 19949, 19961, 19973, 19985, 19997, 20009, 20021, 20033, 20045, 20057, 20069, 20081, 20093, 20105, 20117, 20129, 20141, 20153, 20165, 20177, 20189, 20201, 20213, 20225, 20237, 20249, 20261, 20273, 20285, 20297, 20309, 20321, 20333, 20345, 20357, 20369, 20381, 20393, 20405, 20417, 20429, 20441, 20453, 20465, 20477, 20489, 20501, 20513, 20525, 20537, 20549, 20561, 20573, 20585, 20597, 20609, 20621, 20633, 20645, 20657, 20669, 20681, 20693, 20705, 20717, 20729, 20741, 20753, 20765, 20777, 20789, 20801, 20813, 20825, 20837, 20849, 20861, 20873, 20885, 20897, 20909, 20921, 20933, 20945, 20957, 20969, 20981, 20993, 21005, 21017, 21029, 21041, 21053, 21065, 21077, 21089, 21101, 21113, 21125, 21137, 21149, 21161, 21173, 21185, 21197, 21209, 21221, 21233, 21245, 21257, 21269, 21281, 21293, 21305, 21317, 21329, 21341, 21353, 21365, 21377, 21389, 21401, 21413, 21425, 21437, 21449, 21461, 21473, 21485, 21497, 21509, 21521, 21533, 21545, 21557, 21569, 21581, 21593, 21605, 21617, 21629, 21641, 21653, 21665, 21677, 21689, 21701, 21713, 21725, 21737, 21749, 21761, 21773, 21785, 21797, 21809, 21821, 21833, 21845, 21857, 21869, 21881, 21893, 21905, 21917, 21929, 21941, 21953, 21965, 21977, 21989, 22001, 22013, 22025, 22037, 22049, 22061, 22073, 22085, 22097, 22109, 22121, 22133, 22145, 22157, 22169, 22181, 22193, 22205, 22217, 22229, 22241, 22253, 22265, 22277, 22289, 22301, 22313, 22325, 22337, 22349, 22361, 22373, 22385, 22397, 22409, 22421, 22433, 22445, 22457, 22469, 22481, 22493, 22505, 22517, 22529, 22541, 22553, 22565, 22577, 22589, 22601, 22613, 22625, 22637, 22649, 22661, 22673, 22685, 22697, 22709, 22721, 22733, 22745, 22757, 22769, 22781, 22793, 22805, 22817, 22829, 22841, 22853, 22865, 22877, 22889, 22901, 22913, 22925, 22937, 22949, 22961, 22973, 22985, 22997, 23009, 23021, 23034, 23047, 23060, 23073, 23085, 23098, 23110, 23123, 23135, 23147, 23159, 23171, 23183, 23195, 23207, 23219, 23231, 23243, 23255, 23267, 23279, 23291, 23303, 23315, 23327, 23339, 23351, 23363, 23375, 23387, 23399, 23411, 23423, 23435, 23447, 23459, 23471, 23483, 23495, 23507, 23519, 23531, 23543, 23555, 23567, 23579, 23591, 23603, 23615, 23627, 23639, 23651, 23663, 23675, 23687, 23699, 23711, 23723, 23735, 23747, 23759, 23771, 23783, 23795, 23807, 23819, 23831, 23843, 23855, 23867, 23879, 23891, 23903, 23915, 23927, 23939, 23951, 23963, 23975, 23987, 23999, 24011, 24023, 24035, 24047, 24059, 24071, 24083, 24095, 24107, 24119, 24131, 24143, 24155, 24167, 24180, 24192, 24204, 24216, 24228, 24240, 24252, 24264, 24276, 24288, 24300, 24312, 24324, 24336, 24348, 24360, 24372, 24384, 24396, 24408, 24420, 24432, 24444, 24456, 24468, 24480, 24492, 24504, 24516, 24528, 24540, 24552, 24564, 24576, 24588, 24600, 24612, 24624, 24636, 24648, 24660, 24672, 24684, 24696, 24708, 24720, 24732, 24744, 24756, 24768, 24780, 24792, 24804, 24816, 24828, 24840, 24852, 24864, 24876, 24888, 24900, 24912, 24924, 24936, 24948, 24960, 24972, 24984, 24996, 25008, 25020, 25032, 25044, 25056, 25068, 25080, 25092, 25104, 25116, 25128, 25140, 25152, 25164, 25176, 25188, 25200, 25212, 25224, 25236, 25248, 25260, 25272, 25284, 25296, 25308, 25320, 25332, 25344, 25356, 25368, 25380, 25392, 25404, 25416, 25428, 25440, 25452, 25464, 25476, 25488, 25500, 25512, 25524, 25536, 25548, 25560, 25572, 25584, 25596, 25608, 25620, 25632, 25644, 25656, 25668, 25680, 25692, 25704, 25716, 25728, 25740, 25752, 25764, 25776, 25788, 25800, 25812, 25824, 25836, 25848, 25860, 25872, 25884, 25896, 25908, 25920, 25932, 25944, 25956, 25968, 25980, 25992, 26004, 26016, 26028, 26040, 26053, 26065, 26077, 26090, 26102, 26114, 26126, 26138, 26150, 26162, 26174, 26186, 26198, 26210, 26222, 26234, 26246, 26258, 26270, 26282, 26294, 26306, 26318, 26330, 26342, 26354, 26366, 26378, 26390, 26402, 26414, 26426, 26438, 26450, 26462, 26474, 26486, 26498, 26510, 26522, 26534, 26546, 26558, 26570, 26582, 26594, 26606, 26618, 26630, 26642, 26654, 26666, 26678, 26690, 26702, 26714, 26726, 26738, 26750, 26762, 26774, 26786, 26798, 26810, 26822, 26834, 26846, 26858, 26870, 26882, 26894, 26906, 26918, 26930, 26943, 26955, 26967, 26979, 26991, 27003, 27015, 27027, 27039, 27051, 27063, 27075, 27087, 27099, 27111, 27123, 27135, 27147, 27159, 27171, 27183, 27195, 27207, 27219, 27231, 27243, 27255, 27267, 27279, 27291, 27303, 27315, 27327, 27339, 27351, 27363, 27375, 27387, 27399, 27411, 27423, 27435, 27447, 27459, 27471, 27483, 27495, 27507, 27519, 27531, 27543, 27555, 27567, 27579, 27591, 27603, 27615, 27627, 27639, 27651, 27663, 27675, 27687, 27699, 27711, 27723, 27735, 27747, 27759, 27771, 27783, 27795, 27807, 27819, 27831, 27843, 27855, 27867, 27879, 27891, 27903, 27915, 27927, 27939, 27951, 27963, 27975, 27987, 27999, 28011, 28023, 28035, 28047, 28059, 28071, 28083, 28095, 28107, 28119, 28131, 28143, 28155, 28167, 28179, 28191, 28203, 28215, 28227, 28239, 28251, 28263, 28275, 28287, 28299, 28311, 28323, 28335, 28347, 28359, 28371, 28383, 28395, 28407, 28419, 28431, 28443, 28455, 28467, 28479, 28491, 28503, 28515, 28527, 28539, 28551, 28563, 28575, 28587, 28599, 28611, 28623, 28635, 28647, 28659, 28671, 28683, 28695, 28707, 28719, 28731, 28743, 28755, 28767, 28779, 28791, 28803, 28815, 28827, 28839, 28851, 28863, 28875, 28887, 28899, 28911, 28923, 28935, 28947, 28959, 28971, 28983, 28995, 29007, 29019, 29031, 29043, 29055, 29067, 29079, 29091, 29103, 29115, 29128, 29140, 29152, 29164, 29176, 29188, 29200, 29212, 29224, 29236, 29248, 29260, 29272, 29284, 29296, 29308, 29320, 29332, 29344, 29356, 29368, 29380, 29392, 29404, 29416, 29428, 29440, 29452, 29464, 29476, 29488, 29500, 29512, 29524, 29536, 29548, 29560, 29572, 29584, 29596, 29608, 29620, 29632, 29644, 29656, 29668, 29680, 29692, 29704, 29716, 29728, 29740, 29752, 29764, 29776, 29788, 29800, 29812, 29824, 29836, 29848, 29860, 29872, 29884, 29896, 29908, 29920, 29932, 29944, 29956, 29968, 29980, 29992, 30004, 30016, 30028, 30040, 30052, 30064, 30076, 30088, 30100, 30112, 30124, 30136, 30148, 30160, 30172, 30184, 30196, 30208, 30220, 30232, 30244, 30256, 30268, 30280, 30292, 30304, 30316, 30328, 30340, 30352, 30364, 30376, 30388, 30400, 30412, 30424, 30436, 30448, 30460, 30472, 30484, 30496, 30508, 30520, 30532, 30544, 30556, 30568, 30580, 30592, 30604, 30616, 30628, 30640, 30652, 30664, 30676, 30688, 30700, 30712, 30724, 30736, 30748, 30760, 30772, 30784, 30796, 30808, 30820, 30832, 30844, 30856, 30868, 30880, 30892, 30904, 30916, 30928, 30940, 30952, 30964, 30976, 30988, 31000, 31012, 31024, 31036, 31048, 31060, 31072, 31084, 31096, 31108, 31120, 31132, 31144, 31156, 31168, 31180, 31192, 31204, 31216, 31228, 31240, 31252, 31264, 31276, 31288, 31300, 31312, 31324, 31336, 31348, 31360, 31372, 31384, 31396, 31408, 31420, 31432, 31444, 31456, 31468, 31480, 31492, 31504, 31516, 31528, 31540, 31552, 31564, 31576, 31588, 31600, 31612, 31624, 31636, 31648, 31660, 31672, 31684, 31696, 31708, 31720, 31732, 31744, 31756, 31768, 31780, 31792, 31804, 31816, 31828, 31840, 31852, 31864, 31876, 31888, 31900, 31912, 31924, 31936, 31948, 31960, 31972, 31984, 31996, 32008, 32020, 32032, 32044, 32056, 32068, 32080, 32092, 32104, 32116, 32128, 32140, 32152, 32164, 32176, 32188, 32200, 32212, 32224, 32236, 32248, 32260, 32272, 32284, 32296, 32308, 32320, 32332, 32344, 32356, 32368, 32380, 32392, 32404, 32416, 32428, 32440, 32452, 32464, 32476, 32488, 32500, 32512, 32524, 32536, 32548, 32560, 32572, 32584, 32596, 32608, 32620, 32632, 32644, 32656, 32668, 32680, 32692, 32704, 32716, 32728, 32740, 32752, 32764, 32776, 32788, 32800, 32812, 32824, 32836, 32848, 32860, 32872, 32884, 32896, 32908, 32920, 32932, 32944, 32956, 32968, 32980, 32992, 33004, 33016, 33028, 33040, 33052, 33064, 33076, 33088, 33100, 33112, 33124, 33136, 33148, 33160, 33172, 33184, 33196, 33208, 33220, 33232, 33244, 33256, 33268, 33280, 33292, 33304, 33316, 33328, 33340, 33352, 33364, 33376, 33388, 33400, 33412, 33424, 33436, 33448, 33460, 33472, 33484, 33496, 33508, 33520, 33532, 33544, 33556, 33568, 33580, 33592, 33604, 33616, 33628, 33640, 33652, 33664, 33676, 33688, 33700, 33712, 33724, 33736, 33748, 33760, 33772, 33784, 33796, 33808, 33820, 33832, 33844, 33856, 33868, 33880, 33892, 33904, 33916, 33928, 33940, 33952, 33964, 33976, 33988, 34000, 34012, 34024, 34036, 34048, 34060, 34072, 34084, 34096, 34108, 34120, 34132, 34144, 34156, 34168, 34180, 34192, 34204, 34216, 34228, 34240, 34252, 34264, 34276, 34288, 34300, 34312, 34324, 34336, 34348, 34360, 34372, 34384, 34396, 34408, 34420, 34432, 34444, 34456, 34468, 34480, 34492, 34504, 34516, 34528, 34540, 34552, 34564, 34576, 34588, 34600, 34612, 34624, 34636, 34648, 34660, 34672, 34684, 34696, 34708, 34720, 34732, 34744, 34756, 34768, 34780, 34792, 34804, 34816, 34828, 34840, 34852, 34864, 34876, 34888, 34900, 34912, 34924, 34936, 34948, 34960, 34972, 34984, 34996, 35008, 35020, 35032, 35044, 35056, 35068, 35080, 35092, 35104, 35116, 35128, 35140, 35152, 35164, 35176, 35188, 35200, 35212, 35224, 35236, 35248, 35260, 35272, 35284, 35296, 35308, 35320, 35332, 35344, 35356, 35368, 35380, 35392, 35404, 35416, 35428, 35440, 35452, 35464, 35476, 35488, 35500, 35512, 35524, 35536, 35548, 35560, 35572, 35584, 35596, 35608, 35620, 35632, 35644, 35656, 35668, 35680, 35692, 35704, 35716, 35728, 35740, 35752, 35764, 35776, 35788, 35800, 35812, 35824, 35836, 35848, 35860, 35872, 35884, 35896, 35908, 35920, 35932, 35944, 35956, 35968, 35980, 35992, 36004, 36016, 36028, 36040, 36052, 36064, 36076, 36088, 36100, 36112, 36124, 36136, 36148, 36160, 36172, 36184, 36196, 36208, 36220, 36232, 36244, 36256, 36268, 36280, 36292, 36304, 36316, 36328, 36340, 36352, 36364, 36376, 36388, 36400, 36412, 36424, 36436, 36448, 36460, 36472, 36484, 36496, 36508, 36520, 36532, 36544, 36556, 36568, 36580, 36592, 36604, 36616, 36628, 36640, 36652, 36664, 36676, 36688, 36700, 36712, 36724, 36736, 36748, 36760, 36772, 36784, 36796, 36808, 36820, 36832, 36844, 36856, 36868, 36880, 36892, 36904, 36916, 36928, 36940, 36952, 36964, 36976, 36988, 37000, 37012, 37024, 37036, 37048, 37060, 37072, 37084, 37096, 37108, 37120, 37132, 37144, 37156, 37168, 37180, 37192, 37204, 37216, 37228, 37240, 37252, 37264, 37276, 37288, 37300, 37312, 37324, 37336, 37348, 37360, 37372, 37384, 37396, 37408, 37420, 37432, 37444, 37456, 37468, 37480, 37492, 37504, 37516, 37528, 37540, 37552, 37564, 37576, 37588, 37600, 37612, 37624, 37636, 37648, 37660, 37672, 37684, 37696, 37708, 37720, 37732, 37744, 37756, 37768, 37780, 37792, 37804, 37816, 37828, 37840, 37852, 37864, 37876, 37888, 37900, 37912, 37924, 37936, 37948, 37960, 37972, 37984, 37996, 38008, 38020, 38032, 38044, 38056, 38068, 38080, 38092, 38104, 38116, 38128, 38140, 38152, 38164, 38176, 38188, 38200, 38212, 38224, 38236, 38248, 38260, 38272, 38284, 38296, 38308, 38320, 38332, 38344, 38356, 38368, 38380, 38392, 38404, 38416, 38428, 38440, 38452, 38464, 38476, 38488, 38500, 38512, 38524, 38536, 38549, 38561, 38573, 38585, 38597, 38609, 38621, 38633, 38645, 38657, 38669, 38681, 38693, 38705, 38717, 38729, 38741, 38753, 38765, 38777, 38789, 38801, 38813, 38825, 38837, 38849, 38861, 38873, 38885, 38897, 38909, 38921, 38933, 38945, 38957, 38969, 38981, 38993, 39005, 39017, 39029, 39041, 39053, 39065, 39077, 39089, 39101, 39113, 39125, 39137, 39149, 39161, 39173, 39185, 39197, 39209, 39221, 39233, 39245, 39257, 39269, 39281, 39293, 39305, 39317, 39329, 39341, 39353, 39365, 39377, 39389, 39401, 39413, 39425, 39437, 39449, 39461, 39473, 39485, 39497, 39509, 39521, 39533, 39545, 39557, 39569, 39581, 39593, 39605, 39617, 39629, 39641, 39653, 39665, 39677, 39689, 39701, 39713, 39725, 39737, 39749, 39761, 39773, 39785, 39797, 39809, 39821, 39833, 39845, 39857, 39869, 39881, 39893, 39905, 39917, 39929, 39941, 39953, 39965, 39977, 39989, 40001, 40013, 40025, 40037, 40049, 40061, 40073, 40085, 40097, 40109, 40121, 40133, 40145, 40157, 40169, 40181, 40193, 40205, 40217, 40229, 40241, 40253, 40265, 40277, 40289, 40301, 40313, 40325, 40337, 40349, 40361, 40373, 40385, 40397, 40409, 40421, 40433, 40445, 40457, 40469, 40481, 40493, 40505, 40517, 40529, 40541, 40553, 40565, 40577, 40589, 40601, 40613, 40625, 40637, 40649, 40661, 40673, 40685, 40697, 40709, 40721, 40733, 40745, 40757, 40769, 40781, 40793, 40805, 40817, 40829, 40841, 40853, 40865, 40877, 40889, 40901, 40913, 40925, 40937, 40949, 40961, 40973, 40985, 40997, 41009, 41021, 41033, 41045, 41057, 41069, 41081, 41093, 41105, 41117, 41129, 41141, 41153, 41165, 41177, 41189, 41201, 41213, 41225, 41237, 41249, 41261, 41273, 41285, 41297, 41309, 41321, 41333, 41345, 41357, 41369, 41381, 41392, 41404, 41416, 41428, 41440, 41452, 41464, 41476, 41488, 41500, 41512, 41524, 41536, 41548, 41560, 41572, 41584, 41596, 41608, 41620, 41632, 41644, 41656, 41668, 41680, 41692, 41704, 41716, 41728, 41740, 41752, 41764, 41776, 41788, 41800, 41812, 41824, 41836, 41848, 41860, 41872, 41884, 41896, 41908, 41920, 41932, 41944, 41956, 41968, 41980, 41992, 42004, 42016, 42028, 42040, 42052, 42064, 42076, 42088, 42100, 42112, 42124, 42136, 42148, 42160, 42172, 42184, 42196, 42208, 42220, 42232, 42244, 42256, 42268, 42280, 42292, 42304, 42316, 42328, 42340, 42352, 42364, 42376, 42388, 42400, 42412, 42424, 42436, 42448, 42460, 42472, 42484, 42496, 42508, 42520, 42532, 42544, 42556, 42568, 42580, 42592, 42604, 42616, 42628, 42640, 42652, 42664, 42676, 42688, 42700, 42712, 42724, 42736, 42748, 42760, 42772, 42784, 42796, 42808, 42820, 42832, 42844, 42856, 42868, 42880, 42892, 42904, 42916, 42928, 42940, 42952, 42964, 42976, 42988, 43000, 43012, 43024, 43036, 43048, 43060, 43072, 43084, 43096, 43108, 43120, 43132, 43144, 43156, 43168, 43180, 43192, 43204, 43216, 43228, 43240, 43252, 43264, 43276, 43288, 43300, 43312, 43324, 43336, 43348, 43360, 43372, 43384, 43396, 43408, 43420, 43432, 43444, 43456, 43468, 43480, 43492, 43504, 43516, 43528, 43540, 43552, 43564, 43576, 43588, 43600, 43612, 43624, 43636, 43648, 43660, 43672, 43684, 43696, 43708, 43720, 43732, 43744, 43756, 43768, 43780, 43792, 43804, 43816, 43828, 43840, 43852, 43864, 43876, 43888, 43900, 43912, 43924, 43936, 43948, 43960, 43972, 43984, 43996, 44008, 44020, 44032, 44044, 44056, 44068, 44080, 44092, 44104, 44116, 44128, 44140, 44152, 44164, 44176, 44188, 44200, 44212, 44224, 44236, 44248, 44260, 44272, 44284, 44296, 44308, 44320, 44332, 44344, 44356, 44368, 44380, 44392, 44404, 44416, 44428, 44440, 44452, 44464, 44476, 44488, 44500, 44512, 44524, 44536, 44548, 44560, 44572, 44584, 44596, 44608, 44620, 44632, 44644, 44656, 44668, 44680, 44692, 44704, 44716, 44728, 44740, 44752, 44764, 44776, 44788, 44800, 44812, 44824, 44836, 44848, 44860, 44872, 44884, 44896, 44908, 44920, 44932, 44944, 44956, 44968, 44980, 44992, 45004, 45016, 45028, 45040, 45052, 45064, 45076, 45088, 45100, 45112, 45124, 45136, 45148, 45160, 45172, 45184, 45196, 45208, 45220, 45232, 45244, 45256, 45268, 45280, 45292, 45304, 45316, 45328, 45340, 45352, 45364, 45376, 45388, 45400, 45412, 45424, 45436, 45448, 45460, 45472, 45484, 45496, 45508, 45520, 45532, 45544, 45556, 45568, 45580, 45592, 45604, 45616, 45628, 45640, 45652, 45664, 45676, 45688, 45700, 45712, 45724, 45736, 45748, 45760, 45772, 45784, 45796, 45808, 45820, 45832, 45844, 45856, 45868, 45880, 45892, 45904, 45916, 45928, 45940, 45952, 45964, 45976, 45988, 46000, 46012, 46024, 46036, 46048, 46060, 46072, 46084, 46096, 46108, 46120, 46132, 46144, 46156, 46168, 46180, 46192, 46204, 46216, 46228, 46240, 46252, 46264, 46276, 46288, 46300, 46312, 46324, 46336, 46348, 46360, 46372, 46384, 46396, 46408, 46420, 46432, 46444, 46456, 46468, 46480, 46492, 46504, 46516, 46528, 46540, 46552, 46564, 46576, 46588, 46600, 46612, 46624, 46636, 46648, 46660, 46672, 46684, 46696, 46708, 46720, 46732, 46744, 46756, 46768, 46780, 46792, 46804, 46816, 46828, 46840, 46852, 46864, 46876, 46888, 46900, 46912, 46924, 46936, 46948, 46960, 46972, 46984, 46996, 47008, 47020, 47032, 47044, 47056, 47068, 47080, 47092, 47104, 47116, 47128, 47140, 47152, 47164, 47176, 47188, 47200, 47212, 47224, 47236, 47248, 47260, 47272, 47284, 47296, 47308, 47320, 47332, 47344, 47356, 47368, 47380, 47392, 47404, 47416, 47428, 47440, 47452, 47464, 47476, 47488, 47500, 47512, 47524, 47536, 47548, 47560, 47572, 47584, 47596, 47608, 47620, 47632, 47644, 47656, 47668, 47680, 47692, 47704, 47716, 47728, 47740, 47752, 47764, 47776, 47788, 47800, 47812, 47824, 47836, 47848, 47860, 47872, 47884, 47896, 47908, 47920, 47932, 47944, 47956, 47968, 47980, 47992, 48004, 48016, 48028, 48040, 48052, 48064, 48076, 48088, 48100, 48112, 48124, 48136, 48148, 48160, 48172, 48184, 48196, 48208, 48220, 48232, 48244, 48256, 48268, 48280, 48292, 48304, 48316, 48328, 48340, 48352, 48364, 48376, 48388, 48400, 48412, 48424, 48436, 48448, 48460, 48472, 48484, 48496, 48508, 48520, 48532, 48544, 48556, 48568, 48580, 48592, 48604, 48616, 48628, 48640, 48652, 48664, 48676, 48688, 48700, 48712, 48724, 48736, 48748, 48760, 48772, 48784, 48796, 48808, 48820, 48832, 48844, 48856, 48868, 48880, 48892, 48904, 48916, 48928, 48940, 48952, 48964, 48976, 48988, 49000, 49012, 49024, 49036, 49048, 49060, 49072, 49084, 49096, 49108, 49120, 49132, 49144, 49156, 49168, 49180, 49192, 49204, 49216, 49228, 49240, 49252, 49264, 49276, 49288, 49300, 49312, 49324, 49336, 49348, 49360, 49372, 49384, 49396, 49408, 49420, 49432, 49444, 49456, 49468, 49480, 49492, 49504, 49516, 49528, 49540, 49552, 49564, 49576, 49588, 49600, 49612, 49624, 49636, 49648, 49660, 49672, 49684, 49696, 49708, 49720, 49732, 49744, 49756, 49768, 49780, 49792, 49804, 49816, 49828, 49840, 49852, 49864, 49876, 49888, 49900, 49912, 49924, 49936, 49948, 49960, 49972, 49984, 49996, 50008, 50020, 50032, 50044, 50056, 50068, 50080, 50092, 50104, 50116, 50128, 50140, 50152, 50164, 50176, 50188, 50200, 50212, 50224, 50236, 50248, 50260, 50272, 50284, 50296, 50308, 50320, 50332, 50344, 50356, 50368, 50380, 50392, 50404, 50416, 50428, 50440, 50452, 50464, 50476, 50488, 50500, 50512, 50524, 50536, 50548, 50560, 50572, 50584, 50596, 50608, 50620, 50632, 50644, 50656, 50668, 50680, 50692, 50704, 50716, 50728, 50740, 50752, 50764, 50776, 50788, 50800, 50812, 50824, 50836, 50848, 50860, 50872, 50884, 50896, 50908, 50920, 50932, 50944, 50956, 50968, 50980, 50992, 51004, 51016, 51028, 51040, 51052, 51064, 51076, 51088, 51100, 51112, 51124, 51136, 51148, 51160, 51172, 51184, 51196, 51208, 51220, 51232, 51244, 51256, 51268, 51280, 51292, 51304, 51316, 51328, 51340, 51352, 51364, 51376, 51388, 51400, 51412, 51424, 51436, 51448, 51460, 51472, 51484, 51496, 51508, 51520, 51532, 51544, 51556, 51568, 51580, 51592, 51604, 51616, 51628, 51640, 51652, 51664, 51676, 51688, 51700, 51712, 51724, 51736, 51748, 51760, 51772, 51784, 51796, 51808, 51820, 51832, 51844, 51856, 51868, 51880, 51892, 51904, 51916, 51928, 51940, 51952, 51964, 51976, 51988, 52000, 52012, 52024, 52036, 52048, 52060, 52072, 52084, 52096, 52108, 52120, 52132, 52144, 52156, 52168, 52180, 52192, 52204, 52216, 52228, 52240, 52252, 52264, 52276, 52288, 52300, 52312, 52324, 52336, 52348, 52360, 52372, 52384, 52396, 52408, 52420, 52432, 52444, 52456, 52468, 52480, 52492, 52504, 52516, 52528, 52540, 52552, 52564, 52576, 52588, 52600, 52612, 52624, 52636, 52648, 52660, 52672, 52684, 52696, 52708, 52720, 52732, 52744, 52756, 52768, 52780, 52792, 52804, 52816, 52828, 52840, 52852, 52864, 52876, 52888, 52900, 52912, 52924, 52936, 52948, 52960, 52972, 52984, 52996, 53008, 53020, 53032, 53044, 53056, 53068, 53080, 53092, 53104, 53116, 53128, 53140, 53152, 53164, 53176, 53188, 53200, 53212, 53224, 53236, 53248, 53260, 53272, 53284, 53296, 53308, 53320, 53332, 53344, 53356, 53368, 53380, 53392, 53404, 53416, 53428, 53440, 53452, 53464, 53476, 53488, 53500, 53512, 53524, 53536, 53548, 53560, 53572, 53584, 53596, 53608, 53620, 53632, 53644, 53656, 53668, 53680, 53692, 53704, 53716, 53728, 53740, 53752, 53764, 53776, 53788, 53800, 53812, 53824, 53836, 53848, 53860, 53872, 53884, 53896, 53908, 53920, 53932, 53944, 53956, 53968, 53980, 53992, 54004, 54016, 54028, 54040, 54052, 54064, 54076, 54088, 54100, 54112, 54124, 54136, 54148, 54160, 54172, 54184, 54196, 54208, 54220, 54232, 54244, 54256, 54268, 54280, 54292, 54304, 54316, 54328, 54340, 54352, 54364, 54376, 54388, 54400, 54412, 54424, 54436, 54448, 54460, 54472, 54484, 54496, 54508, 54520, 54532, 54544, 54556, 54568, 54580, 54592, 54604, 54616, 54628, 54640, 54652, 54664, 54676, 54688, 54700, 54712, 54724, 54736, 54748, 54760, 54772, 54784, 54796, 54808, 54820, 54832, 54844, 54856, 54868, 54880, 54892, 54904, 54916, 54928, 54940, 54952, 54964, 54976, 54988, 55000, 55012, 55024, 55036, 55048, 55060, 55072, 55084, 55096, 55108, 55120, 55132, 55144, 55156, 55168, 55180, 55193, 55206, 55218, 55230, 55242, 55254, 55266, 55278, 55290, 55302, 55314, 55326, 55338, 55350, 55362, 55374, 55386, 55398, 55410, 55422, 55434, 55446, 55458, 55470, 55482, 55494, 55506, 55518, 55530, 55542, 55554, 55566, 55578, 55590, 55602, 55614, 55626, 55638, 55650, 55662, 55674, 55686, 55698, 55710, 55722, 55734, 55746, 55758, 55770, 55782, 55794, 55806, 55818, 55830, 55842, 55854, 55866, 55878, 55890, 55902, 55914, 55926, 55938, 55950, 55962, 55974, 55986, 55998, 56010, 56022, 56034, 56046, 56058, 56070, 56082, 56094, 56106, 56118, 56130, 56142, 56154, 56166, 56178, 56190, 56202, 56214, 56226, 56238, 56250, 56262, 56274, 56286, 56298, 56310, 56322, 56334, 56346, 56358, 56370, 56382, 56394, 56406, 56418, 56430, 56442, 56454, 56466, 56478, 56490, 56502, 56514, 56526, 56538, 56550, 56562, 56574, 56586, 56598, 56610, 56622, 56634, 56646, 56658, 56670, 56682, 56694, 56706, 56718, 56730, 56742, 56754, 56766, 56778, 56790, 56802, 56814, 56826, 56838, 56850, 56862, 56874, 56886, 56898, 56910, 56922, 56934, 56946, 56958, 56970, 56982, 56994, 57006, 57018, 57030, 57042, 57054, 57066, 57078, 57090, 57102, 57114, 57126, 57138, 57150, 57162, 57174, 57186, 57198, 57210, 57222, 57234, 57246, 57258, 57270, 57282, 57294, 57306, 57318, 57330, 57342, 57354, 57366, 57378, 57390, 57402, 57414, 57426, 57438, 57450, 57462, 57474, 57486, 57498, 57510, 57522, 57534, 57546, 57558, 57570, 57582, 57594, 57606, 57618, 57630, 57642, 57654, 57666, 57678, 57690, 57702, 57714, 57726, 57738, 57750, 57762, 57774, 57786, 57798, 57810, 57822, 57834, 57846, 57858, 57870, 57882, 57894, 57906, 57918, 57930, 57942, 57954, 57966, 57978, 57990, 58002, 58014, 58026, 58038, 58050, 58062, 58074, 58086, 58098, 58110, 58122, 58134, 58146, 58158, 58170, 58182, 58194, 58206, 58218, 58230, 58242, 58254, 58266, 58278, 58290, 58302, 58314, 58326, 58338, 58350, 58362, 58374, 58386, 58398, 58410, 58422, 58434, 58446, 58458, 58470, 58482, 58494, 58506, 58518, 58530, 58542, 58554, 58566, 58578, 58590, 58602, 58614, 58626, 58638, 58650, 58662, 58674, 58686, 58698, 58710, 58722, 58734, 58746, 58758, 58770, 58782, 58794, 58806, 58818, 58830, 58842, 58854, 58866, 58878, 58890, 58902, 58914, 58926, 58938, 58950, 58962, 58974, 58986, 58998, 59010, 59022, 59034, 59046, 59058, 59070, 59082, 59094, 59106, 59118, 59130, 59142, 59154, 59166, 59178, 59190, 59202, 59214, 59226, 59238, 59250, 59262, 59274, 59286, 59298, 59310, 59322, 59334, 59346, 59358, 59370, 59382, 59394, 59406, 59418, 59430, 59442, 59454, 59466, 59478, 59490, 59502, 59514, 59526, 59538, 59550, 59562, 59574, 59586, 59598, 59610, 59622, 59634, 59646, 59658, 59670, 59682, 59694, 59706, 59718, 59730, 59742, 59754, 59766, 59778, 59790, 59802, 59814, 59826, 59838, 59850, 59862, 59874, 59886, 59898, 59910, 59922, 59934, 59946, 59958, 59970, 59982, 59994, 60006, 60018, 60030] }, { label: 'RecalcStyleCount', backgroundColor: 'rgba(37, 180, 171, 0.2)', borderColor: 'rgba(37, 180, 171, 1.00)', - data: [2, 31, 60, 89, 119, 148, 179, 228, 257, 286, 315, 344, 373, 402, 431, 460, 489, 518, 547, 576, 605, 634, 663, 692, 721, 750, 779, 808, 837, 866, 895, 924, 953, 982, 1011, 1040, 1069, 1098, 1127, 1156, 1185, 1214, 1243, 1272, 1301, 1330, 1359, 1388, 1417, 1446] + data: [3, 21, 38, 55, 75, 106, 126, 144, 162, 179, 196, 214, 231, 248, 265, 282, 299, 316, 333, 350, 369, 387, 405, 423, 441, 459, 477, 495, 513, 531, 549, 567, 585, 603, 621, 639, 656, 673, 690, 707, 724, 741, 758, 775, 792, 809, 826, 843, 860, 877, 894, 911, 928, 945, 962, 979, 996, 1013, 1030, 1047, 1064, 1081, 1098, 1115, 1132, 1149, 1166, 1183, 1200, 1217, 1234, 1251, 1268, 1285, 1302, 1319, 1336, 1353, 1370, 1387, 1404, 1421, 1438, 1455, 1472, 1489, 1506, 1523, 1540, 1557, 1574, 1591, 1608, 1625, 1642, 1659, 1676, 1693, 1710, 1727, 1744, 1761, 1778, 1795, 1812, 1829, 1846, 1863, 1881, 1899, 1917, 1935, 1953, 1971, 1989, 2007, 2025, 2043, 2061, 2079, 2097, 2115, 2133, 2151, 2169, 2187, 2205, 2223, 2241, 2259, 2277, 2295, 2313, 2331, 2348, 2365, 2382, 2399, 2417, 2434, 2451, 2468, 2485, 2502, 2519, 2536, 2553, 2570, 2587, 2604, 2621, 2639, 2656, 2673, 2690, 2707, 2724, 2742, 2759, 2776, 2793, 2810, 2827, 2844, 2861, 2878, 2895, 2912, 2929, 2946, 2963, 2980, 2997, 3014, 3031, 3048, 3065, 3082, 3099, 3116, 3133, 3151, 3168, 3185, 3202, 3219, 3236, 3253, 3270, 3287, 3304, 3321, 3338, 3355, 3372, 3389, 3406, 3423, 3440, 3457, 3474, 3491, 3508, 3525, 3542, 3559, 3576, 3593, 3610, 3627, 3644, 3661, 3678, 3695, 3712, 3729, 3746, 3763, 3780, 3797, 3814, 3831, 3848, 3865, 3882, 3899, 3917, 3934, 3951, 3968, 3985, 4002, 4019, 4036, 4053, 4070, 4087, 4104, 4121, 4138, 4156, 4173, 4190, 4207, 4224, 4241, 4258, 4275, 4292, 4309, 4326, 4343, 4360, 4377, 4394, 4411, 4428, 4445, 4462, 4479, 4496, 4513, 4530, 4547, 4564, 4581, 4598, 4615, 4632, 4650, 4667, 4684, 4701, 4718, 4735, 4752, 4769, 4786, 4803, 4820, 4837, 4854, 4871, 4888, 4905, 4922, 4939, 4956, 4973, 4990, 5007, 5024, 5041, 5058, 5075, 5092, 5109, 5126, 5143, 5160, 5177, 5194, 5211, 5228, 5245, 5262, 5279, 5296, 5313, 5330, 5347, 5364, 5381, 5399, 5416, 5433, 5450, 5468, 5485, 5502, 5519, 5536, 5553, 5570, 5587, 5604, 5621, 5638, 5655, 5673, 5690, 5707, 5724, 5741, 5758, 5775, 5792, 5809, 5826, 5843, 5860, 5877, 5894, 5911, 5928, 5945, 5962, 5979, 5996, 6013, 6030, 6047, 6064, 6081, 6098, 6115, 6132, 6149, 6166, 6183, 6200, 6217, 6235, 6252, 6270, 6288, 6305, 6322, 6339, 6356, 6373, 6390, 6407, 6424, 6441, 6458, 6475, 6492, 6509, 6526, 6543, 6560, 6577, 6594, 6611, 6628, 6645, 6662, 6679, 6696, 6713, 6730, 6747, 6764, 6781, 6798, 6815, 6832, 6849, 6866, 6883, 6900, 6917, 6934, 6951, 6968, 6985, 7002, 7019, 7036, 7053, 7070, 7087, 7104, 7121, 7138, 7155, 7172, 7189, 7206, 7223, 7240, 7257, 7274, 7291, 7308, 7325, 7342, 7359, 7376, 7393, 7410, 7427, 7444, 7461, 7478, 7495, 7512, 7529, 7546, 7563, 7580, 7597, 7614, 7631, 7648, 7665, 7682, 7699, 7716, 7733, 7750, 7767, 7784, 7801, 7818, 7835, 7852, 7869, 7886, 7903, 7920, 7937, 7954, 7971, 7988, 8005, 8022, 8039, 8056, 8073, 8090, 8107, 8124, 8141, 8158, 8175, 8192, 8209, 8226, 8243, 8260, 8277, 8294, 8311, 8328, 8345, 8362, 8379, 8396, 8413, 8430, 8447, 8464, 8481, 8498, 8516, 8534, 8551, 8568, 8585, 8602, 8619, 8636, 8653, 8670, 8687, 8704, 8721, 8738, 8755, 8772, 8789, 8806, 8823, 8840, 8857, 8874, 8891, 8909, 8926, 8943, 8969, 8997, 9014, 9031, 9048, 9065, 9082, 9099, 9116, 9133, 9150, 9167, 9184, 9201, 9218, 9235, 9252, 9269, 9286, 9303, 9320, 9337, 9354, 9371, 9388, 9405, 9422, 9439, 9456, 9473, 9490, 9507, 9525, 9542, 9560, 9577, 9595, 9612, 9629, 9646, 9663, 9681, 9698, 9715, 9732, 9750, 9767, 9784, 9801, 9818, 9835, 9852, 9869, 9886, 9903, 9920, 9937, 9955, 9972, 9989, 10006, 10023, 10040, 10057, 10075, 10092, 10109, 10125, 10142, 10159, 10176, 10193, 10210, 10227, 10244, 10261, 10278, 10295, 10312, 10329, 10346, 10363, 10380, 10397, 10414, 10431, 10448, 10465, 10482, 10498, 10515, 10532, 10549, 10566, 10583, 10601, 10618, 10636, 10653, 10670, 10687, 10704, 10721, 10738, 10755, 10772, 10789, 10806, 10823, 10840, 10858, 10875, 10892, 10909, 10926, 10943, 10960, 10977, 10994, 11011, 11028, 11045, 11063, 11080, 11097, 11114, 11131, 11149, 11166, 11183, 11200, 11217, 11234, 11252, 11269, 11286, 11303, 11320, 11337, 11354, 11371, 11388, 11405, 11422, 11439, 11456, 11473, 11490, 11508, 11525, 11543, 11561, 11578, 11596, 11613, 11630, 11647, 11664, 11693, 11711, 11728, 11747, 11765, 11783, 11801, 11819, 11837, 11855, 11873, 11891, 11909, 11927, 11945, 11963, 11981, 11999, 12017, 12036, 12053, 12070, 12087, 12104, 12121, 12139, 12156, 12173, 12190, 12208, 12226, 12243, 12260, 12277, 12294, 12311, 12328, 12345, 12363, 12381, 12398, 12416, 12433, 12450, 12467, 12484, 12503, 12521, 12539, 12556, 12574, 12592, 12610, 12628, 12647, 12664, 12681, 12698, 12715, 12733, 12750, 12767, 12784, 12802, 12819, 12836, 12854, 12873, 12891, 12909, 12927, 12945, 12963, 12981, 12999, 13017, 13035, 13053, 13070, 13087, 13104, 13122, 13139, 13156, 13173, 13191, 13209, 13227, 13244, 13261, 13278, 13295, 13312, 13329, 13347, 13364, 13381, 13398, 13415, 13432, 13449, 13466, 13483, 13500, 13517, 13535, 13552, 13569, 13588, 13606, 13624, 13642, 13660, 13678, 13696, 13714, 13732, 13750, 13768, 13786, 13804, 13822, 13840, 13858, 13876, 13894, 13912, 13930, 13948, 13966, 13984, 14002, 14020, 14038, 14056, 14074, 14092, 14110, 14128, 14146, 14164, 14182, 14200, 14218, 14236, 14254, 14272, 14290, 14308, 14326, 14345, 14363, 14381, 14398, 14416, 14437, 14454, 14471, 14488, 14505, 14522, 14539, 14556, 14573, 14591, 14608, 14625, 14642, 14659, 14676, 14693, 14710, 14727, 14744, 14762, 14779, 14796, 14813, 14830, 14847, 14864, 14882, 14900, 14917, 14934, 14951, 14968, 14985, 15002, 15019, 15036, 15053, 15071, 15088, 15105, 15123, 15139, 15156, 15172, 15189, 15206, 15223, 15241, 15258, 15275, 15292, 15309, 15325, 15343, 15360, 15377, 15394, 15411, 15428, 15445, 15462, 15479, 15497, 15514, 15531, 15548, 15565, 15582, 15599, 15616, 15633, 15650, 15667, 15684, 15701, 15719, 15736, 15753, 15770, 15788, 15805, 15822, 15839, 15856, 15874, 15892, 15909, 15926, 15943, 15959, 15977, 15994, 16010, 16028, 16046, 16063, 16079, 16097, 16114, 16132, 16149, 16166, 16183, 16200, 16217, 16234, 16252, 16270, 16288, 16305, 16322, 16339, 16357, 16374, 16392, 16409, 16426, 16444, 16461, 16479, 16496, 16513, 16530, 16547, 16564, 16581, 16599, 16616, 16633, 16651, 16669, 16687, 16704, 16721, 16738, 16755, 16773, 16790, 16807, 16824, 16842, 16859, 16876, 16893, 16911, 16928, 16945, 16961, 16979, 16996, 17013, 17030, 17047, 17064, 17082, 17099, 17116, 17133, 17150, 17167, 17185, 17202, 17219, 17237, 17255, 17272, 17290, 17307, 17324, 17341, 17359, 17376, 17394, 17411, 17428, 17445, 17462, 17478, 17495, 17513, 17531, 17548, 17566, 17583, 17600, 17617, 17635, 17652, 17669, 17686, 17704, 17722, 17739, 17757, 17774, 17792, 17810, 17827, 17844, 17861, 17878, 17895, 17912, 17929, 17946, 17963, 17981, 17998, 18015, 18032, 18049, 18066, 18084, 18100, 18117, 18134, 18152, 18169, 18186, 18204, 18221, 18239, 18256, 18273, 18290, 18307, 18324, 18342, 18360, 18377, 18394, 18411, 18427, 18444, 18461, 18478, 18496, 18514, 18531, 18547, 18565, 18583, 18600, 18618, 18635, 18652, 18669, 18687, 18704, 18721, 18738, 18755, 18772, 18789, 18806, 18824, 18841, 18859, 18877, 18894, 18911, 18928, 18946, 18963, 18980, 18997, 19014, 19031, 19049, 19066, 19083, 19101, 19119, 19136, 19154, 19171, 19189, 19207, 19224, 19242, 19259, 19277, 19294, 19312, 19330, 19348, 19365, 19381, 19398, 19416, 19434, 19451, 19469, 19486, 19503, 19521, 19538, 19555, 19572, 19589, 19606, 19624, 19642, 19659, 19676, 19693, 19710, 19728, 19746, 19763, 19780, 19798, 19816, 19834, 19851, 19868, 19886, 19903, 19920, 19937, 19954, 19971, 19988, 20005, 20023, 20040, 20057, 20075, 20092, 20110, 20127, 20144, 20161, 20178, 20196, 20213, 20230, 20248, 20265, 20282, 20299, 20315, 20332, 20349, 20366, 20383, 20399, 20416, 20434, 20450, 20467, 20485, 20502, 20519, 20537, 20554, 20571, 20589, 20606, 20623, 20640, 20657, 20674, 20691, 20708, 20726, 20743, 20760, 20777, 20794, 20811, 20828, 20846, 20863, 20880, 20898, 20916, 20933, 20950, 20967, 20984, 21001, 21018, 21035, 21051, 21069, 21086, 21103, 21120, 21137, 21154, 21172, 21190, 21207, 21224, 21241, 21257, 21274, 21291, 21308, 21326, 21343, 21360, 21377, 21394, 21411, 21429, 21447, 21464, 21481, 21498, 21515, 21532, 21549, 21566, 21583, 21600, 21618, 21635, 21653, 21670, 21688, 21705, 21723, 21740, 21758, 21776, 21793, 21811, 21828, 21845, 21862, 21879, 21896, 21913, 21930, 21948, 21966, 21983, 22000, 22017, 22035, 22052, 22070, 22088, 22105, 22122, 22139, 22157, 22175, 22192, 22209, 22226, 22243, 22260, 22277, 22294, 22312, 22329, 22346, 22363, 22380, 22397, 22415, 22432, 22449, 22466, 22482, 22499, 22516, 22533, 22550, 22567, 22584, 22601, 22619, 22637, 22655, 22672, 22690, 22707, 22724, 22741, 22758, 22775, 22792, 22809, 22826, 22843, 22860, 22877, 22894, 22911, 22929, 22946, 22962, 22979, 22996, 23013, 23030, 23048, 23065, 23082, 23099, 23116, 23133, 23149, 23166, 23183, 23200, 23217, 23235, 23252, 23268, 23285, 23302, 23318, 23335, 23352, 23369, 23386, 23403, 23420, 23437, 23454, 23471, 23488, 23505, 23522, 23539, 23557, 23574, 23591, 23608, 23625, 23643, 23661, 23677, 23694, 23712, 23729, 23746, 23764, 23781, 23799, 23816, 23833, 23851, 23869, 23886, 23903, 23921, 23939, 23956, 23973, 23990, 24007, 24023, 24040, 24058, 24076, 24092, 24109, 24126, 24143, 24160, 24177, 24193, 24210, 24228, 24244, 24261, 24277, 24294, 24311, 24329, 24347, 24364, 24381, 24398, 24416, 24434, 24451, 24468, 24485, 24502, 24519, 24537, 24554, 24571, 24588, 24605, 24621, 24638, 24655, 24672, 24689, 24706, 24723, 24741, 24758, 24774, 24791, 24808, 24825, 24842, 24858, 24874, 24892, 24910, 24927, 24944, 24961, 24979, 24997, 25014, 25031, 25048, 25065, 25083, 25101, 25118, 25135, 25152, 25169, 25186, 25204, 25221, 25238, 25255, 25272, 25289, 25306, 25324, 25341, 25358, 25375, 25392, 25409, 25426, 25443, 25460, 25477, 25494, 25511, 25528, 25545, 25562, 25579, 25596, 25613, 25631, 25648, 25665, 25682, 25699, 25716, 25733, 25751, 25768, 25785, 25801, 25818, 25834, 25851, 25868, 25885, 25902, 25919, 25937, 25955, 25972, 25989, 26007, 26024, 26041, 26059, 26075, 26092, 26109, 26126, 26149, 26166, 26183, 26200, 26217, 26235, 26251, 26268, 26285, 26301, 26318, 26335, 26352, 26369, 26387, 26404, 26422, 26439, 26456, 26473, 26491, 26508, 26526, 26543, 26560, 26578, 26595, 26612, 26629, 26646, 26663, 26680, 26697, 26714, 26732, 26749, 26766, 26784, 26802, 26820, 26837, 26855, 26872, 26888, 26905, 26922, 26939, 26957, 26974, 26992, 27009, 27026, 27043, 27060, 27077, 27094, 27110, 27127, 27144, 27161, 27178, 27195, 27212, 27230, 27247, 27264, 27281, 27298, 27315, 27332, 27349, 27367, 27384, 27401, 27419, 27436, 27454, 27471, 27489, 27506, 27524, 27541, 27558, 27575, 27592, 27609, 27626, 27643, 27660, 27677, 27695, 27713, 27730, 27747, 27764, 27781, 27798, 27815, 27833, 27850, 27867, 27884, 27900, 27917, 27934, 27952, 27969, 27986, 28003, 28021, 28038, 28055, 28072, 28090, 28107, 28124, 28141, 28158, 28175, 28193, 28210, 28228, 28246, 28263, 28281, 28298, 28315, 28332, 28349, 28366, 28384, 28401, 28418, 28435, 28452, 28469, 28487, 28504, 28521, 28538, 28555, 28572, 28590, 28606, 28623, 28640, 28657, 28675, 28692, 28709, 28726, 28743, 28760, 28778, 28795, 28812, 28829, 28846, 28864, 28881, 28898, 28915, 28932, 28950, 28967, 28984, 29001, 29017, 29034, 29051, 29067, 29085, 29102, 29119, 29136, 29153, 29170, 29187, 29204, 29221, 29238, 29255, 29272, 29289, 29305, 29323, 29340, 29357, 29374, 29392, 29409, 29426, 29443, 29460, 29477, 29494, 29510, 29527, 29544, 29561, 29578, 29595, 29612, 29629, 29646, 29664, 29681, 29698, 29716, 29733, 29750, 29767, 29784, 29801, 29818, 29836, 29853, 29870, 29888, 29906, 29923, 29940, 29958, 29975, 29992, 30009, 30026, 30043, 30060, 30077, 30094, 30111, 30129, 30146, 30163, 30180, 30198, 30215, 30232, 30250, 30268, 30285, 30302, 30320, 30337, 30354, 30371, 30388, 30405, 30422, 30439, 30456, 30473, 30490, 30507, 30524, 30541, 30558, 30575, 30592, 30609, 30627, 30644, 30662, 30679, 30696, 30713, 30731, 30748, 30766, 30783, 30800, 30817, 30834, 30850, 30868, 30885, 30902, 30919, 30937, 30955, 30972, 30989, 31007, 31024, 31042, 31059, 31076, 31093, 31110, 31128, 31146, 31163, 31180, 31197, 31215, 31233, 31251, 31268, 31285, 31302, 31320, 31336, 31353, 31370, 31387, 31404, 31421, 31438, 31455, 31472, 31489, 31506, 31523, 31540, 31558, 31575, 31592, 31609, 31627, 31644, 31661, 31678, 31695, 31712, 31729, 31747, 31764, 31781, 31798, 31815, 31832, 31849, 31867, 31884, 31901, 31919, 31937, 31954, 31972, 31990, 32007, 32024, 32041, 32058, 32075, 32092, 32109, 32126, 32143, 32160, 32177, 32194, 32211, 32228, 32245, 32262, 32279, 32296, 32313, 32330, 32347, 32364, 32381, 32398, 32415, 32432, 32449, 32466, 32483, 32500, 32517, 32534, 32551, 32568, 32585, 32602, 32619, 32636, 32653, 32670, 32687, 32705, 32722, 32739, 32756, 32773, 32790, 32807, 32824, 32841, 32858, 32875, 32892, 32909, 32926, 32943, 32960, 32977, 32994, 33011, 33031, 33051, 33079, 33099, 33117, 33139, 33157, 33177, 33194, 33211, 33228, 33245, 33262, 33279, 33296, 33313, 33330, 33347, 33364, 33381, 33398, 33415, 33432, 33449, 33467, 33484, 33501, 33518, 33535, 33552, 33569, 33586, 33603, 33620, 33637, 33653, 33670, 33687, 33704, 33721, 33738, 33755, 33772, 33789, 33806, 33823, 33840, 33857, 33874, 33891, 33908, 33925, 33942, 33959, 33976, 33993, 34010, 34027, 34044, 34061, 34078, 34095, 34112, 34129, 34146, 34163, 34180, 34197, 34214, 34231, 34248, 34265, 34282, 34299, 34316, 34333, 34350, 34367, 34384, 34401, 34418, 34435, 34452, 34469, 34486, 34503, 34520, 34537, 34554, 34571, 34588, 34605, 34622, 34639, 34657, 34677, 34694, 34711, 34728, 34745, 34762, 34779, 34796, 34813, 34830, 34847, 34864, 34881, 34898, 34915, 34932, 34949, 34966, 34983, 35000, 35017, 35034, 35051, 35068, 35085, 35102, 35119, 35136, 35153, 35170, 35187, 35204, 35221, 35238, 35255, 35272, 35289, 35306, 35323, 35340, 35357, 35374, 35391, 35408, 35425, 35442, 35459, 35476, 35493, 35510, 35527, 35545, 35562, 35579, 35596, 35613, 35630, 35647, 35664, 35681, 35698, 35715, 35732, 35749, 35766, 35783, 35800, 35817, 35834, 35851, 35868, 35885, 35902, 35919, 35936, 35953, 35970, 35987, 36004, 36021, 36038, 36055, 36072, 36089, 36106, 36123, 36140, 36157, 36174, 36191, 36208, 36225, 36243, 36260, 36277, 36294, 36311, 36328, 36345, 36362, 36379, 36396, 36413, 36430, 36447, 36464, 36481, 36498, 36515, 36532, 36549, 36566, 36583, 36600, 36617, 36634, 36651, 36668, 36685, 36702, 36719, 36736, 36753, 36770, 36787, 36804, 36821, 36838, 36855, 36872, 36889, 36906, 36923, 36940, 36957, 36974, 36991, 37008, 37025, 37042, 37059, 37076, 37093, 37110, 37127, 37144, 37161, 37178, 37195, 37212, 37229, 37246, 37263, 37280, 37297, 37314, 37334, 37352, 37370, 37388, 37405, 37422, 37439, 37456, 37473, 37490, 37507, 37524, 37541, 37558, 37575, 37592, 37609, 37626, 37643, 37660, 37677, 37694, 37711, 37728, 37745, 37762, 37779, 37796, 37813, 37830, 37847, 37864, 37881, 37898, 37915, 37932, 37949, 37966, 37983, 38000, 38017, 38034, 38051, 38068, 38085, 38102, 38119, 38136, 38153, 38170, 38187, 38204, 38221, 38238, 38255, 38272, 38289, 38306, 38323, 38340, 38357, 38374, 38391, 38408, 38425, 38442, 38460, 38477, 38494, 38511, 38528, 38545, 38562, 38580, 38598, 38615, 38632, 38649, 38666, 38683, 38700, 38717, 38734, 38751, 38768, 38785, 38802, 38819, 38836, 38853, 38870, 38887, 38904, 38921, 38938, 38955, 38972, 38989, 39006, 39023, 39040, 39057, 39074, 39091, 39108, 39125, 39142, 39159, 39176, 39193, 39210, 39227, 39244, 39261, 39278, 39295, 39312, 39329, 39346, 39363, 39380, 39397, 39414, 39431, 39448, 39465, 39482, 39499, 39516, 39533, 39550, 39567, 39584, 39601, 39618, 39635, 39652, 39669, 39686, 39703, 39720, 39737, 39754, 39771, 39788, 39805, 39822, 39839, 39856, 39873, 39890, 39907, 39924, 39941, 39958, 39975, 39992, 40009, 40026, 40043, 40060, 40077, 40094, 40111, 40128, 40145, 40162, 40179, 40196, 40213, 40230, 40247, 40264, 40281, 40298, 40315, 40332, 40349, 40366, 40383, 40400, 40417, 40434, 40451, 40468, 40485, 40502, 40519, 40536, 40553, 40570, 40587, 40604, 40621, 40638, 40655, 40672, 40689, 40706, 40723, 40740, 40757, 40774, 40791, 40808, 40825, 40842, 40859, 40876, 40893, 40910, 40927, 40944, 40961, 40978, 40995, 41012, 41029, 41046, 41063, 41080, 41097, 41114, 41131, 41148, 41165, 41182, 41199, 41216, 41233, 41250, 41267, 41284, 41301, 41318, 41335, 41352, 41369, 41386, 41403, 41420, 41437, 41454, 41471, 41488, 41505, 41522, 41539, 41556, 41573, 41590, 41607, 41624, 41641, 41658, 41675, 41695, 41713, 41731, 41749, 41767, 41785, 41803, 41821, 41839, 41857, 41875, 41893, 41911, 41929, 41947, 41965, 41983, 42001, 42019, 42037, 42055, 42073, 42090, 42107, 42124, 42141, 42158, 42175, 42192, 42209, 42226, 42243, 42260, 42277, 42294, 42311, 42328, 42345, 42362, 42379, 42396, 42413, 42430, 42447, 42464, 42481, 42498, 42515, 42532, 42549, 42566, 42583, 42600, 42617, 42634, 42651, 42668, 42685, 42702, 42719, 42736, 42753, 42770, 42787, 42804, 42821, 42838, 42855, 42872, 42889, 42906, 42923, 42940, 42957, 42974, 42991, 43009, 43026, 43043, 43060, 43077, 43094, 43111, 43128, 43145, 43162, 43179, 43196, 43213, 43230, 43247, 43264, 43281, 43298, 43315, 43332, 43349, 43366, 43383, 43400, 43417, 43434, 43451, 43468, 43485, 43502, 43519, 43536, 43553, 43570, 43587, 43604, 43621, 43638, 43655, 43672, 43689, 43706, 43723, 43740, 43757, 43774, 43791, 43808, 43825, 43842, 43859, 43876, 43893, 43910, 43927, 43944, 43961, 43978, 43995, 44012, 44029, 44046, 44063, 44080, 44097, 44114, 44131, 44148, 44165, 44182, 44199, 44216, 44233, 44250, 44267, 44284, 44301, 44318, 44335, 44352, 44369, 44386, 44403, 44420, 44437, 44454, 44471, 44488, 44505, 44522, 44539, 44556, 44573, 44590, 44607, 44624, 44641, 44658, 44675, 44692, 44709, 44726, 44743, 44760, 44777, 44794, 44811, 44828, 44845, 44862, 44879, 44896, 44913, 44930, 44947, 44964, 44981, 44998, 45015, 45032, 45049, 45066, 45083, 45100, 45117, 45134, 45151, 45168, 45185, 45202, 45219, 45236, 45253, 45270, 45287, 45304, 45321, 45338, 45355, 45372, 45389, 45406, 45423, 45440, 45457, 45474, 45491, 45508, 45525, 45542, 45559, 45576, 45593, 45610, 45627, 45644, 45661, 45678, 45695, 45712, 45729, 45746, 45763, 45780, 45797, 45814, 45831, 45848, 45865, 45882, 45899, 45916, 45933, 45950, 45967, 45984, 46001, 46018, 46035, 46052, 46069, 46086, 46103, 46120, 46137, 46154, 46171, 46188, 46205, 46222, 46239, 46256, 46273, 46290, 46307, 46324, 46341, 46358, 46375, 46392, 46409, 46426, 46443, 46460, 46477, 46494, 46511, 46528, 46545, 46562, 46579, 46596, 46613, 46630, 46647, 46664, 46681, 46698, 46715, 46732, 46749, 46766, 46783, 46800, 46817, 46834, 46851, 46868, 46885, 46902, 46919, 46936, 46953, 46970, 46987, 47004, 47021, 47038, 47055, 47072, 47089, 47106, 47123, 47140, 47157, 47174, 47191, 47208, 47225, 47242, 47259, 47276, 47293, 47310, 47327, 47344, 47361, 47378, 47395, 47412, 47429, 47446, 47463, 47480, 47497, 47514, 47531, 47548, 47565, 47583, 47600, 47617, 47634, 47651, 47668, 47685, 47702, 47719, 47737, 47754, 47771, 47788, 47805, 47822, 47839, 47856, 47873, 47890, 47907, 47924, 47941, 47958, 47975, 47992, 48009, 48027, 48044, 48061, 48078, 48095, 48112, 48129, 48146, 48163, 48180, 48197, 48214, 48231, 48248, 48265, 48282, 48299, 48316, 48333, 48350, 48367, 48384, 48401, 48418, 48435, 48452, 48469, 48486, 48503, 48520, 48537, 48554, 48571, 48588, 48605, 48622, 48639, 48656, 48673, 48690, 48707, 48724, 48741, 48758, 48775, 48792, 48809, 48826, 48843, 48860, 48877, 48894, 48911, 48929, 48947, 48964, 48981, 48998, 49015, 49032, 49049, 49066, 49083, 49100, 49117, 49134, 49151, 49168, 49185, 49202, 49219, 49236, 49253, 49270, 49287, 49304, 49321, 49338, 49355, 49372, 49389, 49406, 49423, 49440, 49457, 49474, 49491, 49508, 49525, 49542, 49559, 49576, 49593, 49610, 49627, 49644, 49661, 49678, 49695, 49712, 49729, 49746, 49763, 49780, 49797, 49814, 49831, 49848, 49865, 49882, 49899, 49916, 49933, 49950, 49967, 49984, 50001, 50018, 50035, 50052, 50069, 50086, 50103, 50120, 50137, 50154, 50171, 50188, 50205, 50222, 50239, 50256, 50273, 50290, 50307, 50324, 50341, 50358, 50375, 50392, 50409, 50426, 50443, 50460, 50477, 50494, 50511, 50528, 50545, 50562, 50579, 50596, 50613, 50630, 50647, 50664, 50681, 50698, 50715, 50732, 50749, 50766, 50783, 50800, 50817, 50834, 50851, 50868, 50885, 50902, 50919, 50936, 50953, 50970, 50987, 51004, 51021, 51038, 51055, 51072, 51089, 51106, 51123, 51140, 51157, 51174, 51191, 51208, 51225, 51242, 51259, 51276, 51293, 51310, 51327, 51344, 51361, 51378, 51395, 51412, 51429, 51446, 51463, 51480, 51497, 51514, 51531, 51548, 51565, 51582, 51599, 51616, 51633, 51650, 51667, 51684, 51701, 51718, 51735, 51752, 51769, 51786, 51803, 51820, 51837, 51854, 51871, 51888, 51905, 51922, 51939, 51956, 51973, 51990, 52007, 52024, 52041, 52058, 52075, 52092, 52109, 52126, 52143, 52160, 52177, 52194, 52211, 52228, 52245, 52262, 52279, 52296, 52313, 52330, 52347, 52364, 52381, 52398, 52415, 52432, 52449, 52466, 52483, 52500, 52517, 52534, 52551, 52568, 52585, 52602, 52619, 52636, 52653, 52670, 52687, 52704, 52721, 52738, 52755, 52772, 52789, 52806, 52823, 52840, 52857, 52874, 52891, 52908, 52925, 52942, 52959, 52976, 52993, 53010, 53027, 53044, 53061, 53078, 53095, 53112, 53129, 53146, 53163, 53180, 53197, 53214, 53231, 53248, 53265, 53283, 53300, 53317, 53334, 53351, 53368, 53385, 53402, 53419, 53436, 53453, 53470, 53487, 53504, 53521, 53538, 53555, 53572, 53589, 53606, 53623, 53640, 53657, 53674, 53691, 53708, 53725, 53742, 53759, 53776, 53793, 53810, 53827, 53844, 53861, 53878, 53895, 53912, 53929, 53946, 53963, 53980, 53997, 54014, 54031, 54048, 54065, 54082, 54099, 54116, 54133, 54150, 54167, 54184, 54201, 54218, 54235, 54252, 54269, 54286, 54303, 54320, 54337, 54354, 54371, 54388, 54405, 54422, 54439, 54456, 54473, 54490, 54507, 54524, 54541, 54558, 54575, 54592, 54609, 54626, 54643, 54660, 54677, 54694, 54711, 54728, 54745, 54762, 54779, 54796, 54813, 54830, 54847, 54864, 54881, 54898, 54915, 54932, 54949, 54966, 54983, 55001, 55023, 55042, 55059, 55088, 55105, 55122, 55139, 55156, 55173, 55190, 55207, 55224, 55241, 55258, 55275, 55292, 55309, 55326, 55343, 55360, 55377, 55394, 55411, 55428, 55445, 55462, 55479, 55496, 55513, 55532, 55548, 55565, 55582, 55599, 55616, 55633, 55650, 55666, 55683, 55700, 55717, 55734, 55751, 55768, 55785, 55802, 55819, 55836, 55853, 55870, 55887, 55904, 55920, 55937, 55954, 55971, 55988, 56005, 56022, 56039, 56056, 56073, 56090, 56107, 56124, 56141, 56158, 56175, 56192, 56209, 56226, 56242, 56259, 56276, 56293, 56310, 56327, 56344, 56361, 56378, 56395, 56411, 56428, 56445, 56462, 56479, 56496, 56512, 56529, 56546, 56563, 56580, 56598, 56615, 56632, 56649, 56666, 56683, 56700, 56717, 56734, 56751, 56768, 56785, 56802, 56819, 56836, 56853, 56870, 56887, 56904, 56921, 56938, 56955, 56972, 56989, 57006, 57023, 57040, 57057, 57074, 57091, 57109, 57126, 57143, 57160, 57177, 57194, 57211, 57228, 57245, 57262, 57279, 57296, 57313, 57330, 57347, 57364, 57381, 57398, 57415, 57432, 57449, 57466, 57483, 57500, 57517, 57534, 57550, 57567, 57584, 57601, 57618, 57635, 57652, 57669, 57686, 57703, 57720, 57737, 57754, 57771, 57788, 57805, 57822, 57839, 57856, 57873, 57890, 57907, 57924, 57941, 57958, 57975, 57992, 58009, 58026, 58043, 58060, 58077, 58094, 58111, 58128, 58145, 58162, 58179, 58196, 58213, 58230, 58247, 58264, 58281, 58298, 58315, 58332, 58349, 58366, 58383, 58400, 58417, 58434, 58451, 58468, 58485, 58503, 58521, 58538, 58555, 58572, 58589, 58606, 58623, 58640, 58657, 58674, 58691, 58708, 58725, 58742, 58759, 58776, 58793, 58810, 58827, 58844, 58861, 58878, 58895, 58912, 58929, 58946, 58963, 58980, 58997, 59014, 59031, 59048, 59065, 59082, 59099, 59115, 59131, 59148, 59165, 59182, 59199, 59216, 59233, 59250, 59267, 59284, 59301, 59318, 59335, 59352, 59369, 59386, 59403, 59420, 59437, 59454, 59471, 59488, 59505, 59523, 59540, 59557, 59574, 59591, 59608, 59625, 59642, 59659, 59676, 59693, 59710, 59727, 59744, 59761, 59778, 59795, 59812, 59829, 59846, 59863, 59880, 59897, 59914, 59931, 59948, 59965, 59982, 59999, 60016, 60033, 60050, 60067, 60084, 60101, 60118, 60135, 60152, 60169, 60186, 60203, 60220, 60237, 60254, 60271, 60288, 60305, 60322, 60339, 60356, 60373, 60390, 60407, 60424, 60441, 60458, 60475, 60492, 60509, 60526, 60543, 60560, 60577, 60594, 60611, 60628, 60645, 60662, 60679, 60696, 60713, 60730, 60747, 60764, 60781, 60798, 60815, 60832, 60849, 60866, 60883, 60900, 60917, 60934, 60951, 60968, 60985, 61002, 61019, 61036, 61053, 61070, 61087, 61104, 61121, 61138, 61155, 61172, 61189, 61206, 61223, 61240, 61257, 61274, 61291, 61308, 61325, 61342, 61359, 61376, 61393, 61410, 61427, 61444, 61461, 61478, 61495, 61512, 61529, 61546, 61563, 61580, 61597, 61614, 61631, 61648, 61665, 61682, 61699, 61716, 61733, 61750, 61767, 61784, 61801, 61818, 61835, 61852, 61869, 61886, 61903, 61920, 61937, 61954, 61971, 61988, 62005, 62022, 62039, 62056, 62073, 62090, 62107, 62124, 62141, 62158, 62175, 62192, 62209, 62226, 62243, 62260, 62277, 62294, 62311, 62328, 62345, 62362, 62379, 62396, 62413, 62430, 62447, 62464, 62481, 62498, 62515, 62532, 62549, 62566, 62583, 62600, 62617, 62634, 62651, 62668, 62685, 62702, 62719, 62736, 62753, 62770, 62787, 62804, 62821, 62838, 62855, 62872, 62889, 62906, 62923, 62940, 62957, 62974, 62991, 63008, 63025, 63042, 63059, 63076, 63093, 63110, 63127, 63144, 63161, 63178, 63195, 63212, 63229, 63246, 63263, 63280, 63297, 63314, 63331, 63348, 63365, 63382, 63399, 63416, 63433, 63450, 63467, 63484, 63501, 63518, 63535, 63552, 63569, 63586, 63603, 63620, 63637, 63654, 63671, 63688, 63705, 63722, 63739, 63756, 63773, 63790, 63807, 63824, 63841, 63858, 63875, 63892, 63909, 63926, 63943, 63960, 63977, 63994, 64011, 64028, 64045, 64062, 64079, 64096, 64113, 64130, 64147, 64164, 64181, 64198, 64215, 64232, 64249, 64266, 64283, 64300, 64317, 64334, 64351, 64368, 64385, 64402, 64419, 64436, 64453, 64470, 64487, 64504, 64521, 64538, 64555, 64572, 64589, 64606, 64623, 64640, 64657, 64674, 64691, 64708, 64725, 64742, 64759, 64776, 64793, 64810, 64827, 64844, 64861, 64878, 64895, 64912, 64929, 64946, 64963, 64980, 64997, 65014, 65031, 65048, 65065, 65082, 65099, 65116, 65133, 65150, 65167, 65184, 65201, 65218, 65235, 65252, 65269, 65286, 65303, 65320, 65337, 65354, 65371, 65388, 65405, 65422, 65439, 65456, 65473, 65490, 65507, 65524, 65541, 65558, 65575, 65592, 65609, 65626, 65643, 65660, 65677, 65694, 65711, 65728, 65745, 65762, 65779, 65796, 65813, 65830, 65847, 65864, 65881, 65898, 65915, 65932, 65949, 65966, 65983, 66000, 66017, 66034, 66051, 66068, 66085, 66102, 66119, 66136, 66153, 66170, 66187, 66204, 66221, 66238, 66255, 66272, 66289, 66306, 66323, 66340, 66357, 66374, 66391, 66408, 66425, 66442, 66459, 66476, 66493, 66510, 66527, 66545, 66562, 66579, 66596, 66613, 66630, 66647, 66664, 66681, 66698, 66715, 66732, 66749, 66766, 66783, 66800, 66817, 66834, 66851, 66868, 66885, 66902, 66919, 66936, 66953, 66970, 66987, 67004, 67021, 67038, 67055, 67072, 67089, 67106, 67123, 67140, 67157, 67174, 67191, 67208, 67225, 67242, 67259, 67276, 67293, 67310, 67327, 67344, 67361, 67378, 67395, 67412, 67429, 67446, 67463, 67480, 67497, 67514, 67531, 67548, 67565, 67582, 67598, 67615, 67632, 67649, 67666, 67683, 67700, 67717, 67734, 67751, 67767, 67784, 67801, 67818, 67835, 67852, 67869, 67886, 67903, 67920, 67937, 67954, 67971, 67988, 68004, 68021, 68038, 68055, 68072, 68089, 68106, 68123, 68140, 68157, 68174, 68191, 68208, 68225, 68242, 68259, 68276, 68293, 68310, 68327, 68344, 68361, 68378, 68395, 68412, 68429, 68446, 68463, 68480, 68497, 68514, 68530, 68547, 68564, 68581, 68598, 68615, 68632, 68649, 68666, 68683, 68700, 68717, 68734, 68751, 68768, 68785, 68802, 68819, 68837, 68854, 68871, 68888, 68905, 68922, 68939, 68956, 68973, 68991, 69008, 69025, 69042, 69059, 69076, 69093, 69110, 69127, 69144, 69161, 69178, 69195, 69212, 69229, 69246, 69263, 69280, 69297, 69314, 69331, 69348, 69364, 69380, 69397, 69414, 69431, 69448, 69465, 69482, 69499, 69516, 69533, 69550, 69567, 69584, 69601, 69618, 69635, 69652, 69669, 69686, 69703, 69720, 69737, 69754, 69771, 69788, 69805, 69822, 69839, 69856, 69873, 69890, 69907, 69924, 69940, 69957, 69974, 69991, 70008, 70025, 70042, 70059, 70076, 70093, 70110, 70127, 70144, 70161, 70178, 70195, 70212, 70229, 70246, 70263, 70280, 70297, 70314, 70331, 70347, 70364, 70381, 70398, 70415, 70432, 70449, 70466, 70483, 70500, 70517, 70534, 70551, 70568, 70585, 70602, 70619, 70636, 70653, 70670, 70687, 70704, 70721, 70738, 70755, 70772, 70789, 70806, 70823, 70840, 70857, 70874, 70891, 70908, 70925, 70942, 70959, 70976, 70993, 71010, 71027, 71044, 71061, 71078, 71095, 71112, 71130, 71147, 71164, 71181, 71198, 71215, 71232, 71249, 71266, 71283, 71300, 71317, 71334, 71351, 71368, 71385, 71402, 71419, 71436, 71453, 71470, 71487, 71504, 71521, 71538, 71554, 71570, 71587, 71604, 71621, 71638, 71655, 71672, 71689, 71706, 71723, 71740, 71757, 71774, 71791, 71808, 71825, 71842, 71859, 71876, 71893, 71909, 71925, 71942, 71959, 71975, 71991, 72008, 72025, 72042, 72059, 72076, 72094, 72111, 72128, 72145, 72162, 72179, 72196, 72213, 72230, 72247, 72264, 72281, 72298, 72315, 72332, 72348, 72365, 72382, 72399, 72416, 72433, 72450, 72467, 72484, 72501, 72518, 72535, 72552, 72569, 72586, 72603, 72620, 72636, 72653, 72670, 72687, 72704, 72721, 72738, 72755, 72772, 72789, 72806, 72824, 72841, 72857, 72873, 72890, 72907, 72924, 72941, 72958, 72975, 72992, 73009, 73026, 73043, 73060, 73077, 73094, 73111, 73128, 73145, 73162, 73179, 73196, 73213, 73230, 73247, 73264, 73281, 73298, 73315, 73332, 73349, 73366, 73383, 73400, 73417, 73434, 73451, 73468, 73485, 73502, 73518, 73535, 73552, 73569, 73585, 73602, 73619, 73636, 73653, 73670, 73687, 73704, 73721, 73738, 73754, 73771, 73787, 73804, 73821, 73838, 73855, 73872, 73888, 73905, 73922, 73939, 73956, 73973, 73990, 74007, 74024, 74040, 74057, 74074, 74090, 74107, 74124, 74141, 74158, 74174, 74191, 74208, 74225, 74242, 74259, 74276, 74293, 74309, 74326, 74343, 74360, 74377, 74394, 74410, 74427, 74444, 74461, 74478, 74495, 74512, 74529, 74546, 74563, 74580, 74597, 74613, 74630, 74647, 74663, 74679, 74695, 74713, 74730, 74747, 74764, 74781, 74797, 74814, 74831, 74847, 74864, 74881, 74898, 74915, 74932, 74948, 74965, 74982, 74999, 75016, 75033, 75050, 75067, 75083, 75100, 75117, 75134, 75150, 75167, 75184, 75201, 75218, 75235, 75252, 75269, 75286, 75303, 75320, 75337, 75354, 75371, 75388, 75405, 75421, 75438, 75455, 75472, 75488, 75505, 75522, 75539, 75555, 75572, 75589, 75606, 75624, 75641, 75658, 75675, 75691, 75708, 75725, 75741, 75758, 75774, 75791, 75808, 75824, 75841, 75858, 75875, 75892, 75908, 75925, 75942, 75959, 75976, 75992, 76009, 76025, 76041, 76057, 76074, 76091, 76108, 76124, 76141, 76157, 76174, 76190, 76206, 76223, 76239, 76255, 76271, 76287, 76304, 76322, 76339, 76355, 76372, 76389, 76406, 76423, 76440, 76456, 76473, 76490, 76507, 76523, 76540, 76557, 76574, 76590, 76607, 76623, 76640, 76656, 76672, 76688, 76705, 76722, 76739, 76755, 76771, 76788, 76805, 76821, 76837, 76854, 76871, 76887, 76904, 76921, 76938, 76954, 76970, 76987, 77004, 77021, 77038, 77055, 77072, 77088, 77104, 77121, 77138, 77155, 77171, 77188, 77205, 77222, 77238, 77255, 77272, 77289, 77307, 77323, 77340, 77357, 77373, 77389, 77406, 77423, 77440, 77456, 77473, 77490, 77506, 77523, 77539, 77556, 77572, 77588, 77605, 77622, 77639, 77656, 77672, 77688, 77705, 77721, 77737, 77753, 77770, 77786, 77803, 77820, 77837, 77854, 77871, 77888, 77905, 77921, 77938, 77954, 77971, 77988, 78005, 78021, 78038, 78054, 78070, 78086, 78103, 78119, 78135, 78152, 78169, 78185, 78202, 78219, 78237, 78254, 78270, 78286, 78302, 78318, 78335, 78351, 78368, 78385, 78402, 78419, 78435, 78452, 78469, 78486, 78502, 78519, 78536, 78553, 78573, 78591, 78608, 78626, 78643, 78661, 78678, 78695, 78711, 78728, 78744, 78761, 78777, 78793, 78809, 78826, 78843, 78859, 78875, 78892, 78909, 78925, 78941, 78958, 78975, 78992, 79008, 79024, 79041, 79058, 79076, 79092, 79109, 79126, 79142, 79158, 79175, 79191, 79208, 79224, 79240, 79257, 79274, 79290, 79306, 79323, 79340, 79357, 79373, 79389, 79406, 79423, 79439, 79455, 79472, 79489, 79505, 79522, 79538, 79555, 79571, 79587, 79603, 79620, 79637, 79653, 79670, 79687, 79704, 79721, 79738, 79755, 79772, 79789, 79805, 79822, 79839, 79855, 79871, 79888, 79905, 79922, 79938, 79955, 79972, 79988, 80005, 80022, 80039, 80056, 80072, 80088, 80105, 80122, 80138, 80154, 80170, 80187, 80204, 80221, 80238, 80254, 80271, 80287, 80304, 80320, 80337, 80353, 80369, 80385, 80402, 80419, 80435, 80451, 80467, 80484, 80500, 80516, 80533, 80550, 80567, 80583, 80599, 80615, 80631, 80647, 80663, 80680, 80697, 80714, 80730, 80747, 80764, 80781, 80797, 80813, 80829, 80846, 80863, 80879, 80895, 80912, 80928, 80945, 80961, 80978, 80994, 81010, 81026, 81042, 81059, 81075, 81091, 81107, 81124, 81140, 81156, 81172, 81188, 81204, 81220, 81237, 81254, 81270, 81286, 81303, 81320, 81337, 81353, 81369, 81385, 81402, 81418, 81435, 81452, 81468, 81484, 81501, 81517, 81534, 81550, 81566, 81582, 81598, 81614, 81631, 81647, 81664, 81681, 81697, 81713, 81729, 81746, 81762, 81778, 81794, 81811, 81828, 81845, 81861, 81878, 81895, 81911, 81927, 81944, 81960, 81976, 81992, 82008, 82024, 82040, 82056, 82072, 82088, 82104, 82120, 82136, 82152, 82168, 82184, 82200, 82216, 82232, 82248, 82264, 82280, 82296, 82312, 82328, 82344, 82360, 82376, 82392, 82408, 82424, 82440, 82456, 82473, 82489, 82505, 82521, 82537, 82553, 82569, 82587, 82603, 82619, 82635, 82653, 82669, 82685, 82703, 82719, 82735, 82751, 82767, 82783, 82799, 82817, 82833, 82849, 82865, 82881, 82897, 82913, 82929, 82945, 82962, 82978, 82996, 83012, 83028, 83044, 83062, 83078, 83096, 83112, 83129, 83147, 83163, 83181, 83197, 83213, 83230, 83247, 83263, 83279, 83295, 83311, 83327, 83343, 83359, 83375, 83391, 83407, 83423, 83439, 83455, 83471, 83489, 83505, 83521, 83538, 83554, 83572, 83590, 83606, 83622, 83638, 83654, 83670, 83686, 83702, 83718, 83736, 83752, 83768, 83784, 83800, 83816, 83832, 83848, 83864, 83882, 83900, 83916, 83932, 83951, 83967, 83983, 83999, 84017, 84033, 84049, 84065, 84081, 84097, 84113, 84129, 84145, 84163, 84179, 84195, 84211, 84227, 84243, 84259, 84277, 84295, 84311, 84327, 84343, 84359, 84375, 84391, 84407, 84423, 84439, 84455, 84471, 84487, 84503, 84519, 84535, 84551, 84567, 84583, 84599, 84615, 84631, 84647, 84663, 84680, 84696, 84712, 84728, 84744, 84760, 84776, 84792, 84808, 84824, 84840, 84856, 84872, 84888, 84904, 84920, 84936, 84952, 84968, 84985, 85001, 85017, 85033, 85049, 85065, 85081, 85097, 85113, 85129, 85145, 85163, 85179] }] }, { - labels: [0, 0.7, 1.3, 1.9, 2.6, 3.5, 4.2, 4.9, 5.5, 6.2, 6.8, 7.4, 8.1, 8.7, 9.3, 10, 10.6, 11.2, 11.9, 12.5, 13.1, 13.8, 14.4, 15, 15.7, 16.3, 16.9, 17.6, 18.2, 18.8, 19.5, 20.1, 20.7, 21.4, 22, 22.6, 23.3, 23.9, 24.6, 25.2, 25.8, 26.5, 27.1, 27.7, 28.4, 29, 29.6, 30.3, 30.9, 31.5], + labels: [0, 1.1, 2.1, 3.1, 4.1, 5.2, 6.4, 7.4, 8.4, 9.4, 10.5, 11.5, 12.5, 13.5, 14.5, 15.6, 16.6, 17.6, 18.6, 19.6, 20.7, 21.7, 22.7, 23.7, 24.7, 25.7, 26.7, 27.7, 28.8, 29.8, 30.8, 31.8, 32.8, 33.8, 34.9, 35.9, 36.9, 37.9, 38.9, 39.9, 40.9, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51.1, 52.1, 53.1, 54.1, 55.1, 56.1, 57.2, 58.2, 59.2, 60.2, 61.2, 62.2, 63.2, 64.2, 65.2, 66.2, 67.3, 68.3, 69.3, 70.3, 71.3, 72.3, 73.3, 74.3, 75.3, 76.3, 77.3, 78.3, 79.3, 80.3, 81.3, 82.4, 83.4, 84.4, 85.4, 86.4, 87.5, 88.5, 89.5, 90.5, 91.5, 92.6, 93.6, 94.6, 95.7, 96.7, 97.7, 98.7, 99.8, 100.8, 101.8, 102.9, 103.9, 104.9, 105.9, 107, 108, 109, 110.1, 111.1, 112.1, 113.1, 114.1, 115.2, 116.2, 117.2, 118.2, 119.3, 120.3, 121.3, 122.4, 123.4, 124.4, 125.4, 126.5, 127.5, 128.5, 129.6, 130.6, 131.6, 132.6, 133.7, 134.7, 135.7, 136.7, 137.7, 138.8, 139.8, 140.8, 141.8, 142.8, 143.8, 144.8, 145.8, 146.8, 147.9, 148.9, 149.9, 150.9, 151.9, 152.9, 154, 155, 156, 157, 158, 159, 160, 161.1, 162.1, 163.1, 164.1, 165.1, 166.1, 167.2, 168.2, 169.2, 170.2, 171.2, 172.2, 173.3, 174.3, 175.3, 176.3, 177.4, 178.4, 179.4, 180.4, 181.5, 182.5, 183.5, 184.5, 185.5, 186.6, 187.6, 188.6, 189.7, 190.7, 191.7, 192.8, 193.8, 194.8, 195.8, 196.8, 197.8, 198.9, 199.9, 200.9, 201.9, 203, 204, 205, 206, 207, 208, 209, 210.1, 211.1, 212.1, 213.2, 214.2, 215.2, 216.3, 217.3, 218.3, 219.4, 220.4, 221.4, 222.5, 223.5, 224.5, 225.6, 226.6, 227.6, 228.6, 229.6, 230.7, 231.7, 232.7, 233.7, 234.7, 235.8, 236.8, 237.8, 238.8, 239.9, 240.9, 241.9, 243, 244, 245, 246, 247, 248.1, 249.1, 250.1, 251.1, 252.2, 253.2, 254.3, 255.3, 256.3, 257.3, 258.4, 259.4, 260.4, 261.4, 262.5, 263.5, 264.5, 265.5, 266.5, 267.6, 268.6, 269.6, 270.6, 271.7, 272.7, 273.7, 274.8, 275.8, 276.8, 277.8, 278.9, 279.9, 281, 282, 283, 284, 285, 286, 287.1, 288.1, 289.1, 290.1, 291.2, 292.2, 293.2, 294.3, 295.3, 296.3, 297.3, 298.3, 299.3, 300.4, 301.4, 302.5, 303.5, 304.5, 305.5, 306.5, 307.5, 308.5, 309.5, 310.5, 311.6, 312.6, 313.7, 314.7, 315.7, 316.8, 317.8, 318.8, 319.9, 320.9, 321.9, 322.9, 323.9, 325, 326, 327, 328, 329.1, 330.1, 331.1, 332.2, 333.2, 334.2, 335.2, 336.3, 337.3, 338.3, 339.3, 340.4, 341.4, 342.4, 343.5, 344.5, 345.5, 346.6, 347.6, 348.6, 349.6, 350.6, 351.6, 352.7, 353.7, 354.8, 355.8, 356.8, 357.8, 358.8, 359.9, 360.9, 361.9, 363, 364, 365, 366, 367, 368, 369.1, 370.1, 371.1, 372.2, 373.2, 374.2, 375.3, 376.3, 377.3, 378.4, 379.4, 380.4, 381.4, 382.5, 383.5, 384.6, 385.6, 386.6, 387.6, 388.7, 389.7, 390.7, 391.7, 392.8, 393.8, 394.8, 395.8, 396.8, 397.8, 398.8, 399.8, 400.8, 401.8, 402.8, 403.8, 404.8, 405.8, 406.8, 407.8, 408.8, 409.8, 410.8, 411.8, 412.8, 413.8, 414.8, 415.8, 416.8, 417.8, 418.8, 419.8, 420.8, 421.8, 422.8, 423.8, 424.8, 425.8, 426.8, 427.8, 428.8, 429.8, 430.8, 431.8, 432.8, 433.8, 434.8, 435.8, 436.8, 437.8, 438.8, 439.8, 440.8, 441.8, 442.8, 443.8, 444.8, 445.8, 446.8, 447.8, 448.8, 449.8, 450.9, 451.9, 452.9, 453.9, 454.9, 455.9, 456.9, 457.9, 458.9, 459.9, 460.9, 461.9, 462.9, 463.9, 464.9, 465.9, 466.9, 467.9, 468.9, 469.9, 470.9, 471.9, 472.9, 473.9, 474.9, 475.9, 476.9, 477.9, 478.9, 479.9, 480.9, 481.9, 482.9, 483.9, 484.9, 485.9, 486.9, 487.9, 488.9, 490, 491, 492, 493, 494.1, 495.1, 496.1, 497.2, 498.2, 499.3, 500.3, 501.3, 502.4, 503.4, 504.5, 505.5, 506.5, 507.6, 508.6, 509.6, 510.6, 511.7, 512.7, 513.7, 514.8, 515.8, 516.8, 517.8, 518.9, 519.9, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533.2, 534.2, 535.2, 536.2, 537.2, 538.2, 539.2, 540.2, 541.2, 542.2, 543.2, 544.2, 545.2, 546.2, 547.2, 548.2, 549.2, 550.2, 551.2, 552.2, 553.2, 554.2, 555.2, 556.2, 557.2, 558.2, 559.2, 560.2, 561.3, 562.3, 563.4, 564.4, 565.4, 566.5, 567.5, 568.5, 569.6, 570.6, 571.6, 572.7, 573.7, 574.8, 575.8, 576.8, 577.9, 578.9, 579.9, 581, 582, 583, 584.1, 585.1, 586.2, 587.2, 588.2, 589.3, 590.3, 591.4, 592.5, 593.5, 594.5, 595.6, 596.6, 597.7, 598.7, 599.8, 600.8, 601.8, 602.9, 603.9, 605, 606, 607.1, 608.1, 609.2, 610.2, 611.2, 612.3, 613.3, 614.4, 615.4, 616.5, 617.5, 618.6, 619.6, 620.6, 621.7, 622.7, 623.8, 624.8, 625.9, 626.9, 627.9, 629, 630.1, 631.1, 632.2, 633.2, 634.3, 635.3, 636.4, 637.4, 638.5, 639.5, 640.6, 641.6, 642.7, 643.7, 644.7, 645.8, 646.9, 647.9, 648.9, 650, 651, 652.1, 653.1, 654.2, 655.2, 656.3, 657.3, 658.4, 659.4, 660.4, 661.5, 662.5, 663.6, 664.6, 665.7, 666.7, 667.8, 668.8, 669.9, 670.9, 672, 673, 674, 675.1, 676.1, 677.2, 678.2, 679.3, 680.3, 681.3, 682.3, 683.4, 684.4, 685.5, 686.5, 687.6, 688.6, 689.7, 690.7, 691.7, 692.8, 693.8, 694.9, 696.1, 697.1, 698.2, 699.3, 700.3, 701.4, 702.4, 703.5, 704.5, 705.6, 706.6, 707.7, 708.7, 709.7, 710.8, 711.8, 712.9, 714, 715, 716, 717.1, 718.1, 719.1, 720.2, 721.2, 722.2, 723.3, 724.4, 725.4, 726.5, 727.5, 728.6, 729.6, 730.7, 731.7, 732.7, 733.8, 734.9, 735.9, 737, 738, 739, 740, 741.1, 742.1, 743.2, 744.3, 745.3, 746.4, 747.4, 748.5, 749.5, 750.6, 751.6, 752.7, 753.7, 754.8, 755.9, 756.9, 758, 759, 760.1, 761.1, 762.1, 763.2, 764.3, 765.3, 766.4, 767.4, 768.4, 769.5, 770.5, 771.6, 772.6, 773.7, 774.7, 775.8, 776.8, 777.9, 778.9, 780, 781, 782.1, 783.2, 784.3, 785.4, 786.4, 787.5, 788.5, 789.5, 790.6, 791.6, 792.6, 793.6, 794.6, 795.6, 796.6, 797.6, 798.6, 799.6, 800.7, 801.7, 802.7, 803.7, 804.7, 805.7, 806.8, 807.8, 808.8, 809.9, 811, 812.2, 813.3, 814.3, 815.3, 816.4, 817.5, 818.6, 819.6, 820.7, 821.8, 822.9, 824, 825.2, 826.2, 827.4, 828.4, 829.6, 830.6, 831.8, 832.9, 834, 835.1, 836.2, 837.3, 838.4, 839.4, 840.5, 841.6, 842.7, 843.8, 845, 846.1, 847.2, 848.3, 849.4, 850.5, 851.7, 852.8, 854, 855.1, 856.3, 857.4, 858.5, 859.6, 860.7, 861.8, 862.9, 864, 865, 866, 867, 868.1, 869.1, 870.1, 871.2, 872.2, 873.2, 874.2, 875.2, 876.2, 877.2, 878.2, 879.2, 880.3, 881.3, 882.4, 883.4, 884.5, 885.5, 886.6, 887.6, 888.7, 889.8, 890.9, 892, 893, 894.1, 895.2, 896.3, 897.3, 898.5, 899.5, 900.6, 901.7, 902.7, 903.8, 904.9, 906, 907.1, 908.2, 909.2, 910.3, 911.4, 912.5, 913.6, 914.6, 915.7, 916.8, 917.9, 919, 920.1, 921.2, 922.2, 923.3, 924.4, 925.4, 926.5, 927.6, 928.6, 929.7, 930.8, 931.9, 932.9, 934.1, 935.2, 936.3, 937.4, 938.4, 939.6, 940.7, 941.8, 942.9, 944, 945.1, 946.3, 947.4, 948.4, 949.5, 950.6, 951.8, 952.9, 954.1, 955.2, 956.3, 957.4, 958.6, 959.7, 960.8, 961.9, 963, 964.1, 965.2, 966.4, 967.5, 968.7, 969.8, 970.9, 972.1, 973.2, 974.3, 975.5, 976.6, 977.8, 979, 980.2, 981.3, 982.5, 983.6, 984.8, 986, 987.1, 988.2, 989.3, 990.5, 991.6, 992.8, 994, 995.2, 996.3, 997.5, 998.7, 999.8, 1001, 1002.2, 1003.3, 1004.5, 1005.7, 1006.8, 1008, 1009.2, 1010.3, 1011.5, 1012.6, 1013.8, 1015, 1016.2, 1017.4, 1018.5, 1019.6, 1020.8, 1022, 1023.1, 1024.3, 1025.5, 1026.6, 1027.8, 1028.9, 1030.1, 1031.2, 1032.4, 1033.6, 1034.7, 1035.9, 1037.1, 1038.2, 1039.4, 1040.6, 1041.7, 1042.9, 1044, 1045.2, 1046.4, 1047.6, 1048.7, 1049.9, 1051.1, 1052.2, 1053.2, 1054.4, 1055.6, 1056.7, 1057.9, 1059.1, 1060.3, 1061.4, 1062.6, 1063.8, 1064.9, 1066, 1067.2, 1068.4, 1069.6, 1070.7, 1071.9, 1073, 1074.2, 1075.4, 1076.6, 1077.7, 1078.9, 1080.1, 1081.3, 1082.4, 1083.6, 1084.8, 1086, 1087.2, 1088.3, 1089.5, 1090.7, 1091.9, 1093.1, 1094.3, 1095.4, 1096.6, 1097.8, 1099, 1100.2, 1101.4, 1102.6, 1103.8, 1104.9, 1106.1, 1107.3, 1108.5, 1109.7, 1110.9, 1112.1, 1113.3, 1114.5, 1115.6, 1116.8, 1118, 1119.2, 1120.4, 1121.5, 1122.7, 1123.9, 1125.1, 1126.3, 1127.5, 1128.7, 1129.9, 1131.1, 1132.3, 1133.5, 1134.6, 1135.8, 1137, 1138.1, 1139.3, 1140.5, 1141.7, 1142.9, 1144.1, 1145.3, 1146.4, 1147.6, 1148.8, 1150, 1151.2, 1152.4, 1153.6, 1154.7, 1155.9, 1157.2, 1158.4, 1159.6, 1160.7, 1161.9, 1163.1, 1164.2, 1165.3, 1166.5, 1167.7, 1168.9, 1170, 1171.2, 1172.4, 1173.6, 1174.8, 1176, 1177.2, 1178.4, 1179.6, 1180.8, 1181.9, 1183.1, 1184.3, 1185.3, 1186.5, 1187.7, 1188.9, 1190.1, 1191.3, 1192.4, 1193.6, 1194.8, 1196, 1197.2, 1198.4, 1199.6, 1200.7, 1201.9, 1203, 1204.2, 1205.4, 1206.6, 1207.8, 1209, 1210.1, 1211.3, 1212.5, 1213.6, 1214.8, 1216, 1217.2, 1218.4, 1219.6, 1220.8, 1222, 1223.2, 1224.3, 1225.5, 1226.7, 1227.9, 1229, 1230.2, 1231.4, 1232.6, 1233.8, 1235, 1236.2, 1237.4, 1238.6, 1239.8, 1241, 1242.2, 1243.4, 1244.6, 1245.8, 1247, 1248.2, 1249.4, 1250.6, 1251.8, 1253, 1254.2, 1255.4, 1256.5, 1257.7, 1258.9, 1260, 1261.2, 1262.4, 1263.6, 1264.8, 1266, 1267.2, 1268.4, 1269.6, 1270.8, 1272, 1273.2, 1274.4, 1275.6, 1276.8, 1278, 1279.2, 1280.4, 1281.6, 1282.8, 1284, 1285.2, 1286.4, 1287.6, 1288.8, 1290, 1291.2, 1292.4, 1293.5, 1294.7, 1295.9, 1297.1, 1298.3, 1299.5, 1300.7, 1301.9, 1303, 1304.2, 1305.4, 1306.6, 1307.8, 1309, 1310.2, 1311.3, 1312.5, 1313.7, 1314.9, 1316.1, 1317.3, 1318.3, 1319.5, 1320.7, 1321.9, 1323, 1324.2, 1325.4, 1326.5, 1327.7, 1328.9, 1330.1, 1331.2, 1332.4, 1333.6, 1334.8, 1336, 1337.2, 1338.4, 1339.6, 1340.8, 1342, 1343.1, 1344.3, 1345.5, 1346.7, 1347.9, 1349, 1350.2, 1351.4, 1352.6, 1353.8, 1355, 1356.1, 1357.3, 1358.5, 1359.7, 1360.9, 1362.1, 1363.3, 1364.5, 1365.7, 1366.9, 1368, 1369.2, 1370.4, 1371.5, 1372.7, 1373.8, 1375, 1376.2, 1377.3, 1378.5, 1379.6, 1380.8, 1382, 1383.2, 1384.4, 1385.6, 1386.8, 1388, 1389.2, 1390.4, 1391.6, 1392.8, 1394, 1395.1, 1396.3, 1397.5, 1398.7, 1399.9, 1401.1, 1402.3, 1403.5, 1404.7, 1405.9, 1407.1, 1408.3, 1409.5, 1410.7, 1411.9, 1413.1, 1414.3, 1415.5, 1416.7, 1417.9, 1419.1, 1420.3, 1421.5, 1422.7, 1423.9, 1425.1, 1426.3, 1427.5, 1428.7, 1429.9, 1431.1, 1432.3, 1433.5, 1434.7, 1435.9, 1437.1, 1438.2, 1439.4, 1440.6, 1441.8, 1443, 1444.2, 1445.4, 1446.6, 1447.8, 1449, 1450.2, 1451.4, 1452.6, 1453.7, 1454.9, 1456.1, 1457.3, 1458.5, 1459.7, 1460.9, 1462.1, 1463.3, 1464.5, 1465.7, 1466.9, 1468.1, 1469.3, 1470.5, 1471.7, 1472.9, 1474.1, 1475.3, 1476.5, 1477.6, 1478.8, 1480, 1481.2, 1482.4, 1483.6, 1484.8, 1485.9, 1487.1, 1488.3, 1489.5, 1490.7, 1491.9, 1493.1, 1494.3, 1495.5, 1496.7, 1497.9, 1499.1, 1500.3, 1501.5, 1502.7, 1503.8, 1505, 1506.2, 1507.4, 1508.6, 1509.8, 1511, 1512.1, 1513.3, 1514.5, 1515.7, 1516.9, 1518.1, 1519.3, 1520.5, 1521.7, 1522.9, 1524.1, 1525.2, 1526.4, 1527.6, 1528.8, 1530, 1531.2, 1532.3, 1533.5, 1534.7, 1535.9, 1537.1, 1538.4, 1539.6, 1540.8, 1542, 1543.2, 1544.4, 1545.6, 1546.7, 1547.9, 1549.1, 1550.3, 1551.5, 1552.7, 1553.9, 1555.1, 1556.3, 1557.5, 1558.7, 1559.9, 1561.1, 1562.3, 1563.5, 1564.7, 1565.8, 1567, 1568.2, 1569.4, 1570.6, 1571.8, 1573, 1574.2, 1575.4, 1576.6, 1577.8, 1579, 1580.2, 1581.4, 1582.6, 1583.8, 1585, 1586.2, 1587.4, 1588.6, 1589.8, 1591, 1592.2, 1593.4, 1594.6, 1595.8, 1597, 1598.2, 1599.4, 1600.6, 1601.8, 1603, 1604.2, 1605.4, 1606.6, 1607.8, 1609, 1610.2, 1611.4, 1612.6, 1613.8, 1615, 1616.2, 1617.4, 1618.6, 1619.8, 1621, 1622.2, 1623.4, 1624.6, 1625.8, 1627, 1628.2, 1629.4, 1630.6, 1631.8, 1633, 1634.2, 1635.4, 1636.6, 1637.8, 1639, 1640.2, 1641.4, 1642.6, 1643.8, 1645, 1646.2, 1647.4, 1648.6, 1649.8, 1651, 1652.2, 1653.4, 1654.6, 1655.8, 1657, 1658.2, 1659.4, 1660.6, 1661.8, 1663, 1664.2, 1665.4, 1666.6, 1667.8, 1669, 1670.2, 1671.4, 1672.6, 1673.8, 1675, 1676.2, 1677.4, 1678.5, 1679.8, 1681, 1682.2, 1683.4, 1684.6, 1685.8, 1687, 1688.2, 1689.4, 1690.6, 1691.8, 1693, 1694.2, 1695.4, 1696.6, 1697.8, 1699, 1700.2, 1701.4, 1702.6, 1703.8, 1705, 1706.2, 1707.4, 1708.6, 1709.8, 1711, 1712.2, 1713.4, 1714.6, 1715.8, 1717, 1718.2, 1719.4, 1720.6, 1721.8, 1723, 1724.2, 1725.4, 1726.6, 1727.8, 1729, 1730.2, 1731.4, 1732.6, 1733.8, 1735, 1736.2, 1737.4, 1738.6, 1739.8, 1741, 1742.2, 1743.4, 1744.6, 1745.8, 1747, 1748.2, 1749.4, 1750.6, 1751.8, 1753, 1754.2, 1755.4, 1756.6, 1757.8, 1759, 1760.2, 1761.4, 1762.6, 1763.8, 1765, 1766.2, 1767.4, 1768.6, 1769.8, 1771, 1772.2, 1773.4, 1774.6, 1775.8, 1777, 1778.2, 1779.5, 1780.7, 1781.9, 1783.1, 1784.3, 1785.5, 1786.7, 1787.9, 1789.1, 1790.3, 1791.5, 1792.7, 1793.9, 1795.1, 1796.3, 1797.5, 1798.7, 1799.9, 1801.1, 1802.3, 1803.5, 1804.7, 1805.9, 1807.1, 1808.3, 1809.5, 1810.7, 1811.9, 1813.1, 1814.3, 1815.5, 1816.7, 1817.9, 1819.1, 1820.3, 1821.5, 1822.7, 1823.9, 1825.1, 1826.3, 1827.5, 1828.7, 1829.9, 1831.1, 1832.3, 1833.5, 1834.7, 1835.9, 1837.1, 1838.3, 1839.5, 1840.7, 1841.9, 1843.2, 1844.4, 1845.6, 1846.8, 1848, 1849.2, 1850.4, 1851.6, 1852.8, 1854, 1855.2, 1856.4, 1857.6, 1858.8, 1860, 1861.2, 1862.4, 1863.6, 1864.8, 1866, 1867.2, 1868.4, 1869.6, 1870.8, 1872, 1873.2, 1874.4, 1875.6, 1876.8, 1878, 1879.2, 1880.4, 1881.6, 1882.8, 1884, 1885.2, 1886.4, 1887.6, 1888.8, 1890, 1891.2, 1892.4, 1893.6, 1894.8, 1896, 1897.2, 1898.4, 1899.7, 1900.8, 1902.1, 1903.3, 1904.5, 1905.7, 1906.9, 1908.1, 1909.3, 1910.5, 1911.7, 1912.9, 1914.1, 1915.3, 1916.5, 1917.7, 1918.9, 1920.1, 1921.3, 1922.5, 1923.7, 1924.9, 1926.1, 1927.3, 1928.5, 1929.7, 1930.9, 1932.1, 1933.3, 1934.5, 1935.7, 1936.9, 1938.1, 1939.3, 1940.5, 1941.7, 1943, 1944.2, 1945.4, 1946.6, 1947.8, 1949, 1950.2, 1951.4, 1952.6, 1953.8, 1955, 1956.2, 1957.4, 1958.6, 1959.8, 1961, 1962.2, 1963.4, 1964.6, 1965.8, 1967, 1968.2, 1969.4, 1970.6, 1971.8, 1973, 1974.2, 1975.4, 1976.6, 1977.8, 1979, 1980.2, 1981.4, 1982.6, 1983.8, 1985, 1986.2, 1987.4, 1988.6, 1989.8, 1991, 1992.2, 1993.4, 1994.6, 1995.8, 1997, 1998.2, 1999.4, 2000.6, 2001.9, 2003.1, 2004.3, 2005.5, 2006.7, 2007.9, 2009.1, 2010.3, 2011.5, 2012.7, 2013.9, 2015.1, 2016.3, 2017.5, 2018.7, 2019.9, 2021.1, 2022.3, 2023.5, 2024.7, 2025.9, 2027.1, 2028.3, 2029.5, 2030.7, 2031.9, 2033.1, 2034.3, 2035.5, 2036.7, 2037.9, 2039.1, 2040.3, 2041.5, 2042.7, 2043.9, 2045.1, 2046.3, 2047.5, 2048.7, 2049.9, 2051.1, 2052.3, 2053.5, 2054.7, 2055.9, 2057.1, 2058.4, 2059.5, 2060.7, 2061.9, 2063.2, 2064.4, 2065.6, 2066.8, 2068, 2069.2, 2070.4, 2071.6, 2072.8, 2074, 2075.2, 2076.4, 2077.6, 2078.8, 2080, 2081.2, 2082.4, 2083.6, 2084.8, 2086, 2087.2, 2088.4, 2089.6, 2090.8, 2092, 2093.2, 2094.4, 2095.6, 2096.8, 2098, 2099.2, 2100.4, 2101.6, 2102.8, 2104, 2105.2, 2106.4, 2107.6, 2108.8, 2110, 2111.2, 2112.4, 2113.6, 2114.8, 2116, 2117.2, 2118.4, 2119.6, 2120.8, 2122, 2123.2, 2124.4, 2125.7, 2126.9, 2128.1, 2129.3, 2130.5, 2131.7, 2132.9, 2134.1, 2135.3, 2136.5, 2137.7, 2138.9, 2140.1, 2141.5, 2142.8, 2144, 2145.2, 2146.4, 2147.7, 2148.9, 2150.1, 2151.3, 2152.5, 2153.7, 2154.9, 2156.1, 2157.3, 2158.5, 2159.7, 2160.9, 2162.1, 2163.3, 2164.5, 2165.7, 2166.9, 2168.1, 2169.3, 2170.5, 2171.7, 2172.9, 2174.1, 2175.3, 2176.5, 2177.7, 2179, 2180.1, 2181.3, 2182.6, 2183.8, 2184.9, 2186.2, 2187.4, 2188.6, 2189.8, 2191, 2192.2, 2193.4, 2194.6, 2195.8, 2197, 2198.2, 2199.4, 2200.6, 2201.8, 2203, 2204.2, 2205.4, 2206.6, 2207.8, 2209, 2210.2, 2211.4, 2212.6, 2213.8, 2215, 2216.2, 2217.4, 2218.6, 2219.8, 2221, 2222.2, 2223.4, 2224.6, 2225.8, 2227, 2228.2, 2229.4, 2230.6, 2231.8, 2233, 2234.2, 2235.4, 2236.6, 2237.8, 2239, 2240.2, 2241.5, 2242.7, 2243.9, 2245.1, 2246.3, 2247.5, 2248.7, 2249.9, 2251.1, 2252.3, 2253.5, 2254.7, 2255.9, 2257.1, 2258.3, 2259.5, 2260.7, 2261.9, 2263.1, 2264.3, 2265.5, 2266.7, 2267.9, 2269.1, 2270.3, 2271.5, 2272.7, 2273.9, 2275.1, 2276.3, 2277.5, 2278.7, 2279.9, 2281.1, 2282.3, 2283.5, 2284.7, 2285.9, 2287.1, 2288.4, 2289.6, 2290.8, 2292, 2293.2, 2294.4, 2295.6, 2296.8, 2298, 2299.2, 2300.4, 2301.6, 2302.8, 2304, 2305.2, 2306.4, 2307.6, 2308.8, 2310, 2311.2, 2312.4, 2313.6, 2314.8, 2316, 2317.2, 2318.4, 2319.6, 2320.8, 2322, 2323.2, 2324.4, 2325.6, 2326.8, 2328, 2329.2, 2330.4, 2331.6, 2332.8, 2334, 2335.2, 2336.4, 2337.6, 2338.8, 2340, 2341.2, 2342.4, 2343.6, 2344.8, 2346, 2347.2, 2348.4, 2349.7, 2350.9, 2352.1, 2353.3, 2354.5, 2355.7, 2356.9, 2358.1, 2359.3, 2360.5, 2361.7, 2362.9, 2364.1, 2365.3, 2366.5, 2367.7, 2369, 2370.2, 2371.4, 2372.6, 2373.8, 2375, 2376.2, 2377.4, 2378.6, 2379.8, 2381, 2382.2, 2383.4, 2384.6, 2385.8, 2387, 2388.2, 2389.4, 2390.6, 2391.8, 2393, 2394.2, 2395.4, 2396.6, 2397.8, 2399, 2400.2, 2401.5, 2402.7, 2403.9, 2405.1, 2406.3, 2407.5, 2408.7, 2409.9, 2411.1, 2412.3, 2413.5, 2414.7, 2415.9, 2417.1, 2418.3, 2419.5, 2420.7, 2421.9, 2423.1, 2424.3, 2425.5, 2426.7, 2427.9, 2429.1, 2430.3, 2431.5, 2432.7, 2433.9, 2435.1, 2436.3, 2437.5, 2438.7, 2439.9, 2441.2, 2442.4, 2443.6, 2444.8, 2446, 2447.2, 2448.4, 2449.6, 2450.8, 2452, 2453.2, 2454.4, 2455.6, 2456.8, 2458, 2459.2, 2460.4, 2461.6, 2462.8, 2464, 2465.2, 2466.4, 2467.6, 2468.8, 2470, 2471.2, 2472.5, 2473.7, 2474.9, 2476.1, 2477.3, 2478.5, 2479.7, 2480.9, 2482.1, 2483.3, 2484.5, 2485.7, 2486.9, 2488.1, 2489.3, 2490.5, 2491.7, 2492.9, 2494.1, 2495.3, 2496.5, 2497.7, 2498.9, 2500.1, 2501.3, 2502.5, 2503.7, 2504.9, 2506.1, 2507.3, 2508.5, 2509.7, 2510.9, 2512.1, 2513.3, 2514.5, 2515.7, 2516.9, 2518.1, 2519.3, 2520.5, 2521.8, 2523, 2524.2, 2525.4, 2526.6, 2527.8, 2529, 2530.2, 2531.4, 2532.6, 2533.8, 2535, 2536.2, 2537.4, 2538.6, 2539.8, 2541, 2542.2, 2543.4, 2544.6, 2545.8, 2547, 2548.2, 2549.4, 2550.6, 2551.8, 2553, 2554.2, 2555.4, 2556.7, 2557.9, 2559.1, 2560.3, 2561.5, 2562.7, 2563.9, 2565.1, 2566.3, 2567.5, 2568.7, 2569.9, 2571.1, 2572.3, 2573.5, 2574.7, 2575.9, 2577.1, 2578.3, 2579.5, 2580.8, 2581.9, 2583.2, 2584.4, 2585.6, 2586.8, 2588, 2589.2, 2590.4, 2591.6, 2592.8, 2594, 2595.2, 2596.4, 2597.6, 2598.8, 2600, 2601.2, 2602.4, 2603.6, 2604.8, 2606, 2607.2, 2608.4, 2609.6, 2610.8, 2612, 2613.2, 2614.4, 2615.6, 2616.8, 2618, 2619.2, 2620.4, 2621.6, 2622.9, 2624.1, 2625.3, 2626.5, 2627.7, 2628.9, 2630.1, 2631.3, 2632.5, 2633.7, 2634.9, 2636.1, 2637.3, 2638.5, 2639.7, 2640.9, 2642.2, 2643.4, 2644.5, 2645.8, 2647, 2648.2, 2649.4, 2650.6, 2651.8, 2653, 2654.2, 2655.4, 2656.6, 2657.8, 2659, 2660.2, 2661.4, 2662.6, 2663.9, 2665.1, 2666.3, 2667.5, 2668.7, 2669.9, 2671.1, 2672.3, 2673.5, 2674.7, 2675.9, 2677.1, 2678.3, 2679.5, 2680.8, 2682, 2683.2, 2684.4, 2685.6, 2686.8, 2688, 2689.2, 2690.4, 2691.6, 2692.8, 2694, 2695.2, 2696.4, 2697.6, 2698.9, 2700.1, 2701.3, 2702.5, 2703.7, 2705, 2706.2, 2707.4, 2708.6, 2709.8, 2711, 2712.2, 2713.4, 2714.6, 2715.9, 2717.1, 2718.3, 2719.5, 2720.7, 2721.9, 2723.1, 2724.3, 2725.5, 2726.7, 2727.9, 2729.1, 2730.4, 2731.6, 2732.8, 2734, 2735.2, 2736.4, 2737.6, 2738.8, 2740.1, 2741.3, 2742.5, 2743.7, 2744.9, 2746.2, 2747.4, 2748.6, 2749.8, 2751.1, 2752.3, 2753.5, 2754.7, 2755.9, 2757.1, 2758.3, 2759.5, 2760.7, 2761.9, 2763.1, 2764.4, 2765.6, 2766.8, 2768, 2769.2, 2770.4, 2771.6, 2772.8, 2774, 2775.3, 2776.5, 2777.7, 2778.9, 2780.1, 2781.3, 2782.5, 2783.7, 2784.9, 2786.1, 2787.3, 2788.5, 2789.7, 2790.9, 2792.2, 2793.4, 2794.6, 2795.8, 2797, 2798.2, 2799.4, 2800.6, 2801.8, 2803, 2804.2, 2805.4, 2806.7, 2807.9, 2809.1, 2810.3, 2811.5, 2812.7, 2813.9, 2815.1, 2816.3, 2817.5, 2818.7, 2819.9, 2821.1, 2822.4, 2823.6, 2824.8, 2826, 2827.2, 2828.4, 2829.6, 2830.8, 2832, 2833.2, 2834.5, 2835.7, 2836.9, 2838.1, 2839.3, 2840.5, 2841.7, 2843, 2844.2, 2845.4, 2846.6, 2847.8, 2849, 2850.2, 2851.5, 2852.7, 2853.9, 2855.1, 2856.3, 2857.5, 2858.7, 2860, 2861.2, 2862.4, 2863.6, 2864.8, 2866, 2867.3, 2868.5, 2869.7, 2870.9, 2872.2, 2873.4, 2874.6, 2875.8, 2877, 2878.2, 2879.4, 2880.7, 2881.9, 2883.1, 2884.3, 2885.5, 2886.7, 2887.9, 2889.2, 2890.4, 2891.6, 2892.8, 2894, 2895.2, 2896.4, 2897.7, 2898.9, 2900.1, 2901.3, 2902.5, 2903.7, 2904.9, 2906.2, 2907.4, 2908.6, 2909.8, 2911, 2912.2, 2913.4, 2914.6, 2915.9, 2917.1, 2918.3, 2919.5, 2920.7, 2921.9, 2923.1, 2924.4, 2925.6, 2926.8, 2928, 2929.2, 2930.5, 2931.7, 2932.9, 2934.1, 2935.3, 2936.5, 2937.7, 2939, 2940.2, 2941.4, 2942.6, 2943.8, 2945.1, 2946.3, 2947.5, 2948.7, 2949.9, 2951.2, 2952.4, 2953.6, 2954.8, 2956, 2957.2, 2958.4, 2959.7, 2960.9, 2962.1, 2963.3, 2964.5, 2965.8, 2967, 2968.2, 2969.4, 2970.6, 2971.8, 2973, 2974.3, 2975.5, 2976.7, 2977.9, 2979.1, 2980.3, 2981.5, 2982.8, 2984, 2985.2, 2986.4, 2987.6, 2988.8, 2990.1, 2991.3, 2992.5, 2993.7, 2994.9, 2996.1, 2997.4, 2998.6, 2999.8, 3001, 3002.2, 3003.5, 3004.7, 3005.9, 3007.1, 3008.3, 3009.5, 3010.8, 3012, 3013.2, 3014.4, 3015.6, 3016.8, 3018.1, 3019.3, 3020.5, 3021.7, 3022.9, 3024.1, 3025.3, 3026.6, 3027.8, 3029, 3030.2, 3031.4, 3032.7, 3033.9, 3035.1, 3036.3, 3037.5, 3038.8, 3040, 3041.2, 3042.4, 3043.6, 3044.8, 3046, 3047.2, 3048.5, 3049.7, 3050.9, 3052.2, 3053.4, 3054.7, 3055.9, 3057.1, 3058.3, 3059.5, 3060.7, 3061.9, 3063.1, 3064.4, 3065.6, 3066.8, 3068, 3069.2, 3070.4, 3071.7, 3072.9, 3074.1, 3075.3, 3076.5, 3077.7, 3079, 3080.2, 3081.4, 3082.6, 3083.9, 3085.1, 3086.3, 3087.5, 3088.7, 3089.9, 3091.2, 3092.4, 3093.6, 3094.8, 3096, 3097.2, 3098.5, 3099.7, 3100.9, 3102.2, 3103.4, 3104.6, 3105.8, 3107.1, 3108.3, 3109.5, 3110.8, 3112, 3113.3, 3114.5, 3115.7, 3116.9, 3118.2, 3119.4, 3120.7, 3122, 3123.2, 3124.5, 3125.7, 3126.9, 3128.2, 3129.4, 3130.6, 3131.9, 3133.1, 3134.4, 3135.6, 3136.9, 3138.1, 3139.4, 3140.6, 3141.9, 3143.1, 3144.4, 3145.6, 3146.9, 3148.1, 3149.4, 3150.6, 3151.8, 3153.1, 3154.3, 3155.6, 3156.8, 3158.1, 3159.3, 3160.6, 3161.8, 3163.1, 3164.3, 3165.6, 3166.8, 3168.1, 3169.3, 3170.6, 3171.8, 3173.1, 3174.3, 3175.5, 3176.8, 3178, 3179.3, 3180.5, 3181.8, 3183, 3184.3, 3185.5, 3186.8, 3188, 3189.2, 3190.5, 3191.7, 3193, 3194.2, 3195.5, 3196.8, 3198, 3199.3, 3200.5, 3201.8, 3203, 3204.3, 3205.5, 3206.8, 3208, 3209.3, 3210.5, 3211.7, 3213, 3214.2, 3215.5, 3216.8, 3218, 3219.3, 3220.5, 3221.8, 3223, 3224.2, 3225.5, 3226.7, 3228, 3229.2, 3230.4, 3231.7, 3232.9, 3234.2, 3235.5, 3236.7, 3238, 3239.2, 3240.5, 3241.7, 3243, 3244.2, 3245.4, 3246.7, 3247.9, 3249.1, 3250.4, 3251.6, 3252.9, 3254.2, 3255.4, 3256.7, 3257.9, 3259.1, 3260.4, 3261.6, 3262.9, 3264.1, 3265.4, 3266.6, 3267.9, 3269.1, 3270.4, 3271.7, 3272.9, 3274.1, 3275.4, 3276.6, 3277.9, 3279.2, 3280.4, 3281.6, 3282.9, 3284.1, 3285.4, 3286.6, 3287.9, 3289.1, 3290.3, 3291.6, 3292.9, 3294.1, 3295.4, 3296.6, 3297.9, 3299.1, 3300.4, 3301.6, 3302.9, 3304.1, 3305.4, 3306.6, 3307.9, 3309.1, 3310.4, 3311.7, 3312.9, 3314.1, 3315.4, 3316.6, 3317.9, 3319.1, 3320.4, 3321.6, 3322.9, 3324.1, 3325.4, 3326.6, 3327.8, 3329.1, 3330.4, 3331.6, 3332.9, 3334.1, 3335.4, 3336.6, 3337.9, 3339.1, 3340.4, 3341.6, 3342.9, 3344.1, 3345.4, 3346.6, 3347.9, 3350.1, 3351.4, 3352.6, 3353.8, 3355, 3356.2, 3357.4, 3358.7, 3359.9, 3361.1, 3362.3, 3363.6, 3364.8, 3366.1, 3367.3, 3368.6, 3369.8, 3371, 3372.3, 3373.5, 3374.7, 3375.9, 3377.2, 3378.4, 3379.6, 3380.8, 3382, 3383.3, 3384.5, 3385.7, 3386.9, 3388.2, 3389.4, 3390.7, 3391.9, 3393.1, 3394.4, 3395.6, 3396.8, 3398.1, 3399.3, 3400.5, 3401.8, 3403, 3404.2, 3405.4, 3406.7, 3408, 3409.2, 3410.4, 3411.7, 3412.9, 3414.1, 3415.4, 3416.6, 3417.8, 3419.1, 3420.3, 3421.5, 3422.8, 3424, 3425.2, 3426.4, 3427.7, 3428.9, 3430.1, 3431.4, 3432.6, 3433.9, 3435.1, 3436.3, 3437.6, 3438.8, 3440, 3441.2, 3442.5, 3443.7, 3445, 3446.2, 3447.4, 3448.6, 3449.8, 3451, 3452.3, 3453.5, 3454.7, 3455.9, 3457.1, 3458.3, 3459.5, 3460.7, 3461.9, 3463.1, 3464.4, 3465.6, 3466.9, 3468.1, 3469.3, 3470.5, 3471.7, 3472.9, 3474.1, 3475.3, 3476.5, 3477.7, 3478.9, 3480.1, 3481.3, 3482.6, 3483.8, 3485, 3486.2, 3487.5, 3488.7, 3489.9, 3491.1, 3492.3, 3493.5, 3494.7, 3496, 3497.2, 3498.4, 3499.6, 3500.8, 3502, 3503.2, 3504.4, 3505.7, 3506.9, 3508.1, 3509.3, 3510.5, 3511.7, 3512.9, 3514.1, 3515.3, 3516.6, 3517.8, 3519, 3520.2, 3521.4, 3522.6, 3523.8, 3525.1, 3526.3, 3527.5, 3528.7, 3529.9, 3531.1, 3532.3, 3533.5, 3534.7, 3536, 3537.2, 3538.4, 3539.6, 3540.8, 3542.1, 3543.3, 3544.6, 3545.9, 3547.1, 3548.4, 3549.6, 3550.8, 3552.1, 3553.3, 3554.5, 3555.7, 3557, 3558.2, 3559.4, 3560.7, 3561.9, 3563.1, 3564.4, 3565.6, 3566.9, 3568.1, 3569.4, 3570.6, 3571.9, 3573.1, 3574.3, 3575.6, 3576.8, 3578, 3579.3, 3580.5, 3581.8, 3583, 3584.2, 3585.5, 3586.7, 3587.9, 3589.2, 3590.4, 3591.6, 3592.9, 3594.1, 3595.3, 3596.6, 3597.8, 3599, 3600.3, 3601.5, 3602.7, 3603.9, 3605.2, 3606.5, 3607.7, 3609, 3610.2, 3611.5, 3612.7, 3613.9, 3615.1, 3616.4, 3617.6, 3618.8, 3620.1, 3621.3, 3622.5, 3623.8, 3625, 3626.3, 3627.6, 3628.8, 3630, 3631.3, 3632.5, 3633.7, 3635, 3636.2, 3637.4, 3638.6, 3639.9, 3641.1, 3642.3, 3643.6, 3644.8, 3646.1, 3647.3, 3648.6, 3649.8, 3651.1, 3652.3, 3653.5, 3654.8, 3656, 3657.3, 3658.5, 3659.7, 3661, 3662.2, 3663.5, 3664.7, 3666, 3667.2, 3668.5, 3669.8, 3671, 3672.2, 3673.5, 3674.7, 3676, 3677.2, 3678.5, 3679.7, 3681, 3682.2, 3683.5, 3684.7, 3686, 3687.2, 3688.5, 3689.7, 3691.1, 3692.3, 3693.6, 3694.8, 3696.1, 3697.3, 3698.6, 3699.8, 3701, 3702.3, 3703.5, 3704.7, 3705.9, 3707.2, 3708.4, 3709.7, 3711.2, 3712.7, 3714, 3715.2, 3716.7, 3718, 3719.2, 3720.4, 3721.7, 3722.9, 3724.1, 3725.4, 3726.6, 3727.9, 3729.1, 3730.4, 3731.6, 3732.9, 3734.1, 3735.4, 3736.6, 3737.9, 3739.1, 3740.3, 3741.6, 3742.8, 3744.1, 3745.3, 3746.6, 3747.8, 3749.6, 3751.3, 3752.6, 3753.9, 3755.3, 3756.5, 3757.7, 3759, 3760.4, 3761.6, 3762.9, 3764.1, 3765.3, 3766.7, 3768, 3769.2, 3770.5, 3771.8, 3773, 3774.2, 3775.5, 3776.9, 3778.3, 3780, 3781.4, 3782.9, 3784.1, 3785.6, 3786.9, 3788.4, 3789.7, 3791, 3792.4, 3793.7, 3795.1, 3796.6, 3797.8, 3799.1, 3800.3, 3801.6, 3803, 3804.3, 3805.7, 3807.1, 3808.4, 3809.7, 3811, 3812.3, 3813.7, 3815, 3816.4, 3817.7, 3819.1, 3820.5, 3821.8, 3823.3, 3824.7, 3826, 3827.5, 3828.8, 3830, 3831.3, 3832.5, 3833.8, 3835, 3836.3, 3837.5, 3838.8, 3840, 3841.3, 3842.5, 3843.8, 3845, 3846.2, 3847.5, 3848.8, 3850, 3851.3, 3852.5, 3853.8, 3855, 3856.2, 3857.5, 3858.7, 3860, 3861.2, 3862.5, 3863.7, 3865, 3866.3, 3867.5, 3868.7, 3870, 3871.4, 3872.7, 3873.9, 3875.2, 3876.4, 3877.7, 3879, 3880.2, 3881.5, 3882.8, 3884.1, 3885.3, 3886.5, 3887.7, 3888.9, 3890.2, 3891.4, 3892.7, 3894, 3895.3, 3896.5, 3897.8, 3899, 3900.3, 3901.6, 3902.8, 3904.2, 3905.4, 3906.7, 3908, 3909.3, 3910.6, 3911.9, 3913.2, 3914.5, 3915.8, 3917, 3918.3, 3919.6, 3920.9, 3922.2, 3923.4, 3924.7, 3925.9, 3927.2, 3928.5, 3929.7, 3931, 3932.3, 3933.5, 3934.8, 3936, 3937.3, 3938.6, 3939.8, 3941.1, 3942.3, 3943.6, 3944.8, 3946.1, 3947.3, 3948.6, 3949.8, 3951.1, 3952.3, 3953.6, 3954.8, 3956.1, 3957.3, 3958.6, 3959.8, 3961.2, 3962.4, 3963.7, 3965, 3966.2, 3967.5, 3968.7, 3970, 3971.2, 3972.5, 3973.7, 3975, 3976.4, 3977.6, 3978.9, 3980.1, 3981.4, 3982.7, 3984, 3985.2, 3986.5, 3987.8, 3989, 3990.3, 3991.5, 3992.8, 3994, 3995.3, 3996.5, 3997.8, 3999, 4000.3, 4001.6, 4002.8, 4004.1, 4005.4, 4006.7, 4008, 4009.3, 4010.6, 4011.9, 4013.1, 4014.4, 4015.6, 4016.9, 4018.1, 4019.4, 4021.5, 4023, 4024.3, 4025.6, 4026.9, 4028.1, 4029.5, 4030.8, 4032.1, 4033.4, 4034.6, 4035.9, 4037.2, 4038.4, 4039.7, 4040.9, 4042.2, 4043.4, 4044.7, 4046, 4047.2, 4048.5, 4049.7, 4051, 4052.3, 4053.5, 4054.7, 4056, 4057.2, 4058.5, 4059.8, 4061, 4062.3, 4063.6, 4064.9, 4066.1, 4067.4, 4068.7, 4069.9, 4071.2, 4072.4, 4073.8, 4075, 4076.3, 4077.6, 4078.8, 4080.1, 4081.3, 4082.6, 4083.8, 4085.1, 4086.4, 4087.6, 4088.8, 4090.1, 4091.4, 4092.7, 4094, 4095.2, 4096.5, 4097.7, 4099.1, 4100.4, 4101.7, 4103.1, 4104.4, 4105.7, 4107, 4108.2, 4109.5, 4110.8, 4112, 4113.3, 4114.5, 4115.8, 4117.1, 4118.3, 4119.6, 4120.8, 4122.2, 4123.4, 4124.7, 4126, 4127.2, 4128.4, 4129.7, 4131, 4132.2, 4133.5, 4134.7, 4136, 4137.3, 4138.5, 4139.8, 4141.1, 4142.3, 4143.6, 4144.9, 4146.2, 4147.5, 4148.7, 4150, 4151.2, 4152.5, 4153.8, 4155, 4156.3, 4157.5, 4158.8, 4160, 4161.3, 4162.6, 4163.8, 4165.1, 4166.3, 4167.6, 4168.9, 4170.2, 4171.4, 4172.7, 4174, 4175.3, 4176.5, 4177.8, 4179, 4180.3, 4181.5, 4182.8, 4184, 4185.3, 4186.5, 4187.8, 4189.1, 4190.3, 4191.6, 4192.9, 4194.1, 4195.4, 4196.6, 4197.9, 4199.1, 4200.4, 4201.7, 4202.9, 4204.2, 4205.5, 4206.7, 4208, 4209.3, 4210.5, 4211.8, 4213, 4214.3, 4215.6, 4216.9, 4218.1, 4219.4, 4220.7, 4221.9, 4223.2, 4224.6, 4225.9, 4227.1, 4228.4, 4229.7, 4230.9, 4232.2, 4233.5, 4234.8, 4236.1, 4237.5, 4238.8, 4240.2, 4241.4, 4242.7, 4244, 4245.2, 4246.6, 4247.9, 4249.2, 4250.6, 4251.9, 4253.2, 4254.5, 4255.8, 4257, 4258.3, 4259.6, 4261, 4262.2, 4263.5, 4264.9, 4266.2, 4267.4, 4268.7, 4270, 4271.2, 4272.5, 4273.7, 4275, 4276.3, 4277.6, 4278.8, 4280.1, 4281.4, 4282.7, 4284, 4285.2, 4286.6, 4287.9, 4289.2, 4290.5, 4291.8, 4293.1, 4294.3, 4295.6, 4296.9, 4298.1, 4299.4, 4300.7, 4302, 4303.2, 4304.5, 4305.8, 4307, 4308.3, 4309.6, 4310.8, 4312.1, 4313.4, 4314.7, 4316, 4317.2, 4318.5, 4319.7, 4321, 4322.3, 4323.6, 4324.8, 4326.1, 4327.3, 4328.7, 4330, 4331.3, 4332.7, 4334, 4335.3, 4336.5, 4337.8, 4339.1, 4340.4, 4341.7, 4343, 4344.2, 4345.5, 4346.9, 4348.2, 4349.4, 4350.7, 4352.1, 4353.4, 4354.7, 4355.9, 4357.2, 4358.5, 4359.8, 4361.1, 4362.4, 4363.7, 4364.9, 4366.2, 4367.5, 4368.8, 4370, 4371.4, 4372.6, 4373.9, 4375.2, 4376.4, 4377.8, 4379, 4380.3, 4381.5, 4382.8, 4384.1, 4385.4, 4386.8, 4388.1, 4389.4, 4390.7, 4392, 4393.3, 4394.6, 4395.8, 4397.1, 4398.4, 4399.7, 4401.1, 4402.3, 4403.6, 4404.9, 4406.3, 4407.6, 4408.9, 4410.3, 4411.6, 4412.8, 4414.2, 4415.4, 4416.7, 4418, 4419.3, 4420.7, 4422, 4423.3, 4424.6, 4425.9, 4427.3, 4428.7, 4430, 4431.3, 4432.7, 4434, 4435.4, 4436.8, 4438.1, 4439.5, 4440.8, 4442.2, 4443.5, 4444.9, 4446.1, 4447.4, 4448.7, 4450, 4451.4, 4452.7, 4453.9, 4455.3, 4456.6, 4457.9, 4459.2, 4460.5, 4461.9, 4463.2, 4464.6, 4466, 4467.3, 4468.7, 4470, 4471.3, 4472.7, 4474.1, 4475.4, 4476.7, 4478.1, 4479.4, 4480.8, 4482.2, 4483.5, 4484.9, 4486.3, 4487.6, 4488.9, 4490.3, 4491.8, 4493.1, 4494.4, 4495.7, 4497, 4498.3, 4499.6, 4501, 4502.3, 4503.7, 4505, 4506.3, 4507.6, 4508.9, 4510.2, 4511.5, 4512.8, 4514.1, 4515.4, 4516.8, 4518.1, 4519.5, 4520.8, 4522.2, 4523.4, 4524.8, 4526.1, 4527.5, 4528.8, 4530.1, 4531.4, 4532.8, 4534, 4535.3, 4536.7, 4538.1, 4539.4, 4540.7, 4542, 4543.4, 4544.7, 4546.1, 4547.4, 4548.7, 4550.1, 4551.4, 4552.8, 4554.1, 4555.4, 4556.8, 4558.1, 4559.4, 4560.7, 4562, 4563.3, 4564.6, 4566, 4567.3, 4568.7, 4570.1, 4571.4, 4572.7, 4574, 4575.5, 4576.9, 4578.3, 4579.6, 4581, 4582.3, 4583.7, 4585.1, 4586.4, 4587.7, 4589, 4590.3, 4591.7, 4593, 4594.3, 4595.7, 4597, 4598.3, 4599.6, 4601, 4602.3, 4603.6, 4604.9, 4606.3, 4607.7, 4609, 4610.4, 4611.8, 4613.1, 4614.5, 4616, 4617.3, 4618.6, 4619.9, 4621.2, 4622.5, 4623.9, 4625.3, 4626.7, 4628, 4629.4, 4630.8, 4632.2, 4633.5, 4634.8, 4636.2, 4637.5, 4638.8, 4640.2, 4641.5, 4642.9, 4644.2, 4645.6, 4646.9, 4648.3, 4649.6, 4650.9, 4652.2, 4653.6, 4654.9, 4656.3, 4657.7, 4659.1, 4660.5, 4661.9, 4663.3, 4664.6, 4665.9, 4667.3, 4668.7, 4670.1, 4671.4, 4672.7, 4674.1, 4675.5, 4676.9, 4678.2, 4679.6, 4681, 4682.4, 4683.7, 4685.1, 4686.4, 4687.8, 4689.1, 4690.4, 4691.8, 4693.2, 4694.5, 4695.9, 4697.3, 4698.8, 4700.1, 4701.5, 4702.9, 4704.2, 4705.5, 4706.9, 4708.3, 4709.7, 4711, 4712.4, 4713.8, 4715.2, 4716.6, 4717.9, 4719.3, 4720.6, 4722, 4723.3, 4724.6, 4726, 4727.5, 4728.8, 4730.2, 4731.5, 4732.9, 4734.3, 4735.7, 4737.1, 4738.5, 4739.8, 4741.2, 4742.5, 4743.9, 4745.3, 4746.6, 4747.9, 4749.3, 4750.6, 4752, 4753.4, 4754.8, 4756.2, 4757.5, 4758.9, 4760.3, 4761.6, 4762.9, 4764.3, 4765.6, 4767, 4768.3, 4769.6, 4771, 4772.4, 4773.7, 4775, 4776.4, 4777.8, 4779.2, 4780.6, 4782, 4783.4, 4784.8, 4786.2, 4787.5, 4788.9, 4790.3, 4791.7, 4793, 4794.4, 4795.7, 4797.1, 4798.4, 4799.8, 4801.3, 4802.6, 4804, 4805.4, 4806.8, 4808.2, 4809.6, 4811, 4812.4, 4813.8, 4815.2, 4816.6, 4818, 4819.4, 4820.8, 4822.2, 4823.6, 4824.9, 4826.4, 4827.7, 4829.1, 4830.5, 4831.9, 4833.3, 4834.7, 4836.1, 4837.5, 4838.9, 4840.2, 4841.6, 4843, 4844.4, 4845.8, 4847.2, 4848.6, 4850, 4851.4, 4852.8, 4854.2, 4855.6, 4856.9, 4858.3, 4859.7, 4861.1, 4862.5, 4863.9, 4865.3, 4866.7, 4868.1, 4869.5, 4870.9, 4872.3, 4873.7, 4875.1, 4876.5, 4877.8, 4879.2, 4880.6, 4882, 4883.3, 4884.6, 4886, 4887.4, 4888.8, 4890.1, 4891.6, 4893, 4894.4, 4895.7, 4897.1, 4898.6, 4900, 4901.4, 4902.8, 4904.2, 4905.6, 4907, 4908.4, 4909.8, 4911.2, 4912.6, 4914, 4915.3, 4916.7, 4918.1, 4919.5, 4920.9, 4922.3, 4923.7, 4925.1, 4926.5, 4927.9, 4929.3, 4930.7, 4932.1, 4933.5, 4934.9, 4936.3, 4937.7, 4939.1, 4940.5, 4941.9, 4943.3, 4944.7, 4946.1, 4947.5, 4948.9, 4950.3, 4951.7, 4953.1, 4954.5, 4955.9, 4957.3, 4958.7, 4960.1, 4961.5, 4962.9, 4964.3, 4965.7, 4967.1, 4968.4, 4969.8, 4971.2, 4972.6, 4974, 4975.4, 4976.8, 4978.2, 4979.6, 4981, 4982.4, 4983.8, 4985.2, 4986.6, 4988, 4989.4, 4990.9, 4992.3, 4993.7, 4995.1, 4996.5, 4997.9, 4999.3, 5000.9, 5002.4, 5003.8, 5005.2, 5006.6, 5008, 5009.4, 5010.8, 5012.2, 5013.6, 5015, 5016.4, 5017.8, 5019.2, 5020.6, 5022.1, 5023.5, 5025, 5026.5, 5028, 5029.4, 5030.9, 5032.3, 5033.7, 5035.1, 5036.5, 5037.9, 5039.3, 5040.7, 5042.1, 5043.5, 5044.9, 5046.3, 5047.7, 5049.1, 5050.5, 5051.9, 5053.4, 5054.8, 5056.2, 5057.6, 5059, 5060.4, 5061.8, 5063.2, 5064.6, 5066, 5067.4, 5068.8, 5070.2, 5071.6, 5073, 5074.4, 5075.8, 5077.2, 5078.6, 5080, 5081.4, 5082.8, 5084.2, 5085.6, 5087, 5088.4, 5089.8, 5091.3, 5092.7, 5094.1, 5095.5, 5096.9, 5098.3, 5099.7, 5101.1, 5102.5, 5103.9, 5105.3, 5106.7, 5108.1, 5109.5, 5110.9, 5112.3, 5113.7, 5115.1, 5116.5, 5117.9, 5119.3, 5120.7, 5122.1, 5123.5, 5124.9, 5126.3, 5127.7, 5129.1, 5130.6, 5131.9, 5133.4, 5134.8, 5136.2, 5137.6, 5139, 5140.4, 5141.8, 5143.2, 5144.6, 5146, 5147.4, 5148.8, 5150.3, 5151.6, 5153.1, 5154.5, 5155.9, 5157.3, 5158.7, 5160.1, 5161.5, 5162.9, 5164.3, 5165.7, 5167.1, 5168.5, 5169.9, 5171.3, 5172.7, 5174.1, 5175.5, 5177, 5178.4, 5179.8, 5181.2, 5182.6, 5184, 5185.4, 5186.8, 5188.2, 5189.6, 5191, 5192.4, 5193.8, 5195.2, 5196.6, 5198, 5199.4, 5200.8, 5202.2, 5203.6, 5205, 5206.4, 5207.9, 5209.3, 5210.7, 5212.1, 5213.5, 5214.9, 5216.3, 5217.7, 5219.1, 5220.5, 5221.9, 5223.3, 5224.7, 5226.1, 5227.5, 5228.9, 5230.3, 5231.7, 5233.1, 5234.5, 5235.9, 5237.4, 5238.9, 5240.3, 5241.7, 5243.1, 5244.5, 5246, 5247.6, 5249, 5250.4, 5251.8, 5253.2, 5254.6, 5256, 5257.4, 5259, 5260.4, 5261.9, 5263.3, 5264.7, 5266.2, 5267.6, 5269, 5270.4, 5271.8, 5273.2, 5274.6, 5276.1, 5277.5, 5278.9, 5280.3, 5281.7, 5283.1, 5284.5, 5285.9, 5287.3, 5288.8, 5290.2, 5291.6, 5293, 5294.4, 5295.9, 5297.3, 5298.7, 5300.1, 5301.5, 5303, 5304.5, 5305.9, 5307.3, 5308.7, 5310.1, 5311.5, 5312.9, 5314.3, 5315.7, 5317.1, 5318.5, 5319.9, 5321.3, 5322.7, 5324.1, 5325.5, 5326.9, 5328.3, 5329.7, 5331.1, 5332.5, 5333.9, 5335.4, 5336.8, 5338.2, 5339.6, 5341, 5342.4, 5343.8, 5345.2, 5346.6, 5348, 5349.4, 5350.8, 5352.2, 5353.6, 5355, 5356.4, 5357.8, 5359.2, 5360.6, 5362, 5363.4, 5364.8, 5366.3, 5367.7, 5369.1, 5370.5, 5371.9, 5373.3, 5374.7, 5376.1, 5377.5, 5378.9, 5380.3, 5381.7, 5383.1, 5384.5, 5386, 5387.3, 5388.7, 5390.2, 5391.6, 5393, 5394.3, 5395.8, 5397.2, 5398.6, 5400, 5401.4, 5402.8, 5404.2, 5405.6, 5407, 5408.4, 5409.9, 5411.2, 5412.7, 5414.1, 5415.5, 5416.9, 5418.3, 5419.7, 5421.1, 5422.5, 5423.9, 5425.3, 5426.7, 5428.1, 5429.5, 5431, 5432.3, 5433.7, 5435.1, 5436.6, 5438, 5439.4, 5440.8, 5442.2, 5443.6, 5445, 5446.4, 5447.8, 5449.2, 5450.6, 5452, 5453.4, 5454.8, 5456.2, 5457.6, 5459, 5460.4, 5461.8, 5463.3, 5464.7, 5466.1, 5467.5, 5468.9, 5470.3, 5471.7, 5473.1, 5474.5, 5475.9, 5477.3, 5478.7, 5480.1, 5481.5, 5482.9, 5484.3, 5485.7, 5487.1, 5488.5, 5489.9, 5491.3, 5492.7, 5494.1, 5495.6, 5497, 5498.4, 5499.8, 5501.2, 5502.6, 5504, 5505.4, 5506.8, 5508.2, 5509.6, 5511, 5512.4, 5513.8, 5515.2, 5516.6, 5518, 5519.4, 5520.8, 5522.2, 5523.6, 5525, 5526.4, 5527.8, 5529.4, 5530.8, 5532.2, 5533.6, 5535.1, 5536.5, 5537.9, 5539.3, 5540.7, 5542.2, 5543.6, 5545, 5546.4, 5547.8, 5549.3, 5550.7, 5552.1, 5553.5, 5555.1, 5556.5, 5558, 5559.4, 5560.8, 5562.3, 5563.8, 5565.2, 5566.6, 5568, 5569.4, 5570.8, 5572.2, 5573.6, 5575, 5576.4, 5577.8, 5579.3, 5580.7, 5582.1, 5583.5, 5584.9, 5586.3, 5587.7, 5589.1, 5590.5, 5591.9, 5593.3, 5594.7, 5596.2, 5597.6, 5599, 5600.4, 5601.8, 5603.2, 5604.6, 5606, 5607.4, 5608.8, 5610.2, 5611.6, 5613, 5614.4, 5615.8, 5617.2, 5618.6, 5620, 5621.4, 5622.8, 5624.2, 5625.6, 5627, 5628.5, 5629.9, 5631.3, 5632.7, 5634.1, 5635.5, 5636.9, 5638.3, 5639.7, 5641.1, 5642.5, 5643.9, 5645.3, 5646.7, 5648.1, 5649.5, 5650.9, 5652.3, 5653.7, 5655.2, 5656.6, 5658, 5659.4, 5660.8, 5662.2, 5663.6, 5665, 5666.4, 5667.8, 5669.2, 5670.6, 5672, 5673.4, 5674.8, 5676.2, 5677.6, 5679, 5680.4, 5681.8, 5683.2, 5684.6, 5686, 5687.4, 5688.8, 5690.2, 5691.6, 5693, 5694.5, 5695.9, 5697.3, 5698.7, 5700.1, 5701.5, 5702.9, 5704.3, 5705.7, 5707.1, 5708.5, 5709.9, 5711.3, 5712.7, 5714.1, 5715.5, 5716.9, 5718.3, 5719.7, 5721.1, 5722.5, 5723.9, 5725.3, 5726.7, 5728.1, 5729.5, 5730.9, 5732.3, 5733.7, 5735.2, 5736.5, 5738, 5739.4, 5740.8, 5742.2, 5743.6, 5745, 5746.4, 5747.8, 5749.2, 5750.6, 5752, 5753.4, 5754.8, 5756.2, 5757.6, 5759, 5760.4, 5761.8, 5763.2, 5764.6, 5766, 5767.4, 5768.8, 5770.2, 5771.6, 5773, 5774.4, 5775.8, 5777.3, 5778.7, 5780.1, 5781.5, 5782.9, 5784.3, 5785.7, 5787.1, 5788.5, 5789.9, 5791.3, 5792.7, 5794.1, 5795.5, 5796.9, 5798.4, 5799.8, 5801.2, 5802.6, 5804, 5805.4, 5806.8, 5808.2, 5809.6, 5811, 5812.4, 5813.8, 5815.2, 5816.6, 5818, 5819.4, 5820.8, 5822.2, 5823.6, 5825, 5826.4, 5827.8, 5829.2, 5830.6, 5832.1, 5833.5, 5834.9, 5836.3, 5837.8, 5839.2, 5840.6, 5842, 5843.4, 5844.8, 5846.2, 5847.6, 5849, 5850.4, 5851.8, 5853.2, 5854.6, 5856, 5857.4, 5858.8, 5860.2, 5861.6, 5863, 5864.4, 5865.8, 5867.3, 5868.7, 5870.1, 5871.5, 5872.9, 5874.3, 5875.8, 5877.2, 5878.6, 5880, 5881.4, 5882.8, 5884.2, 5885.6, 5887, 5888.4, 5889.8, 5891.2, 5892.6, 5894.1, 5895.5, 5896.9, 5898.3, 5899.7, 5901.1, 5902.5, 5903.9, 5905.3, 5906.7, 5908.1, 5909.6, 5911, 5912.4, 5913.8, 5915.2, 5916.6, 5918, 5919.4, 5920.8, 5922.3, 5923.7, 5925.1, 5926.5, 5928, 5929.4, 5930.8, 5932.3, 5933.7, 5935.1, 5936.6, 5938, 5939.4, 5940.8, 5942.2, 5943.7, 5945.1, 5946.5, 5947.9, 5949.4, 5950.8, 5952.2, 5953.7, 5955.1, 5956.5, 5957.9, 5959.4, 5960.8, 5962.2, 5963.7, 5965.1, 5966.5, 5967.9, 5969.4, 5970.8, 5972.3, 5973.7, 5975.2, 5976.6, 5978, 5979.4, 5980.8, 5982.2, 5983.7, 5985.1, 5986.5, 5987.9, 5989.4, 5990.8, 5992.2, 5993.6, 5995, 5996.4, 5997.8, 5999.3, 6000.7, 6002.1, 6003.5, 6005, 6006.4, 6007.9, 6009.3, 6010.8, 6012.2, 6013.6, 6015.1, 6016.5, 6017.9, 6019.4, 6020.8, 6022.2, 6023.6, 6025.1, 6026.5, 6028, 6029.4, 6030.8, 6032.2, 6033.7, 6035.1, 6036.5, 6037.9, 6039.4, 6040.8, 6042.2, 6043.6, 6045.1, 6046.5, 6047.9, 6049.4, 6050.8, 6052.3, 6053.7, 6055.1, 6056.5, 6057.9, 6059.4, 6060.8, 6062.2, 6063.7, 6065.1, 6066.5, 6068, 6069.4, 6070.8, 6072.3, 6073.7, 6075.2, 6076.6, 6078, 6079.4, 6081, 6082.4, 6083.8, 6085.2, 6086.6, 6088, 6089.5, 6090.9, 6092.3, 6093.7, 6095.1, 6096.6, 6098, 6099.4, 6100.8, 6102.2, 6103.6, 6105.1, 6106.5, 6107.9, 6109.3, 6110.7, 6112.2, 6113.6, 6115, 6116.5, 6117.9, 6119.3, 6120.7, 6122.2, 6123.6, 6125, 6126.4, 6127.8, 6129.2, 6130.6, 6132, 6133.5, 6134.9, 6136.3, 6137.7, 6139.2, 6140.6, 6142, 6143.4, 6144.9, 6146.3, 6147.7, 6149.1, 6150.5, 6152, 6153.5], datasets: [{ label: 'LayoutDuration', backgroundColor: 'rgba(45, 134, 203, 0.2)', borderColor: 'rgba(45, 134, 203, 1.00)', - data: [0.034717, 0.045234, 0.052591, 0.060077, 0.067149, 0.071509, 0.076464, 0.083082, 0.090573, 0.100478, 0.110227, 0.118513, 0.127812, 0.135397, 0.143446, 0.152105, 0.158883, 0.165507, 0.17236, 0.179002, 0.186141, 0.192941, 0.200185, 0.207068, 0.215006, 0.224683, 0.233793, 0.242402, 0.253824, 0.263647, 0.274202, 0.280719, 0.287725, 0.294708, 0.301861, 0.308844, 0.316033, 0.32277, 0.329336, 0.337564, 0.345527, 0.353553, 0.362964, 0.372258, 0.382831, 0.392567, 0.401285, 0.408552, 0.415288, 0.422008] + data: [0.080402, 0.087187, 0.091918, 0.096581, 0.101393, 0.106364, 0.113197, 0.118064, 0.122497, 0.127593, 0.134779, 0.139889, 0.144302, 0.148892, 0.153729, 0.158304, 0.163082, 0.168933, 0.173395, 0.17803, 0.182593, 0.187051, 0.191528, 0.196118, 0.200568, 0.205112, 0.209858, 0.214826, 0.219285, 0.223857, 0.228416, 0.233052, 0.237581, 0.242198, 0.246865, 0.251366, 0.255758, 0.260616, 0.265602, 0.270022, 0.274393, 0.278759, 0.283128, 0.287528, 0.291909, 0.296228, 0.300664, 0.305023, 0.308891, 0.313305, 0.317672, 0.321991, 0.32628, 0.330564, 0.334741, 0.338738, 0.342821, 0.346611, 0.350667, 0.354515, 0.358758, 0.363076, 0.367396, 0.37166, 0.375924, 0.380258, 0.384591, 0.38891, 0.393255, 0.397605, 0.401951, 0.406324, 0.410693, 0.414967, 0.419256, 0.423574, 0.427829, 0.432312, 0.43687, 0.440974, 0.445332, 0.449892, 0.454181, 0.458459, 0.462904, 0.467239, 0.471606, 0.475944, 0.480768, 0.485014, 0.489326, 0.49367, 0.497996, 0.502357, 0.506656, 0.510822, 0.515214, 0.519526, 0.523889, 0.528215, 0.532538, 0.536859, 0.541171, 0.545557, 0.5499, 0.554231, 0.558549, 0.562868, 0.567252, 0.571635, 0.576004, 0.580389, 0.58475, 0.589144, 0.593475, 0.597844, 0.60227, 0.606714, 0.611095, 0.61552, 0.61993, 0.624287, 0.628668, 0.633038, 0.63744, 0.641817, 0.646172, 0.650533, 0.654932, 0.659324, 0.663691, 0.668069, 0.672401, 0.676962, 0.681351, 0.685687, 0.690009, 0.694305, 0.700491, 0.704798, 0.709218, 0.713217, 0.717737, 0.721868, 0.726209, 0.730531, 0.734759, 0.739162, 0.743477, 0.748258, 0.752587, 0.756955, 0.761289, 0.765569, 0.769896, 0.774276, 0.778549, 0.782881, 0.787547, 0.791849, 0.796838, 0.801222, 0.80554, 0.809877, 0.814213, 0.818527, 0.822907, 0.827367, 0.831603, 0.835954, 0.840272, 0.844613, 0.84893, 0.853343, 0.857659, 0.861949, 0.866291, 0.870638, 0.875, 0.87938, 0.883734, 0.888013, 0.892393, 0.896718, 0.901075, 0.905402, 0.909735, 0.914092, 0.918474, 0.92283, 0.927145, 0.931455, 0.935762, 0.940094, 0.944459, 0.948759, 0.953116, 0.957359, 0.961665, 0.966011, 0.970425, 0.974872, 0.979198, 0.983589, 0.987935, 0.992293, 0.996641, 1.000962, 1.005334, 1.009747, 1.014193, 1.018563, 1.022984, 1.027349, 1.031671, 1.035999, 1.040363, 1.044709, 1.049011, 1.053347, 1.057675, 1.062017, 1.066347, 1.070718, 1.075022, 1.079434, 1.083601, 1.0879, 1.092377, 1.096821, 1.101166, 1.105582, 1.109939, 1.114302, 1.118672, 1.122967, 1.12722, 1.131635, 1.136101, 1.140436, 1.144777, 1.149046, 1.153245, 1.157788, 1.162146, 1.166458, 1.170801, 1.1751, 1.179381, 1.183716, 1.188168, 1.192391, 1.196728, 1.20104, 1.205383, 1.209691, 1.214013, 1.218656, 1.223044, 1.227395, 1.231757, 1.236086, 1.240427, 1.24478, 1.249047, 1.253324, 1.257666, 1.261931, 1.266276, 1.270595, 1.274902, 1.279322, 1.283992, 1.288471, 1.29279, 1.297174, 1.301497, 1.305923, 1.310379, 1.31486, 1.319298, 1.32375, 1.328203, 1.332581, 1.337013, 1.341485, 1.345796, 1.350017, 1.354218, 1.358624, 1.36282, 1.367222, 1.371559, 1.375913, 1.380388, 1.384713, 1.388976, 1.393327, 1.397719, 1.402103, 1.406408, 1.41073, 1.415104, 1.419393, 1.423682, 1.427872, 1.43218, 1.436491, 1.440822, 1.445178, 1.449504, 1.453763, 1.458095, 1.462286, 1.46684, 1.471076, 1.475441, 1.479774, 1.48441, 1.488684, 1.492998, 1.497348, 1.501675, 1.506017, 1.510322, 1.51452, 1.519044, 1.523388, 1.528204, 1.53239, 1.536637, 1.540942, 1.545255, 1.549506, 1.553855, 1.558016, 1.562597, 1.567043, 1.571493, 1.575785, 1.580084, 1.584388, 1.588655, 1.592757, 1.5971, 1.601305, 1.605713, 1.610197, 1.614888, 1.619152, 1.623417, 1.627719, 1.632015, 1.636115, 1.640409, 1.6447, 1.64884, 1.652942, 1.657256, 1.661592, 1.66595, 1.670271, 1.674622, 1.678973, 1.683343, 1.687655, 1.692199, 1.696468, 1.700765, 1.7051, 1.709394, 1.713664, 1.718034, 1.722208, 1.726443, 1.73072, 1.734996, 1.739189, 1.743417, 1.747858, 1.752101, 1.756361, 1.760653, 1.764907, 1.769048, 1.772927, 1.776699, 1.780693, 1.784396, 1.788116, 1.791793, 1.79591, 1.799629, 1.803408, 1.807156, 1.810881, 1.814755, 1.81865, 1.822446, 1.826367, 1.830089, 1.833833, 1.837591, 1.841419, 1.84512, 1.84889, 1.852671, 1.856483, 1.860356, 1.864104, 1.867922, 1.871656, 1.875496, 1.879349, 1.883228, 1.88717, 1.890965, 1.894806, 1.898615, 1.902491, 1.906335, 1.910152, 1.913834, 1.9176, 1.921305, 1.925269, 1.92915, 1.93298, 1.936765, 1.940756, 1.944538, 1.948364, 1.952015, 1.955944, 1.959835, 1.963642, 1.967362, 1.971063, 1.97477, 1.978434, 1.982281, 1.986027, 1.989787, 1.993601, 1.997382, 2.001272, 2.005181, 2.009067, 2.013033, 2.017009, 2.020761, 2.02446, 2.02816, 2.031872, 2.03563, 2.039432, 2.043243, 2.046958, 2.050717, 2.054525, 2.058259, 2.062061, 2.065876, 2.069614, 2.073355, 2.077088, 2.080785, 2.084718, 2.088553, 2.092425, 2.096199, 2.100051, 2.103804, 2.107621, 2.111306, 2.115119, 2.118934, 2.122774, 2.126461, 2.130186, 2.133929, 2.138015, 2.142064, 2.145936, 2.149954, 2.154017, 2.158076, 2.162151, 2.166164, 2.170209, 2.174277, 2.178377, 2.182462, 2.186546, 2.190577, 2.194729, 2.198879, 2.202956, 2.206999, 2.211082, 2.215137, 2.219714, 2.223821, 2.227967, 2.23195, 2.236188, 2.240282, 2.244508, 2.248528, 2.253001, 2.257062, 2.260775, 2.26449, 2.26827, 2.271974, 2.27586, 2.27955, 2.283298, 2.287022, 2.291152, 2.294938, 2.298685, 2.302778, 2.306849, 2.310658, 2.314544, 2.31831, 2.322394, 2.32605, 2.32987, 2.333698, 2.337437, 2.341182, 2.345005, 2.34876, 2.352569, 2.356376, 2.360134, 2.364034, 2.367964, 2.37184, 2.375545, 2.379438, 2.383379, 2.387339, 2.391142, 2.394906, 2.398693, 2.402497, 2.406504, 2.41057, 2.414689, 2.418899, 2.422887, 2.426878, 2.430959, 2.435028, 2.439019, 2.443112, 2.447217, 2.451287, 2.455362, 2.45949, 2.463611, 2.467772, 2.47187, 2.475972, 2.479994, 2.484032, 2.48808, 2.49212, 2.496206, 2.500232, 2.504135, 2.50815, 2.512201, 2.51628, 2.520372, 2.524532, 2.528658, 2.532678, 2.536735, 2.54081, 2.544923, 2.549217, 2.553315, 2.557379, 2.561276, 2.565641, 2.569674, 2.573681, 2.577671, 2.581804, 2.585869, 2.589953, 2.594021, 2.598085, 2.602181, 2.606295, 2.610406, 2.614487, 2.618623, 2.622705, 2.626847, 2.630905, 2.635085, 2.639106, 2.643155, 2.647159, 2.651243, 2.655269, 2.659197, 2.663295, 2.667602, 2.671687, 2.67576, 2.679843, 2.683944, 2.688016, 2.692112, 2.696236, 2.700372, 2.704445, 2.70853, 2.712623, 2.716699, 2.72076, 2.724839, 2.72885, 2.732816, 2.736763, 2.740849, 2.7449, 2.748923, 2.75301, 2.757039, 2.761132, 2.765273, 2.769375, 2.773469, 2.777546, 2.781795, 2.785899, 2.790323, 2.794637, 2.798642, 2.802619, 2.806734, 2.810795, 2.814839, 2.818922, 2.823184, 2.827298, 2.83134, 2.835513, 2.839612, 2.843685, 2.847809, 2.851764, 2.85589, 2.859924, 2.863977, 2.868064, 2.872165, 2.876165, 2.880486, 2.884786, 2.888665, 2.892703, 2.89675, 2.900837, 2.90493, 2.909027, 2.912964, 2.917028, 2.921053, 2.925123, 2.929084, 2.932936, 2.936897, 2.941065, 2.944716, 2.948758, 2.953063, 2.957168, 2.961299, 2.9655, 2.969656, 2.973764, 2.977888, 2.982019, 2.986127, 2.990213, 2.994297, 2.99842, 3.002562, 3.006733, 3.010751, 3.014984, 3.019331, 3.024464, 3.028573, 3.032703, 3.036863, 3.040886, 3.044854, 3.048933, 3.052981, 3.05705, 3.061055, 3.065067, 3.069092, 3.073127, 3.077119, 3.081162, 3.085219, 3.089329, 3.093414, 3.097799, 3.101855, 3.105834, 3.110263, 3.114151, 3.118194, 3.12226, 3.126271, 3.130519, 3.134647, 3.138789, 3.142932, 3.147041, 3.151138, 3.155264, 3.159402, 3.163461, 3.16747, 3.171495, 3.175614, 3.179641, 3.183685, 3.187786, 3.191843, 3.19585, 3.199456, 3.203718, 3.207761, 3.2113, 3.215493, 3.219852, 3.223911, 3.227965, 3.232013, 3.236068, 3.240206, 3.244631, 3.249724, 3.253518, 3.257158, 3.261786, 3.266072, 3.270172, 3.274644, 3.278665, 3.282899, 3.286922, 3.291225, 3.295356, 3.299504, 3.303491, 3.307285, 3.311034, 3.314839, 3.318937, 3.323087, 3.327105, 3.331214, 3.335152, 3.338979, 3.342832, 3.346996, 3.350817, 3.354622, 3.358296, 3.362174, 3.365926, 3.369658, 3.37342, 3.377334, 3.381511, 3.385678, 3.389713, 3.393813, 3.397939, 3.402019, 3.406491, 3.410612, 3.414701, 3.418814, 3.422893, 3.426976, 3.431095, 3.435193, 3.439316, 3.443456, 3.44757, 3.451711, 3.455953, 3.460114, 3.464181, 3.46825, 3.472349, 3.476459, 3.480549, 3.484657, 3.488645, 3.492776, 3.496889, 3.500996, 3.50516, 3.509304, 3.513499, 3.517632, 3.521803, 3.525979, 3.530104, 3.53423, 3.538354, 3.542448, 3.546542, 3.550668, 3.55479, 3.558911, 3.563002, 3.567115, 3.571197, 3.575558, 3.579627, 3.583637, 3.587522, 3.591372, 3.595322, 3.599258, 3.603038, 3.606988, 3.611072, 3.614899, 3.619002, 3.622814, 3.626647, 3.630539, 3.634514, 3.638277, 3.642025, 3.646077, 3.649903, 3.653809, 3.657682, 3.661594, 3.665488, 3.669333, 3.673179, 3.677069, 3.680982, 3.684911, 3.688812, 3.692665, 3.696565, 3.700428, 3.70434, 3.708267, 3.712186, 3.71609, 3.719983, 3.723809, 3.727644, 3.731503, 3.735315, 3.739777, 3.744071, 3.747894, 3.751767, 3.755725, 3.75964, 3.763563, 3.767417, 3.771312, 3.775168, 3.778988, 3.782861, 3.786737, 3.790618, 3.794515, 3.798417, 3.802318, 3.806236, 3.8101, 3.813971, 3.817811, 3.821644, 3.825549, 3.829399, 3.833148, 3.836982, 3.840837, 3.844692, 3.848503, 3.852311, 3.856207, 3.860048, 3.863916, 3.867794, 3.871656, 3.875564, 3.879432, 3.883356, 3.887356, 3.891278, 3.895183, 3.899093, 3.902972, 3.906819, 3.910658, 3.914645, 3.918466, 3.922563, 3.926433, 3.930425, 3.934283, 3.938165, 3.941975, 3.945896, 3.949832, 3.953537, 3.957283, 3.961201, 3.964981, 3.968834, 3.972712, 3.976632, 3.980532, 3.984372, 3.988239, 3.992231, 3.996046, 3.999892, 4.003723, 4.007598, 4.011468, 4.015336, 4.019103, 4.023001, 4.026826, 4.030735, 4.03463, 4.038477, 4.042335, 4.0462, 4.050021, 4.053748, 4.057581, 4.061407, 4.065289, 4.069148, 4.073052, 4.076856, 4.08071, 4.084501, 4.088363, 4.092205, 4.096068, 4.100137, 4.103936, 4.107743, 4.111569, 4.115278, 4.118984, 4.122823, 4.126649, 4.130495, 4.13437, 4.138255, 4.142108, 4.146012, 4.14988, 4.153851, 4.157793, 4.16169, 4.165596, 4.169435, 4.173295, 4.177046, 4.180911, 4.184771, 4.188605, 4.19235, 4.196163, 4.199957, 4.203843, 4.207731, 4.211587, 4.215439, 4.219294, 4.223136, 4.226986, 4.230819, 4.234739, 4.238557, 4.242515, 4.246795, 4.250708, 4.25452, 4.258544, 4.262573, 4.266443, 4.270319, 4.274167, 4.278005, 4.281787, 4.285642, 4.289504, 4.293387, 4.297259, 4.301183, 4.305067, 4.308901, 4.312758, 4.316604, 4.320621, 4.324542, 4.32842, 4.332259, 4.336156, 4.339984, 4.343795, 4.347636, 4.351488, 4.355345, 4.359281, 4.363159, 4.367006, 4.370765, 4.374525, 4.378367, 4.382214, 4.385957, 4.389802, 4.393693, 4.397577, 4.401403, 4.405262, 4.409138, 4.413017, 4.416822, 4.420691, 4.424557, 4.428468, 4.432347, 4.43624, 4.440166, 4.444015, 4.448078, 4.451906, 4.455743, 4.459596, 4.463435, 4.467282, 4.471241, 4.475054, 4.478922, 4.482781, 4.486666, 4.4906, 4.494412, 4.498271, 4.502094, 4.505983, 4.509813, 4.513644, 4.517549, 4.521428, 4.525285, 4.52912, 4.532908, 4.536811, 4.540684, 4.544501, 4.548371, 4.552323, 4.556093, 4.55998, 4.563858, 4.567666, 4.571509, 4.575405, 4.579246, 4.583099, 4.58696, 4.590796, 4.594642, 4.598564, 4.602334, 4.606172, 4.610086, 4.61406, 4.617953, 4.621769, 4.625648, 4.629493, 4.633589, 4.637435, 4.64125, 4.645121, 4.648984, 4.652828, 4.656676, 4.660442, 4.664249, 4.668147, 4.671988, 4.675838, 4.679711, 4.683635, 4.687461, 4.69131, 4.695142, 4.698978, 4.702794, 4.706605, 4.710439, 4.714299, 4.718112, 4.721958, 4.725818, 4.72965, 4.733483, 4.737289, 4.74116, 4.745003, 4.74873, 4.752683, 4.75651, 4.760336, 4.764214, 4.768039, 4.771814, 4.775629, 4.779547, 4.783369, 4.787195, 4.791084, 4.794924, 4.798761, 4.802632, 4.806485, 4.810382, 4.814213, 4.818111, 4.821931, 4.825723, 4.829555, 4.833424, 4.837302, 4.841133, 4.845005, 4.848927, 4.852723, 4.85657, 4.860412, 4.864275, 4.868194, 4.872057, 4.87593, 4.87977, 4.883617, 4.887543, 4.891387, 4.895278, 4.899178, 4.903058, 4.906955, 4.910806, 4.914636, 4.918802, 4.922827, 4.926748, 4.930705, 4.93452, 4.938366, 4.942196, 4.946017, 4.949885, 4.953757, 4.957634, 4.961535, 4.965411, 4.969268, 4.973117, 4.976939, 4.980758, 4.984594, 4.988415, 4.9923, 4.996156, 4.999984, 5.003807, 5.007599, 5.011385, 5.01523, 5.019109, 5.022881, 5.026659, 5.030493, 5.03423, 5.03797, 5.041747, 5.045466, 5.049442, 5.05324, 5.05702, 5.060711, 5.064446, 5.068127, 5.07183, 5.075677, 5.07934, 5.083082, 5.086982, 5.090697, 5.094382, 5.098089, 5.101873, 5.105555, 5.109512, 5.113217, 5.117004, 5.120737, 5.12453, 5.128277, 5.132008, 5.135743, 5.139435, 5.143146, 5.146846, 5.150515, 5.154275, 5.158049, 5.161807, 5.165596, 5.169324, 5.173147, 5.176822, 5.180522, 5.184306, 5.18797, 5.191698, 5.195428, 5.199173, 5.202909, 5.206733, 5.210477, 5.214373, 5.218098, 5.221846, 5.225649, 5.229489, 5.233209, 5.23689, 5.240616, 5.244323, 5.248034, 5.25174, 5.255691, 5.25936, 5.263004, 5.266762, 5.270425, 5.274182, 5.277942, 5.281522, 5.285388, 5.289136, 5.292799, 5.296418, 5.300062, 5.303824, 5.307531, 5.311233, 5.31493, 5.318648, 5.322308, 5.326042, 5.32989, 5.334001, 5.337638, 5.341309, 5.34502, 5.348712, 5.352568, 5.356389, 5.360139, 5.363821, 5.367527, 5.371228, 5.374963, 5.378699, 5.38241, 5.386038, 5.38975, 5.393433, 5.397127, 5.400884, 5.404603, 5.408283, 5.411944, 5.415578, 5.419224, 5.422904, 5.426615, 5.430287, 5.433994, 5.437692, 5.441422, 5.445253, 5.449508, 5.453212, 5.456962, 5.460654, 5.464443, 5.468222, 5.471868, 5.475509, 5.479144, 5.483056, 5.486735, 5.490478, 5.494166, 5.497831, 5.501482, 5.505137, 5.508903, 5.512614, 5.516281, 5.52004, 5.523752, 5.527419, 5.531094, 5.534761, 5.538516, 5.542203, 5.545956, 5.549704, 5.553381, 5.557072, 5.560771, 5.564458, 5.568096, 5.571772, 5.575448, 5.579134, 5.582833, 5.586521, 5.590384, 5.594123, 5.59776, 5.601396, 5.60511, 5.608833, 5.612513, 5.616282, 5.62008, 5.623789, 5.627484, 5.631168, 5.634908, 5.638602, 5.642446, 5.646287, 5.649941, 5.653684, 5.657471, 5.661459, 5.665251, 5.668944, 5.672691, 5.676482, 5.680268, 5.684012, 5.687687, 5.691429, 5.69511, 5.698839, 5.70253, 5.706258, 5.709981, 5.713641, 5.717515, 5.721229, 5.724888, 5.728633, 5.732345, 5.736131, 5.739811, 5.743574, 5.747359, 5.751055, 5.754858, 5.758571, 5.762387, 5.766115, 5.769826, 5.773756, 5.777546, 5.781246, 5.784943, 5.788695, 5.792401, 5.796118, 5.799848, 5.803584, 5.807263, 5.810932, 5.814566, 5.818292, 5.822175, 5.826059, 5.829719, 5.833316, 5.837187, 5.840882, 5.844654, 5.848408, 5.852134, 5.855972, 5.860031, 5.86374, 5.867492, 5.871228, 5.87493, 5.878518, 5.882194, 5.885955, 5.889701, 5.893313, 5.896907, 5.900697, 5.904477, 5.90814, 5.912022, 5.915734, 5.919327, 5.923056, 5.926725, 5.930458, 5.934098, 5.937825, 5.941481, 5.945063, 5.948708, 5.952373, 5.955978, 5.959578, 5.963434, 5.96712, 5.970703, 5.974313, 5.977925, 5.981484, 5.98514, 5.988742, 5.992402, 5.996006, 5.999569, 6.003121, 6.00672, 6.010414, 6.014077, 6.017644, 6.021235, 6.024847, 6.028544, 6.032421, 6.03599, 6.039656, 6.043233, 6.047035, 6.050698, 6.054557, 6.058219, 6.061836, 6.065516, 6.069187, 6.0731, 6.076822, 6.080566, 6.084428, 6.088567, 6.092315, 6.096074, 6.099737, 6.103419, 6.107222, 6.111022, 6.115026, 6.119211, 6.122867, 6.12655, 6.130355, 6.134204, 6.137875, 6.141743, 6.145429, 6.14914, 6.153117, 6.156839, 6.160558, 6.164264, 6.168258, 6.172108, 6.175809, 6.179487, 6.183325, 6.18696, 6.19064, 6.194302, 6.197976, 6.20185, 6.205564, 6.209415, 6.213176, 6.216994, 6.220754, 6.224416, 6.228117, 6.231821, 6.235548, 6.2392, 6.242913, 6.246621, 6.250336, 6.254039, 6.257747, 6.261409, 6.26526, 6.268914, 6.272586, 6.276582, 6.280569, 6.284376, 6.288004, 6.292043, 6.295746, 6.299449, 6.303297, 6.307067, 6.310734, 6.315132, 6.318778, 6.322516, 6.32629, 6.329999, 6.333689, 6.337769, 6.341541, 6.345155, 6.348895, 6.352532, 6.3562, 6.359955, 6.363781, 6.367469, 6.371316, 6.375211, 6.379134, 6.382955, 6.386655, 6.390417, 6.39438, 6.398576, 6.402337, 6.406353, 6.410339, 6.414046, 6.41788, 6.421705, 6.425376, 6.429215, 6.432921, 6.436793, 6.440567, 6.444208, 6.448097, 6.451728, 6.455707, 6.459488, 6.463432, 6.467132, 6.470778, 6.474481, 6.478296, 6.48224, 6.485986, 6.489657, 6.49355, 6.497392, 6.501097, 6.505061, 6.508926, 6.512898, 6.51674, 6.520532, 6.524569, 6.528364, 6.532405, 6.536235, 6.539984, 6.543764, 6.547676, 6.551698, 6.556066, 6.560174, 6.564033, 6.567979, 6.571775, 6.575473, 6.579299, 6.583077, 6.586993, 6.591174, 6.595109, 6.599514, 6.603207, 6.606893, 6.610622, 6.614395, 6.61826, 6.621982, 6.625798, 6.629575, 6.633411, 6.637344, 6.641157, 6.644994, 6.649137, 6.653058, 6.656816, 6.660628, 6.664437, 6.668231, 6.672045, 6.675858, 6.6797, 6.68353, 6.687334, 6.691106, 6.694764, 6.698582, 6.702355, 6.706242, 6.710218, 6.713927, 6.717716, 6.721586, 6.725922, 6.730109, 6.733879, 6.737595, 6.741552, 6.74537, 6.749284, 6.75307, 6.756811, 6.760619, 6.764454, 6.768145, 6.771952, 6.776163, 6.780059, 6.783784, 6.78775, 6.791606, 6.79546, 6.799438, 6.803365, 6.807214, 6.811003, 6.815088, 6.819149, 6.823002, 6.826826, 6.830591, 6.834485, 6.838319, 6.842247, 6.846092, 6.849829, 6.854044, 6.857799, 6.861589, 6.865533, 6.869371, 6.873456, 6.87755, 6.881947, 6.885959, 6.889814, 6.893534, 6.897397, 6.901418, 6.905247, 6.909329, 6.913235, 6.91702, 6.920997, 6.925293, 6.929142, 6.932973, 6.936768, 6.940592, 6.944651, 6.948647, 6.953125, 6.956861, 6.960746, 6.964737, 6.968633, 6.972483, 6.97632, 6.981072, 6.985266, 6.989219, 6.993323, 6.99729, 7.001116, 7.005094, 7.009408, 7.013549, 7.017371, 7.021339, 7.025297, 7.029815, 7.033888, 7.037792, 7.041699, 7.045566, 7.049483, 7.053953, 7.057997, 7.061883, 7.065924, 7.06982, 7.073629, 7.077584, 7.081758, 7.086016, 7.090896, 7.094898, 7.099023, 7.102869, 7.106753, 7.110624, 7.114499, 7.118239, 7.122155, 7.126079, 7.129766, 7.133579, 7.137577, 7.141441, 7.145553, 7.14944, 7.153372, 7.157972, 7.162, 7.166741, 7.171118, 7.175161, 7.179501, 7.183489, 7.187496, 7.191414, 7.195809, 7.199787, 7.203801, 7.208027, 7.21216, 7.216162, 7.220246, 7.224226, 7.228193, 7.23203, 7.235863, 7.23977, 7.243649, 7.247603, 7.25167, 7.258439, 7.264049, 7.268119, 7.271996, 7.276084, 7.28003, 7.284171, 7.288168, 7.292171, 7.296052, 7.300186, 7.304138, 7.308021, 7.311839, 7.315807, 7.319806, 7.323689, 7.327524, 7.331725, 7.335571, 7.339588, 7.343768, 7.348065, 7.352274, 7.356449, 7.360556, 7.364896, 7.369031, 7.373654, 7.377643, 7.382344, 7.386631, 7.390847, 7.395048, 7.399483, 7.40358, 7.407887, 7.411933, 7.416611, 7.420608, 7.424611, 7.428443, 7.432475, 7.43636, 7.440676, 7.444615, 7.44888, 7.452899, 7.457106, 7.460982, 7.465433, 7.470386, 7.474943, 7.478972, 7.483062, 7.487985, 7.492687, 7.496748, 7.500463, 7.50437, 7.508279, 7.512119, 7.516482, 7.520368, 7.524358, 7.528404, 7.532248, 7.536273, 7.540317, 7.544287, 7.548372, 7.552405, 7.556665, 7.560699, 7.564616, 7.568763, 7.572758, 7.576792, 7.580748, 7.584723, 7.589014, 7.593503, 7.59767, 7.601775, 7.606098, 7.610182, 7.614153, 7.618276, 7.622293, 7.626338, 7.630467, 7.634481, 7.638623, 7.642875, 7.646725, 7.650976, 7.65543, 7.659787, 7.663994, 7.668659, 7.672874, 7.677904, 7.682139, 7.686404, 7.690666, 7.694675, 7.698834, 7.702914, 7.707006, 7.711131, 7.715257, 7.720953, 7.725115, 7.729073, 7.73315, 7.737278, 7.741335, 7.745455, 7.749445, 7.753286, 7.757392, 7.761567, 7.765893, 7.770319, 7.774726, 7.779123, 7.783328, 7.787571, 7.79168, 7.796365, 7.800366, 7.804559, 7.808774, 7.812928, 7.817003, 7.821142, 7.825336, 7.829464, 7.833707, 7.837792, 7.84199, 7.846207, 7.850369, 7.854496, 7.858372, 7.862422, 7.86639, 7.870404, 7.874444, 7.878562, 7.882841, 7.887046, 7.89104, 7.895074, 7.898989, 7.903311, 7.907438, 7.911396, 7.915495, 7.919609, 7.9237, 7.927763, 7.931818, 7.93572, 7.939839, 7.944012, 7.947982, 7.952118, 7.956286, 7.96028, 7.964344, 7.968496, 7.972669, 7.976817, 7.981001, 7.985095, 7.989238, 7.993301, 7.997516, 8.001725, 8.005876, 8.010043, 8.01416, 8.018358, 8.022514, 8.026659, 8.030662, 8.034738, 8.03899, 8.043078, 8.047198, 8.051269, 8.055391, 8.059573, 8.063598, 8.067689, 8.07178, 8.075929, 8.07999, 8.084082, 8.08821, 8.092303, 8.096305, 8.100473, 8.104628, 8.10865, 8.112824, 8.116967, 8.121148, 8.125307, 8.129395, 8.133313, 8.137449, 8.141593, 8.14571, 8.14987, 8.153684, 8.157925, 8.162134, 8.166211, 8.170299, 8.174436, 8.178596, 8.182789, 8.186976, 8.191119, 8.195315, 8.199408, 8.203569, 8.207689, 8.211876, 8.216005, 8.220131, 8.224268, 8.228328, 8.232508, 8.236608, 8.240745, 8.244876, 8.249347, 8.253347, 8.257444, 8.261709, 8.265868, 8.269951, 8.274131, 8.278251, 8.282409, 8.286438, 8.290516, 8.294595, 8.298724, 8.302705, 8.307938, 8.312038, 8.316182, 8.320267, 8.32448, 8.328644, 8.332842, 8.337587, 8.341656, 8.345797, 8.350088, 8.35415, 8.358483, 8.362418, 8.366629, 8.370796, 8.375001, 8.379128, 8.383134, 8.387228, 8.391431, 8.395573, 8.399671, 8.403893, 8.408039, 8.412216, 8.416432, 8.420578, 8.424765, 8.428863, 8.43299, 8.437277, 8.441659, 8.446607, 8.450719, 8.454834, 8.459124, 8.463214, 8.467321, 8.471481, 8.475644, 8.479614, 8.48384, 8.48797, 8.492039, 8.496077, 8.500255, 8.504361, 8.508457, 8.512778, 8.516919, 8.521123, 8.525214, 8.529568, 8.53383, 8.538126, 8.542384, 8.546501, 8.550696, 8.554869, 8.558976, 8.56341, 8.567755, 8.571845, 8.576008, 8.580068, 8.584162, 8.588366, 8.592666, 8.596856, 8.601056, 8.605197, 8.609305, 8.613519, 8.617694, 8.621821, 8.626006, 8.630188, 8.634266, 8.638471, 8.6429, 8.647007, 8.651162, 8.65541, 8.659614, 8.66373, 8.667926, 8.672058, 8.676203, 8.68051, 8.684616, 8.688729, 8.693715, 8.697925, 8.702074, 8.706235, 8.710383, 8.714572, 8.718792, 8.722961, 8.727094, 8.731237, 8.735427, 8.739583, 8.743962, 8.74814, 8.752319, 8.756518, 8.760689, 8.764824, 8.768994, 8.773187, 8.777534, 8.781694, 8.785799, 8.789953, 8.794118, 8.798288, 8.80252, 8.806681, 8.811122, 8.81527, 8.819445, 8.823995, 8.828285, 8.832491, 8.836676, 8.840836, 8.845006, 8.8492, 8.853376, 8.857601, 8.861827, 8.865938, 8.87012, 8.874233, 8.878395, 8.882585, 8.886768, 8.890864, 8.895563, 8.899876, 8.903981, 8.908119, 8.912343, 8.916503, 8.920769, 8.925218, 8.929669, 8.933749, 8.937825, 8.941998, 8.946072, 8.950229, 8.954394, 8.958497, 8.962645, 8.966764, 8.970968, 8.975454, 8.979631, 8.983666, 8.988207, 8.992948, 8.99692, 9.001194, 9.005352, 9.009501, 9.013499, 9.01768, 9.021796, 9.025919, 9.030103, 9.034279, 9.038345, 9.042445, 9.046556, 9.050749, 9.054877, 9.058975, 9.063198, 9.067361, 9.071561, 9.07565, 9.079821, 9.084013, 9.088292, 9.092406, 9.096568, 9.100646, 9.104799, 9.10904, 9.113229, 9.117361, 9.121964, 9.126177, 9.130308, 9.134431, 9.138541, 9.142731, 9.146898, 9.151119, 9.155358, 9.159518, 9.163738, 9.167914, 9.172056, 9.176217, 9.180488, 9.184672, 9.18888, 9.193084, 9.197278, 9.201485, 9.205699, 9.209879, 9.214096, 9.218274, 9.222501, 9.226634, 9.230763, 9.234952, 9.239031, 9.243153, 9.247348, 9.251503, 9.255729, 9.259981, 9.264243, 9.268422, 9.272571, 9.276717, 9.280972, 9.285168, 9.289353, 9.293574, 9.297676, 9.301811, 9.306, 9.310089, 9.314216, 9.318315, 9.322493, 9.326688, 9.330852, 9.335026, 9.339155, 9.343295, 9.347409, 9.351609, 9.355822, 9.359955, 9.364153, 9.368339, 9.372421, 9.376566, 9.380718, 9.384687, 9.388854, 9.392999, 9.397197, 9.401445, 9.405655, 9.409753, 9.414004, 9.418361, 9.422679, 9.427086, 9.431042, 9.435248, 9.439398, 9.443698, 9.44841, 9.452432, 9.456467, 9.460591, 9.464669, 9.468853, 9.473072, 9.47718, 9.481345, 9.485548, 9.48958, 9.493627, 9.49776, 9.501991, 9.506243, 9.510342, 9.514545, 9.518685, 9.522851, 9.52699, 9.531086, 9.535248, 9.539408, 9.543529, 9.547647, 9.551876, 9.556051, 9.560157, 9.564307, 9.568814, 9.572929, 9.577079, 9.581469, 9.585676, 9.589666, 9.593757, 9.597841, 9.602016, 9.606209, 9.610379, 9.614421, 9.618495, 9.623062, 9.627813, 9.633156, 9.637352, 9.641519, 9.645649, 9.649798, 9.653999, 9.658186, 9.662224, 9.666386, 9.670547, 9.674711, 9.67882, 9.682975, 9.68707, 9.691199, 9.695114, 9.699284, 9.703329, 9.707507, 9.711612, 9.715747, 9.719905, 9.724119, 9.728264, 9.732384, 9.736693, 9.740838, 9.745112, 9.749332, 9.753475, 9.757643, 9.761828, 9.765952, 9.770118, 9.774065, 9.77793, 9.78206, 9.785994, 9.790121, 9.794061, 9.798119, 9.80241, 9.806297, 9.810459, 9.814432, 9.818417, 9.822441, 9.826498, 9.830616, 9.834954, 9.839089, 9.842866, 9.84681, 9.851426, 9.855387, 9.85941, 9.86369, 9.867588, 9.87164, 9.87586, 9.880363, 9.884711, 9.88869, 9.892805, 9.896669, 9.900863, 9.904963, 9.909071, 9.913109, 9.917119, 9.921167, 9.925292, 9.92929, 9.933293, 9.937147, 9.941098, 9.945156, 9.949196, 9.95315, 9.95719, 9.961158, 9.965374, 9.969313, 9.973334, 9.977319, 9.981446, 9.985566, 9.989667, 9.993655, 9.997768, 10.001633, 10.005554, 10.009659, 10.013817, 10.017935, 10.021854, 10.025838, 10.029786, 10.033876, 10.037909, 10.041987, 10.046086, 10.050608, 10.054824, 10.058882, 10.063001, 10.067228, 10.071555, 10.076342, 10.080441, 10.084481, 10.088706, 10.092952, 10.097039, 10.101127, 10.10568, 10.109771, 10.113738, 10.117756, 10.121731, 10.125741, 10.129762, 10.133976, 10.13784, 10.141666, 10.145693, 10.149692, 10.153802, 10.158491, 10.162548, 10.166559, 10.170695, 10.174635, 10.178694, 10.182662, 10.186667, 10.190661, 10.19469, 10.198768, 10.202689, 10.206663, 10.210681, 10.214731, 10.218693, 10.222616, 10.226706, 10.230826, 10.234924, 10.238967, 10.24293, 10.246838, 10.250866, 10.25485, 10.258748, 10.262759, 10.266884, 10.270951, 10.274974, 10.279081, 10.282966, 10.286921, 10.291114, 10.295172, 10.299236, 10.303329, 10.307357, 10.311622, 10.31563, 10.319602, 10.323583, 10.327549, 10.331558, 10.335463, 10.339634, 10.343606, 10.347593, 10.351803, 10.355876, 10.359835, 10.36385, 10.367912, 10.371887, 10.375853, 10.37997, 10.384056, 10.388154, 10.392156, 10.396174, 10.400313, 10.404251, 10.408241, 10.412256, 10.416385, 10.420338, 10.424321, 10.428315, 10.432472, 10.436546, 10.440783, 10.444818, 10.44897, 10.453047, 10.456973, 10.460923, 10.464832, 10.468733, 10.472761, 10.476677, 10.480758, 10.484735, 10.488885, 10.49287, 10.496891, 10.500949, 10.505154, 10.509184, 10.513197, 10.517186, 10.521448, 10.525336, 10.529518, 10.533581, 10.537552, 10.541601, 10.545768, 10.550045, 10.553965, 10.558091, 10.56222, 10.56622, 10.570176, 10.574156, 10.578207, 10.582367, 10.58655, 10.590764, 10.594812, 10.598781, 10.602807, 10.607056, 10.611209, 10.615217, 10.619292, 10.623439, 10.627403, 10.631435, 10.63547, 10.63942, 10.643363, 10.647471, 10.651499, 10.655455, 10.659583, 10.663642, 10.667764, 10.671725, 10.675814, 10.679866, 10.683991, 10.688021, 10.692063, 10.696103, 10.700213, 10.704263, 10.708334, 10.712445, 10.716663, 10.720616, 10.724853, 10.728956, 10.733087, 10.737097, 10.741132, 10.745123, 10.749184, 10.753168, 10.757189, 10.761306, 10.765351, 10.769437, 10.773569, 10.777563, 10.781547, 10.785506, 10.789545, 10.79373, 10.79786, 10.801893, 10.805902, 10.809864, 10.813741, 10.817754, 10.82173, 10.825688, 10.829816, 10.833965, 10.838056, 10.842151, 10.846122, 10.850406, 10.854589, 10.858553, 10.862625, 10.866944, 10.871032, 10.875101, 10.879194, 10.883283, 10.887425, 10.89159, 10.895717, 10.899873, 10.904008, 10.908139, 10.912076, 10.916063, 10.920318, 10.924486, 10.928582, 10.932729, 10.936828, 10.940878, 10.944841, 10.948771, 10.952819, 10.956978, 10.960975, 10.964921, 10.968973, 10.973056, 10.977119, 10.981293, 10.985321, 10.989546, 10.993912, 10.997943, 11.001865, 11.005909, 11.010073, 11.014088, 11.018046, 11.022181, 11.026298, 11.030312, 11.034298, 11.038409, 11.042502, 11.046661, 11.050663, 11.054678, 11.05875, 11.062758, 11.066753, 11.070849, 11.07473, 11.078835, 11.082852, 11.086866, 11.091081, 11.09529, 11.099652, 11.103834, 11.108003, 11.112, 11.11608, 11.120307, 11.124699, 11.128989, 11.133286, 11.137369, 11.141399, 11.145361, 11.149281, 11.153227, 11.157521, 11.161649, 11.1658, 11.169926, 11.174062, 11.17825, 11.182425, 11.186436, 11.190505, 11.194605, 11.198747, 11.202847, 11.206967, 11.211177, 11.215091, 11.219539, 11.22356, 11.227738, 11.231777, 11.235849, 11.239965, 11.243945, 11.247982, 11.252006, 11.256236, 11.26052, 11.264499, 11.26853, 11.27263, 11.276729, 11.280812, 11.284937, 11.288967, 11.293127, 11.29754, 11.301692, 11.305836, 11.309934, 11.31393, 11.317997, 11.322136, 11.326308, 11.330296, 11.334374, 11.338432, 11.342432, 11.346416, 11.3505, 11.354667, 11.358955, 11.362895, 11.366972, 11.371104, 11.375175, 11.379233, 11.383306, 11.387617, 11.391818, 11.395885, 11.39998, 11.404173, 11.408267, 11.412501, 11.41664, 11.42081, 11.424882, 11.429002, 11.433146, 11.43718, 11.441207, 11.445326, 11.449274, 11.453304, 11.457296, 11.461415, 11.465511, 11.469432, 11.473384, 11.477559, 11.481532, 11.485615, 11.48968, 11.493933, 11.498118, 11.502374, 11.506465, 11.510546, 11.514693, 11.518822, 11.52302, 11.527213, 11.531291, 11.535421, 11.539508, 11.543641, 11.547681, 11.551673, 11.555722, 11.559854, 11.564008, 11.568021, 11.572047, 11.576195, 11.580248, 11.584301, 11.588242, 11.592392, 11.596653, 11.600762, 11.60494, 11.609041, 11.613322, 11.617451, 11.621535, 11.62578, 11.629876, 11.634032, 11.638315, 11.642306, 11.646399, 11.65072, 11.65482, 11.658961, 11.663006, 11.666987, 11.670943, 11.675026, 11.679155, 11.683192, 11.687409, 11.691528, 11.695518, 11.699673, 11.703799, 11.707854, 11.711998, 11.716076, 11.720227, 11.724459, 11.728552, 11.732573, 11.736637, 11.740686, 11.744789, 11.748903, 11.753172, 11.757113, 11.761138, 11.765315, 11.769437, 11.773511, 11.777539, 11.781696, 11.785772, 11.790033, 11.794057, 11.798261, 11.802388, 11.806781, 11.810926, 11.81502, 11.819075, 11.82334, 11.827435, 11.831556, 11.835612, 11.839826, 11.843797, 11.847981, 11.852244, 11.856475, 11.860718, 11.864864, 11.868913, 11.884978, 11.889108, 11.893081, 11.897122, 11.901204, 11.90529, 11.909419, 11.913435, 11.917443, 11.921651, 11.925819, 11.929955, 11.934188, 11.938251, 11.942328, 11.946337, 11.95042, 11.954483, 11.958535, 11.962576, 11.966678, 11.970693, 11.974729, 11.97894, 11.982992, 11.987205, 11.99131, 11.995404, 11.99955, 12.003789, 12.008144, 12.012215, 12.016339, 12.02039, 12.024495, 12.028734, 12.032868, 12.036987, 12.041079, 12.045339, 12.049398, 12.053513, 12.057721, 12.061679, 12.065758, 12.069982, 12.074122, 12.078165, 12.082402, 12.086615, 12.090751, 12.094798, 12.098894, 12.103055, 12.107071, 12.111126, 12.115148, 12.119267, 12.12339, 12.127556, 12.131515, 12.135715, 12.139683, 12.143767, 12.147911, 12.151886, 12.156006, 12.16029, 12.165126, 12.169252, 12.173284, 12.177403, 12.181561, 12.185732, 12.18972, 12.193755, 12.197792, 12.201794, 12.205984, 12.210095, 12.214125, 12.218275, 12.222561, 12.226719, 12.230886, 12.234779, 12.238697, 12.242808, 12.247027, 12.251123, 12.25518, 12.259179, 12.2632, 12.267442, 12.271506, 12.275655, 12.279661, 12.283846, 12.287869, 12.291821, 12.295884, 12.3, 12.304015, 12.308098, 12.312062, 12.316175, 12.320269, 12.324493, 12.328496, 12.332524, 12.336522, 12.340728, 12.344762, 12.349026, 12.353143, 12.357134, 12.361327, 12.36529, 12.369292, 12.373394, 12.37738, 12.381471, 12.385777, 12.389878, 12.393903, 12.398016, 12.402066, 12.406362, 12.410522, 12.414628, 12.418625, 12.422681, 12.426747, 12.430841, 12.434813, 12.438822, 12.442702, 12.446714, 12.450967, 12.455081, 12.45904, 12.462995, 12.467041, 12.471118, 12.475281, 12.479346, 12.483431, 12.487499, 12.491545, 12.49565, 12.499748, 12.504021, 12.508186, 12.512249, 12.516407, 12.52038, 12.524281, 12.528457, 12.532573, 12.536756, 12.540899, 12.545119, 12.54929, 12.553412, 12.557598, 12.561607, 12.565673, 12.569682, 12.573638, 12.577701, 12.581829, 12.58585, 12.589755, 12.593968, 12.59819, 12.602346, 12.606561, 12.610731, 12.614822, 12.618846, 12.62274, 12.626839, 12.630898, 12.634828, 12.638805, 12.642717, 12.646824, 12.650957, 12.655057, 12.659084, 12.663179, 12.667478, 12.671705, 12.675967, 12.680009, 12.684182, 12.688441, 12.69242, 12.696608, 12.700639, 12.704641, 12.708577, 12.71259, 12.716528, 12.720573, 12.724818, 12.7289, 12.733011, 12.737043, 12.741121, 12.745092, 12.749165, 12.753239, 12.757511, 12.761514, 12.765432, 12.769508, 12.773575, 12.777417, 12.781446, 12.785567, 12.789832, 12.794008, 12.798166, 12.802123, 12.806143, 12.810172, 12.814299, 12.81829, 12.822431, 12.826702, 12.83101, 12.834998, 12.838941, 12.842919, 12.84704, 12.851505, 12.855793, 12.86, 12.863963, 12.868008, 12.872404, 12.876482, 12.880495, 12.884463, 12.888571, 12.892643, 12.896908, 12.900884, 12.905081, 12.909119, 12.913065, 12.917218, 12.921321, 12.925505, 12.929623, 12.933815, 12.937911, 12.941949, 12.946021, 12.95, 12.954169, 12.958198, 12.962493, 12.966575, 12.970437, 12.974498, 12.978537, 12.982648, 12.986813, 12.99103, 12.995072, 12.999007, 13.003028, 13.007083, 13.011053, 13.015098, 13.019055, 13.022731, 13.026736, 13.030573, 13.03444, 13.038366, 13.041965, 13.045511, 13.049475, 13.053133, 13.057131, 13.061213, 13.065277, 13.069345, 13.073493, 13.077549, 13.081529, 13.085527, 13.089658, 13.093741, 13.098322, 13.10195, 13.106112, 13.110031, 13.114105, 13.118136, 13.122154, 13.126293, 13.13052, 13.134616, 13.138754, 13.142671, 13.146712, 13.150731, 13.154875, 13.159014, 13.16303, 13.167117, 13.171155, 13.175212, 13.179339, 13.183476, 13.187476, 13.191588, 13.195658, 13.199814, 13.208148, 13.215483, 13.221864, 13.226236, 13.231111, 13.235029, 13.239135, 13.243288, 13.24779, 13.252148, 13.256251, 13.260513, 13.264561, 13.269365, 13.273809, 13.278147, 13.283158, 13.287126, 13.291434, 13.295653, 13.299614, 13.304883, 13.309623, 13.318382, 13.323558, 13.329055, 13.333275, 13.338565, 13.344385, 13.35061, 13.355185, 13.359496, 13.365278, 13.369929, 13.37611, 13.380359, 13.384974, 13.389054, 13.393184, 13.397259, 13.402777, 13.408163, 13.412422, 13.417492, 13.421835, 13.426457, 13.430717, 13.434863, 13.440308, 13.445168, 13.450435, 13.454773, 13.4605, 13.464964, 13.469457, 13.47578, 13.480547, 13.485599, 13.490115, 13.494249, 13.49856, 13.502616, 13.506655, 13.510823, 13.514824, 13.51878, 13.522817, 13.526902, 13.531078, 13.535119, 13.539131, 13.543266, 13.547306, 13.551384, 13.555332, 13.559388, 13.563439, 13.567358, 13.571434, 13.575491, 13.579489, 13.583544, 13.587643, 13.591883, 13.595878, 13.600145, 13.604205, 13.608316, 13.612512, 13.616719, 13.620846, 13.625009, 13.629282, 13.63365, 13.637681, 13.641675, 13.645711, 13.649622, 13.65394, 13.657906, 13.661965, 13.666193, 13.670206, 13.67408, 13.678389, 13.682534, 13.686742, 13.690845, 13.694916, 13.69913, 13.703218, 13.707842, 13.712095, 13.716032, 13.720167, 13.72417, 13.728366, 13.732827, 13.736797, 13.741358, 13.745589, 13.750023, 13.754125, 13.758692, 13.762728, 13.766644, 13.770893, 13.774646, 13.779702, 13.783543, 13.787464, 13.791159, 13.795051, 13.798914, 13.802649, 13.806658, 13.810893, 13.815075, 13.81926, 13.823461, 13.827546, 13.832326, 13.836172, 13.840315, 13.844202, 13.848193, 13.852336, 13.856473, 13.860511, 13.864474, 13.868554, 13.872665, 13.876784, 13.880945, 13.885035, 13.889269, 13.893387, 13.897573, 13.901639, 13.905756, 13.909818, 13.913851, 13.917939, 13.921933, 13.926175, 13.930347, 13.934202, 13.938276, 13.94245, 13.946501, 13.950649, 13.95483, 13.958883, 13.963065, 13.96723, 13.971381, 13.975552, 13.979646, 13.983803, 13.988062, 13.992221, 13.996406, 14.000514, 14.004551, 14.008642, 14.012833, 14.017027, 14.021105, 14.025387, 14.029553, 14.033605, 14.037732, 14.04169, 14.045926, 14.049947, 14.054092, 14.058205, 14.062394, 14.066512, 14.070664, 14.074801, 14.078959, 14.083029, 14.087073, 14.09122, 14.095337, 14.099526, 14.10365, 14.107792, 14.111843, 14.115986, 14.121627, 14.128373, 14.132383, 14.136601, 14.141171, 14.145234, 14.149621, 14.15356, 14.157208, 14.160998, 14.164804, 14.168817, 14.172891, 14.176901, 14.18061, 14.184679, 14.188791, 14.193116, 14.197299, 14.201303, 14.205357, 14.209497, 14.213646, 14.217681, 14.221773, 14.225888, 14.229995, 14.233966, 14.237913, 14.241866, 14.245942, 14.250016, 14.253873, 14.257672, 14.261495, 14.265178, 14.269134, 14.272616, 14.276298, 14.280379, 14.284389, 14.288563, 14.292546, 14.296723, 14.300513, 14.30454, 14.308733, 14.312787, 14.316784, 14.321122, 14.325237, 14.32941, 14.333465, 14.337588, 14.341673, 14.345928, 14.350098, 14.353599, 14.357821, 14.361806, 14.365776, 14.370546, 14.374865, 14.379052, 14.383101, 14.387132, 14.391276, 14.395276, 14.399392, 14.403454, 14.407556, 14.411703, 14.4158, 14.419973, 14.424076, 14.428123, 14.432233, 14.436184, 14.440204, 14.4442, 14.448396, 14.452546, 14.456707, 14.460868, 14.464986, 14.469079, 14.47325, 14.477333, 14.481355, 14.485341, 14.489592, 14.493625, 14.497687, 14.501763, 14.505782, 14.509866, 14.513565, 14.517694, 14.521478, 14.525709, 14.529816, 14.533892, 14.538036, 14.54153, 14.545128, 14.548382, 14.552196, 14.556248, 14.560303, 14.564427, 14.568467, 14.572442, 14.576553, 14.580714, 14.584937, 14.589056, 14.593242, 14.597291, 14.601348, 14.605553, 14.609748, 14.6138, 14.617979, 14.622054, 14.626108, 14.630229, 14.634285, 14.638368, 14.642421, 14.646483, 14.650592, 14.654575, 14.658719, 14.662911, 14.666919, 14.671028, 14.675149, 14.679288, 14.683387, 14.687482, 14.691586, 14.695595, 14.699627, 14.703592, 14.707732, 14.711949, 14.716153, 14.719913, 14.724149, 14.728265, 14.732117, 14.736315, 14.74037, 14.744522, 14.748631, 14.752699, 14.756787, 14.760835, 14.76506, 14.76876, 14.773566, 14.77759, 14.781886, 14.785566, 14.789303, 14.793381, 14.797501, 14.801541, 14.805477, 14.809711, 14.8139, 14.818151, 14.822036, 14.825349, 14.829357, 14.833439, 14.83746, 14.841551, 14.845566, 14.849756, 14.853919, 14.858063, 14.861765, 14.865801, 14.869373, 14.87287, 14.876846, 14.880968, 14.885138, 14.88854, 14.892609, 14.896359, 14.899851, 14.904024, 14.908166, 14.912291, 14.91645, 14.920564, 14.924436, 14.928302, 14.931963, 14.93618, 14.94032, 14.943781, 14.947263, 14.951369, 14.955389, 14.959205, 14.962846, 14.967105, 14.97121, 14.975342, 14.979473, 14.983561, 14.987694, 14.991788, 14.995881, 15.000124, 15.004129, 15.008127, 15.012271, 15.016339, 15.020252, 15.024266, 15.028509, 15.032536, 15.036681, 15.040752, 15.044849, 15.048895, 15.052896, 15.056377, 15.060282, 15.064298, 15.068409, 15.071906, 15.076005, 15.080059, 15.084327, 15.088512, 15.09255, 15.096678, 15.100799, 15.105017, 15.109052, 15.113206, 15.117381, 15.121416, 15.125584, 15.129149, 15.132979, 15.136706, 15.140475, 15.144062, 15.148047, 15.152294, 15.15632, 15.160435, 15.164493, 15.168275, 15.171719, 15.175389, 15.179349, 15.182783, 15.186267, 15.190108, 15.194496, 15.198767, 15.203076, 15.207108, 15.211175, 15.215288, 15.219422, 15.223476, 15.227634, 15.231645, 15.235776, 15.239938, 15.244137, 15.24849, 15.252588, 15.256711, 15.260786, 15.264873, 15.268965, 15.273292, 15.277363, 15.28153, 15.285613, 15.289759, 15.29383, 15.297906, 15.302001, 15.306092, 15.310164, 15.313941, 15.317991, 15.322104, 15.326, 15.330242, 15.334352, 15.338045, 15.342066, 15.346213, 15.350324, 15.354361, 15.358467, 15.362346, 15.366022, 15.370048, 15.374186, 15.37793, 15.382101, 15.386315, 15.390377, 15.394313, 15.398575, 15.40267, 15.407806, 15.411368, 15.415623, 15.419899, 15.423982, 15.428168, 15.432213, 15.436339, 15.440486, 15.444352, 15.448542, 15.452435, 15.456297, 15.460453, 15.464384, 15.46827, 15.47242, 15.476518, 15.4807, 15.484761, 15.488609, 15.492824, 15.496954, 15.500945, 15.505049, 15.508947, 15.513058, 15.516998, 15.521602, 15.525778, 15.529874, 15.533937, 15.538031, 15.541812, 15.545532, 15.549486, 15.55379, 15.557914, 15.562076, 15.566403, 15.570358, 15.574375, 15.578535, 15.582898, 15.586636, 15.590255, 15.594371, 15.598495, 15.602168, 15.605712, 15.609572, 15.613671, 15.617734, 15.621755, 15.625806, 15.629362, 15.633579, 15.637631, 15.641812, 15.646025, 15.650217, 15.654286, 15.658392, 15.662521, 15.666732, 15.670855, 15.675035, 15.678925, 15.683125, 15.687099, 15.691353, 15.695375, 15.699002, 15.702646, 15.706679, 15.710988, 15.71518, 15.719221, 15.723152, 15.72656, 15.730341, 15.734585, 15.738804, 15.742935, 15.747008, 15.751331, 15.755648, 15.759817, 15.763936, 15.768015, 15.772158, 15.776209, 15.780264, 15.784577, 15.788709, 15.792821, 15.797023, 15.801112, 15.805214, 15.809345, 15.81335, 15.817524, 15.821629, 15.825656, 15.829776, 15.833944, 15.83801, 15.842102, 15.846256, 15.850722, 15.855253, 15.8591, 15.863657, 15.86766, 15.871991, 15.875952, 15.88011, 15.884114, 15.888057, 15.892256, 15.896381, 15.900585, 15.904965, 15.909187, 15.913329, 15.917439, 15.921567, 15.925708, 15.92968, 15.93364, 15.937722, 15.94152, 15.945756, 15.949932, 15.954064, 15.958233, 15.962206, 15.966421, 15.970599, 15.974784, 15.978985, 15.983093, 15.987205, 15.991302, 15.995442, 15.999648, 16.003714, 16.007878, 16.011929, 16.016028, 16.019816, 16.023646, 16.027732, 16.03196, 16.036063, 16.040209, 16.044295, 16.048587, 16.052705, 16.056851, 16.060958, 16.065109, 16.069235, 16.073404, 16.077568, 16.081783, 16.085974, 16.090203, 16.094374, 16.098617, 16.102438, 16.106817, 16.110917, 16.115159, 16.119241, 16.123309, 16.127308, 16.131536, 16.135634, 16.139949, 16.143759, 16.147482, 16.150967, 16.154944, 16.159074, 16.163186, 16.167354, 16.17141, 16.175548, 16.179683, 16.183897, 16.187705, 16.191235, 16.194851, 16.198292, 16.20187, 16.20546, 16.209464, 16.213146, 16.21721, 16.22132, 16.225873, 16.230302, 16.234418, 16.238626, 16.242514, 16.246585, 16.25078, 16.254946, 16.259103, 16.263155, 16.267226, 16.271473, 16.275832, 16.280111, 16.284256, 16.288039, 16.292037, 16.296204, 16.299914, 16.304082, 16.308229, 16.312448, 16.31653, 16.320722, 16.324863, 16.328979, 16.33315, 16.337338, 16.341105, 16.345084, 16.349193, 16.353496, 16.357474, 16.361553, 16.365592, 16.369137, 16.373326, 16.37749, 16.381618, 16.385715, 16.389887, 16.394004, 16.398104, 16.401856, 16.405743, 16.409532, 16.413553, 16.417102, 16.421425, 16.425509, 16.429709, 16.433275, 16.436998, 16.441027, 16.445127, 16.449081, 16.45315, 16.457352, 16.461597, 16.465825, 16.46989, 16.474148, 16.478243, 16.482291, 16.486367, 16.490445, 16.494597, 16.498944, 16.503098, 16.506984, 16.511059, 16.515087, 16.518802, 16.522458, 16.526597, 16.531256, 16.535438, 16.539652, 16.544345, 16.548642, 16.552299, 16.556099, 16.559893, 16.563465, 16.566968, 16.570551, 16.574593, 16.579127, 16.583304, 16.58742, 16.591521, 16.59566, 16.599698, 16.603708, 16.607859, 16.612117, 16.61628, 16.620367, 16.624477, 16.62867, 16.632514, 16.636634, 16.640708, 16.644884, 16.648972, 16.653141, 16.657381, 16.66155, 16.665496, 16.669545, 16.673711, 16.677932, 16.682367, 16.686426, 16.690497, 16.694488, 16.698462, 16.702612, 16.70677, 16.711074, 16.715404, 16.719696, 16.723803, 16.728586, 16.73274, 16.736733, 16.740761, 16.744915, 16.749348, 16.753206, 16.757022, 16.761308, 16.766164, 16.769819, 16.773618, 16.777727, 16.782173, 16.786212, 16.789848, 16.793434, 16.797788, 16.801847, 16.806397, 16.810204, 16.81418, 16.818223, 16.822531, 16.826522, 16.830682, 16.83494, 16.839082, 16.843284, 16.847287, 16.851348, 16.855499, 16.859412, 16.863542, 16.867692, 16.871942, 16.876153, 16.880643, 16.884801, 16.889021, 16.89335, 16.897368, 16.901438, 16.905611, 16.909692, 16.913716, 16.917812, 16.921995, 16.926202, 16.930347, 16.934462, 16.938514, 16.942754, 16.947067, 16.951225, 16.955499, 16.961123, 16.965163, 16.969182, 16.973381, 16.977575, 16.981764, 16.985883, 16.989959, 16.994084, 16.998341, 17.002609, 17.006806, 17.010929, 17.015037, 17.019122, 17.023303, 17.027328, 17.031422, 17.035663, 17.039803, 17.043792, 17.047854, 17.052037, 17.056093, 17.060274, 17.064332, 17.068399, 17.072515, 17.076749, 17.080853, 17.084841, 17.089021, 17.09333, 17.097403, 17.101391, 17.105672, 17.11052, 17.114655, 17.118874, 17.124849, 17.129158, 17.133214, 17.137332, 17.141757, 17.146052, 17.150238, 17.154386, 17.158651, 17.162878, 17.167398, 17.171505, 17.175681, 17.179746, 17.184536, 17.189373, 17.194067, 17.198485, 17.20457, 17.209592, 17.214123, 17.218594, 17.22296, 17.227101, 17.23132, 17.235675, 17.240479, 17.244687, 17.249151, 17.253342, 17.257428, 17.261745, 17.26616, 17.270251, 17.274319, 17.278795, 17.283153, 17.287355, 17.291737, 17.295889, 17.3, 17.304174, 17.308187, 17.312483, 17.316723, 17.32085, 17.324814, 17.329193, 17.333306, 17.337522, 17.341615, 17.345759, 17.350013, 17.354268, 17.358584, 17.362595, 17.36742, 17.372559, 17.376841, 17.381016, 17.38508, 17.389144, 17.3934, 17.397459, 17.40199, 17.406079, 17.410308, 17.414527, 17.418678, 17.422878, 17.427021, 17.431579, 17.435633, 17.440168, 17.444268, 17.448396, 17.452539, 17.45652, 17.460667, 17.464851, 17.469083, 17.473983, 17.478254, 17.482557, 17.486845, 17.491098, 17.495082, 17.49945, 17.503731, 17.507791, 17.511876, 17.515917, 17.520121, 17.524358, 17.528513, 17.532736, 17.537005, 17.541314, 17.545529, 17.549531, 17.553785, 17.557949, 17.562328, 17.566406, 17.5705, 17.574725, 17.578933, 17.583204, 17.587456, 17.59152, 17.595625, 17.59966, 17.603815, 17.608117, 17.612492, 17.6165, 17.620709, 17.624853, 17.629116, 17.633324, 17.637304, 17.641554, 17.645956, 17.650072, 17.654347, 17.658393, 17.662771, 17.667003, 17.671148, 17.675262, 17.67962, 17.68372, 17.687983, 17.69205, 17.696059, 17.700511, 17.704903, 17.708915, 17.713158, 17.717299, 17.721541, 17.725781, 17.729767, 17.733949, 17.73821, 17.742257, 17.746766, 17.751109, 17.75534, 17.759634, 17.764862, 17.76959, 17.77389, 17.778195, 17.78229, 17.786466, 17.790833, 17.79504, 17.799167, 17.803333, 17.807526, 17.811692, 17.816252, 17.821898, 17.826137, 17.83061, 17.835008, 17.839438, 17.843766, 17.848418, 17.852566, 17.856811, 17.861108, 17.865673, 17.871721, 17.876703, 17.881091, 17.885677, 17.889853, 17.894326, 17.898714, 17.902834, 17.907287, 17.911512, 17.91584, 17.920693, 17.925051, 17.929811, 17.935067, 17.940129, 17.944456, 17.9492, 17.954154, 17.958647, 17.963055, 17.967297, 17.971792, 17.976049, 17.980156, 17.984513, 17.988852, 17.993388, 17.997503, 18.001663, 18.00604, 18.011247, 18.015334, 18.019965, 18.024161, 18.02941, 18.033712, 18.037878, 18.041941, 18.045975, 18.050489, 18.054942, 18.059082, 18.063493, 18.067807, 18.072021, 18.076297, 18.080104, 18.084308, 18.088923, 18.093143, 18.097445, 18.101572, 18.106063, 18.110216, 18.114558, 18.118702, 18.123, 18.127338, 18.131976, 18.136324, 18.140689, 18.144968, 18.149468, 18.153913, 18.157896, 18.161936, 18.166013, 18.1701, 18.174661, 18.178955, 18.183354, 18.187558, 18.191782, 18.195887, 18.200017, 18.204259, 18.208565, 18.212758, 18.216989, 18.221152, 18.225379, 18.229299, 18.233315, 18.237962, 18.242874, 18.24726, 18.251431, 18.255525, 18.259358, 18.26331, 18.267601, 18.272187, 18.275825, 18.279577, 18.283789, 18.288371, 18.292375, 18.298864, 18.303922, 18.3081, 18.311881, 18.316226, 18.320457, 18.324518, 18.328534, 18.333366, 18.337446, 18.34161, 18.345877, 18.35003, 18.354504, 18.358412, 18.361982, 18.36677, 18.371254, 18.375528, 18.379546, 18.383583, 18.387694, 18.39187, 18.396035, 18.399891, 18.404171, 18.408078, 18.412386, 18.4167, 18.421248, 18.425375, 18.429396, 18.433424, 18.437518, 18.441669, 18.445641, 18.449658, 18.453383, 18.457157, 18.461595, 18.465643, 18.470061, 18.47442, 18.478349, 18.482625, 18.486345, 18.490283, 18.49477, 18.498465, 18.50287, 18.50705, 18.51124, 18.515293, 18.519457, 18.523666, 18.52734, 18.531769, 18.535852, 18.5399, 18.543996, 18.54862, 18.552722, 18.556956, 18.561095, 18.5664, 18.570672, 18.574858, 18.579087, 18.583197, 18.58737, 18.591484, 18.595619, 18.599708, 18.603828, 18.607838, 18.611971, 18.61641, 18.620725, 18.624551, 18.628691, 18.633458, 18.637588, 18.641653, 18.645913, 18.650146, 18.654569, 18.658895, 18.663054, 18.6672, 18.671539, 18.675838, 18.679863, 18.68393, 18.68823, 18.692159, 18.696506, 18.700611, 18.704883, 18.709343, 18.714127, 18.718209, 18.72267, 18.727142, 18.73156, 18.735964, 18.740258, 18.744378, 18.74884, 18.753048, 18.757196, 18.761898, 18.766487, 18.770638, 18.774849, 18.779144, 18.78336, 18.787552, 18.791611, 18.796032, 18.800389, 18.804865, 18.809389, 18.813665, 18.817931, 18.822149, 18.826303, 18.830384, 18.83472, 18.838881, 18.842719, 18.846959, 18.851295, 18.855408, 18.859448, 18.863509, 18.867728, 18.871953, 18.877868, 18.882129, 18.886434, 18.89057, 18.89491, 18.899244, 18.904021, 18.908253, 18.912698, 18.916691, 18.921163, 18.925558, 18.929725, 18.933822, 18.937859, 18.94209, 18.946232, 18.950376, 18.954522, 18.958495, 18.962798, 18.967111, 18.971396, 18.975476, 18.979639, 18.984098, 18.988644, 18.993573, 18.998251, 19.002438, 19.006902, 19.011109, 19.015624, 19.019591, 19.023977, 19.028046, 19.032228, 19.036453, 19.040869, 19.045154, 19.049456, 19.053396, 19.058442, 19.0626, 19.066786, 19.07081, 19.075227, 19.079513, 19.083673, 19.088961, 19.093383, 19.097597, 19.102073, 19.106428, 19.110532, 19.115341, 19.119691, 19.123821, 19.128363, 19.132666, 19.136692, 19.140933, 19.145303, 19.149321, 19.153522, 19.157552, 19.162083, 19.166362, 19.170612, 19.175053, 19.179656, 19.184099, 19.188337, 19.192432, 19.196395, 19.200543, 19.204697, 19.208837, 19.213229, 19.217243, 19.221584, 19.225696, 19.229837, 19.234249, 19.238398, 19.24239, 19.246701, 19.250922, 19.255183, 19.259328, 19.263334, 19.26754, 19.271965, 19.276348, 19.28048, 19.284456, 19.288447, 19.292693, 19.296765, 19.300809, 19.304799, 19.308916, 19.313167, 19.317227, 19.321571, 19.325837, 19.330154, 19.334216, 19.338738, 19.343145, 19.347307, 19.351666, 19.355752, 19.359879, 19.364206, 19.368549, 19.372619, 19.377177, 19.381308, 19.385305, 19.389338, 19.393755, 19.397634, 19.40182, 19.406041, 19.410269, 19.414389, 19.418753, 19.422926, 19.426997, 19.431047, 19.435264, 19.439355, 19.443514, 19.447608, 19.451845, 19.455935, 19.460367, 19.464399, 19.468716, 19.472874, 19.477189, 19.481146, 19.485387, 19.48961, 19.494522, 19.498507, 19.50286, 19.507017, 19.511163, 19.515307, 19.519837, 19.523955, 19.527964, 19.53264, 19.536792, 19.540759, 19.545163, 19.549344, 19.553494, 19.557776, 19.561895, 19.566434, 19.570517, 19.574834, 19.579328, 19.583404, 19.587613, 19.592, 19.596233, 19.600259, 19.604467, 19.608793, 19.612868, 19.617149, 19.621262, 19.625717, 19.629691, 19.633833, 19.637845, 19.641964, 19.646047, 19.650131, 19.654608, 19.658543, 19.662483, 19.666415, 19.670873, 19.675245, 19.67997, 19.68449, 19.68893, 19.69319, 19.697325, 19.701741, 19.705816, 19.710333, 19.714603, 19.718589, 19.722859, 19.727168, 19.731408, 19.735796, 19.739937, 19.744073, 19.748291, 19.752283, 19.756295, 19.760321, 19.764692, 19.768663, 19.773312, 19.778547, 19.783626, 19.787884, 19.792177, 19.79646, 19.800574, 19.804891, 19.809078, 19.81333, 19.817447, 19.82163, 19.825906, 19.830085, 19.834356, 19.83845, 19.842688, 19.846955, 19.851268, 19.855691, 19.860028, 19.864323, 19.868539, 19.872728, 19.876914, 19.881382, 19.885556, 19.889727, 19.894005, 19.898225, 19.902594, 19.906782, 19.911033, 19.915154, 19.919174, 19.923349, 19.927461, 19.931602, 19.935849, 19.940053, 19.944215, 19.948509, 19.952554, 19.956699, 19.960874, 19.965022, 19.969094, 19.973156, 19.977166, 19.981432, 19.985539, 19.989719, 19.994157, 19.99825, 20.002438, 20.006606, 20.010853, 20.01506, 20.019112, 20.02326, 20.027509, 20.031724, 20.035748, 20.03982, 20.043811, 20.047883, 20.052245, 20.056471, 20.060694, 20.064744, 20.068803, 20.072838, 20.076959, 20.081245, 20.08533, 20.089504, 20.093752, 20.0979, 20.102067, 20.106328, 20.11043, 20.11442, 20.118426, 20.122563, 20.126595, 20.130576, 20.134796, 20.13897, 20.143176, 20.147264, 20.151391, 20.155639, 20.159781, 20.164, 20.168164, 20.172277, 20.176341, 20.180518, 20.184734, 20.188912, 20.192999, 20.197175, 20.201302, 20.20542, 20.209559, 20.213759, 20.217864, 20.222052, 20.226143, 20.230371, 20.234436, 20.238621, 20.24271, 20.246787, 20.250978, 20.255171, 20.259445, 20.263698, 20.267846, 20.271981, 20.276148, 20.28023, 20.284502, 20.288499, 20.29251, 20.296554, 20.300755, 20.304752, 20.308895, 20.312876, 20.317044, 20.320953, 20.32503, 20.329138, 20.33333, 20.337434, 20.341536, 20.345697, 20.349953, 20.354073, 20.35815, 20.362414, 20.366501, 20.370583, 20.374771, 20.378769, 20.382804, 20.386979, 20.391957, 20.396027, 20.400299, 20.404463, 20.408638, 20.413288, 20.417299, 20.421498, 20.425692, 20.429906, 20.434195, 20.438205, 20.442423, 20.446633, 20.450684, 20.454649, 20.458683, 20.463158, 20.467323, 20.471462, 20.475527, 20.479519, 20.483746, 20.488381, 20.492424, 20.496648, 20.500645, 20.5054, 20.50941, 20.513352, 20.517757, 20.521854, 20.526759, 20.530927, 20.535101, 20.539289, 20.543376, 20.547494, 20.551439, 20.555859, 20.560043, 20.564372, 20.568364, 20.572381, 20.576419, 20.580403, 20.584696, 20.58882, 20.593057] }, { label: 'RecalcStyleDuration', backgroundColor: 'rgba(100, 58, 195, 0.2)', borderColor: 'rgba(100, 58, 195, 1.00)', - data: [0.002738, 0.006824, 0.010537, 0.014037, 0.018236, 0.020886, 0.024098, 0.029695, 0.033175, 0.037279, 0.041541, 0.045205, 0.049411, 0.054237, 0.058096, 0.062371, 0.065937, 0.069282, 0.072792, 0.076427, 0.08009, 0.084139, 0.08768, 0.091037, 0.094712, 0.098608, 0.102891, 0.106416, 0.110557, 0.114785, 0.119077, 0.12265, 0.126408, 0.13009, 0.133841, 0.137573, 0.141269, 0.1447, 0.148171, 0.15194, 0.155498, 0.159181, 0.163059, 0.167256, 0.17212, 0.176481, 0.180456, 0.184155, 0.187568, 0.191164] + data: [0.00439, 0.006026, 0.007432, 0.008855, 0.01089, 0.013762, 0.016411, 0.018071, 0.019775, 0.02112, 0.023108, 0.024709, 0.026127, 0.027583, 0.02912, 0.03063, 0.03213, 0.033991, 0.035457, 0.036949, 0.038619, 0.040105, 0.041562, 0.043092, 0.044775, 0.046288, 0.047833, 0.049365, 0.050804, 0.052338, 0.053859, 0.055439, 0.05691, 0.05848, 0.060052, 0.061535, 0.062983, 0.064934, 0.066419, 0.067843, 0.069321, 0.070743, 0.072117, 0.073538, 0.075018, 0.076407, 0.077765, 0.079085, 0.080371, 0.081757, 0.083152, 0.084526, 0.085888, 0.087229, 0.088549, 0.08978, 0.091072, 0.092364, 0.093612, 0.095054, 0.096431, 0.097802, 0.099178, 0.100653, 0.102041, 0.103411, 0.104801, 0.106182, 0.107571, 0.10897, 0.110351, 0.111718, 0.113129, 0.114486, 0.115863, 0.117169, 0.118528, 0.119935, 0.121328, 0.122633, 0.124056, 0.125517, 0.126872, 0.128221, 0.129514, 0.130893, 0.13227, 0.133656, 0.135111, 0.136555, 0.13793, 0.13931, 0.140711, 0.142098, 0.143441, 0.144721, 0.146113, 0.147486, 0.148868, 0.150244, 0.151618, 0.15295, 0.154334, 0.155716, 0.157086, 0.158467, 0.159853, 0.161229, 0.162759, 0.164191, 0.165627, 0.167064, 0.168488, 0.169938, 0.171352, 0.172804, 0.174249, 0.175717, 0.177141, 0.178587, 0.180012, 0.181441, 0.182882, 0.184325, 0.185754, 0.187195, 0.188574, 0.190006, 0.191432, 0.192811, 0.194248, 0.195678, 0.197113, 0.198577, 0.199927, 0.201298, 0.202689, 0.204019, 0.205514, 0.206909, 0.208305, 0.209574, 0.210904, 0.212197, 0.213589, 0.214989, 0.21648, 0.217934, 0.219241, 0.220812, 0.222195, 0.223673, 0.225056, 0.226393, 0.227786, 0.229172, 0.230606, 0.23206, 0.23405, 0.235417, 0.236889, 0.238275, 0.239613, 0.241007, 0.242451, 0.243836, 0.245282, 0.246607, 0.247916, 0.249249, 0.250628, 0.252012, 0.253392, 0.254734, 0.256053, 0.257436, 0.258927, 0.260322, 0.261741, 0.263195, 0.264565, 0.265968, 0.267394, 0.268786, 0.270175, 0.271563, 0.272914, 0.274298, 0.275685, 0.277064, 0.278405, 0.279825, 0.281223, 0.282602, 0.283969, 0.285348, 0.286696, 0.288056, 0.289432, 0.290777, 0.292223, 0.293682, 0.295085, 0.296487, 0.297874, 0.299254, 0.30064, 0.302022, 0.303417, 0.304857, 0.306427, 0.307841, 0.309414, 0.310797, 0.31216, 0.31354, 0.314914, 0.316299, 0.317686, 0.319095, 0.320481, 0.321863, 0.323198, 0.324594, 0.325989, 0.327369, 0.328857, 0.330198, 0.331628, 0.33319, 0.334685, 0.336226, 0.33757, 0.338977, 0.340296, 0.34163, 0.343064, 0.344529, 0.34629, 0.347689, 0.34914, 0.3505, 0.351992, 0.353411, 0.3548, 0.356153, 0.357544, 0.358999, 0.360379, 0.361759, 0.363177, 0.364498, 0.365884, 0.367282, 0.368665, 0.370056, 0.371403, 0.372847, 0.374232, 0.375613, 0.377033, 0.378424, 0.379822, 0.381199, 0.382535, 0.383835, 0.385161, 0.386512, 0.387885, 0.389331, 0.390665, 0.392247, 0.393727, 0.395065, 0.396493, 0.397882, 0.399227, 0.400683, 0.402123, 0.403547, 0.404988, 0.406571, 0.408126, 0.409461, 0.410803, 0.412197, 0.413533, 0.414915, 0.416196, 0.417771, 0.419166, 0.420651, 0.422038, 0.423466, 0.424932, 0.426396, 0.427826, 0.429259, 0.430719, 0.432097, 0.433471, 0.434847, 0.436161, 0.437507, 0.438918, 0.440442, 0.441802, 0.443187, 0.444581, 0.44597, 0.447335, 0.448709, 0.450105, 0.45159, 0.453104, 0.454633, 0.455986, 0.457815, 0.459224, 0.460578, 0.461987, 0.46337, 0.46475, 0.466133, 0.467492, 0.468841, 0.470402, 0.471817, 0.473285, 0.474734, 0.476141, 0.477529, 0.478929, 0.480514, 0.481864, 0.483268, 0.484708, 0.486092, 0.487494, 0.488892, 0.49024, 0.491627, 0.492984, 0.494334, 0.495693, 0.497033, 0.49846, 0.499874, 0.501306, 0.50273, 0.50419, 0.505577, 0.506872, 0.508158, 0.509527, 0.51088, 0.512172, 0.513589, 0.51493, 0.516354, 0.517828, 0.519352, 0.520743, 0.522098, 0.523554, 0.525079, 0.526501, 0.527868, 0.529247, 0.530629, 0.531985, 0.53336, 0.534813, 0.536145, 0.537542, 0.538917, 0.540335, 0.541866, 0.543309, 0.544736, 0.546103, 0.547478, 0.548863, 0.550254, 0.551632, 0.552857, 0.554046, 0.555254, 0.556369, 0.557515, 0.558654, 0.559917, 0.561203, 0.562387, 0.563652, 0.564806, 0.566054, 0.567207, 0.56845, 0.569655, 0.570907, 0.57221, 0.573383, 0.574588, 0.575792, 0.577008, 0.578218, 0.579403, 0.580607, 0.581762, 0.583, 0.58421, 0.585467, 0.586606, 0.587866, 0.589055, 0.590298, 0.59152, 0.592743, 0.59396, 0.595185, 0.596395, 0.597595, 0.59878, 0.600058, 0.60126, 0.60249, 0.603671, 0.604919, 0.606136, 0.607371, 0.608542, 0.609756, 0.61094, 0.612208, 0.613428, 0.614601, 0.615833, 0.617053, 0.618221, 0.61946, 0.620703, 0.621858, 0.623064, 0.624201, 0.625415, 0.626636, 0.627857, 0.629087, 0.630263, 0.631503, 0.632616, 0.633761, 0.634902, 0.636171, 0.637356, 0.638644, 0.639845, 0.641083, 0.642229, 0.643382, 0.644638, 0.645855, 0.647078, 0.648303, 0.649472, 0.650638, 0.651863, 0.653148, 0.654352, 0.65566, 0.656805, 0.657968, 0.659175, 0.660365, 0.661667, 0.66296, 0.664117, 0.66531, 0.66649, 0.667711, 0.669048, 0.670343, 0.671731, 0.673035, 0.674325, 0.67565, 0.676987, 0.678308, 0.679636, 0.681002, 0.68231, 0.683667, 0.684992, 0.686321, 0.687719, 0.689255, 0.690604, 0.69194, 0.693273, 0.694591, 0.695906, 0.697209, 0.698552, 0.699866, 0.701252, 0.702609, 0.704029, 0.705376, 0.706778, 0.708142, 0.709344, 0.710592, 0.711735, 0.712897, 0.714049, 0.715295, 0.716483, 0.717691, 0.719066, 0.720257, 0.721455, 0.723755, 0.726172, 0.727376, 0.728653, 0.729858, 0.731087, 0.732239, 0.733424, 0.734594, 0.735807, 0.73698, 0.738183, 0.73939, 0.740544, 0.74184, 0.743016, 0.744233, 0.745381, 0.746626, 0.747893, 0.749177, 0.750488, 0.751673, 0.752927, 0.754138, 0.755362, 0.756669, 0.757879, 0.759157, 0.760508, 0.761962, 0.763327, 0.764693, 0.766021, 0.767448, 0.768784, 0.770198, 0.771561, 0.772886, 0.774205, 0.775574, 0.77696, 0.77843, 0.779784, 0.78113, 0.782517, 0.78388, 0.785209, 0.78659, 0.787883, 0.789209, 0.790462, 0.791791, 0.793122, 0.794458, 0.795799, 0.797168, 0.798617, 0.799949, 0.80127, 0.802599, 0.803879, 0.805303, 0.80672, 0.808115, 0.809432, 0.810859, 0.812088, 0.813372, 0.814727, 0.816033, 0.817432, 0.818739, 0.820082, 0.821389, 0.82274, 0.82414, 0.825434, 0.826779, 0.828101, 0.829431, 0.830751, 0.83211, 0.833512, 0.834853, 0.836179, 0.83746, 0.838784, 0.840129, 0.841287, 0.842663, 0.844027, 0.845368, 0.846701, 0.848032, 0.849415, 0.850794, 0.852186, 0.853523, 0.854856, 0.856162, 0.857485, 0.85882, 0.860147, 0.861468, 0.862792, 0.86408, 0.865414, 0.866821, 0.868175, 0.869674, 0.871058, 0.87254, 0.873832, 0.875239, 0.876634, 0.877924, 0.879264, 0.880565, 0.881891, 0.883305, 0.884713, 0.886147, 0.887444, 0.8887, 0.890093, 0.89141, 0.89279, 0.894126, 0.895447, 0.896802, 0.898247, 0.899654, 0.901098, 0.902464, 0.903967, 0.905283, 0.906643, 0.907959, 0.909292, 0.910625, 0.911956, 0.913298, 0.914647, 0.916014, 0.917284, 0.91859, 0.919901, 0.92124, 0.92259, 0.923999, 0.925373, 0.926722, 0.928048, 0.929394, 0.930677, 0.931913, 0.933094, 0.935631, 0.937012, 0.938275, 0.940076, 0.941458, 0.942822, 0.944209, 0.945586, 0.946959, 0.948334, 0.949795, 0.95114, 0.952507, 0.953875, 0.955213, 0.956586, 0.957963, 0.959336, 0.960682, 0.96221, 0.963473, 0.964803, 0.966164, 0.967504, 0.968848, 0.970269, 0.971589, 0.972909, 0.974229, 0.975603, 0.976976, 0.978299, 0.979624, 0.980942, 0.982253, 0.983523, 0.984748, 0.986156, 0.98782, 0.989133, 0.990694, 0.992035, 0.993346, 0.994662, 0.99601, 0.997324, 0.999017, 1.000393, 1.001811, 1.003194, 1.004583, 1.005963, 1.007292, 1.008585, 1.010126, 1.011443, 1.012776, 1.014092, 1.015383, 1.016795, 1.018153, 1.019489, 1.020701, 1.022043, 1.023339, 1.024672, 1.025962, 1.027538, 1.02899, 1.030378, 1.031747, 1.0331, 1.034443, 1.035812, 1.037247, 1.039024, 1.040263, 1.041496, 1.043512, 1.044994, 1.046358, 1.048046, 1.049332, 1.050746, 1.052051, 1.053671, 1.055097, 1.056413, 1.057743, 1.058885, 1.060136, 1.061332, 1.06259, 1.063844, 1.065272, 1.066566, 1.067812, 1.068987, 1.070262, 1.071557, 1.072851, 1.074001, 1.075197, 1.076418, 1.077644, 1.078981, 1.080265, 1.081568, 1.083191, 1.084526, 1.085872, 1.087226, 1.088576, 1.089894, 1.091441, 1.092791, 1.09415, 1.095526, 1.096838, 1.098182, 1.099543, 1.100902, 1.10227, 1.103626, 1.105001, 1.106368, 1.107714, 1.109071, 1.11041, 1.111777, 1.113131, 1.114464, 1.115791, 1.117173, 1.118563, 1.119915, 1.121254, 1.122558, 1.123897, 1.125241, 1.12659, 1.12793, 1.129296, 1.13065, 1.132001, 1.133354, 1.134698, 1.136033, 1.137384, 1.138728, 1.140263, 1.141614, 1.143104, 1.144394, 1.145737, 1.147462, 1.148782, 1.150107, 1.151288, 1.152594, 1.153946, 1.155216, 1.156414, 1.157664, 1.158987, 1.160206, 1.161549, 1.162705, 1.163905, 1.165175, 1.16657, 1.167783, 1.169021, 1.170262, 1.171545, 1.17282, 1.17408, 1.175376, 1.176692, 1.178021, 1.179288, 1.18064, 1.181938, 1.183172, 1.184473, 1.185648, 1.186968, 1.188235, 1.189504, 1.19077, 1.192099, 1.193413, 1.194791, 1.196033, 1.197445, 1.198801, 1.199925, 1.201205, 1.202385, 1.20369, 1.204976, 1.206236, 1.207749, 1.209077, 1.210376, 1.211677, 1.213007, 1.214106, 1.215546, 1.216764, 1.218075, 1.219362, 1.220656, 1.221964, 1.223294, 1.224619, 1.225886, 1.227248, 1.228514, 1.229773, 1.231047, 1.232348, 1.2336, 1.234913, 1.236143, 1.237414, 1.238646, 1.23993, 1.241177, 1.242455, 1.2438, 1.245078, 1.246385, 1.247616, 1.248946, 1.250152, 1.251528, 1.252776, 1.254057, 1.255393, 1.256695, 1.25802, 1.259289, 1.26056, 1.261718, 1.263027, 1.26429, 1.265513, 1.266864, 1.268229, 1.269537, 1.27068, 1.271935, 1.273226, 1.274633, 1.275895, 1.277143, 1.278453, 1.279749, 1.281069, 1.282296, 1.283766, 1.285155, 1.286542, 1.28821, 1.289446, 1.290711, 1.291994, 1.293234, 1.294974, 1.29627, 1.297929, 1.299571, 1.300849, 1.302152, 1.303468, 1.304753, 1.306257, 1.307516, 1.308754, 1.310124, 1.311475, 1.312762, 1.314045, 1.315372, 1.316704, 1.318364, 1.31963, 1.320902, 1.322184, 1.323881, 1.32515, 1.32665, 1.327876, 1.32927, 1.330687, 1.33193, 1.333231, 1.334532, 1.335901, 1.337189, 1.338479, 1.339645, 1.340959, 1.342272, 1.343579, 1.344891, 1.346193, 1.347477, 1.348906, 1.350193, 1.35147, 1.352792, 1.35404, 1.356506, 1.357849, 1.359508, 1.360802, 1.362216, 1.363549, 1.364777, 1.366126, 1.367303, 1.36854, 1.36975, 1.371168, 1.372362, 1.373683, 1.375006, 1.376322, 1.377557, 1.378781, 1.380012, 1.381293, 1.382638, 1.383921, 1.385212, 1.386729, 1.387987, 1.389282, 1.390583, 1.391907, 1.39321, 1.394523, 1.395738, 1.397077, 1.398499, 1.399785, 1.401138, 1.402394, 1.40373, 1.405442, 1.40673, 1.407988, 1.409254, 1.410559, 1.411847, 1.413121, 1.414407, 1.415945, 1.41722, 1.418686, 1.419999, 1.421266, 1.422473, 1.423763, 1.425097, 1.42643, 1.427523, 1.428808, 1.430045, 1.431371, 1.432672, 1.433961, 1.435318, 1.436609, 1.437924, 1.439207, 1.440507, 1.441808, 1.443079, 1.444372, 1.445764, 1.447128, 1.448476, 1.449751, 1.451042, 1.452202, 1.453502, 1.454771, 1.456028, 1.457369, 1.458747, 1.459991, 1.461168, 1.462563, 1.46389, 1.465169, 1.466502, 1.467824, 1.469059, 1.470266, 1.471633, 1.472921, 1.474201, 1.475441, 1.476701, 1.478322, 1.479543, 1.480787, 1.482124, 1.483436, 1.484788, 1.486106, 1.487375, 1.48867, 1.490012, 1.491342, 1.49261, 1.493942, 1.495417, 1.496696, 1.497893, 1.499295, 1.500581, 1.501876, 1.503204, 1.504563, 1.505872, 1.507208, 1.50848, 1.50983, 1.511388, 1.512656, 1.514059, 1.515369, 1.516712, 1.517942, 1.519319, 1.52065, 1.522052, 1.523327, 1.52446, 1.525814, 1.527171, 1.528501, 1.529778, 1.531118, 1.532358, 1.53365, 1.534996, 1.536299, 1.537598, 1.538861, 1.540024, 1.541364, 1.542678, 1.544041, 1.545273, 1.546518, 1.547768, 1.54905, 1.550621, 1.551941, 1.553182, 1.554444, 1.555755, 1.557061, 1.558367, 1.559721, 1.560995, 1.562324, 1.563587, 1.564886, 1.566044, 1.567297, 1.568587, 1.569849, 1.571075, 1.572399, 1.573659, 1.574933, 1.576265, 1.577566, 1.578925, 1.580182, 1.581446, 1.58272, 1.583962, 1.585279, 1.586526, 1.587789, 1.5891, 1.590298, 1.591566, 1.592843, 1.593988, 1.595294, 1.596552, 1.597875, 1.599311, 1.600454, 1.601755, 1.60356, 1.604705, 1.605976, 1.607349, 1.608612, 1.609881, 1.611198, 1.612487, 1.613746, 1.615046, 1.616305, 1.617564, 1.618821, 1.620084, 1.621351, 1.622591, 1.623848, 1.625213, 1.626453, 1.627713, 1.628966, 1.630244, 1.63153, 1.632783, 1.634103, 1.635395, 1.636689, 1.638026, 1.639381, 1.640689, 1.641899, 1.643072, 1.644273, 1.645533, 1.646838, 1.648078, 1.649223, 1.650516, 1.651793, 1.65306, 1.654349, 1.655733, 1.656939, 1.658338, 1.65967, 1.660923, 1.662146, 1.663401, 1.664542, 1.665905, 1.667185, 1.668469, 1.669821, 1.671087, 1.672345, 1.673595, 1.674852, 1.676206, 1.677501, 1.678814, 1.680105, 1.681312, 1.682651, 1.68395, 1.685217, 1.686463, 1.687702, 1.688958, 1.690227, 1.691627, 1.693059, 1.694425, 1.695675, 1.697001, 1.698352, 1.699747, 1.701036, 1.702406, 1.703752, 1.705024, 1.706546, 1.707747, 1.709009, 1.710248, 1.711555, 1.712799, 1.714084, 1.7154, 1.716811, 1.718167, 1.719347, 1.720688, 1.721885, 1.723228, 1.724385, 1.725635, 1.727147, 1.728437, 1.729738, 1.73107, 1.732439, 1.734173, 1.735443, 1.73671, 1.737976, 1.739216, 1.740451, 1.741779, 1.743057, 1.744501, 1.745748, 1.74709, 1.748336, 1.749627, 1.750924, 1.75226, 1.753533, 1.754794, 1.756049, 1.757204, 1.758521, 1.759782, 1.761037, 1.762295, 1.763582, 1.764818, 1.766118, 1.767458, 1.768754, 1.770129, 1.771379, 1.77269, 1.773953, 1.775163, 1.77644, 1.777722, 1.778992, 1.780252, 1.781477, 1.782802, 1.784273, 1.785863, 1.787093, 1.788383, 1.789657, 1.79104, 1.792295, 1.793466, 1.79477, 1.796034, 1.797246, 1.798601, 1.799928, 1.80121, 1.802537, 1.803835, 1.80507, 1.806334, 1.807439, 1.808782, 1.810168, 1.81147, 1.812797, 1.814018, 1.815284, 1.816449, 1.817733, 1.819007, 1.820131, 1.821393, 1.822682, 1.82389, 1.825159, 1.826461, 1.827737, 1.828995, 1.830444, 1.831715, 1.833023, 1.834279, 1.835509, 1.83678, 1.838125, 1.839414, 1.840671, 1.841981, 1.84326, 1.844595, 1.845931, 1.84709, 1.848353, 1.849691, 1.851094, 1.85234, 1.853691, 1.854969, 1.856223, 1.85758, 1.858873, 1.8602, 1.861456, 1.862845, 1.863983, 1.865279, 1.866518, 1.867845, 1.869074, 1.870268, 1.871555, 1.872689, 1.873949, 1.875311, 1.87701, 1.878244, 1.879492, 1.880753, 1.881955, 1.883139, 1.884358, 1.885511, 1.886839, 1.888187, 1.889379, 1.890595, 1.891686, 1.892943, 1.894255, 1.895638, 1.897003, 1.898296, 1.899579, 1.900821, 1.902236, 1.903558, 1.904811, 1.906067, 1.907347, 1.908882, 1.910195, 1.911619, 1.91294, 1.914313, 1.915515, 1.916739, 1.91795, 1.91916, 1.920432, 1.921743, 1.923026, 1.924246, 1.925619, 1.92702, 1.928331, 1.929487, 1.930993, 1.932307, 1.933856, 1.935069, 1.93629, 1.93751, 1.938859, 1.94028, 1.94161, 1.942875, 1.944114, 1.945471, 1.94679, 1.948095, 1.949459, 1.950764, 1.952065, 1.953513, 1.954869, 1.956202, 1.957484, 1.958822, 1.960157, 1.961451, 1.962799, 1.96408, 1.965389, 1.966672, 1.967971, 1.969297, 1.970648, 1.97209, 1.973466, 1.97474, 1.976055, 1.977373, 1.978702, 1.979994, 1.981317, 1.982608, 1.983858, 1.985227, 1.986539, 1.987931, 1.989241, 1.99059, 1.991924, 1.993254, 1.994485, 1.995845, 1.997179, 1.998465, 1.999689, 2.000991, 2.002375, 2.003702, 2.00499, 2.006304, 2.007569, 2.008726, 2.01014, 2.01135, 2.012747, 2.014202, 2.01567, 2.017049, 2.018526, 2.019871, 2.021189, 2.022492, 2.023803, 2.025121, 2.026432, 2.027813, 2.029231, 2.03061, 2.031912, 2.03327, 2.034659, 2.036532, 2.037851, 2.03914, 2.04046, 2.041817, 2.043119, 2.044322, 2.045613, 2.046857, 2.048156, 2.049515, 2.050777, 2.052107, 2.053383, 2.054798, 2.056581, 2.058003, 2.059296, 2.060599, 2.061913, 2.063347, 2.064649, 2.066065, 2.067317, 2.068625, 2.070035, 2.071371, 2.072724, 2.074012, 2.075415, 2.076814, 2.078171, 2.079533, 2.081446, 2.082867, 2.084259, 2.085511, 2.086899, 2.088281, 2.089725, 2.091006, 2.092452, 2.093659, 2.094885, 2.096296, 2.097575, 2.098929, 2.10024, 2.101549, 2.103005, 2.104263, 2.105612, 2.10695, 2.108214, 2.109524, 2.110803, 2.111999, 2.113238, 2.114641, 2.115936, 2.117457, 2.118958, 2.120287, 2.121925, 2.123236, 2.124455, 2.126104, 2.127454, 2.128821, 2.130123, 2.13142, 2.132848, 2.134172, 2.135448, 2.136737, 2.138057, 2.139445, 2.140819, 2.142334, 2.143736, 2.145101, 2.146419, 2.147691, 2.149126, 2.150393, 2.151688, 2.152962, 2.15443, 2.15563, 2.156985, 2.158442, 2.159901, 2.161591, 2.162885, 2.164275, 2.165569, 2.166891, 2.16827, 2.169678, 2.170992, 2.172433, 2.173892, 2.175086, 2.176714, 2.178132, 2.179606, 2.181041, 2.182294, 2.18359, 2.184983, 2.186669, 2.188034, 2.189452, 2.190903, 2.192194, 2.193494, 2.194834, 2.196202, 2.19748, 2.198947, 2.200274, 2.201625, 2.20308, 2.204451, 2.205829, 2.207098, 2.20885, 2.210441, 2.21181, 2.21316, 2.214643, 2.215892, 2.217238, 2.218633, 2.219969, 2.221363, 2.222749, 2.224043, 2.225371, 2.226684, 2.22806, 2.229466, 2.230811, 2.231989, 2.233304, 2.234714, 2.236356, 2.237867, 2.239125, 2.240518, 2.241896, 2.243217, 2.244816, 2.246218, 2.247506, 2.248918, 2.250289, 2.251712, 2.253221, 2.254681, 2.256007, 2.257332, 2.25864, 2.260061, 2.261376, 2.262732, 2.264185, 2.265408, 2.2667, 2.268217, 2.27031, 2.271756, 2.273061, 2.274464, 2.275849, 2.277176, 2.278569, 2.279908, 2.281556, 2.283317, 2.284733, 2.286107, 2.287529, 2.288865, 2.290127, 2.291647, 2.293149, 2.294539, 2.295952, 2.297334, 2.298728, 2.300152, 2.301545, 2.302946, 2.304396, 2.305749, 2.307033, 2.308403, 2.309757, 2.311114, 2.312418, 2.313794, 2.315201, 2.316612, 2.318038, 2.319429, 2.320774, 2.322151, 2.323581, 2.324977, 2.326381, 2.327892, 2.329409, 2.330745, 2.332232, 2.333733, 2.334973, 2.337015, 2.338498, 2.339938, 2.341245, 2.342588, 2.344211, 2.345958, 2.347267, 2.348616, 2.349986, 2.351342, 2.352705, 2.354081, 2.35543, 2.356716, 2.358174, 2.359482, 2.360807, 2.362171, 2.363656, 2.364966, 2.366305, 2.367674, 2.369155, 2.370475, 2.371689, 2.373002, 2.37434, 2.375636, 2.376967, 2.378397, 2.379639, 2.380992, 2.38236, 2.383831, 2.385212, 2.386625, 2.388303, 2.391197, 2.392536, 2.394008, 2.395541, 2.396897, 2.398233, 2.399715, 2.401085, 2.402556, 2.40435, 2.406022, 2.40772, 2.409157, 2.41055, 2.411956, 2.413348, 2.414704, 2.416069, 2.417447, 2.418641, 2.419962, 2.421315, 2.422682, 2.423932, 2.426098, 2.428328, 2.429614, 2.430879, 2.432259, 2.433501, 2.43483, 2.436218, 2.437498, 2.438832, 2.440169, 2.44147, 2.442719, 2.443955, 2.445336, 2.446611, 2.447917, 2.449225, 2.450544, 2.451949, 2.453304, 2.454629, 2.45604, 2.457269, 2.458646, 2.460117, 2.46155, 2.463096, 2.464439, 2.465753, 2.467161, 2.468657, 2.470303, 2.471824, 2.473242, 2.474682, 2.4765, 2.477957, 2.479865, 2.481305, 2.482731, 2.484099, 2.485504, 2.48691, 2.488338, 2.489761, 2.491245, 2.492754, 2.49405, 2.495348, 2.496688, 2.497945, 2.499386, 2.500578, 2.502024, 2.504213, 2.505465, 2.506975, 2.50825, 2.509588, 2.511072, 2.512681, 2.514073, 2.515446, 2.516781, 2.518195, 2.519525, 2.520967, 2.522394, 2.523808, 2.525316, 2.526697, 2.528064, 2.529469, 2.530797, 2.532206, 2.533485, 2.534866, 2.536213, 2.537628, 2.53921, 2.540826, 2.542238, 2.54368, 2.54513, 2.546532, 2.547908, 2.549816, 2.551304, 2.552661, 2.554061, 2.555441, 2.556867, 2.558283, 2.559669, 2.561489, 2.563133, 2.56516, 2.566537, 2.567916, 2.569211, 2.571131, 2.573326, 2.574861, 2.576265, 2.57764, 2.578999, 2.580434, 2.581823, 2.58322, 2.584637, 2.585961, 2.587378, 2.588766, 2.590166, 2.591553, 2.592933, 2.594352, 2.595711, 2.597167, 2.598583, 2.59992, 2.601678, 2.603502, 2.606222, 2.608181, 2.60977, 2.611828, 2.613501, 2.615408, 2.616861, 2.618223, 2.619583, 2.621, 2.622386, 2.62381, 2.625208, 2.626645, 2.628064, 2.629418, 2.630803, 2.632255, 2.633657, 2.635047, 2.636451, 2.637841, 2.639222, 2.640684, 2.64201, 2.643401, 2.644802, 2.646218, 2.647615, 2.649059, 2.65038, 2.651737, 2.653139, 2.654385, 2.65574, 2.657145, 2.658492, 2.659858, 2.661239, 2.662593, 2.664034, 2.665422, 2.666821, 2.668255, 2.669665, 2.671046, 2.672455, 2.673854, 2.675275, 2.676693, 2.678088, 2.679498, 2.68088, 2.682301, 2.683605, 2.684963, 2.686395, 2.687764, 2.689194, 2.690566, 2.691957, 2.693304, 2.694705, 2.696133, 2.697482, 2.698897, 2.700294, 2.701685, 2.703095, 2.704534, 2.705922, 2.707377, 2.708759, 2.710171, 2.711602, 2.712972, 2.7144, 2.715788, 2.717152, 2.718582, 2.719985, 2.721369, 2.722794, 2.724191, 2.725627, 2.727024, 2.72842, 2.729797, 2.73119, 2.732548, 2.733974, 2.735378, 2.736764, 2.738528, 2.740431, 2.741845, 2.743262, 2.744667, 2.746067, 2.74747, 2.748892, 2.75027, 2.751624, 2.75304, 2.754449, 2.75592, 2.757325, 2.758682, 2.760107, 2.761442, 2.762853, 2.764244, 2.765646, 2.767011, 2.768379, 2.76973, 2.771097, 2.772491, 2.773866, 2.775287, 2.776698, 2.77804, 2.779425, 2.780851, 2.782229, 2.783629, 2.785024, 2.786436, 2.78778, 2.789221, 2.79059, 2.791991, 2.793376, 2.79478, 2.796203, 2.797618, 2.799208, 2.800588, 2.802009, 2.803369, 2.804694, 2.806071, 2.807484, 2.808799, 2.810351, 2.811738, 2.813114, 2.814481, 2.815813, 2.817214, 2.818607, 2.820005, 2.821454, 2.822855, 2.824248, 2.825663, 2.827065, 2.828475, 2.829866, 2.83126, 2.832724, 2.834324, 2.835844, 2.837096, 2.838473, 2.839892, 2.841306, 2.842645, 2.844046, 2.845437, 2.846816, 2.848216, 2.849583, 2.850916, 2.852332, 2.85374, 2.85512, 2.856545, 2.857914, 2.85926, 2.8606, 2.862021, 2.863443, 2.865282, 2.866643, 2.868328, 2.869847, 2.87136, 2.873223, 2.875021, 2.876762, 2.878442, 2.879832, 2.88124, 2.882596, 2.883981, 2.885379, 2.88681, 2.8882, 2.889543, 2.890946, 2.892356, 2.893754, 2.895202, 2.896657, 2.898078, 2.899453, 2.900858, 2.902258, 2.903663, 2.905063, 2.90647, 2.907885, 2.909296, 2.910713, 2.912215, 2.9136, 2.914984, 2.916312, 2.917736, 2.919118, 2.921184, 2.922528, 2.923921, 2.92532, 2.926738, 2.928138, 2.929531, 2.930919, 2.932323, 2.933734, 2.935104, 2.936516, 2.93797, 2.93939, 2.940787, 2.942186, 2.943578, 2.944966, 2.946367, 2.947715, 2.949119, 2.95051, 2.951888, 2.953339, 2.954709, 2.956089, 2.957482, 2.958898, 2.960819, 2.962459, 2.964056, 2.96553, 2.966948, 2.968332, 2.969741, 2.971131, 2.972585, 2.973983, 2.975381, 2.976791, 2.978206, 2.979697, 2.981039, 2.982433, 2.983842, 2.985243, 2.98665, 2.988038, 2.989383, 2.990971, 2.992377, 2.993738, 2.995107, 2.99652, 2.997872, 2.999268, 3.000641, 3.001932, 3.00326, 3.004661, 3.006053, 3.007415, 3.008771, 3.010116, 3.011496, 3.012912, 3.014521, 3.015823, 3.017118, 3.018516, 3.01989, 3.021274, 3.022673, 3.024094, 3.025499, 3.026874, 3.02824, 3.029673, 3.031071, 3.032464, 3.033883, 3.035295, 3.036665, 3.038049, 3.039427, 3.040809, 3.042216, 3.043572, 3.044981, 3.04635, 3.04776, 3.04915, 3.050566, 3.051948, 3.053429, 3.054869, 3.056267, 3.057689, 3.059096, 3.060484, 3.061908, 3.063512, 3.065082, 3.066458, 3.067764, 3.069099, 3.070516, 3.071929, 3.073358, 3.074765, 3.076166, 3.077587, 3.07897, 3.080354, 3.081725, 3.083128, 3.084556, 3.085955, 3.087295, 3.088717, 3.090105, 3.091521, 3.092932, 3.094349, 3.095762, 3.097172, 3.09854, 3.099941, 3.101379, 3.102781, 3.104147, 3.10552, 3.10694, 3.108332, 3.109739, 3.111151, 3.112544, 3.113958, 3.115342, 3.116762, 3.118183, 3.119577, 3.120988, 3.122405, 3.123771, 3.125174, 3.126575, 3.127982, 3.129375, 3.130735, 3.132121, 3.133535, 3.134937, 3.136355, 3.137639, 3.139115, 3.140522, 3.141922, 3.143326, 3.144719, 3.146102, 3.147502, 3.148854, 3.150335, 3.151681, 3.153042, 3.154456, 3.155844, 3.15734, 3.158763, 3.160129, 3.161538, 3.162907, 3.164345, 3.165929, 3.167414, 3.168726, 3.170169, 3.171575, 3.172888, 3.174262, 3.17562, 3.177316, 3.178747, 3.180106, 3.181424, 3.182839, 3.184147, 3.185811, 3.187129, 3.188438, 3.18987, 3.191358, 3.192858, 3.194214, 3.1956, 3.197025, 3.198481, 3.199884, 3.201275, 3.202664, 3.204038, 3.205415, 3.206904, 3.208327, 3.209642, 3.210976, 3.212366, 3.213783, 3.215232, 3.216567, 3.217984, 3.219462, 3.22085, 3.222075, 3.223431, 3.22482, 3.226186, 3.227553, 3.228944, 3.230317, 3.232108, 3.233397, 3.234672, 3.23613, 3.237533, 3.238884, 3.240312, 3.241738, 3.243139, 3.244531, 3.24587, 3.247258, 3.248673, 3.250061, 3.251528, 3.252935, 3.25427, 3.255716, 3.257286, 3.258744, 3.260134, 3.261548, 3.262925, 3.264405, 3.265854, 3.267226, 3.268837, 3.270215, 3.271581, 3.272974, 3.274398, 3.275807, 3.277234, 3.278624, 3.280043, 3.281397, 3.28278, 3.284192, 3.285452, 3.286802, 3.288123, 3.289391, 3.29069, 3.292, 3.293319, 3.294634, 3.295991, 3.297293, 3.298651, 3.300016, 3.301338, 3.302722, 3.304182, 3.305534, 3.30686, 3.308193, 3.309588, 3.31093, 3.312333, 3.313835, 3.315141, 3.31646, 3.31779, 3.319622, 3.321153, 3.322601, 3.324224, 3.32578, 3.327353, 3.328966, 3.330542, 3.332102, 3.333705, 3.335336, 3.33711, 3.338686, 3.34027, 3.34181, 3.343455, 3.345151, 3.3467, 3.348151, 3.349674, 3.351178, 3.352573, 3.354255, 3.355753, 3.357123, 3.358497, 3.359828, 3.361127, 3.362487, 3.363886, 3.365219, 3.366582, 3.36798, 3.369403, 3.370775, 3.3721, 3.373505, 3.374873, 3.376215, 3.37765, 3.379055, 3.380409, 3.381672, 3.382924, 3.384218, 3.38557, 3.386781, 3.388201, 3.389468, 3.390888, 3.392182, 3.393519, 3.394847, 3.396171, 3.397497, 3.398925, 3.40025, 3.40159, 3.402988, 3.404369, 3.405769, 3.407119, 3.408541, 3.409883, 3.411267, 3.412667, 3.414036, 3.415432, 3.416791, 3.418117, 3.419416, 3.420788, 3.422146, 3.423439, 3.424838, 3.426136, 3.427638, 3.429072, 3.430468, 3.431941, 3.433446, 3.434788, 3.436019, 3.437345, 3.438691, 3.440009, 3.441401, 3.442761, 3.444437, 3.445829, 3.447211, 3.448527, 3.449936, 3.451296, 3.452685, 3.454014, 3.45532, 3.456578, 3.457925, 3.459263, 3.460723, 3.462132, 3.463519, 3.464864, 3.466285, 3.467722, 3.469043, 3.470323, 3.471667, 3.473037, 3.474378, 3.47575, 3.477118, 3.478516, 3.47979, 3.481122, 3.482581, 3.484001, 3.48529, 3.486656, 3.488055, 3.489457, 3.490808, 3.492149, 3.493506, 3.4949, 3.496244, 3.497607, 3.499082, 3.500494, 3.501922, 3.503195, 3.504607, 3.506013, 3.507265, 3.508649, 3.510016, 3.511352, 3.512808, 3.514216, 3.515619, 3.516977, 3.518357, 3.519773, 3.52122, 3.52252, 3.523894, 3.525281, 3.526845, 3.528197, 3.52957, 3.530896, 3.532264, 3.533648, 3.535043, 3.536446, 3.537882, 3.53926, 3.540637, 3.541859, 3.54323, 3.54464, 3.545996, 3.547333, 3.548664, 3.549993, 3.551323, 3.552707, 3.554069, 3.555429, 3.5568, 3.558142, 3.559561, 3.560883, 3.562171, 3.563612, 3.56493, 3.566226, 3.567553, 3.568902, 3.570199, 3.571593, 3.572957, 3.574383, 3.575733, 3.57715, 3.578493, 3.579813, 3.581151, 3.582561, 3.583856, 3.585186, 3.5865, 3.587837, 3.589156, 3.590488, 3.591846, 3.593193, 3.594612, 3.595972, 3.597379, 3.598682, 3.600063, 3.601397, 3.602733, 3.604105, 3.605384, 3.606707, 3.608157, 3.609542, 3.610835, 3.61217, 3.613592, 3.614958, 3.616286, 3.617665, 3.619023, 3.620372, 3.621742, 3.623095, 3.624419, 3.625777, 3.627093, 3.628446, 3.629818, 3.631129, 3.632503, 3.633841, 3.635246, 3.636632, 3.637984, 3.639299, 3.640668, 3.642026, 3.643354, 3.644702, 3.645947, 3.647285, 3.648659, 3.650035, 3.651409, 3.652827, 3.654235, 3.655603, 3.657057, 3.658403, 3.659735, 3.661053, 3.662396, 3.663746, 3.66508, 3.666413, 3.667753, 3.669189, 3.670532, 3.671883, 3.673251, 3.674687, 3.676092, 3.677399, 3.678805, 3.680215, 3.681541, 3.682803, 3.684146, 3.685453, 3.686772, 3.688056, 3.689298, 3.69065, 3.692027, 3.693446, 3.694792, 3.696176, 3.697696, 3.699037, 3.700457, 3.701728, 3.703039, 3.704338, 3.705634, 3.706993, 3.70833, 3.70974, 3.71107, 3.712448, 3.713863, 3.715211, 3.716606, 3.717962, 3.719277, 3.720603, 3.721999, 3.723346, 3.724809, 3.726139, 3.727441, 3.728749, 3.730091, 3.73151, 3.73279, 3.734181, 3.735635, 3.736982, 3.738317, 3.739711, 3.741179, 3.742548, 3.743886, 3.745276, 3.746686, 3.748064, 3.749425, 3.750848, 3.752245, 3.753686, 3.75522, 3.756583, 3.757898, 3.759248, 3.760608, 3.761988, 3.763246, 3.764585, 3.765932, 3.767349, 3.76872, 3.770093, 3.771385, 3.772797, 3.774227, 3.775597, 3.777003, 3.778383, 3.7797, 3.781047, 3.782342, 3.783675, 3.785046, 3.786375, 3.787696, 3.788989, 3.790302, 3.791623, 3.792969, 3.794453, 3.795808, 3.797182, 3.798563, 3.799943, 3.80128, 3.802608, 3.803941, 3.805327, 3.806813, 3.80819, 3.809624, 3.811014, 3.812326, 3.813762, 3.815067, 3.81641, 3.817767, 3.819147, 3.820521, 3.821818, 3.8232, 3.824527, 3.825827, 3.827137, 3.828394, 3.829966, 3.83135, 3.832695, 3.834253, 3.835594, 3.836999, 3.838335, 3.839761, 3.841112, 3.842537, 3.843943, 3.845371, 3.846764, 3.848159, 3.849589, 3.850928, 3.852229, 3.853612, 3.854959, 3.856338, 3.857633, 3.858988, 3.860308, 3.861585, 3.86292, 3.864308, 3.865656, 3.86698, 3.868322, 3.869643, 3.871087, 3.872465, 3.873911, 3.875342, 3.87677, 3.878196, 3.879507, 3.880911, 3.882276, 3.883647, 3.885063, 3.886532, 3.887826, 3.889117, 3.890485, 3.891878, 3.893223, 3.894531, 3.895766, 3.89709, 3.898442, 3.899874, 3.901221, 3.902659, 3.90415, 3.905572, 3.906983, 3.908365, 3.909729, 3.911075, 3.912594, 3.914075, 3.915426, 3.916681, 3.91809, 3.919523, 3.920894, 3.922136, 3.923398, 3.924753, 3.926088, 3.927378, 3.928678, 3.930039, 3.93138, 3.93271, 3.934058, 3.935433, 3.936755, 3.938104, 3.939433, 3.940832, 3.942219, 3.943574, 3.944937, 3.946282, 3.94765, 3.948924, 3.950324, 3.951701, 3.953042, 3.954475, 3.955832, 3.957136, 3.958427, 3.959775, 3.96108, 3.962461, 3.963837, 3.965181, 3.966516, 3.96787, 3.969237, 3.970579, 3.971905, 3.973319, 3.974725, 3.976097, 3.977479, 3.978887, 3.980214, 3.98161, 3.982974, 3.984366, 3.985767, 3.9872, 3.988724, 3.993198, 3.994587, 3.99594, 3.997315, 3.998622, 4.000113, 4.001499, 4.002837, 4.004146, 4.005499, 4.006878, 4.008222, 4.009644, 4.011034, 4.012351, 4.013757, 4.015137, 4.01646, 4.017752, 4.019048, 4.020369, 4.021759, 4.023115, 4.024486, 4.025806, 4.027166, 4.02858, 4.029994, 4.031274, 4.032704, 4.034134, 4.035454, 4.036768, 4.038101, 4.039493, 4.040861, 4.042198, 4.043563, 4.044849, 4.046174, 4.047516, 4.048906, 4.050251, 4.051589, 4.053069, 4.054465, 4.055876, 4.057318, 4.058621, 4.059965, 4.061326, 4.062728, 4.064207, 4.065638, 4.067015, 4.068357, 4.069684, 4.07105, 4.072435, 4.073805, 4.075132, 4.07652, 4.077882, 4.079174, 4.080536, 4.081883, 4.08312, 4.084432, 4.085871, 4.08727, 4.088577, 4.090029, 4.091478, 4.092856, 4.094253, 4.095525, 4.096871, 4.098078, 4.099498, 4.100801, 4.102079, 4.103327, 4.104602, 4.105976, 4.107264, 4.108529, 4.10976, 4.110977, 4.112281, 4.113638, 4.114889, 4.11615, 4.117469, 4.118723, 4.120083, 4.12138, 4.122708, 4.124118, 4.125344, 4.126551, 4.127835, 4.129149, 4.130449, 4.131723, 4.133028, 4.134263, 4.135547, 4.136814, 4.138099, 4.139485, 4.140787, 4.14223, 4.143545, 4.144857, 4.146147, 4.147386, 4.14867, 4.149926, 4.151162, 4.15242, 4.153715, 4.155033, 4.15626, 4.157504, 4.158851, 4.160234, 4.16153, 4.16288, 4.164189, 4.165499, 4.166803, 4.168057, 4.16942, 4.170745, 4.172044, 4.173273, 4.174611, 4.175853, 4.177204, 4.178526, 4.179815, 4.181147, 4.182506, 4.183839, 4.185129, 4.18643, 4.187648, 4.188943, 4.190257, 4.191596, 4.19291, 4.194258, 4.195528, 4.196933, 4.198231, 4.19944, 4.200688, 4.201953, 4.203275, 4.204606, 4.206001, 4.207423, 4.20879, 4.210129, 4.211534, 4.212874, 4.214208, 4.215604, 4.216956, 4.218286, 4.219626, 4.221012, 4.222376, 4.223802, 4.225104, 4.226399, 4.227744, 4.229272, 4.230616, 4.232041, 4.233432, 4.23469, 4.236109, 4.237418, 4.238711, 4.240042, 4.241396, 4.242786, 4.244173, 4.245451, 4.24687, 4.248194, 4.24968, 4.250959, 4.252331, 4.253653, 4.254939, 4.256333, 4.257606, 4.258825, 4.260107, 4.261356, 4.262748, 4.264118, 4.265441, 4.266778, 4.268143, 4.269502, 4.270858, 4.272205, 4.273518, 4.274857, 4.276189, 4.277527, 4.278792, 4.280141, 4.281485, 4.282821, 4.284147, 4.285415, 4.286747, 4.288168, 4.289551, 4.290991, 4.292276, 4.293621, 4.295062, 4.296434, 4.297738, 4.299106, 4.300468, 4.301934, 4.303208, 4.304525, 4.305758, 4.307088, 4.308619, 4.310005, 4.311268, 4.312574, 4.313822, 4.31513, 4.316467, 4.317788, 4.319067, 4.320432, 4.321801, 4.323119, 4.324433, 4.32579, 4.327086, 4.328363, 4.329668, 4.331031, 4.332428, 4.333746, 4.335115, 4.336503, 4.337781, 4.339166, 4.340551, 4.341899, 4.343214, 4.344505, 4.345822, 4.347168, 4.348668, 4.350022, 4.351425, 4.352784, 4.354233, 4.355569, 4.356911, 4.358328, 4.359795, 4.361158, 4.362483, 4.363614, 4.364917, 4.366201, 4.367555, 4.36887, 4.370235, 4.371906, 4.373054, 4.374452, 4.375664, 4.376931, 4.378316, 4.379648, 4.380944, 4.382273, 4.383615, 4.385129, 4.387409, 4.389149, 4.390504, 4.393117, 4.394428, 4.395731, 4.397061, 4.398401, 4.399786, 4.401248, 4.4026, 4.403968, 4.405338, 4.406715, 4.407985, 4.40931, 4.410719, 4.412121, 4.413477, 4.41479, 4.416152, 4.41751, 4.418882, 4.420296, 4.421649, 4.422963, 4.424345, 4.425657, 4.426979, 4.428804, 4.431637, 4.433078, 4.434412, 4.436476, 4.437783, 4.439159, 4.440443, 4.441832, 4.443105, 4.444415, 4.445912, 4.447265, 4.448563, 4.450254, 4.451614, 4.453077, 4.454521, 4.455901, 4.457112, 4.458461, 4.459889, 4.461164, 4.463887, 4.465649, 4.467353, 4.46861, 4.470407, 4.471943, 4.473453, 4.475489, 4.476705, 4.478305, 4.479803, 4.481603, 4.483229, 4.48469, 4.486106, 4.487404, 4.489108, 4.490715, 4.492039, 4.493479, 4.495034, 4.49679, 4.498414, 4.499747, 4.501103, 4.502783, 4.504239, 4.505989, 4.507454, 4.510009, 4.511466, 4.51293, 4.515234, 4.517151, 4.518721, 4.520004, 4.521371, 4.522761, 4.524153, 4.52556, 4.527113, 4.528449, 4.529815, 4.531164, 4.532625, 4.534021, 4.535403, 4.536793, 4.538191, 4.539536, 4.540937, 4.542234, 4.543613, 4.54488, 4.546191, 4.547517, 4.548836, 4.550119, 4.551418, 4.552752, 4.554093, 4.555433, 4.556739, 4.558086, 4.559396, 4.560661, 4.562168, 4.563439, 4.564771, 4.566153, 4.567555, 4.56892, 4.570173, 4.571492, 4.572826, 4.574093, 4.575411, 4.576716, 4.578044, 4.57917, 4.580423, 4.581741, 4.583082, 4.584413, 4.585745, 4.587076, 4.588373, 4.58969, 4.591103, 4.592468, 4.593786, 4.59507, 4.596339, 4.597722, 4.599062, 4.6004, 4.601723, 4.60337, 4.604826, 4.606407, 4.608429, 4.610423, 4.612068, 4.613694, 4.615108, 4.616873, 4.618335, 4.619996, 4.621325, 4.622697, 4.623912, 4.625326, 4.626676, 4.628015, 4.629346, 4.630682, 4.632069, 4.633355, 4.63479, 4.636078, 4.637394, 4.63872, 4.64, 4.641328, 4.642716, 4.644014, 4.645309, 4.646613, 4.647966, 4.649319, 4.650651, 4.652016, 4.653358, 4.654727, 4.656108, 4.657477, 4.658858, 4.660208, 4.66149, 4.662761, 4.664277, 4.666232, 4.667628, 4.668936, 4.670259, 4.671613, 4.672945, 4.674351, 4.675756, 4.677088, 4.678492, 4.679786, 4.681253, 4.682652, 4.68399, 4.685346, 4.686726, 4.688009, 4.689309, 4.690603, 4.691882, 4.693204, 4.694517, 4.695858, 4.697223, 4.6985, 4.699797, 4.701034, 4.702406, 4.703742, 4.705204, 4.706574, 4.707883, 4.709425, 4.710846, 4.712237, 4.713612, 4.714955, 4.716464, 4.717866, 4.719128, 4.72053, 4.72182, 4.723095, 4.724363, 4.725641, 4.726925, 4.728225, 4.730063, 4.731912, 4.733397, 4.734674, 4.736708, 4.738095, 4.739808, 4.741328, 4.742561, 4.743774, 4.745044, 4.746229, 4.747453, 4.748672, 4.750055, 4.751343, 4.752712, 4.754105, 4.755443, 4.756792, 4.758126, 4.759464, 4.76079, 4.762137, 4.763587, 4.764885, 4.76618, 4.767538, 4.768831, 4.770068, 4.771347, 4.772703, 4.773958, 4.775273, 4.776635, 4.777918, 4.779267, 4.780537, 4.781783, 4.783075, 4.784383, 4.785619, 4.786951, 4.788285, 4.789601, 4.790913, 4.79225, 4.793609, 4.794928, 4.796312, 4.797676, 4.79912, 4.800427, 4.801839, 4.803207, 4.804554, 4.805919, 4.807518, 4.809, 4.810294, 4.811589, 4.812934, 4.814692, 4.816234, 4.817437, 4.818956, 4.820242, 4.821578, 4.822863, 4.824264, 4.825621, 4.826999, 4.828351, 4.829707, 4.83102, 4.832351, 4.833706, 4.834975, 4.836223, 4.837511, 4.838895, 4.840198, 4.841528, 4.842888, 4.844342, 4.845702, 4.84708, 4.848425, 4.849741, 4.851025, 4.852365, 4.85371, 4.855049, 4.856413, 4.85773, 4.85904, 4.860352, 4.861763, 4.863111, 4.864522, 4.865897, 4.867278, 4.868659, 4.869928, 4.871271, 4.872511, 4.87381, 4.875131, 4.876452, 4.877811, 4.879153, 4.880495, 4.881826, 4.883225, 4.884687, 4.886112, 4.887463, 4.888763, 4.890061, 4.891471, 4.892903, 4.894364, 4.895719, 4.897073, 4.898419, 4.899788, 4.901099, 4.902444, 4.903786, 4.905225, 4.90659, 4.907981, 4.909377, 4.910755, 4.912105, 4.913454, 4.914832, 4.916204, 4.917587, 4.918942, 4.920284, 4.921674, 4.923017, 4.924302, 4.925634, 4.926984, 4.928352, 4.929722, 4.931145, 4.932513, 4.933789, 4.935176, 4.936457, 4.937907, 4.939332, 4.940727, 4.942108, 4.943488, 4.945092, 4.946533, 4.947932, 4.949404, 4.95087, 4.952451, 4.954048, 4.955851, 4.957241, 4.958541, 4.959772, 4.961183, 4.962543, 4.963898, 4.965135, 4.966305, 4.96757, 4.96901, 4.97048, 4.971857, 4.973702, 4.975139, 4.976472, 4.977774, 4.979051, 4.980344, 4.981512, 4.982997, 4.984302, 4.985704, 4.986918, 4.988178, 4.989577, 4.991006, 4.992513, 4.993912, 4.995335, 4.996795, 4.998449, 4.999786, 5.001142, 5.002433, 5.003818, 5.005112, 5.006461, 5.007712, 5.008961, 5.01032, 5.011851, 5.013238, 5.014528, 5.01588, 5.017314, 5.01866, 5.020043, 5.021398, 5.022759, 5.024107, 5.025448, 5.026881, 5.028251, 5.029548, 5.030903, 5.032299, 5.033643, 5.03504, 5.036455, 5.037825, 5.039185, 5.040522, 5.04197, 5.04332, 5.044669, 5.046057, 5.047449, 5.048794, 5.05019, 5.051551, 5.052948, 5.05433, 5.05585, 5.057248, 5.058578, 5.059925, 5.061217, 5.062598, 5.063974, 5.065318, 5.066624, 5.067991, 5.06929, 5.070714, 5.072179, 5.073583, 5.07473, 5.076025, 5.077343, 5.078883, 5.080295, 5.081741, 5.08322, 5.084637, 5.085871, 5.08731, 5.088603, 5.089927, 5.091085, 5.092303, 5.093664, 5.095083, 5.096497, 5.097838, 5.099245, 5.100607, 5.101978, 5.103372, 5.104735, 5.106136, 5.107533, 5.108932, 5.110275, 5.111668, 5.113033, 5.114469, 5.115884, 5.117283, 5.118665, 5.120079, 5.121387, 5.122712, 5.124081, 5.125376, 5.126744, 5.128155, 5.129518, 5.130847, 5.132184, 5.133718, 5.135069, 5.136579, 5.137891, 5.139229, 5.140667, 5.141866, 5.143104, 5.144402, 5.145759, 5.147122, 5.148685, 5.150586, 5.151928, 5.153223, 5.154761, 5.156108, 5.157406, 5.158788, 5.160242, 5.161561, 5.162883, 5.164141, 5.165435, 5.166768, 5.168159, 5.16949, 5.170773, 5.172051, 5.173393, 5.174789, 5.17625, 5.177559, 5.178882, 5.180109, 5.181437, 5.182796, 5.184123, 5.185495, 5.186888, 5.188217, 5.18962, 5.191223, 5.192495, 5.193807, 5.195262, 5.19659, 5.197901, 5.199163, 5.200552, 5.201915, 5.203441, 5.204742, 5.206042, 5.207303, 5.20867, 5.209991, 5.211267, 5.212498, 5.213888, 5.215298, 5.216598, 5.21796, 5.219386, 5.220904, 5.222161, 5.223474, 5.22467, 5.22587, 5.227164, 5.228464, 5.229703, 5.230866, 5.232119, 5.233492, 5.234868, 5.236237, 5.237688, 5.238976, 5.240329, 5.241679, 5.242969, 5.244328, 5.245749, 5.247094, 5.248427, 5.249803, 5.251184, 5.252542, 5.253993, 5.255391, 5.256741, 5.258275, 5.259645, 5.260956, 5.262208, 5.263518, 5.264799, 5.266136, 5.26754, 5.268906, 5.270255, 5.271454, 5.272759, 5.274087, 5.275603, 5.27724, 5.278602, 5.279991, 5.281543, 5.283019, 5.284354, 5.285689, 5.287151, 5.288513, 5.289921, 5.291252, 5.293058, 5.294333, 5.295726, 5.297071, 5.298418, 5.299798, 5.30119, 5.302568, 5.304009, 5.305336, 5.30669, 5.308037, 5.309464, 5.31087, 5.312265, 5.313678, 5.315191, 5.316501, 5.318019, 5.31946, 5.320902, 5.322202, 5.323509, 5.324819, 5.326138, 5.327655, 5.329269, 5.330838, 5.332252, 5.333751, 5.335126, 5.336439, 5.337742, 5.339076, 5.340409, 5.341741, 5.343034, 5.344367, 5.345642, 5.347076, 5.348441, 5.349754, 5.351203, 5.352595, 5.35408, 5.355522, 5.357055, 5.358385, 5.359731, 5.361107, 5.362485, 5.36392, 5.365436, 5.36675, 5.368106, 5.369397, 5.370742, 5.37241, 5.373672, 5.375004, 5.376419, 5.377747, 5.379138, 5.380542, 5.381997, 5.383289, 5.384603, 5.385949, 5.387244, 5.388591, 5.389923, 5.391335, 5.392917, 5.394318, 5.395671, 5.397009, 5.398622, 5.400046, 5.401454, 5.403208, 5.404468, 5.40577, 5.407188, 5.408557, 5.410024, 5.411656, 5.412903, 5.414489, 5.415735, 5.417083, 5.418345, 5.419681, 5.421026, 5.422318, 5.423692, 5.425008, 5.426529, 5.427736, 5.429301, 5.430545, 5.431814, 5.433077, 5.434401, 5.435704, 5.437072, 5.438493, 5.439901, 5.441654, 5.443076, 5.444367, 5.445686, 5.446908, 5.448223, 5.449618, 5.451058, 5.452401, 5.45371, 5.45505, 5.456499, 5.458038, 5.459537, 5.4608, 5.462268, 5.463565, 5.464973, 5.466425, 5.467861, 5.469196, 5.470664, 5.472015, 5.473383, 5.474716, 5.476077, 5.477473, 5.478777, 5.480849, 5.482136, 5.48372, 5.485033, 5.486332, 5.487611, 5.488973, 5.490193, 5.491519, 5.49363, 5.495036, 5.496297, 5.497602, 5.498979, 5.500578, 5.501914, 5.50306, 5.504522, 5.505998, 5.507349, 5.508809, 5.510201, 5.511509, 5.512991, 5.514378, 5.515923, 5.517388, 5.518906, 5.520512, 5.521927, 5.523348, 5.524664, 5.526006, 5.527442, 5.528815, 5.530187, 5.531519, 5.532892, 5.53422, 5.535523, 5.536941, 5.538207, 5.539903, 5.541804, 5.543454, 5.544718, 5.546348, 5.54788, 5.549203, 5.550753, 5.55218, 5.553591, 5.554849, 5.556188, 5.557412, 5.558567, 5.559783, 5.561205, 5.562621, 5.564145, 5.5656, 5.566977, 5.568346, 5.569679, 5.571142, 5.572478, 5.573852, 5.575394, 5.576865, 5.578239, 5.579638, 5.581008, 5.582329, 5.583713, 5.585041, 5.586321, 5.587663, 5.589059, 5.590489, 5.591819, 5.593184, 5.594563, 5.596265, 5.597855, 5.599247, 5.600599, 5.601957, 5.603266, 5.604499, 5.605838, 5.607147, 5.608376, 5.60993, 5.611334, 5.612955, 5.614681, 5.615973, 5.617367, 5.618892, 5.620326, 5.621749, 5.623256, 5.624441, 5.625831, 5.627955, 5.629511, 5.630877, 5.632463, 5.633805, 5.635137, 5.636565, 5.637765, 5.639315, 5.640589, 5.642257, 5.643513, 5.644919, 5.646224, 5.647612, 5.648957, 5.650279, 5.651662, 5.652949, 5.65424, 5.655526, 5.656846, 5.658151, 5.659542, 5.660949, 5.66225, 5.663543, 5.665173, 5.666498, 5.667875, 5.669202, 5.670512, 5.671886, 5.673272, 5.674604, 5.676004, 5.67747, 5.678884, 5.680313, 5.681955, 5.683259, 5.684552, 5.685967, 5.687422, 5.688833, 5.690479, 5.692048, 5.694601, 5.695891, 5.697218, 5.698512, 5.699876, 5.701288, 5.70269, 5.704045, 5.705505, 5.707053, 5.708481, 5.709752, 5.711046, 5.712401, 5.713752, 5.715098, 5.716326, 5.717609, 5.718977, 5.72041, 5.721678, 5.723019, 5.724427, 5.725909, 5.727269, 5.728771, 5.730094, 5.731461, 5.733012, 5.734374, 5.735704, 5.737108, 5.738494, 5.739936, 5.741213, 5.742718, 5.7445, 5.745964, 5.747359, 5.748866, 5.750524, 5.751938, 5.753544, 5.755359, 5.757271, 5.758649, 5.760256, 5.761959, 5.763356, 5.764916, 5.766337, 5.767666, 5.769385, 5.770785, 5.772303, 5.773718, 5.775306, 5.776822, 5.778617, 5.781172, 5.782742, 5.784253, 5.78561, 5.787019, 5.788594, 5.790289, 5.791937, 5.793329, 5.794821, 5.79609, 5.797393, 5.798792, 5.800145, 5.801479, 5.802895, 5.804198, 5.805535, 5.806971, 5.808347, 5.80969, 5.81117, 5.812736, 5.814301, 5.815767, 5.817036, 5.818358, 5.81975, 5.821219, 5.822669, 5.824026, 5.825406, 5.826783, 5.828414, 5.829746, 5.83108, 5.832507, 5.834103, 5.83542, 5.836683, 5.838075, 5.839354, 5.840666, 5.842004, 5.843405, 5.844754, 5.846225, 5.847592, 5.849049, 5.850294, 5.851856, 5.853343, 5.854632, 5.856262, 5.857684, 5.858966, 5.860376, 5.861775, 5.863106, 5.864549, 5.865892, 5.867365, 5.868747, 5.870297, 5.871849, 5.873358, 5.874826, 5.876302, 5.877763, 5.879214, 5.880555, 5.881831, 5.883181, 5.884513, 5.885886, 5.887336, 5.888839, 5.890267, 5.89163, 5.893013, 5.894474, 5.895768, 5.897087, 5.898383, 5.89994, 5.901359, 5.902694, 5.904049, 5.905455, 5.906814, 5.908148, 5.909348, 5.911057, 5.91253, 5.914035, 5.915312, 5.916675, 5.91809, 5.919629, 5.920959, 5.922269, 5.923656, 5.924994, 5.926344, 5.927705, 5.928991, 5.93029, 5.93156, 5.932896, 5.934261, 5.93575, 5.937056, 5.938505, 5.939818, 5.94118, 5.94255, 5.943927, 5.945266, 5.946586, 5.947974, 5.949485, 5.95084, 5.95223, 5.953651, 5.955037, 5.956233, 5.957582, 5.958959, 5.960293, 5.961582, 5.963311, 5.964887, 5.966625, 5.967995, 5.969376, 5.9708, 5.972224, 5.973552, 5.974911, 5.976234, 5.977664, 5.979004, 5.980531, 5.981889, 5.983253, 5.98467, 5.985988, 5.987275, 5.988721, 5.990144, 5.99148, 5.992842, 5.994225, 5.995566, 5.99747, 5.999024, 6.00031, 6.001666, 6.00292, 6.004238, 6.005612, 6.006843, 6.00867, 6.010228, 6.011732, 6.013168, 6.014569, 6.016265, 6.017664, 6.019242, 6.020431, 6.021964, 6.024462, 6.025754, 6.027091, 6.028434, 6.029798, 6.031588, 6.033225, 6.034523, 6.036277, 6.037686, 6.03894, 6.040604, 6.041974, 6.043596, 6.045133, 6.046533, 6.047939, 6.04943, 6.050889, 6.052299, 6.053685, 6.054994, 6.056433, 6.057883, 6.059205, 6.06054, 6.062091, 6.063459, 6.064977, 6.066237, 6.067764, 6.069364, 6.070715, 6.072044, 6.073595, 6.07501, 6.076351, 6.077852, 6.079139, 6.080497, 6.081806, 6.083551, 6.08499, 6.0863, 6.088136, 6.089478, 6.091077, 6.092897, 6.094301, 6.095642, 6.097073, 6.098465, 6.099825, 6.10111, 6.102544, 6.103889, 6.10513, 6.106428, 6.107892, 6.109268, 6.110559, 6.111943, 6.113326, 6.114871, 6.116648, 6.118357, 6.119793, 6.122026, 6.123345, 6.124629, 6.125993, 6.127596, 6.128955, 6.130384, 6.131647, 6.133116, 6.134288, 6.136092, 6.137546, 6.139088, 6.140708, 6.142034, 6.143458, 6.144659, 6.145992, 6.147329, 6.148722, 6.150088, 6.152049, 6.153552, 6.154894, 6.15638, 6.157752, 6.159092, 6.160317, 6.161721, 6.163343, 6.164801, 6.166068, 6.167378, 6.169358, 6.170729, 6.172048, 6.173349, 6.174582, 6.176216, 6.177575, 6.178906, 6.180185, 6.181826, 6.183267, 6.184841, 6.186173, 6.18814, 6.190082, 6.191417, 6.192718, 6.194671, 6.196366, 6.197708, 6.198974, 6.200464, 6.201857, 6.20347, 6.204832, 6.205981, 6.207775, 6.209114, 6.210545, 6.211844, 6.213218, 6.214574, 6.216084, 6.217403, 6.218665, 6.219888, 6.221242, 6.222538, 6.223856, 6.225209, 6.226557, 6.227822, 6.229205, 6.230502, 6.231879, 6.233404, 6.234732, 6.236147, 6.237471, 6.23877, 6.240211, 6.24174, 6.243087, 6.244479, 6.245743, 6.247049, 6.248718, 6.24994, 6.251228, 6.252845, 6.254325, 6.255549, 6.256862, 6.25818, 6.259546, 6.260922, 6.262237, 6.263509, 6.264881, 6.266245, 6.267498, 6.268714, 6.270113, 6.27146, 6.2727, 6.274198, 6.275626, 6.277003, 6.278335, 6.279822, 6.281333, 6.282754, 6.284112, 6.285659, 6.286864, 6.288171, 6.289568, 6.291043, 6.292353, 6.293886, 6.295205, 6.296581, 6.297895, 6.299236, 6.300548, 6.301765, 6.303101, 6.304504, 6.305866, 6.3073, 6.308737, 6.310377, 6.311758, 6.313147, 6.314397, 6.315675, 6.317097, 6.318446, 6.319681, 6.321005, 6.322523, 6.323879, 6.325153, 6.326469, 6.32785, 6.329281, 6.33074, 6.331978, 6.333339, 6.334759, 6.336087, 6.33826, 6.339952, 6.341412, 6.342939, 6.344296, 6.345949, 6.347363, 6.348932, 6.350134, 6.351492, 6.352896, 6.354241, 6.355466, 6.356798, 6.358044, 6.35933, 6.360696, 6.361937, 6.363228, 6.364634, 6.365918, 6.367213, 6.368425, 6.369796, 6.371128, 6.372499, 6.373838, 6.375118, 6.376494, 6.377766, 6.379276, 6.380517, 6.381892, 6.383351, 6.384728, 6.385988, 6.387431, 6.388866, 6.390399, 6.391668, 6.392924, 6.394471, 6.395816, 6.397084, 6.398447, 6.39977, 6.401224, 6.402585, 6.404008, 6.405334, 6.406705, 6.40806, 6.40926, 6.410486, 6.412054, 6.413347, 6.414536, 6.416205, 6.417548, 6.419104, 6.420343, 6.421527, 6.42284, 6.424128, 6.425701, 6.427058, 6.428429, 6.429804, 6.431174, 6.432596, 6.433899, 6.435215, 6.436651, 6.438049, 6.439353, 6.440642, 6.442132, 6.443455, 6.444664, 6.44635, 6.447672, 6.449115, 6.450353, 6.451775, 6.45304, 6.454376, 6.45572, 6.457201, 6.45884, 6.460176, 6.461409, 6.462624, 6.46398, 6.465294, 6.466558, 6.46796, 6.469183, 6.47059, 6.472086, 6.473369, 6.474751, 6.476043, 6.477671, 6.478963, 6.48036, 6.481757, 6.483157, 6.484371, 6.485617, 6.487001, 6.488451, 6.489811, 6.49105, 6.492283, 6.493568, 6.494932, 6.496161, 6.497443, 6.498843, 6.50047, 6.501878, 6.503125, 6.504407, 6.506013, 6.507248, 6.508451, 6.5097, 6.511194, 6.512534, 6.514038, 6.515288, 6.516603, 6.517934, 6.51932, 6.520549, 6.521809, 6.523159, 6.524453, 6.52568, 6.526945, 6.528333, 6.529889, 6.531136, 6.53251, 6.533813, 6.53515, 6.536422, 6.537757, 6.539089, 6.540353, 6.541749, 6.543009, 6.544275, 6.545586, 6.546907, 6.548141, 6.549394, 6.550631, 6.552056, 6.553352, 6.554578, 6.556304, 6.557646, 6.558888, 6.560095, 6.561542, 6.562878, 6.564252, 6.565514, 6.566852, 6.568229, 6.56963, 6.571001, 6.572317, 6.573693, 6.575084, 6.576363, 6.577691, 6.57895, 6.580285, 6.581554, 6.582753, 6.584058, 6.58536, 6.586599, 6.588033, 6.589366, 6.590685, 6.592062, 6.59333, 6.594705, 6.596055, 6.597402, 6.598622, 6.599855, 6.601264, 6.602597, 6.603924, 6.605311, 6.606522, 6.607934, 6.60936, 6.610598, 6.611946, 6.613153, 6.614608, 6.615831, 6.617346, 6.618856, 6.620881, 6.622183, 6.623551, 6.62488, 6.626199, 6.627486, 6.628766, 6.630075, 6.631411, 6.632689, 6.633971, 6.63528, 6.636604, 6.637924, 6.639223, 6.640549, 6.641877, 6.643195, 6.644484, 6.645791, 6.647094, 6.648434, 6.649755, 6.651055, 6.652367, 6.653662, 6.654956, 6.656265, 6.657729, 6.659008, 6.660328, 6.661695, 6.663003, 6.664347, 6.665653, 6.667213, 6.6685, 6.669825, 6.671153, 6.672744, 6.674076, 6.675407, 6.676973, 6.678207, 6.679502, 6.68077, 6.682037, 6.683299, 6.684574, 6.686212, 6.687582, 6.688909, 6.690162, 6.691509, 6.692776, 6.694032, 6.695321, 6.696587, 6.697952, 6.699269, 6.700813, 6.702173, 6.703375, 6.704593, 6.706088, 6.707387, 6.708971, 6.7102, 6.711587, 6.713182, 6.714551, 6.716112, 6.717375, 6.718609, 6.719977, 6.721344, 6.722537, 6.723778, 6.725038, 6.726293, 6.727614, 6.728952, 6.730279, 6.731591, 6.732909, 6.7342, 6.73551, 6.736791, 6.738152, 6.739471, 6.741041, 6.742369, 6.743701, 6.745108, 6.746434, 6.74803, 6.749586, 6.750942, 6.752246, 6.753545, 6.754839, 6.756142, 6.757516, 6.758868, 6.760204, 6.761781, 6.763096, 6.764406, 6.765722, 6.767063, 6.768396, 6.769742, 6.771117, 6.772473, 6.774118, 6.775696, 6.776996, 6.778329, 6.780044, 6.781377, 6.782702, 6.783994, 6.785615, 6.786889, 6.788216, 6.789549, 6.790843, 6.792151, 6.793433, 6.794711, 6.796043, 6.797611, 6.79897, 6.800284, 6.801581, 6.802887, 6.804222, 6.805556, 6.807131, 6.808719, 6.81003, 6.811289, 6.812622, 6.81393, 6.815236, 6.816539, 6.817863, 6.819134, 6.820479, 6.821742, 6.823299, 6.824733, 6.825993, 6.827374, 6.828735, 6.829991, 6.831346, 6.832744, 6.834111, 6.835428, 6.836706, 6.837954, 6.839202, 6.840883, 6.842395, 6.843722, 6.845023, 6.846399, 6.847697, 6.849032, 6.850341, 6.85164, 6.85301, 6.854402, 6.855716, 6.856919, 6.858415, 6.859745, 6.861864, 6.863266, 6.864546, 6.866378, 6.867793, 6.869143, 6.870482, 6.871866, 6.873126, 6.874533, 6.875872, 6.877164, 6.878508, 6.879717, 6.881135, 6.882842, 6.884248] }, { label: 'ScriptDuration', backgroundColor: 'rgba(161, 59, 195, 0.2)', borderColor: 'rgba(161, 59, 195, 1.00)', - data: [0.011806, 0.01932, 0.024839, 0.029735, 0.035304, 0.039916, 0.044773, 0.049431, 0.053814, 0.058653, 0.062587, 0.066457, 0.070276, 0.074693, 0.079702, 0.083712, 0.088783, 0.093909, 0.098117, 0.104154, 0.108997, 0.114945, 0.118872, 0.122772, 0.127332, 0.131368, 0.135275, 0.138926, 0.143478, 0.147394, 0.151377, 0.15608, 0.161111, 0.165037, 0.169151, 0.173286, 0.177763, 0.182366, 0.186596, 0.190741, 0.194672, 0.199272, 0.203283, 0.207111, 0.211225, 0.215767, 0.219568, 0.224003, 0.228104, 0.232082] + data: [0.014251, 0.032293, 0.04639, 0.059536, 0.07394, 0.08875, 0.105464, 0.117318, 0.129837, 0.143122, 0.158888, 0.177807, 0.190292, 0.202882, 0.217151, 0.231278, 0.243541, 0.263557, 0.275397, 0.288905, 0.300247, 0.312509, 0.326661, 0.338605, 0.349655, 0.361865, 0.373699, 0.385214, 0.399262, 0.411527, 0.422659, 0.434441, 0.446639, 0.458609, 0.471187, 0.484171, 0.496546, 0.510906, 0.523342, 0.535658, 0.548472, 0.560166, 0.571915, 0.584317, 0.596992, 0.610703, 0.623524, 0.637779, 0.646185, 0.658591, 0.670867, 0.683005, 0.695011, 0.706276, 0.7155, 0.725754, 0.735658, 0.745789, 0.754711, 0.763601, 0.773784, 0.787148, 0.799722, 0.81118, 0.824721, 0.838046, 0.852376, 0.866194, 0.879656, 0.891043, 0.905505, 0.919263, 0.931613, 0.943995, 0.956512, 0.968816, 0.981383, 0.99429, 1.007147, 1.017795, 1.031486, 1.043931, 1.058826, 1.071735, 1.085667, 1.100868, 1.115604, 1.130001, 1.142464, 1.155261, 1.169544, 1.184019, 1.198143, 1.211935, 1.226932, 1.238916, 1.254151, 1.268345, 1.282343, 1.297159, 1.313401, 1.327173, 1.341762, 1.356381, 1.37097, 1.384866, 1.399331, 1.414168, 1.428717, 1.443801, 1.459454, 1.473755, 1.488249, 1.502626, 1.517007, 1.531344, 1.546093, 1.559825, 1.574185, 1.589151, 1.604029, 1.619028, 1.634538, 1.648734, 1.66327, 1.677857, 1.693185, 1.708465, 1.723546, 1.73878, 1.754004, 1.769861, 1.783807, 1.798935, 1.813946, 1.829272, 1.844013, 1.862711, 1.8744, 1.889057, 1.904095, 1.915687, 1.929463, 1.94215, 1.956882, 1.971149, 1.985654, 2.000515, 2.015599, 2.033135, 2.047002, 2.062593, 2.077528, 2.092941, 2.109989, 2.125899, 2.140536, 2.156469, 2.171754, 2.186653, 2.203104, 2.219189, 2.234114, 2.249945, 2.266678, 2.282127, 2.298374, 2.313354, 2.326931, 2.342949, 2.359538, 2.37596, 2.391384, 2.406537, 2.422404, 2.438882, 2.454717, 2.472683, 2.489089, 2.505343, 2.521552, 2.538054, 2.553672, 2.569539, 2.586333, 2.603392, 2.62, 2.636986, 2.653761, 2.670861, 2.686581, 2.703809, 2.720167, 2.737164, 2.754252, 2.770974, 2.788319, 2.805006, 2.821931, 2.838734, 2.855656, 2.872565, 2.890345, 2.907399, 2.924541, 2.940922, 2.957676, 2.974559, 2.991274, 3.009644, 3.027584, 3.046253, 3.064636, 3.081835, 3.099103, 3.116797, 3.134793, 3.151951, 3.169654, 3.188801, 3.206464, 3.224257, 3.241631, 3.258713, 3.276561, 3.294182, 3.310805, 3.32811, 3.347755, 3.369198, 3.388244, 3.407466, 3.426253, 3.444013, 3.461286, 3.478392, 3.495238, 3.513082, 3.532563, 3.550688, 3.568897, 3.587082, 3.603786, 3.622103, 3.64065, 3.658149, 3.676739, 3.696188, 3.714251, 3.732889, 3.752562, 3.770702, 3.789102, 3.807723, 3.826712, 3.844832, 3.863566, 3.882608, 3.901426, 3.920313, 3.939452, 3.958647, 3.977298, 3.996606, 4.015397, 4.034484, 4.053327, 4.071842, 4.090585, 4.109763, 4.127822, 4.148003, 4.168026, 4.186302, 4.206056, 4.224817, 4.24355, 4.263504, 4.283213, 4.304143, 4.324995, 4.345845, 4.365755, 4.384608, 4.404421, 4.423778, 4.443309, 4.462034, 4.480553, 4.501055, 4.518894, 4.538647, 4.557921, 4.576386, 4.595643, 4.613931, 4.632541, 4.652969, 4.672669, 4.691846, 4.711665, 4.732125, 4.752903, 4.773125, 4.791881, 4.81072, 4.830092, 4.850374, 4.870823, 4.891501, 4.912792, 4.931952, 4.95229, 4.972865, 4.99212, 5.012095, 5.031647, 5.053752, 5.073953, 5.093475, 5.113776, 5.133717, 5.153558, 5.173807, 5.193809, 5.213552, 5.236079, 5.257426, 5.279335, 5.299076, 5.319177, 5.339411, 5.361001, 5.381452, 5.4036, 5.422298, 5.443266, 5.465322, 5.486864, 5.508314, 5.52907, 5.550361, 5.571442, 5.591116, 5.611913, 5.633586, 5.655894, 5.678443, 5.701812, 5.724535, 5.74638, 5.767502, 5.788322, 5.804259, 5.825406, 5.847698, 5.868368, 5.889267, 5.909769, 5.93085, 5.95242, 5.973163, 5.994592, 6.01516, 6.036778, 6.058162, 6.081426, 6.102668, 6.124316, 6.146062, 6.167476, 6.18902, 6.210455, 6.23257, 6.253912, 6.275525, 6.298039, 6.320198, 6.341585, 6.363678, 6.385223, 6.407105, 6.430117, 6.45198, 6.473254, 6.49202, 6.509942, 6.528163, 6.544718, 6.561804, 6.578669, 6.595527, 6.612715, 6.629386, 6.646208, 6.663123, 6.679937, 6.69684, 6.714042, 6.731472, 6.748608, 6.76572, 6.782902, 6.799739, 6.816815, 6.834217, 6.851574, 6.868501, 6.88586, 6.902972, 6.920419, 6.938114, 6.955828, 6.973095, 6.99036, 7.008026, 7.025518, 7.043136, 7.060867, 7.07804, 7.095627, 7.113174, 7.130921, 7.148545, 7.166664, 7.185143, 7.20317, 7.220841, 7.239238, 7.257089, 7.274893, 7.29301, 7.311485, 7.329702, 7.348358, 7.366525, 7.384827, 7.402694, 7.421232, 7.43954, 7.457631, 7.475969, 7.494045, 7.512548, 7.531578, 7.549907, 7.56865, 7.587099, 7.606084, 7.624921, 7.643805, 7.662876, 7.681196, 7.699379, 7.718171, 7.737084, 7.755922, 7.774436, 7.79303, 7.811543, 7.830403, 7.849178, 7.867731, 7.886637, 7.905286, 7.92403, 7.942802, 7.961923, 7.981463, 8.000772, 8.020203, 8.039145, 8.058193, 8.077159, 8.095873, 8.114896, 8.134242, 8.153565, 8.173061, 8.192601, 8.21194, 8.237137, 8.26218, 8.285709, 8.310192, 8.334916, 8.359987, 8.385523, 8.409959, 8.435128, 8.460048, 8.484664, 8.508692, 8.534355, 8.55924, 8.586235, 8.612743, 8.638188, 8.663234, 8.688865, 8.713982, 8.738926, 8.764513, 8.789863, 8.815057, 8.841793, 8.870551, 8.897823, 8.923153, 8.949677, 8.97596, 8.996769, 9.017179, 9.037145, 9.05695, 9.07689, 9.097323, 9.117687, 9.138311, 9.159855, 9.180036, 9.200833, 9.26216, 9.319265, 9.340157, 9.361782, 9.38269, 9.403017, 9.423594, 9.444465, 9.464743, 9.485299, 9.505721, 9.526421, 9.547297, 9.568126, 9.589624, 9.610781, 9.632292, 9.653713, 9.674909, 9.697592, 9.719503, 9.740859, 9.763312, 9.785994, 9.808017, 9.829225, 9.850226, 9.873929, 9.900989, 9.928592, 9.955836, 9.982273, 10.009711, 10.03678, 10.064095, 10.09207, 10.118555, 10.145655, 10.173446, 10.201686, 10.229177, 10.256303, 10.283387, 10.310461, 10.337947, 10.364306, 10.390745, 10.418923, 10.445461, 10.471697, 10.498812, 10.525196, 10.552857, 10.580756, 10.608409, 10.636462, 10.665529, 10.693156, 10.72171, 10.749935, 10.77871, 10.807589, 10.837758, 10.867494, 10.896447, 10.924228, 10.953892, 10.982969, 11.010808, 11.039209, 11.067287, 11.096437, 11.125914, 11.155601, 11.184789, 11.215585, 11.246327, 11.275269, 11.304467, 11.332781, 11.361888, 11.390902, 11.420885, 11.450944, 11.480086, 11.509139, 11.53683, 11.56662, 11.595525, 11.624236, 11.65475, 11.684106, 11.713317, 11.742909, 11.772059, 11.801326, 11.83095, 11.860815, 11.890401, 11.919856, 11.949473, 11.97908, 12.008706, 12.038351, 12.068157, 12.098115, 12.127164, 12.156419, 12.185043, 12.215964, 12.248057, 12.278894, 12.309686, 12.339599, 12.370353, 12.40124, 12.430371, 12.459111, 12.489498, 12.519308, 12.551336, 12.582054, 12.612504, 12.642754, 12.672384, 12.704128, 12.734357, 12.76471, 12.79542, 12.825764, 12.856311, 12.887705, 12.919053, 12.94864, 12.979106, 13.010453, 13.040416, 13.069878, 13.099897, 13.13036, 13.160591, 13.191473, 13.220796, 13.250076, 13.27916, 13.310346, 13.339944, 13.369826, 13.40053, 13.431488, 13.462513, 13.493148, 13.523916, 13.553802, 13.584917, 13.615674, 13.64465, 13.673208, 13.75915, 13.7871, 13.818177, 13.853992, 13.886868, 13.918588, 13.950284, 13.982018, 14.013879, 14.045718, 14.077531, 14.108891, 14.141069, 14.172033, 14.20342, 14.235114, 14.266957, 14.297372, 14.326874, 14.355707, 14.385094, 14.414521, 14.44493, 14.474652, 14.504928, 14.536098, 14.568537, 14.600599, 14.632397, 14.663754, 14.695579, 14.7275, 14.759455, 14.791016, 14.823315, 14.853883, 14.886366, 14.91976, 14.955027, 14.987174, 15.013712, 15.042819, 15.068233, 15.100649, 15.132986, 15.164967, 15.197567, 15.230308, 15.262863, 15.295216, 15.328004, 15.360192, 15.393264, 15.425762, 15.454211, 15.487732, 15.520802, 15.553527, 15.586308, 15.61906, 15.652534, 15.685659, 15.714958, 15.742092, 15.775074, 15.807941, 15.834298, 15.863517, 15.891287, 15.924021, 15.957303, 15.988657, 16.021145, 16.052785, 16.084958, 16.117396, 16.145928, 16.174463, 16.208568, 16.240181, 16.273553, 16.305656, 16.339133, 16.3735, 16.407509, 16.442083, 16.475903, 16.507737, 16.535528, 16.562633, 16.589645, 16.616573, 16.643762, 16.671508, 16.699941, 16.72767, 16.755664, 16.784778, 16.812146, 16.84216, 16.870658, 16.897632, 16.924446, 16.951836, 16.979349, 17.006822, 17.034537, 17.062991, 17.096249, 17.129861, 17.163756, 17.198574, 17.233526, 17.266191, 17.297871, 17.332281, 17.366816, 17.401539, 17.436607, 17.471155, 17.506081, 17.541252, 17.576224, 17.611556, 17.646624, 17.681637, 17.716939, 17.752861, 17.787092, 17.822435, 17.857046, 17.892556, 17.927529, 17.961565, 17.995531, 18.031027, 18.066127, 18.100554, 18.136017, 18.171593, 18.207253, 18.243176, 18.278991, 18.314694, 18.350575, 18.386651, 18.422213, 18.457714, 18.493123, 18.529142, 18.562971, 18.59894, 18.635635, 18.671491, 18.707463, 18.744714, 18.781281, 18.816968, 18.847792, 18.877115, 18.906702, 18.93618, 18.965562, 18.99527, 19.028328, 19.05826, 19.087898, 19.116877, 19.14573, 19.177079, 19.206813, 19.237113, 19.267026, 19.296099, 19.325673, 19.359235, 19.394204, 19.429056, 19.465478, 19.500355, 19.535197, 19.570449, 19.606068, 19.642277, 19.676654, 19.711845, 19.747981, 19.784282, 19.820918, 19.857047, 19.893924, 19.930832, 19.965136, 20.000618, 20.037139, 20.072274, 20.106596, 20.140566, 20.17644, 20.209461, 20.246023, 20.282764, 20.32013, 20.357211, 20.394638, 20.430361, 20.466738, 20.502445, 20.538872, 20.574864, 20.610866, 20.648507, 20.685333, 20.722442, 20.761538, 20.798026, 20.834571, 20.870967, 20.907886, 20.944683, 20.981855, 21.016477, 21.052755, 21.0905, 21.127195, 21.163462, 21.199416, 21.234467, 21.269518, 21.307683, 21.345053, 21.382856, 21.422, 21.458206, 21.495294, 21.531808, 21.569957, 21.607239, 21.643622, 21.67991, 21.716256, 21.757416, 21.794334, 21.830498, 21.864419, 21.90203, 21.939869, 21.977859, 22.016253, 22.051548, 22.088715, 22.125841, 22.161949, 22.201002, 22.242305, 22.279788, 22.317405, 22.355489, 22.393974, 22.432857, 22.468768, 22.505341, 22.545629, 22.583347, 22.624281, 22.664005, 22.702312, 22.741428, 22.77957, 22.822759, 22.861746, 22.903611, 22.942449, 22.982435, 23.02142, 23.060024, 23.099588, 23.140549, 23.185214, 23.223643, 23.268523, 23.30963, 23.349315, 23.389009, 23.427828, 23.467348, 23.508255, 23.54878, 23.58732, 23.627767, 23.670889, 23.711356, 23.754259, 23.795033, 23.840478, 23.883331, 23.924527, 23.965909, 24.007251, 24.04539, 24.085939, 24.125423, 24.164819, 24.202476, 24.242403, 24.282802, 24.323157, 24.362515, 24.400434, 24.44057, 24.481653, 24.521995, 24.559693, 24.59893, 24.639453, 24.680955, 24.725457, 24.766178, 24.806099, 24.845618, 24.88593, 24.925932, 24.96665, 25.007542, 25.047576, 25.087831, 25.127327, 25.16268, 25.200281, 25.240209, 25.279543, 25.3183, 25.359416, 25.40068, 25.441765, 25.482284, 25.521659, 25.562965, 25.600968, 25.641699, 25.682223, 25.723509, 25.76489, 25.805973, 25.846217, 25.885446, 25.926505, 25.968064, 26.010018, 26.0501, 26.091297, 26.13345, 26.175413, 26.21767, 26.25848, 26.300252, 26.341648, 26.383401, 26.424916, 26.46867, 26.510909, 26.556636, 26.599135, 26.640616, 26.679576, 26.721653, 26.764693, 26.80701, 26.847412, 26.889512, 26.93065, 26.972192, 27.013283, 27.054815, 27.096451, 27.138994, 27.180613, 27.222824, 27.265062, 27.306741, 27.349978, 27.392842, 27.433494, 27.475703, 27.517748, 27.559249, 27.600292, 27.642334, 27.685094, 27.727586, 27.769442, 27.811149, 27.857992, 27.902044, 27.947299, 27.989245, 28.031527, 28.073734, 28.116534, 28.15905, 28.200219, 28.240664, 28.282359, 28.327172, 28.371738, 28.415448, 28.458308, 28.50212, 28.544994, 28.589489, 28.634991, 28.679004, 28.723546, 28.767541, 28.811805, 28.855678, 28.90096, 28.945906, 28.990274, 29.032312, 29.075828, 29.120195, 29.161007, 29.199258, 29.24647, 29.290464, 29.334982, 29.378938, 29.422612, 29.467062, 29.51099, 29.555437, 29.601396, 29.645445, 29.690466, 29.73643, 29.78094, 29.821794, 29.865352, 29.91053, 29.948592, 29.993272, 30.03764, 30.083077, 30.126885, 30.171302, 30.214411, 30.25712, 30.302091, 30.346417, 30.391016, 30.43493, 30.479152, 30.523245, 30.565313, 30.607138, 30.652107, 30.696424, 30.740648, 30.784539, 30.829074, 30.872685, 30.918141, 30.961134, 31.00359, 31.048092, 31.09267, 31.137113, 31.182259, 31.227545, 31.271934, 31.317062, 31.362568, 31.407818, 31.451642, 31.494291, 31.539264, 31.583864, 31.628112, 31.671958, 31.717847, 31.763249, 31.809267, 31.854569, 31.900797, 31.946191, 31.991888, 32.037656, 32.083109, 32.128565, 32.174417, 32.220163, 32.265491, 32.311309, 32.357264, 32.401797, 32.447974, 32.494827, 32.540616, 32.587415, 32.633125, 32.677309, 32.722662, 32.768468, 32.814194, 32.860333, 32.90617, 32.951097, 32.997101, 33.043561, 33.089943, 33.135604, 33.182288, 33.228981, 33.275615, 33.322194, 33.368908, 33.416086, 33.462435, 33.50875, 33.555317, 33.601632, 33.648429, 33.694995, 33.741641, 33.788569, 33.835763, 33.88265, 33.929486, 33.976449, 34.02301, 34.069904, 34.116676, 34.162144, 34.208192, 34.251941, 34.295624, 34.342198, 34.386963, 34.43171, 34.477932, 34.523455, 34.570808, 34.616158, 34.66171, 34.707876, 34.755299, 34.800423, 34.847984, 34.894306, 34.940519, 34.986215, 35.027511, 35.073725, 35.121211, 35.167156, 35.212297, 35.2586, 35.305168, 35.348015, 35.394353, 35.441657, 35.489011, 35.535643, 35.58239, 35.631617, 35.67868, 35.724854, 35.772502, 35.820128, 35.868626, 35.916391, 35.965296, 36.011238, 36.059562, 36.1081, 36.155205, 36.199959, 36.245709, 36.295813, 36.346076, 36.393935, 36.442593, 36.490755, 36.534343, 36.581588, 36.628343, 36.677047, 36.725541, 36.77476, 36.824019, 36.870983, 36.920226, 36.968229, 37.017896, 37.065423, 37.112543, 37.160298, 37.204206, 37.253179, 37.30087, 37.349774, 37.397595, 37.443166, 37.492135, 37.541147, 37.5902, 37.639243, 37.688084, 37.73686, 37.785825, 37.836507, 37.885666, 37.933935, 37.981671, 38.030809, 38.079664, 38.126443, 38.173135, 38.221729, 38.271468, 38.320786, 38.369532, 38.418498, 38.467519, 38.516872, 38.566541, 38.616886, 38.66586, 38.715454, 38.764217, 38.813834, 38.862847, 38.912356, 38.96151, 39.010685, 39.060044, 39.109391, 39.15943, 39.21081, 39.261781, 39.311572, 39.364759, 39.417977, 39.467709, 39.516713, 39.566155, 39.615623, 39.665485, 39.715061, 39.762273, 39.81038, 39.857408, 39.904879, 39.95203, 40.000908, 40.050016, 40.098003, 40.147678, 40.196511, 40.245935, 40.295355, 40.345981, 40.396521, 40.446767, 40.497222, 40.546862, 40.599202, 40.648061, 40.696838, 40.747555, 40.797334, 40.847283, 40.897855, 40.947767, 40.998705, 41.051496, 41.102603, 41.153562, 41.203899, 41.2545, 41.306717, 41.357106, 41.407481, 41.458631, 41.507125, 41.556182, 41.606586, 41.656613, 41.707105, 41.756711, 41.806512, 41.856918, 41.907145, 41.958035, 42.00824, 42.057842, 42.106974, 42.159661, 42.210036, 42.262145, 42.312873, 42.362691, 42.411377, 42.460708, 42.510473, 42.557279, 42.606421, 42.656152, 42.706957, 42.757934, 42.807677, 42.857384, 42.906936, 42.956795, 43.00243, 43.052795, 43.103394, 43.155152, 43.205397, 43.255781, 43.304781, 43.355544, 43.406207, 43.45646, 43.507878, 43.555556, 43.603831, 43.656165, 43.706443, 43.75485, 43.804564, 43.85533, 43.906111, 43.958687, 44.011938, 44.063294, 44.114791, 44.166646, 44.218235, 44.270425, 44.321133, 44.372769, 44.427857, 44.475139, 44.525415, 44.577151, 44.627706, 44.677764, 44.730235, 44.782038, 44.834179, 44.886149, 44.938035, 44.990326, 45.042475, 45.094736, 45.148227, 45.200749, 45.255703, 45.306154, 45.357627, 45.40934, 45.459733, 45.512704, 45.564414, 45.616558, 45.662598, 45.714898, 45.766997, 45.818335, 45.87045, 45.922347, 45.975076, 46.02816, 46.080937, 46.134281, 46.187573, 46.241038, 46.293859, 46.346767, 46.399422, 46.45277, 46.506324, 46.559506, 46.613185, 46.666616, 46.719874, 46.772965, 46.826696, 46.880867, 46.935394, 46.989081, 47.042862, 47.096418, 47.150061, 47.203654, 47.25679, 47.309572, 47.36319, 47.416941, 47.471011, 47.524993, 47.578822, 47.632565, 47.686889, 47.739115, 47.792466, 47.846503, 47.899742, 47.953019, 48.007826, 48.061019, 48.110224, 48.161667, 48.214941, 48.264879, 48.320739, 48.374645, 48.429298, 48.482479, 48.538092, 48.592539, 48.648295, 48.700758, 48.75564, 48.809993, 48.864001, 48.913311, 48.966958, 49.022264, 49.077203, 49.132895, 49.186791, 49.24214, 49.297125, 49.358408, 49.413393, 49.467314, 49.522222, 49.576827, 49.632173, 49.68599, 49.740501, 49.794879, 49.847551, 49.901803, 49.956275, 50.010423, 50.065851, 50.117558, 50.172249, 50.226822, 50.282977, 50.338949, 50.393597, 50.448687, 50.503757, 50.558936, 50.614437, 50.67039, 50.726148, 50.782384, 50.837576, 50.891893, 50.949081, 51.005741, 51.061063, 51.114922, 51.169788, 51.225649, 51.279725, 51.334542, 51.388438, 51.444622, 51.499025, 51.553337, 51.606147, 51.661225, 51.716735, 51.772014, 51.828313, 51.884639, 51.939285, 51.99619, 52.051657, 52.107496, 52.164332, 52.219406, 52.274682, 52.329326, 52.385776, 52.44175, 52.49712, 52.551585, 52.606311, 52.661443, 52.719098, 52.775605, 52.83262, 52.890624, 52.943337, 52.999664, 53.054746, 53.111105, 53.166769, 53.223019, 53.281035, 53.337208, 53.392957, 53.447667, 53.50466, 53.561217, 53.618465, 53.673788, 53.730302, 53.787516, 53.844312, 53.900836, 53.958117, 54.011992, 54.067434, 54.126391, 54.183949, 54.239342, 54.295167, 54.355254, 54.412617, 54.469254, 54.524612, 54.582599, 54.639125, 54.694049, 54.750394, 54.807536, 54.864486, 54.922783, 54.980875, 55.037704, 55.098631, 55.155679, 55.213309, 55.271045, 55.326787, 55.385639, 55.441238, 55.498081, 55.55652, 55.612053, 55.669591, 55.724574, 55.782273, 55.838368, 55.895692, 55.953925, 56.010637, 56.068383, 56.125102, 56.181656, 56.240491, 56.297495, 56.355466, 56.416637, 56.476201, 56.534279, 56.591961, 56.650617, 56.70934, 56.767619, 56.826211, 56.88419, 56.943006, 57.001664, 57.060574, 57.119392, 57.178454, 57.236897, 57.310305, 57.367802, 57.424232, 57.483776, 57.543185, 57.603962, 57.664193, 57.722593, 57.781698, 57.84107, 57.90019, 57.958593, 58.015317, 58.07434, 58.133697, 58.193418, 58.253203, 58.312702, 58.372569, 58.432168, 58.491717, 58.552147, 58.611346, 58.670908, 58.730442, 58.790977, 58.850263, 58.908439, 58.968756, 59.028039, 59.087726, 59.147713, 59.207022, 59.266456, 59.326122, 59.386754, 59.447314, 59.503548, 59.56518, 59.62736, 59.68681, 59.74766, 59.807033, 59.875031, 59.933097, 59.993421, 60.055298, 60.115634, 60.17602, 60.237597, 60.300865, 60.360969, 60.4213, 60.480964, 60.538005, 60.596033, 60.656434, 60.714047, 60.774745, 60.834136, 60.888752, 60.948519, 61.008858, 61.068089, 61.124666, 61.185523, 61.246671, 61.30732, 61.367852, 61.428445, 61.494537, 61.554452, 61.613442, 61.674663, 61.740759, 61.800035, 61.862048, 61.923898, 61.979763, 62.037657, 62.098906, 62.154833, 62.221601, 62.282816, 62.343978, 62.404795, 62.466119, 62.525723, 62.582918, 62.636265, 62.695459, 62.77123, 62.83205, 62.891415, 62.952958, 63.011099, 63.066359, 63.122827, 63.181228, 63.241026, 63.301389, 63.362119, 63.422132, 63.482029, 63.541262, 63.603888, 63.66715, 63.725839, 63.78426, 63.845623, 63.907532, 63.969541, 64.031477, 64.093452, 64.159794, 64.22429, 64.295379, 64.36004, 64.422412, 64.485863, 64.547114, 64.609341, 64.670869, 64.738877, 64.8022, 64.869155, 64.931966, 64.994349, 65.055829, 65.118422, 65.180497, 65.241207, 65.303869, 65.364605, 65.425677, 65.489651, 65.549503, 65.607618, 65.683021, 65.755844, 65.819797, 65.876027, 65.932341, 65.989513, 66.047472, 66.103846, 66.160787, 66.220037, 66.282157, 66.33885, 66.394948, 66.451259, 66.507954, 66.564961, 66.621976, 66.678909, 66.736102, 66.796902, 66.859122, 66.921271, 66.982311, 67.044329, 67.105559, 67.166545, 67.227802, 67.289839, 67.352159, 67.414497, 67.476502, 67.538741, 67.600471, 67.661037, 67.721854, 67.784474, 67.848672, 67.911065, 67.983562, 68.04713, 68.109349, 68.171715, 68.235108, 68.297366, 68.36164, 68.424951, 68.488145, 68.551254, 68.6143, 68.676291, 68.735859, 68.795359, 68.859696, 68.918996, 68.977236, 69.043397, 69.106159, 69.173804, 69.230929, 69.289181, 69.352393, 69.415992, 69.480079, 69.543694, 69.607782, 69.671535, 69.733998, 69.798862, 69.863031, 69.927532, 69.992156, 70.056563, 70.120315, 70.184424, 70.24793, 70.313085, 70.378059, 70.441832, 70.506249, 70.57078, 70.6355, 70.701414, 70.766518, 70.831627, 70.896844, 70.961182, 71.025404, 71.093793, 71.16209, 71.226611, 71.291422, 71.355427, 71.420606, 71.483166, 71.547366, 71.611186, 71.677996, 71.745189, 71.811307, 71.875765, 71.938434, 72.006345, 72.075078, 72.142611, 72.208005, 72.272918, 72.338706, 72.403663, 72.46972, 72.536303, 72.602641, 72.671704, 72.736821, 72.801988, 72.867388, 72.932414, 72.997622, 73.063706, 73.129399, 73.194624, 73.25992, 73.324793, 73.412093, 73.49422, 73.628622, 73.698862, 73.765153, 73.840097, 73.906139, 74.013803, 74.081166, 74.147708, 74.213697, 74.280091, 74.34624, 74.4124, 74.479188, 74.545457, 74.611777, 74.677701, 74.743336, 74.811205, 74.877519, 74.944286, 75.010371, 75.075505, 75.136379, 75.200876, 75.267254, 75.334516, 75.400674, 75.467221, 75.533459, 75.600193, 75.666005, 75.734034, 75.800489, 75.860773, 75.924967, 75.991532, 76.057275, 76.119514, 76.185935, 76.25075, 76.317295, 76.38346, 76.449534, 76.516823, 76.584563, 76.651243, 76.718632, 76.786184, 76.853772, 76.921105, 76.988272, 77.054549, 77.121617, 77.188503, 77.256928, 77.32395, 77.39191, 77.458931, 77.526194, 77.594114, 77.662314, 77.73095, 77.797766, 77.865052, 77.932751, 78.000312, 78.068155, 78.135473, 78.204137, 78.271978, 78.339466, 78.407315, 78.475522, 78.542886, 78.609594, 78.678212, 78.745516, 78.81236, 78.879239, 78.947079, 79.014272, 79.081531, 79.149558, 79.217266, 79.284798, 79.352586, 79.420166, 79.487633, 79.555853, 79.624299, 79.691967, 79.760289, 79.828005, 79.898531, 79.96759, 80.035736, 80.102943, 80.171121, 80.239139, 80.307698, 80.376303, 80.443987, 80.51223, 80.580498, 80.649194, 80.718173, 80.786701, 80.856056, 80.924459, 80.993029, 81.063631, 81.132749, 81.200639, 81.269664, 81.338238, 81.408074, 81.475826, 81.543936, 81.611673, 81.681766, 81.750424, 81.818995, 81.888139, 81.957669, 82.027844, 82.096939, 82.163809, 82.233221, 82.303077, 82.379436, 82.457834, 82.526886, 82.595692, 82.664214, 82.73415, 82.803652, 82.874874, 82.944347, 83.013923, 83.090504, 83.158354, 83.227014, 83.295698, 83.3648, 83.434347, 83.504218, 83.572559, 83.641098, 83.708665, 83.777751, 83.847067, 83.917351, 83.98727, 84.056837, 84.126458, 84.19683, 84.266633, 84.335557, 84.404859, 84.473721, 84.544656, 84.621141, 84.697326, 84.767038, 84.836466, 84.905903, 84.97571, 85.045353, 85.114487, 85.184524, 85.253756, 85.323773, 85.393932, 85.464053, 85.532701, 85.603912, 85.673268, 85.7437, 85.813971, 85.883512, 85.953666, 86.024028, 86.098059, 86.174227, 86.24927, 86.329728, 86.402171, 86.473458, 86.54492, 86.625608, 86.705384, 86.780534, 86.852261, 86.923261, 86.996155, 87.067149, 87.141818, 87.212511, 87.282801, 87.352851, 87.423819, 87.495109, 87.566052, 87.637383, 87.707724, 87.778916, 87.849617, 87.920301, 87.99178, 88.063085, 88.134807, 88.20711, 88.278531, 88.349587, 88.420243, 88.49788, 88.573471, 88.643923, 88.714573, 88.785917, 88.857242, 88.939217, 89.020547, 89.090826, 89.162565, 89.23402, 89.305057, 89.377147, 89.448569, 89.520396, 89.591658, 89.662946, 89.734298, 89.805698, 89.877681, 89.949504, 90.021605, 90.093692, 90.164693, 90.236267, 90.3073, 90.379001, 90.451024, 90.52293, 90.596217, 90.669338, 90.741605, 90.813697, 90.884529, 90.964105, 91.035773, 91.107707, 91.179686, 91.252024, 91.324197, 91.396444, 91.468953, 91.542514, 91.614794, 91.687347, 91.760419, 91.832928, 91.905091, 91.977986, 92.05046, 92.122972, 92.195442, 92.267795, 92.340095, 92.414214, 92.486454, 92.558077, 92.630699, 92.704444, 92.776822, 92.850605, 92.924096, 92.991786, 93.061624, 93.133074, 93.207558, 93.280106, 93.352895, 93.427, 93.499997, 93.573461, 93.647048, 93.721292, 93.788479, 93.859025, 93.930433, 94.003376, 94.074925, 94.14427, 94.217397, 94.290561, 94.363044, 94.431167, 94.50508, 94.577916, 94.650669, 94.737488, 94.810543, 94.883976, 94.957375, 95.030922, 95.104645, 95.177214, 95.250874, 95.324193, 95.396597, 95.468089, 95.542268, 95.616473, 95.689532, 95.758613, 95.833098, 95.906722, 95.979805, 96.052455, 96.126599, 96.200153, 96.28083, 96.355622, 96.429824, 96.504219, 96.576911, 96.650571, 96.724755, 96.798337, 96.872549, 96.947047, 97.021901, 97.096626, 97.170402, 97.244977, 97.318427, 97.393044, 97.467496, 97.541597, 97.61619, 97.690796, 97.765922, 97.839839, 97.91436, 97.988407, 98.063153, 98.137638, 98.212031, 98.286639, 98.360975, 98.435018, 98.509996, 98.584169, 98.658269, 98.733168, 98.808423, 98.88276, 98.957333, 99.031695, 99.106467, 99.181677, 99.256967, 99.331845, 99.405962, 99.480235, 99.555855, 99.631248, 99.70556, 99.780913, 99.856384, 99.931088, 100.006867, 100.082222, 100.159006, 100.231228, 100.30573, 100.381847, 100.457067, 100.532637, 100.607487, 100.683051, 100.759035, 100.834601, 100.909641, 100.985022, 101.060308, 101.136767, 101.212281, 101.288135, 101.36402, 101.440647, 101.513972, 101.585636, 101.656614, 101.731451, 101.808905, 101.880184, 101.954898, 102.030144, 102.107679, 102.182308, 102.260212, 102.334781, 102.409932, 102.487098, 102.564907, 102.642314, 102.718833, 102.796507, 102.874158, 102.952269, 103.030476, 103.107695, 103.183414, 103.261177, 103.336883, 103.412686, 103.48896, 103.566007, 103.642138, 103.718024, 103.794721, 103.873084, 103.951294, 104.027539, 104.104129, 104.180771, 104.257351, 104.333832, 104.410382, 104.486842, 104.563188, 104.641303, 104.71895, 104.791786, 104.867427, 104.94247, 105.019062, 105.094678, 105.171164, 105.246939, 105.321753, 105.394427, 105.472524, 105.552224, 105.627649, 105.705025, 105.783036, 105.860757, 105.937526, 106.014843, 106.092772, 106.169058, 106.245272, 106.32281, 106.399689, 106.478202, 106.554543, 106.632642, 106.711881, 106.790651, 106.86856, 106.945478, 107.024023, 107.101977, 107.178707, 107.257177, 107.334337, 107.411543, 107.487397, 107.564836, 107.641883, 107.719413, 107.796727, 107.875285, 107.953803, 108.031265, 108.110066, 108.186546, 108.262819, 108.339982, 108.418615, 108.498242, 108.578148, 108.659287, 108.739075, 108.818944, 108.898045, 108.976516, 109.056051, 109.134224, 109.212891, 109.292343, 109.372491, 109.451467, 109.5296, 109.607924, 109.690625, 109.769736, 109.849305, 109.928526, 110.008876, 110.08892, 110.168912, 110.263129, 110.341238, 110.422636, 110.499914, 110.580661, 110.657991, 110.736875, 110.815448, 110.893827, 110.972541, 111.050836, 111.130587, 111.209149, 111.288251, 111.369619, 111.448769, 111.526781, 111.60634, 111.685147, 111.764101, 111.842582, 111.946737, 112.025456, 112.103786, 112.182876, 112.261579, 112.341025, 112.42118, 112.499421, 112.578309, 112.658111, 112.738005, 112.81874, 112.899109, 112.977681, 113.057398, 113.136598, 113.216781, 113.296747, 113.375723, 113.455451, 113.537518, 113.614275, 113.690671, 113.764512, 113.840309, 113.917153, 114.005499, 114.090306, 114.168423, 114.243793, 114.319223, 114.395493, 114.471214, 114.547363, 114.621985, 114.701315, 114.782069, 114.863206, 114.944178, 115.023831, 115.105492, 115.18637, 115.26757, 115.347279, 115.425746, 115.50674, 115.587411, 115.665521, 115.745239, 115.82587, 115.905608, 115.985508, 116.06513, 116.145865, 116.225607, 116.303901, 116.384334, 116.465841, 116.547364, 116.628674, 116.710137, 116.790472, 116.872722, 116.953573, 117.035412, 117.116585, 117.198663, 117.281212, 117.363083, 117.444875, 117.525565, 117.608094, 117.689872, 117.771302, 117.852194, 117.935022, 118.017108, 118.098662, 118.179709, 118.259946, 118.340512, 118.419931, 118.500252, 118.581441, 118.664612, 118.745478, 118.828368, 118.911303, 118.992258, 119.073914, 119.156337, 119.237918, 119.319646, 119.401283, 119.484108, 119.567279, 119.649057, 119.730219, 119.811817, 119.892473, 119.973619, 120.055828, 120.136998, 120.219683, 120.301839, 120.384229, 120.465833, 120.54874, 120.632107, 120.713268, 120.794311, 120.876448, 120.958784, 121.039841, 121.122553, 121.205239, 121.287651, 121.369218, 121.45124, 121.533953, 121.617277, 121.702706, 121.786681, 121.868531, 121.950657, 122.033851, 122.116281, 122.198802, 122.282286, 122.364058, 122.445757, 122.529035, 122.613411, 122.695951, 122.777807, 122.860855, 122.943702, 123.02708, 123.110947, 123.193091, 123.276746, 123.360394, 123.443053, 123.526292, 123.609112, 123.692673, 123.776635, 123.860334, 123.942778, 124.026753, 124.109558, 124.192092, 124.275098, 124.35823, 124.439797, 124.522456, 124.605755, 124.68822, 124.771273, 124.854322, 124.935368, 125.017842, 125.102719, 125.185011, 125.268842, 125.351088, 125.432991, 125.517644, 125.599305, 125.682878, 125.766768, 125.851061, 125.935333, 126.018887, 126.10326, 126.186999, 126.271807, 126.356968, 126.440211, 126.525527, 126.609915, 126.694378, 126.777031, 126.861076, 126.945777, 127.030795, 127.114399, 127.198036, 127.283263, 127.366373, 127.449561, 127.534299, 127.618228, 127.701564, 127.786342, 127.870189, 127.954152, 128.03871, 128.120985, 128.205325, 128.290214, 128.373711, 128.459695, 128.54281, 128.626998, 128.711263, 128.795123, 128.878101, 128.962857, 129.04757, 129.130705, 129.216089, 129.301052, 129.385722, 129.470849, 129.556486, 129.642169, 129.727915, 129.812066, 129.899528, 129.984796, 130.069708, 130.153715, 130.238146, 130.323103, 130.408094, 130.493328, 130.578722, 130.664168, 130.749194, 130.834081, 130.918118, 131.001168, 131.08165, 131.164903, 131.250404, 131.333948, 131.419324, 131.503765, 131.58874, 131.674217, 131.758993, 131.843348, 131.929235, 132.013928, 132.097557, 132.183004, 132.268885, 132.353838, 132.437119, 132.522437, 132.607209, 132.690642, 132.773525, 132.896611, 132.981509, 133.066483, 133.1511, 133.237211, 133.321673, 133.406942, 133.491326, 133.57746, 133.663422, 133.748724, 133.834929, 133.9203, 134.00248, 134.089481, 134.174775, 134.260442, 134.346211, 134.430828, 134.516604, 134.601546, 134.687062, 134.771558, 134.857635, 134.944106, 135.029577, 135.115244, 135.20065, 135.285804, 135.370819, 135.457214, 135.542984, 135.629681, 135.713195, 135.798358, 135.883988, 135.969751, 136.054584, 136.14076, 136.227844, 136.312806, 136.399568, 136.484418, 136.571542, 136.656362, 136.744654, 136.832715, 136.918399, 137.00469, 137.091927, 137.178062, 137.262586, 137.348095, 137.434102, 137.520593, 137.607749, 137.694084, 137.780689, 137.866939, 137.953178, 138.040512, 138.127747, 138.213883, 138.300473, 138.386652, 138.471719, 138.558754, 138.644447, 138.731079, 138.817739, 138.902371, 138.987958, 139.07521, 139.160991, 139.247284, 139.331866, 139.419502, 139.507327, 139.593304, 139.67917, 139.765789, 139.850738, 139.937261, 140.024171, 140.111107, 140.197725, 140.283759, 140.370568, 140.458294, 140.545294, 140.631648, 140.763801, 140.850906, 140.937179, 141.024962, 141.112111, 141.199098, 141.285812, 141.373431, 141.458156, 141.544693, 141.631454, 141.718073, 141.80457, 141.89176, 141.978539, 142.066285, 142.153423, 142.240197, 142.326687, 142.414773, 142.501969, 142.588858, 142.675587, 142.761564, 142.849822, 142.937013, 143.024098, 143.111755, 143.199747, 143.28824, 143.375011, 143.464653, 143.551517, 143.639247, 143.727462, 143.81441, 143.901966, 143.990163, 144.078022, 144.164734, 144.25116, 144.339645, 144.427795, 144.515929, 144.603066, 144.690732, 144.779409, 144.866636, 144.954564, 145.043143, 145.130333, 145.216676, 145.303837, 145.392966, 145.479545, 145.569543, 145.658819, 145.747711, 145.83552, 145.922682, 146.011352, 146.100304, 146.187632, 146.276279, 146.363457, 146.449977, 146.538246, 146.626369, 146.713749, 146.801732, 146.890153, 146.978526, 147.066287, 147.154474, 147.242132, 147.331299, 147.458752, 147.546384, 147.635237, 147.723434, 147.810987, 147.8993, 147.988853, 148.07694, 148.166022, 148.256407, 148.345128, 148.43389, 148.521018, 148.61005, 148.698571, 148.786511, 148.874265, 148.961883, 149.050554, 149.139427, 149.228766, 149.317488, 149.406107, 149.495272, 149.583084, 149.673238, 149.761037, 149.849975, 149.937494, 150.027178, 150.115831, 150.20452, 150.293893, 150.384188, 150.473159, 150.563069, 150.652205, 150.740969, 150.831044, 150.919879, 151.010069, 151.098271, 151.186882, 151.275865, 151.366051, 151.461564, 151.745877, 151.836089, 151.925324, 152.014364, 152.102406, 152.191985, 152.282107, 152.370587, 152.459586, 152.548719, 152.637505, 152.727647, 152.816452, 152.906192, 152.994957, 153.08437, 153.174316, 153.263836, 153.354546, 153.445123, 153.53533, 153.623961, 153.713702, 153.802663, 153.891105, 153.980219, 154.069582, 154.158905, 154.24779, 154.336565, 154.425574, 154.560077, 154.649349, 154.739203, 154.828968, 154.918576, 155.008332, 155.098262, 155.189349, 155.280269, 155.369583, 155.459033, 155.549681, 155.640329, 155.731632, 155.82268, 155.912466, 156.002823, 156.09284, 156.183062, 156.272618, 156.362018, 156.452749, 156.544354, 156.634277, 156.724849, 156.813597, 156.903596, 156.993422, 157.083616, 157.173714, 157.264231, 157.355171, 157.446814, 157.536576, 157.62626, 157.717654, 157.812943, 157.911046, 158.001406, 158.094307, 158.185866, 158.275256, 158.366041, 158.456694, 158.547811, 158.641206, 158.733876, 158.824434, 158.915064, 159.007864, 159.099065, 159.189217, 159.280972, 159.371562, 159.462283, 159.553073, 159.645082, 159.740018, 159.832186, 159.923064, 160.016084, 160.108449, 160.199889, 160.291377, 160.383495, 160.478328, 160.571518, 160.661841, 160.752902, 160.842748, 160.932922, 161.023588, 161.113977, 161.205467, 161.296522, 161.387874, 161.478457, 161.568514, 161.659437, 161.751637, 161.84384, 161.935577, 162.026395, 162.117674, 162.209943, 162.301139, 162.393257, 162.483243, 162.574484, 162.664972, 162.756606, 162.847673, 162.938349, 163.03021, 163.122758, 163.215176, 163.306124, 163.3982, 163.489878, 163.58131, 163.672401, 163.763705, 163.854827, 163.945995, 164.037211, 164.12959, 164.222609, 164.314948, 164.406324, 164.500011, 164.592021, 164.683081, 164.774432, 164.866584, 164.95864, 165.050356, 165.141312, 165.233183, 165.324671, 165.418522, 165.511678, 165.605185, 165.69848, 165.793408, 165.886602, 165.979703, 166.072052, 166.166229, 166.260351, 166.354724, 166.458755, 166.550059, 166.641616, 166.734079, 166.826241, 166.918314, 167.010693, 167.103573, 167.196004, 167.287301, 167.381168, 167.47501, 167.56918, 167.662058, 167.756263, 167.852173, 167.947115, 168.039302, 168.135931, 168.231898, 168.326416, 168.42165, 168.517298, 168.61268, 168.709958, 168.802489, 168.894684, 168.987692, 169.080589, 169.173722, 169.268001, 169.361957, 169.456049, 169.550597, 169.646158, 169.742004, 169.837476, 169.931377, 170.026388, 170.122651, 170.217274, 170.309855, 170.403177, 170.496774, 170.589503, 170.681935, 170.774731, 170.869106, 170.962776, 171.056311, 171.149656, 171.242123, 171.333756, 171.425356, 171.519717, 171.614856, 171.708727, 171.802202, 171.895809, 171.988704, 172.081672, 172.173972, 172.267533, 172.361322, 172.455355, 172.595989, 172.689497, 172.783715, 172.877196, 172.971361, 173.065341, 173.16129, 173.254034, 173.352054, 173.447336, 173.543116, 173.637241, 173.731865, 173.827007, 173.921038, 174.018369, 174.113957, 174.214052, 174.311678, 174.411284, 174.506483, 174.604414, 174.69877, 174.795659, 174.891371, 174.985565, 175.078757, 175.171768, 175.265758, 175.360128, 175.453682, 175.54882, 175.643085, 175.7376, 175.833711, 175.930444, 176.024499, 176.120804, 176.222203, 176.318499, 176.414171, 176.510099, 176.604614, 176.698319, 176.793015, 176.888877, 176.984249, 177.079391, 177.174991, 177.271312, 177.368444, 177.475827, 177.574765, 177.670041, 177.764848, 177.860272, 177.956201, 178.051449, 178.144654, 178.239442, 178.335739, 178.431266, 178.527157, 178.622869, 178.718184, 178.813728, 178.909417, 179.004447, 179.156259, 179.282099, 179.3761, 179.644221, 179.761375, 179.858579, 179.953749, 180.048585, 180.143784, 180.240548, 180.336028, 180.432249, 180.528444, 180.623092, 180.719281, 180.815245, 180.910318, 181.004887, 181.101058, 181.1963, 181.291041, 181.386647, 181.481984, 181.577682, 181.67246, 181.767237, 181.863134, 181.958974, 182.055347, 182.238885, 182.461621, 182.564291, 182.687548, 182.799973, 182.901539, 182.997089, 183.097371, 183.217911, 183.318368, 183.41733, 183.518087, 183.616038, 183.735344, 183.844682, 183.943688, 184.046544, 184.158901, 184.256153, 184.354777, 184.454334, 184.601704, 184.729906, 184.910706, 185.035416, 185.17696, 185.27748, 185.417817, 185.534106, 185.692769, 185.797068, 185.915324, 186.04473, 186.155491, 186.281516, 186.423974, 186.523905, 186.623951, 186.723192, 186.823384, 186.947847, 187.062262, 187.184254, 187.312415, 187.415698, 187.534225, 187.644308, 187.744775, 187.878871, 187.990976, 188.124838, 188.228636, 188.361072, 188.47441, 188.603101, 188.76865, 188.889092, 189.016836, 189.210016, 189.309523, 189.411386, 189.509027, 189.605965, 189.711536, 189.809835, 189.908343, 190.006089, 190.103243, 190.202768, 190.300606, 190.397872, 190.49521, 190.592501, 190.689527, 190.787901, 190.884842, 190.983059, 191.084654, 191.182756, 191.282136, 191.379657, 191.478732, 191.576458, 191.673946, 191.77073, 191.871568, 191.97002, 192.06845, 192.173318, 192.274441, 192.372982, 192.471589, 192.576983, 192.682268, 192.789523, 192.888493, 192.986961, 193.092327, 193.19855, 193.298839, 193.400975, 193.512658, 193.617154, 193.719187, 193.819654, 193.91923, 194.018375, 194.117613, 194.218514, 194.319926, 194.423477, 194.583421, 194.6833, 194.784889, 194.884516, 194.985671, 195.085389, 195.19733, 195.301731, 195.40826, 195.509066, 195.623225, 195.736502, 195.855628, 195.974991, 196.084583, 196.201199, 196.307336, 196.418942, 196.527269, 196.635265, 196.745965, 196.848267, 196.95689, 197.065285, 197.168661, 197.267883, 197.366728, 197.465431, 197.564616, 197.666868, 197.779736, 197.879715, 197.97941, 198.080439, 198.179411, 198.278715, 198.380126, 198.482019, 198.582643, 198.681487, 198.781639, 198.881936, 198.982995, 199.084273, 199.185308, 199.284676, 199.384449, 199.484825, 199.585548, 199.686587, 199.786802, 199.888444, 199.992155, 200.098502, 200.199465, 200.300823, 200.40107, 200.502177, 200.604536, 200.705829, 200.806999, 200.908215, 201.012042, 201.112297, 201.21482, 201.319114, 201.420395, 201.520448, 201.622036, 201.723113, 201.823992, 201.924463, 202.024781, 202.12566, 202.229252, 202.331187, 202.433253, 202.533545, 202.633797, 202.734643, 202.836392, 202.942002, 203.043328, 203.146289, 203.249971, 203.352476, 203.453516, 203.556171, 203.658618, 203.76286, 203.865407, 203.97044, 204.074349, 204.175975, 204.276038, 204.377829, 204.48092, 204.583346, 204.685569, 204.789083, 205.162401, 205.341177, 205.445611, 205.551103, 205.655826, 205.761469, 205.870383, 205.976218, 206.082582, 206.187699, 206.290562, 206.392956, 206.496324, 206.599016, 206.699988, 206.804759, 206.90887, 207.012567, 207.116256, 207.217905, 207.321039, 207.424599, 207.527519, 207.629954, 207.732493, 207.834569, 207.935872, 208.039105, 208.141229, 208.243784, 208.345422, 208.448052, 208.552838, 208.658574, 208.758905, 208.860921, 208.963821, 209.067106, 209.171195, 209.274515, 209.376794, 209.485857, 209.591272, 209.692963, 209.796372, 209.900674, 210.008312, 210.111629, 210.21464, 210.317216, 210.419263, 210.522121, 210.623294, 210.726572, 210.829583, 210.930946, 211.039834, 211.154779, 211.268821, 211.372884, 211.475796, 211.591395, 211.708759, 211.819173, 211.924638, 212.031994, 212.136318, 212.240085, 212.34278, 212.446998, 212.550252, 212.653739, 212.756346, 212.859387, 212.964201, 213.067997, 213.172029, 213.275566, 213.37912, 213.484045, 213.587434, 213.690197, 213.792851, 213.895798, 213.99892, 214.102033, 214.204901, 214.308346, 214.411504, 214.515833, 214.619037, 214.721168, 214.824717, 214.927429, 215.030717, 215.134181, 215.240237, 215.343454, 215.449663, 215.552866, 215.656165, 215.75983, 215.863571, 215.964556, 216.070222, 216.174043, 216.277354, 216.380263, 216.48313, 216.586878, 216.691017, 216.79522, 216.899044, 217.003676, 217.106929, 217.211448, 217.315623, 217.419312, 217.52621, 217.633506, 217.741798, 217.845218, 217.94851, 218.053252, 218.157573, 218.26252, 218.366498, 218.470281, 218.574503, 218.677529, 218.781848, 218.886312, 218.990757, 219.094892, 219.20064, 219.307004, 219.411808, 219.516192, 219.621388, 219.726577, 219.831789, 219.937146, 220.043256, 220.149183, 220.25396, 220.358179, 220.462862, 220.575959, 220.683266, 220.788965, 220.896594, 221.002506, 221.108104, 221.216673, 221.322236, 221.427113, 221.531969, 221.640789, 221.747424, 221.859677, 221.990088, 222.100698, 222.208258, 222.317043, 222.428385, 222.53581, 222.642244, 222.751166, 222.860636, 222.970259, 223.082202, 223.191053, 223.301245, 223.410857, 223.525258, 223.63328, 223.742976, 223.85415, 223.965442, 224.075021, 224.184881, 224.294359, 224.403712, 224.511657, 224.620111, 224.728661, 224.836489, 224.943398, 225.055884, 225.16526, 225.272253, 225.38344, 225.492044, 225.599877, 225.706892, 225.818442, 225.925091, 226.031072, 226.139129, 226.246043, 226.35331, 226.460207, 226.566411, 226.67412, 226.782168, 226.89183, 227.001477, 227.113018, 227.223715, 227.333472, 227.443771, 227.55363, 227.661357, 227.768377, 227.875216, 227.981789, 228.088901, 228.196835, 228.304234, 228.412235, 228.519418, 228.627191, 228.737341, 228.845309, 228.953431, 229.060248, 229.166455, 229.275588, 229.384102, 229.493989, 229.601226, 229.709239, 229.819548, 229.927631, 230.034227, 230.143876, 230.253241, 230.36057, 230.469131, 230.57575, 230.682782, 230.793382, 230.905746, 231.017137, 231.130227, 231.242284, 231.351733, 231.46135, 231.57325, 231.68821, 231.803479, 231.91473, 232.02576, 232.134395, 232.245056, 232.357092, 232.46827, 232.579948, 232.690597, 232.801749, 232.913969, 233.023762, 233.132233, 233.240666, 233.349467, 233.462516, 233.578477, 233.693618, 233.802452, 233.911672, 234.019947, 234.127936, 234.235409, 234.343627, 234.451052, 234.558818, 234.666576, 234.775431, 234.883765, 234.994581, 235.102183, 235.2104, 235.3192, 235.42699, 235.535311, 235.648101, 235.75854, 235.870836, 235.981318, 236.091439, 236.202184, 236.311413, 236.42087, 236.53009, 236.640363, 236.74963, 236.859693, 236.977755, 237.087951, 237.197916, 237.309744, 237.422935, 237.534786, 237.64402, 237.756843, 237.866519, 237.97569, 238.092699, 238.209576, 238.321484, 238.432887, 238.545441, 238.658594, 238.768543, 238.880428, 238.99164, 239.1054, 239.224173, 239.341046, 239.453729, 239.565831, 239.695651, 239.810018, 239.923662, 240.037535, 240.198109, 240.319492, 240.431992, 240.544889, 240.658869, 240.774005, 240.886663, 241.000235, 241.110162, 241.22074, 241.334984, 241.445068, 241.557356, 241.670067, 241.781188, 241.894124, 242.00698, 242.118253, 242.23123, 242.342394, 242.45931, 242.575917, 242.688406, 242.802342, 242.915308, 243.029661, 243.147821, 243.269656, 243.38546, 243.502713, 243.618375, 243.732249, 243.849896, 243.966376, 244.081715, 244.197801, 244.313846, 244.433842, 244.549404, 244.667166, 244.787111, 244.899734, 245.01181, 245.128177, 245.239461, 245.351363, 245.464477, 245.579005, 245.697222, 245.814279, 245.927922, 246.039684, 246.151911, 246.264291, 246.377235, 246.488498, 246.599076, 246.711233, 246.822993, 246.939329, 247.053581, 247.168628, 247.290126, 247.403796, 247.51719, 247.633832, 247.749651, 247.865246, 247.978144, 248.092354, 248.207978, 248.323607, 248.435423, 248.548528, 248.664566, 248.780087, 248.894021, 249.006127, 249.119986, 249.238924, 249.354491, 249.468609, 249.581692, 249.694208, 249.808838, 249.923156, 250.037839, 250.151887, 250.265442, 250.377705, 250.490269, 250.603358, 250.714973, 250.827256, 250.940064, 251.055, 251.170473, 251.283881, 251.398498, 251.511577, 251.625438, 251.737802, 251.85429, 252.001536, 252.118589, 252.23964, 252.355424, 252.469871, 252.583325, 252.69903, 252.813561, 252.930152, 253.042753, 253.160914, 253.282088, 253.395904, 253.507787, 253.624176, 253.73937, 253.854498, 253.967549, 254.081721, 254.197707, 254.315087, 254.430978, 254.544937, 254.659784, 254.774969, 254.88961, 255.006649, 255.122549, 255.235632, 255.353554, 255.469984, 255.583596, 255.697877, 255.811356, 255.92492, 256.041714, 256.157932, 256.273873, 256.389273, 256.505732, 256.624044, 256.741544, 256.85804, 256.971185, 257.086194, 257.20091, 257.317038, 257.431897, 257.547068, 257.661685, 257.776766, 257.891247, 258.006312, 258.12023, 258.236854, 258.353496, 258.466213, 258.58084, 258.697432, 258.815357, 258.933118, 259.05044, 259.166908, 259.28407, 259.400944, 259.516935, 259.633662, 259.74816, 259.864682, 259.981527, 260.098146, 260.216605, 260.333446, 260.450454, 260.565098, 260.681122, 260.79667, 260.912608, 261.030597, 261.147201, 261.264146, 261.3824, 261.500106, 261.621371, 261.736986, 261.856947, 261.978174, 262.097466, 262.216325, 262.33857, 262.458696, 262.580922, 262.700767, 262.817935, 262.934799, 263.051302, 263.166749, 263.28429, 263.400636, 263.518758, 263.634257, 263.752153, 263.869036, 263.98671, 264.105151, 264.222982, 264.338425, 264.454635, 264.573219, 264.693866, 264.809785, 264.926106, 265.042756, 265.159235, 265.275881, 265.394011, 265.5119, 265.631584, 265.765062, 265.882051, 266.001924, 266.117915, 266.235874, 266.35292, 266.470093, 266.587609, 266.704059, 266.824426, 266.942098, 267.060095, 267.176365, 267.294843, 267.41187, 267.52889, 267.646702, 267.764748, 267.884985, 268.004385, 268.123998, 268.24163, 268.357435, 268.474855, 268.592658, 268.712699, 268.833632, 268.956248, 269.075552, 269.196865, 269.315627, 269.434433, 269.552379, 269.67044, 269.787548, 269.906291, 270.025131, 270.142688, 270.261077, 270.377735, 270.493873, 270.613961, 270.733741, 270.85412, 270.976106, 271.096607, 271.217562, 271.337398, 271.475011, 271.593451, 271.714617, 271.833362, 271.954362, 272.074938, 272.194467, 272.315733, 272.439408, 272.561135, 272.687029, 272.807939, 272.928212, 273.051229, 273.171206, 273.291569, 273.410393, 273.529542, 273.653309, 273.773553, 273.893678, 274.011402, 274.132587, 274.2512, 274.370567, 274.488513, 274.608499, 274.72873, 274.847232, 274.965358, 275.086184, 275.211853, 275.331332, 275.451085, 275.579392, 275.703771, 275.825796, 275.9452, 276.065978, 276.186989, 276.305118, 276.425002, 276.545479, 276.667325, 276.789604, 276.90882, 277.028557, 277.153455, 277.277608, 277.40141, 277.522479, 277.644307, 277.766766, 277.891243, 278.0123, 278.132159, 278.256202, 278.381888, 278.502663, 278.622936, 278.740995, 278.861305, 278.980747, 279.101597, 279.220138, 279.337865, 279.458572, 279.588173, 279.708754, 279.830804, 279.95299, 280.073055, 280.196621, 280.318309, 280.438913, 280.559851, 280.679635, 280.800408, 280.920453, 281.039199, 281.158673, 281.279024, 281.398873, 281.518567, 281.637599, 281.759406, 281.879139, 281.998133, 282.117773, 282.238646, 282.361413, 282.481764, 282.665721, 282.784721, 282.904516, 283.024947, 283.14584, 283.265823, 283.38569, 283.507667, 283.628322, 283.747517, 283.871954, 283.99537, 284.134628, 284.254548, 284.376982, 284.499855, 284.620126, 284.741747, 284.86163, 284.983101, 285.103765, 285.22605, 285.347511, 285.466655, 285.588416, 285.710201, 285.829902, 285.951826, 286.071577, 286.192604, 286.31368, 286.433704, 286.554747, 286.676937, 286.797524, 286.917638, 287.038694, 287.160254, 287.282118, 287.403486, 287.524437, 287.645372, 287.767686, 287.889221, 288.010466, 288.132871, 288.259767, 288.394004, 288.525445, 288.65091, 288.77537, 288.98796, 289.126219, 289.247678, 289.373234, 289.496975, 289.619321, 289.744091, 289.867642, 289.990864, 290.114431, 290.236766, 290.358857, 290.481923, 290.608359, 290.734444, 290.939162, 291.069197, 291.225442, 291.377795, 291.537457, 291.700566, 291.862542, 291.992403, 292.120815, 292.247714, 292.374734, 292.499207, 292.624375, 292.750402, 292.875348, 293.003188, 293.128433, 293.25309, 293.375836, 293.499096, 293.620481, 293.742709, 293.922771, 294.050244, 294.172021, 294.295968, 294.422236, 294.549191, 294.675367, 294.800378, 294.924145, 295.046762, 295.170648, 295.292835, 295.415861, 295.53831, 295.661223, 295.78412, 295.90552, 296.028294, 296.150271, 296.276264, 296.400607, 296.526442, 296.71043, 296.835337, 296.957986, 297.080311, 297.204029, 297.328154, 297.451742, 297.573413, 297.697757, 297.82177, 297.944591, 298.071713, 298.19984, 298.324033, 298.452276, 298.579244, 298.702497, 298.82732, 298.952189, 299.074806, 299.201211, 299.323563, 299.518091, 299.644991, 299.772359, 299.898585, 300.027065, 300.1548, 300.28081, 300.40302, 300.527925, 300.650986, 300.775954, 300.901751, 301.029406, 301.157233, 301.285616, 301.411369, 301.533567, 301.656035, 301.78224, 301.907899, 302.032982, 302.157828, 302.361857, 302.490913, 302.614073, 302.737854, 302.863916, 302.98833, 303.116101, 303.244744, 303.371758, 303.498854, 303.626175, 303.750785, 303.874033, 303.998364, 304.122483, 304.247824, 304.372038, 304.497162, 304.621164, 304.746227, 304.869558, 304.994322, 305.184288, 305.309069, 305.433464, 305.557246, 305.682811, 305.807909, 305.933989, 306.059219, 306.185563, 306.310097, 306.434354, 306.560291, 306.684529, 306.809612, 306.935733, 307.062059, 307.18691, 307.314484, 307.440403, 307.564692, 307.69071, 307.817271, 307.942261, 308.066343, 308.193377, 308.322461, 308.449921, 308.574084, 308.698904, 308.82455, 308.949941, 309.074456, 309.199251, 309.325753, 309.450183, 309.575814, 309.701067, 309.829323, 309.970767, 310.103851, 310.231916, 310.358796, 310.498055, 310.660902, 310.866055, 310.994318, 311.122357, 311.250348, 311.388288, 311.560878, 311.741044, 311.887978, 312.021918, 312.155007, 312.287286, 312.41857, 312.551563, 312.68489, 312.864877, 313.002457, 313.168002, 313.299798, 313.442553, 313.601503, 313.742177, 313.880268, 314.022868, 314.165988, 314.295148, 314.4246, 314.556921, 314.69339, 314.836268, 314.979878, 315.112609, 315.242986, 315.373537, 315.514477, 315.655659, 315.798314, 315.936016, 316.07603, 316.220094, 316.358698, 316.52032, 316.652691, 316.782857, 316.911529, 317.040825, 317.261701, 317.404365, 317.535369, 317.663739, 317.792086, 317.920478, 318.0527, 318.186214, 318.318932, 318.450952, 318.58188, 318.710738, 318.843999, 318.973298, 319.101912, 319.234925, 319.365068, 319.495094, 319.638314, 319.772643, 319.90252, 320.030581, 320.15886, 320.293761, 320.436167, 320.572984, 320.710518, 320.839809, 320.969381, 321.100374, 321.232208, 321.364573, 321.494219, 321.622564, 321.751412, 321.878527, 322.010813, 322.139618, 322.267324, 322.395473, 322.523522, 322.656617, 322.787861, 322.91948, 323.052319, 323.266869, 323.393467, 323.522102, 323.653622, 323.78566, 323.913345, 324.0447, 324.175733, 324.30819, 324.444895, 324.5755, 324.70735, 324.836238, 324.965743, 325.095418, 325.228426, 325.36119, 325.499511, 325.630303, 325.762086, 325.892768, 326.02634, 326.156166, 326.35166, 326.481591, 326.613351, 326.74788, 326.879525, 327.012247, 327.147081, 327.276675, 327.41165, 327.54458, 327.679102, 327.814787, 327.944804, 328.074891, 328.207194, 328.34096, 328.475857, 328.607802, 328.74007, 328.87468, 329.010161, 329.146764, 329.279526, 329.493168, 329.626814, 329.758175, 329.892427, 330.026775, 330.160315, 330.29753, 330.433456, 330.564673, 330.696379, 330.828817, 330.960307, 331.093168, 331.231903, 331.363313, 331.496428, 331.631307, 331.762483, 331.892693, 332.021292, 332.153296, 332.286017, 332.420707, 332.609931, 332.739374, 332.870181, 333.000797, 333.130417, 333.26123, 333.391404, 333.522077, 333.653439, 333.784145, 333.915435, 334.045147, 334.175183, 334.305029, 334.437302, 334.56993, 334.704845, 334.83884, 334.97086, 335.103323, 335.235792, 335.366304, 335.500906, 335.699546, 335.835762, 335.966442, 336.100495, 336.235916, 336.36819, 336.499101, 336.63029, 336.762765, 336.894901, 337.024222, 337.15567, 337.286294, 337.418343, 337.549427, 337.68064, 337.811512, 337.943216, 338.074495, 338.206493, 338.337664, 338.469946, 338.604383, 338.749884, 338.988277, 339.127488, 339.268897, 339.413155, 339.577708, 339.729332, 339.87814, 340.019849, 340.165365, 340.324985, 340.462686, 340.606889, 340.743437, 340.878988, 341.033306, 341.17992, 341.316467, 341.451078, 341.601948, 341.739106, 341.881556, 342.018968, 342.152882, 342.368912, 342.528821, 342.661407, 342.796316, 342.934233, 343.067455, 343.203015, 343.33704, 343.471608, 343.605954, 343.741157, 343.888837, 344.025529, 344.158189, 344.291459, 344.436665, 344.570541, 344.705997, 344.854399, 344.990215, 345.127007, 345.260598, 345.396254, 345.528726, 345.664411, 345.796258, 345.928802, 346.060944, 346.193183, 346.327151, 346.45952, 346.591339, 346.722819, 346.857454, 346.991175, 347.12479, 347.258151, 347.39071, 347.524521, 347.659276, 347.792279, 347.92588, 348.060555, 348.194848, 348.328475, 348.461677, 348.595194, 348.730586, 348.864809, 348.9987, 349.132545, 349.269492, 349.404172, 349.537518, 349.670386, 349.804856, 349.938594, 350.070664, 350.205022, 350.338533, 350.472688, 350.608242, 350.743685, 350.876244, 351.010303, 351.14716, 351.280055, 351.413376, 351.549306, 351.685854, 351.820679, 351.955249, 352.09174, 352.227031, 352.361469, 352.496533, 352.633063, 352.767464, 352.901543, 353.03626, 353.169795, 353.304546, 353.437817, 353.570709, 353.705321, 353.840662, 353.975052, 354.110464, 354.243144, 354.377886, 354.511574, 354.646176, 354.782143, 354.918135, 355.053229, 355.188584, 355.325058, 355.459836, 355.594199, 355.730514, 355.863902, 355.998068, 356.133128, 356.267938, 356.402327, 356.53683, 356.672455, 356.806469, 356.94166, 357.07747, 357.213711, 357.349469, 357.485839, 357.620305, 357.755175, 357.891245, 358.028779, 358.163767, 358.299366, 358.434429, 358.569919, 358.704762, 358.840378, 358.975588, 359.110972, 359.246864, 359.383549, 359.519152, 359.655461, 359.791335, 359.925233, 360.059268, 360.195477, 360.332608, 360.469683, 360.606273, 360.740819, 360.877751, 361.013924, 361.148685, 361.285802, 361.421723, 361.556268, 361.6917, 361.830111, 361.966047, 362.103059, 362.240345, 362.374993, 362.511133, 362.647667, 362.785902, 362.922349, 363.060914, 363.199091, 363.335827, 363.473068, 363.609775, 363.74667, 363.882652, 364.021405, 364.159382, 364.297025, 364.434793, 364.573552, 364.712036, 364.846912, 364.984713, 365.197547, 365.33404, 365.471892, 365.610994, 365.747721, 365.886478, 366.025243, 366.162459, 366.311064, 366.448555, 366.585073, 366.723664, 366.867206, 367.004614, 367.140944, 367.278531, 367.415724, 367.554134, 367.692406, 367.829764, 367.969312, 368.107314, 368.247396, 368.385928, 368.525114, 368.663531, 368.801282, 368.940309, 369.078855, 369.216635, 369.353823, 369.491523, 369.629343, 369.766125, 369.902635, 370.03994, 370.177662, 370.316659, 370.455685, 370.593969, 370.732139, 370.870803, 371.010506, 371.14815, 371.285468, 371.423556, 371.563403, 371.70335, 371.841537, 372.069876, 372.208598, 372.347224, 372.486655, 372.626797, 372.785934, 372.947153, 373.089904, 373.22683, 373.362151, 373.498364, 373.634747, 373.770925, 373.907301, 374.044146, 374.180724, 374.316971, 374.453514, 374.59069, 374.727466, 374.864477, 375.00101, 375.137454, 375.273564, 375.411014, 375.549515, 375.686599, 375.823274, 375.959054, 376.095533, 376.232245, 376.369018, 376.505768, 376.642707, 376.779382, 376.915527, 377.052596, 377.188754, 377.32608, 377.463911, 377.600425, 377.737793, 377.874554, 378.011468, 378.147847, 378.286964, 378.42451, 378.561871, 378.699423, 378.839478, 378.979691, 379.119968, 379.261345, 379.403048, 379.545954, 379.688121, 379.83214, 379.9732, 380.116711, 380.257007, 380.394839, 380.533455, 380.673474, 380.814791, 380.957697, 381.099093, 381.238123, 381.376681, 381.514942, 381.654907, 381.794549, 381.936703, 382.078313, 382.220125, 382.361841, 382.501809, 382.64037, 382.77858, 382.916971, 383.054633, 383.194105, 383.33435, 383.478344, 383.620354, 383.76239, 383.901512, 384.040739, 384.179115, 384.317699, 384.456751, 384.59511, 384.733383, 384.871262, 385.010572, 385.149896, 385.288275, 385.427405, 385.565576, 385.704287, 385.842624, 385.983496, 386.12234, 386.261057, 386.399266, 386.538375, 386.67668, 386.815864, 386.954373, 387.093326, 387.233645, 387.372989, 387.512811, 387.652294, 387.792858, 387.93231, 388.072107, 388.211519, 388.351016, 388.490348, 388.629711, 388.768844, 388.908183, 389.046803, 389.185565, 389.326349, 389.468121, 389.607885, 389.748036, 389.887042, 390.027794, 390.166446, 390.305864, 390.444977, 390.583762, 390.722693, 390.862144, 391.002427, 391.141743, 391.281309, 391.421272, 391.56122, 391.700522, 391.839887, 391.979014, 392.119433, 392.260295, 392.399854, 392.539081, 392.678656, 392.819461, 393.049472, 393.192888, 393.334941, 393.482602, 393.62557, 393.767586, 393.914951, 394.063755, 394.221499, 394.368496, 394.509492, 394.651486, 394.791571, 394.935395, 395.081575, 395.225758, 395.371802, 395.519107, 395.667494, 395.814912, 395.975003, 396.121394, 396.265515, 396.410588, 396.556631, 396.706523, 396.855437, 396.998564, 397.143371, 397.288448, 397.454042, 397.598952, 397.748501, 397.903469, 398.047329, 398.192292, 398.338312, 398.488799, 398.632117, 398.782786, 398.931963, 399.077434, 399.221759, 399.368086, 399.524991, 399.670772, 399.813785, 399.958448, 400.10257, 400.247823, 400.397941, 400.550929] }, { label: 'TaksDuration', backgroundColor: 'rgba(221, 65, 150, 0.2)', borderColor: 'rgba(221, 65, 150, 1.00)', - data: [0.084179, 0.146628, 0.195962, 0.243041, 0.295599, 0.34297, 0.391556, 0.444207, 0.491842, 0.541939, 0.591301, 0.63829, 0.692105, 0.743808, 0.791797, 0.839578, 0.888443, 0.934595, 0.979944, 1.027176, 1.075164, 1.124315, 1.170777, 1.217007, 1.263484, 1.312175, 1.362752, 1.408734, 1.460274, 1.510012, 1.559248, 1.604944, 1.653554, 1.699409, 1.746603, 1.795274, 1.844479, 1.888634, 1.934995, 1.984076, 2.031683, 2.080534, 2.130563, 2.180306, 2.231364, 2.280398, 2.326837, 2.375887, 2.42164, 2.466577] + data: [0.142465, 0.223887, 0.29351, 0.36073, 0.440737, 0.526818, 0.612494, 0.677971, 0.756956, 0.821335, 0.89306, 0.965746, 1.029793, 1.095336, 1.16524, 1.233845, 1.30097, 1.377327, 1.44416, 1.513012, 1.578145, 1.648066, 1.715583, 1.785182, 1.862767, 1.930373, 2.000073, 2.066653, 2.135361, 2.202841, 2.269821, 2.339102, 2.407005, 2.47732, 2.545684, 2.617588, 2.685222, 2.762326, 2.830877, 2.907374, 2.977706, 3.045281, 3.113099, 3.183506, 3.251686, 3.321865, 3.391644, 3.46125, 3.513462, 3.582768, 3.651896, 3.730279, 3.799334, 3.864567, 3.932127, 3.992217, 4.059818, 4.119621, 4.179973, 4.235888, 4.302554, 4.391467, 4.460319, 4.526716, 4.597658, 4.668334, 4.741373, 4.816132, 4.888636, 4.95694, 5.029691, 5.10257, 5.171562, 5.252497, 5.321519, 5.390228, 5.459456, 5.530667, 5.602642, 5.664872, 5.737442, 5.809465, 5.883132, 5.954194, 6.02802, 6.104509, 6.181529, 6.256127, 6.324349, 6.389426, 6.465698, 6.542206, 6.619707, 6.693137, 6.7703, 6.846522, 6.923859, 7.000471, 7.076748, 7.154124, 7.232517, 7.307421, 7.385815, 7.463695, 7.541978, 7.62027, 7.697677, 7.775473, 7.854677, 7.942581, 8.02098, 8.099336, 8.175875, 8.252775, 8.33173, 8.40876, 8.487295, 8.563965, 8.641186, 8.720959, 8.800061, 8.879953, 8.960099, 9.049316, 9.128015, 9.207861, 9.287785, 9.368682, 9.448329, 9.52818, 9.608759, 9.689719, 9.767662, 9.849486, 9.928449, 10.007676, 10.086268, 10.171625, 10.24158, 10.317942, 10.396815, 10.456868, 10.535585, 10.603553, 10.681343, 10.759878, 10.83425, 10.911374, 10.989121, 11.077055, 11.161297, 11.241785, 11.322198, 11.401215, 11.482673, 11.564524, 11.640365, 11.72138, 11.79848, 11.87786, 11.960296, 12.042663, 12.121011, 12.201499, 12.294941, 12.376173, 12.457721, 12.534763, 12.607479, 12.689233, 12.772919, 12.8563, 12.938562, 13.020354, 13.098673, 13.180862, 13.261757, 13.34588, 13.442321, 13.527356, 13.610959, 13.69359, 13.77478, 13.858837, 13.942762, 14.027239, 14.110246, 14.193961, 14.27784, 14.36375, 14.443076, 14.539327, 14.622489, 14.706481, 14.789601, 14.872606, 14.957334, 15.039596, 15.124146, 15.209199, 15.293242, 15.377757, 15.464958, 15.561518, 15.648025, 15.730486, 15.814649, 15.900142, 15.986496, 16.073665, 16.160898, 16.247227, 16.335595, 16.421048, 16.505796, 16.592507, 16.67896, 16.76412, 16.862898, 16.951323, 17.03858, 17.126182, 17.213811, 17.301667, 17.388588, 17.471077, 17.54869, 17.629525, 17.71874, 17.809328, 17.897293, 17.986505, 18.083381, 18.169235, 18.252579, 18.336829, 18.419069, 18.501292, 18.590039, 18.674958, 18.760974, 18.846026, 18.926496, 19.012805, 19.099924, 19.188242, 19.276815, 19.379861, 19.467297, 19.557387, 19.647338, 19.730817, 19.820272, 19.909953, 19.99924, 20.08664, 20.175982, 20.265047, 20.354695, 20.444673, 20.549434, 20.639217, 20.729135, 20.819211, 20.904754, 20.99344, 21.081635, 21.169701, 21.260439, 21.352213, 21.440526, 21.52902, 21.618081, 21.706844, 21.809816, 21.897366, 21.981573, 22.07058, 22.16042, 22.250638, 22.340697, 22.431688, 22.521846, 22.608825, 22.696642, 22.784133, 22.871511, 22.953727, 23.054269, 23.145599, 23.230097, 23.320249, 23.413151, 23.499273, 23.588698, 23.675019, 23.765081, 23.857963, 23.950392, 24.044016, 24.138194, 24.232269, 24.325581, 24.415065, 24.514116, 24.598921, 24.689764, 24.783739, 24.878642, 24.97297, 25.06587, 25.157513, 25.251943, 25.346674, 25.439105, 25.546746, 25.640412, 25.739573, 25.833237, 25.926588, 26.022497, 26.114763, 26.206347, 26.301505, 26.396004, 26.485968, 26.581344, 26.674778, 26.770317, 26.875171, 26.96794, 27.062457, 27.15641, 27.249793, 27.34452, 27.430899, 27.524195, 27.633228, 27.738454, 27.832384, 27.925169, 28.020793, 28.116672, 28.20259, 28.29635, 28.392474, 28.488524, 28.585604, 28.682128, 28.775574, 28.88582, 28.98087, 29.076948, 29.152798, 29.249189, 29.343143, 29.433736, 29.52507, 29.619719, 29.716197, 29.813106, 29.907036, 30.001254, 30.09721, 30.210093, 30.30381, 30.40259, 30.499653, 30.597436, 30.695397, 30.792579, 30.890218, 30.98553, 31.082382, 31.17874, 31.291677, 31.390483, 31.488033, 31.582733, 31.677727, 31.774576, 31.871413, 31.97251, 32.069732, 32.163676, 32.245437, 32.3228, 32.400137, 32.476423, 32.566358, 32.641266, 32.717387, 32.794066, 32.869858, 32.946362, 33.021343, 33.096969, 33.17325, 33.250302, 33.327556, 33.405271, 33.481254, 33.55713, 33.651533, 33.727086, 33.803421, 33.880844, 33.956806, 34.032723, 34.110186, 34.188294, 34.265529, 34.344343, 34.420952, 34.498446, 34.577023, 34.654346, 34.748939, 34.826966, 34.903889, 34.982657, 35.060292, 35.137294, 35.21668, 35.294896, 35.373933, 35.453076, 35.530759, 35.610603, 35.689922, 35.767919, 35.863502, 35.943104, 36.022967, 36.103489, 36.182731, 36.263469, 36.341456, 36.421557, 36.517022, 36.596198, 36.675702, 36.754794, 36.835069, 36.916777, 36.996952, 37.077383, 37.157349, 37.237741, 37.319843, 37.40112, 37.482116, 37.56193, 37.641272, 37.737227, 37.818097, 37.899874, 37.979798, 38.061186, 38.14178, 38.222523, 38.304112, 38.384921, 38.466231, 38.548489, 38.629226, 38.709681, 38.79186, 38.889762, 38.972847, 39.055531, 39.136601, 39.218639, 39.301621, 39.382955, 39.464876, 39.547334, 39.629952, 39.713088, 39.796807, 39.879584, 39.986621, 40.111664, 40.209524, 40.310201, 40.41605, 40.522128, 40.628921, 40.73385, 40.839128, 40.945325, 41.050099, 41.153259, 41.261547, 41.367448, 41.477508, 41.602351, 41.707016, 41.813224, 41.920876, 42.028422, 42.134474, 42.241122, 42.34741, 42.453607, 42.560891, 42.67373, 42.783663, 42.889635, 42.998702, 43.107455, 43.21401, 43.300725, 43.385074, 43.469352, 43.554157, 43.640385, 43.726205, 43.813194, 43.904361, 43.990418, 44.078504, 44.294933, 44.496284, 44.583003, 44.690161, 44.777237, 44.86273, 44.949536, 45.036793, 45.124064, 45.211363, 45.298384, 45.384937, 45.472293, 45.561466, 45.650427, 45.737892, 45.826059, 45.933859, 46.02224, 46.113212, 46.203265, 46.291689, 46.38415, 46.474325, 46.563056, 46.651602, 46.738813, 46.832814, 46.943215, 47.054795, 47.167199, 47.295188, 47.406419, 47.518923, 47.632016, 47.743315, 47.854861, 47.965097, 48.076347, 48.189732, 48.302396, 48.412509, 48.523646, 48.636161, 48.749493, 48.859508, 48.991011, 49.1042, 49.215599, 49.325027, 49.436692, 49.546141, 49.660741, 49.776206, 49.891334, 50.007525, 50.124201, 50.235482, 50.348584, 50.464135, 50.581225, 50.717271, 50.834727, 50.950919, 51.067095, 51.179236, 51.315293, 51.431458, 51.548261, 51.664616, 51.779071, 51.896417, 52.012272, 52.131667, 52.249186, 52.367138, 52.488281, 52.605353, 52.725084, 52.840889, 52.978881, 53.095561, 53.213773, 53.332841, 53.449386, 53.56797, 53.680282, 53.799031, 53.914158, 54.029337, 54.151037, 54.26803, 54.387766, 54.508274, 54.627013, 54.766694, 54.88673, 55.006056, 55.125675, 55.245965, 55.366596, 55.487704, 55.608246, 55.728727, 55.848854, 55.97133, 56.088583, 56.20492, 56.320175, 56.441959, 56.588171, 56.709227, 56.828378, 56.9493, 57.070393, 57.192067, 57.31001, 57.426399, 57.546513, 57.6684, 57.792953, 57.911799, 58.030059, 58.148817, 58.267797, 58.412916, 58.535705, 58.658469, 58.78226, 58.905383, 59.028234, 59.148587, 59.272344, 59.391287, 59.512526, 59.636346, 59.756154, 59.87588, 59.99834, 60.143012, 60.264356, 60.388201, 60.505952, 60.621595, 60.735629, 60.853558, 60.974842, 61.095857, 61.220143, 61.346878, 61.471767, 61.592802, 61.716081, 61.83617, 61.981257, 62.102673, 62.217964, 62.335132, 62.630612, 62.74179, 62.865772, 63.009234, 63.136678, 63.264833, 63.39128, 63.51802, 63.645541, 63.772434, 63.922041, 64.047831, 64.174717, 64.298733, 64.423336, 64.548512, 64.675034, 64.796215, 64.91404, 65.031263, 65.143938, 65.263228, 65.384901, 65.502899, 65.622523, 65.767783, 65.893669, 66.019911, 66.145418, 66.268802, 66.393708, 66.519298, 66.644701, 66.768266, 66.894708, 67.016657, 67.143101, 67.272729, 67.409806, 67.562965, 67.674988, 67.791144, 67.893186, 68.020329, 68.148233, 68.273892, 68.403505, 68.533578, 68.664667, 68.794582, 68.924981, 69.053433, 69.184206, 69.333633, 69.445859, 69.575141, 69.704681, 69.834887, 69.961703, 70.090634, 70.220426, 70.350792, 70.467402, 70.574113, 70.704391, 70.832529, 70.936634, 71.051579, 71.182375, 71.311549, 71.441677, 71.567215, 71.696478, 71.82221, 71.952063, 72.083722, 72.19754, 72.316511, 72.453294, 72.577935, 72.708846, 72.833566, 72.964429, 73.128578, 73.263697, 73.39885, 73.535012, 73.661683, 73.774353, 73.883215, 73.989127, 74.097546, 74.205946, 74.315776, 74.428706, 74.537484, 74.649052, 74.786173, 74.894771, 75.012259, 75.124986, 75.230589, 75.337008, 75.444424, 75.551391, 75.658899, 75.767132, 75.880338, 76.010048, 76.144924, 76.277963, 76.415205, 76.576504, 76.703938, 76.829703, 76.964846, 77.101331, 77.236339, 77.371909, 77.507924, 77.645847, 77.785056, 77.923735, 78.06244, 78.200706, 78.33933, 78.476521, 78.638545, 78.772218, 78.912646, 79.049323, 79.188611, 79.326788, 79.46233, 79.594577, 79.733606, 79.871424, 80.007004, 80.145651, 80.286095, 80.426194, 80.593575, 80.73327, 80.873711, 81.013747, 81.15326, 81.291429, 81.431385, 81.571228, 81.712594, 81.847236, 81.991875, 82.133847, 82.273885, 82.414211, 82.556817, 82.722388, 82.861103, 82.980065, 83.093588, 83.206481, 83.319115, 83.433905, 83.548546, 83.671732, 83.789298, 83.903735, 84.015424, 84.126649, 84.246756, 84.36192, 84.476216, 84.617736, 84.730439, 84.844546, 84.973764, 85.110615, 85.244494, 85.384778, 85.519806, 85.656772, 85.794342, 85.931402, 86.074521, 86.21322, 86.35506, 86.518126, 86.656046, 86.797335, 86.936582, 87.078305, 87.223037, 87.356185, 87.49504, 87.636077, 87.773577, 87.907499, 88.039944, 88.176489, 88.305292, 88.447343, 88.589788, 88.765997, 88.909471, 89.053862, 89.191465, 89.330207, 89.468025, 89.608392, 89.748092, 89.889326, 90.033769, 90.176754, 90.318663, 90.464362, 90.603637, 90.744537, 90.904703, 91.045061, 91.187025, 91.329176, 91.463885, 91.604928, 91.749042, 91.894394, 92.037584, 92.175438, 92.307132, 92.441101, 92.588315, 92.732327, 92.877134, 93.048929, 93.197652, 93.341488, 93.482118, 93.629559, 93.773223, 93.913309, 94.054101, 94.195799, 94.352397, 94.495716, 94.638654, 94.767946, 94.915559, 95.061051, 95.232353, 95.378307, 95.514952, 95.657366, 95.801267, 95.942752, 96.09761, 96.254096, 96.402872, 96.547874, 96.695718, 96.844625, 96.995159, 97.135212, 97.278147, 97.461713, 97.605306, 97.760202, 97.912073, 98.06028, 98.211321, 98.360382, 98.523059, 98.672978, 98.830485, 98.97878, 99.129305, 99.277044, 99.426099, 99.578697, 99.760923, 99.927719, 100.074823, 100.238947, 100.394716, 100.548275, 100.700674, 100.850316, 101.003793, 101.162849, 101.320497, 101.46683, 101.622363, 101.784219, 101.937504, 102.122834, 102.274355, 102.441178, 102.604447, 102.761542, 102.916959, 103.073235, 103.220761, 103.377213, 103.528955, 103.681447, 103.825639, 103.979219, 104.132124, 104.286995, 104.463614, 104.609009, 104.76245, 104.917792, 105.071522, 105.217457, 105.366488, 105.528361, 105.681989, 105.846451, 106.001682, 106.154497, 106.307635, 106.461872, 106.615681, 106.798309, 106.951648, 107.105767, 107.25959, 107.411312, 107.547504, 107.692621, 107.847679, 107.998224, 108.144028, 108.301489, 108.459029, 108.616981, 108.771865, 108.950906, 109.107508, 109.253384, 109.409368, 109.564059, 109.721916, 109.879241, 110.03361, 110.186279, 110.335759, 110.491153, 110.650634, 110.80918, 110.961097, 111.116894, 111.301672, 111.459562, 111.617019, 111.773927, 111.932645, 112.089781, 112.248368, 112.406891, 112.572251, 112.731852, 112.904936, 113.065022, 113.223633, 113.371309, 113.531133, 113.722073, 113.882701, 114.037541, 114.198216, 114.355109, 114.513039, 114.670032, 114.829713, 114.988593, 115.149872, 115.307462, 115.469273, 115.629942, 115.787053, 115.977426, 116.135257, 116.289447, 116.44952, 116.609863, 116.769868, 116.923621, 117.083592, 117.246857, 117.408212, 117.567455, 117.726773, 117.898379, 118.061365, 118.227363, 118.418348, 118.579843, 118.738598, 118.899713, 119.060306, 119.214701, 119.367798, 119.572022, 119.734855, 119.899, 120.060695, 120.222549, 120.385301, 120.545306, 120.707741, 120.874236, 121.036615, 121.19987, 121.363724, 121.528683, 121.693339, 121.884851, 122.050888, 122.216448, 122.374403, 122.537578, 122.702593, 122.855498, 122.997443, 123.168193, 123.332811, 123.499064, 123.662234, 123.826681, 123.99266, 124.187926, 124.352194, 124.525481, 124.690803, 124.858258, 125.02486, 125.189298, 125.341396, 125.505264, 125.670846, 125.810482, 126.001753, 126.166811, 126.333891, 126.49488, 126.659158, 126.820022, 126.981039, 127.145413, 127.310086, 127.474968, 127.636418, 127.802062, 127.964864, 128.120614, 128.308623, 128.475403, 128.639955, 128.799363, 128.961709, 129.125919, 129.289925, 129.455926, 129.614611, 129.77327, 129.939358, 130.102638, 130.266936, 130.433757, 130.632621, 130.794809, 130.962721, 131.130389, 131.29723, 131.460594, 131.620063, 131.78757, 131.951604, 132.116289, 132.280446, 132.451001, 132.619621, 132.790779, 132.957782, 133.156915, 133.324788, 133.493214, 133.662481, 133.830354, 133.999624, 134.168368, 134.337377, 134.504377, 134.673632, 134.844049, 135.00964, 135.207506, 135.378518, 135.546467, 135.716061, 135.887743, 136.049757, 136.212631, 136.382892, 136.552367, 136.723004, 136.891148, 137.053638, 137.223586, 137.392917, 137.563263, 137.76421, 137.934382, 138.104818, 138.276313, 138.447023, 138.617671, 138.78855, 138.958744, 139.12801, 139.297563, 139.469012, 139.641638, 139.812861, 139.983718, 140.191046, 140.36255, 140.5335, 140.704664, 140.876171, 141.047878, 141.218012, 141.390078, 141.5584, 141.726209, 141.889114, 142.054838, 142.21982, 142.385854, 142.551252, 142.752858, 142.920168, 143.092668, 143.258232, 143.426448, 143.596021, 143.765297, 143.934486, 144.108905, 144.278053, 144.446876, 144.615136, 144.770222, 144.941151, 145.154542, 145.321841, 145.486001, 145.656111, 145.826807, 145.981569, 146.15008, 146.324114, 146.49702, 146.664769, 146.836584, 147.012833, 147.185991, 147.354437, 147.528104, 147.731134, 147.905992, 148.080485, 148.255242, 148.422183, 148.593683, 148.770579, 148.945939, 149.109027, 149.276547, 149.45374, 149.630615, 149.807311, 149.984156, 150.190556, 150.346364, 150.518253, 150.690125, 150.867417, 151.042281, 151.218571, 151.39666, 151.563869, 151.743898, 151.917697, 152.093635, 152.264174, 152.434007, 152.605902, 152.800435, 152.975409, 153.146625, 153.323738, 153.492111, 153.657234, 153.830847, 154.008952, 154.186431, 154.363876, 154.542369, 154.719466, 154.899072, 155.080209, 155.291778, 155.464909, 155.637984, 155.817059, 155.993467, 156.164049, 156.334884, 156.510061, 156.688646, 156.86695, 157.043164, 157.221756, 157.398815, 157.578185, 157.75836, 157.973905, 158.150258, 158.328066, 158.504546, 158.683037, 158.860235, 159.039293, 159.218745, 159.396345, 159.575979, 159.754791, 159.934922, 160.116577, 160.297551, 160.512195, 160.701867, 160.894544, 161.075623, 161.253276, 161.432323, 161.61052, 161.789067, 161.969382, 162.140063, 162.316947, 162.486409, 162.656732, 162.82804, 163.004989, 163.221892, 163.394041, 163.573089, 163.749536, 163.928941, 164.107541, 164.290491, 164.472417, 164.654584, 164.83624, 165.014801, 165.198959, 165.375818, 165.551925, 165.734668, 165.948451, 166.128285, 166.310737, 166.490988, 166.673857, 166.859597, 167.043279, 167.227492, 167.408502, 167.589951, 167.773116, 167.953185, 168.135907, 168.318078, 168.495481, 168.702498, 168.883156, 169.063545, 169.245647, 169.421152, 169.598552, 169.779897, 169.959, 170.141362, 170.322228, 170.502579, 170.680632, 170.864545, 171.048718, 171.266494, 171.447124, 171.627047, 171.80141, 171.979673, 172.157678, 172.325722, 172.502597, 172.681242, 172.863741, 173.046156, 173.226121, 173.405985, 173.584952, 173.764034, 173.968613, 174.149317, 174.332013, 174.517564, 174.69906, 174.878976, 175.053419, 175.234516, 175.416229, 175.594183, 175.778039, 175.947271, 176.121804, 176.306749, 176.48873, 176.701957, 176.879795, 177.060947, 177.244335, 177.432389, 177.620462, 177.805491, 177.992397, 178.179002, 178.363761, 178.550556, 178.73315, 178.917176, 179.110033, 179.279114, 179.499483, 179.685931, 179.868777, 180.046331, 180.234822, 180.420743, 180.608094, 180.796009, 180.981635, 181.169676, 181.356288, 181.54425, 181.736591, 181.927168, 182.158986, 182.337675, 182.519983, 182.70595, 182.887406, 183.075563, 183.263043, 183.450826, 183.61615, 183.804184, 183.991288, 184.174783, 184.360947, 184.546041, 184.736353, 184.96405, 185.152271, 185.343152, 185.534017, 185.724495, 185.913807, 186.103642, 186.294102, 186.484111, 186.675292, 186.865667, 187.05674, 187.247696, 187.43866, 187.630385, 187.856519, 188.048015, 188.24088, 188.432563, 188.624858, 188.816693, 189.008433, 189.202648, 189.391656, 189.581178, 189.772588, 189.964658, 190.158297, 190.352297, 190.546062, 190.779807, 190.972444, 191.159217, 191.35004, 191.541987, 191.7292, 191.916621, 192.111006, 192.301473, 192.479855, 192.665683, 192.853009, 193.030764, 193.22755, 193.458858, 193.652909, 193.842652, 194.039637, 194.233808, 194.432056, 194.620016, 194.815598, 195.00942, 195.20261, 195.379894, 195.571184, 195.76766, 195.964223, 196.160794, 196.392843, 196.589293, 196.784364, 196.999081, 197.194894, 197.387697, 197.584825, 197.778057, 197.973963, 198.160521, 198.354843, 198.54911, 198.738217, 198.933982, 199.127499, 199.362611, 199.555634, 199.739719, 199.932249, 200.119189, 200.317073, 200.515703, 200.710323, 200.907488, 201.102882, 201.299588, 201.496072, 201.695531, 201.892906, 202.132874, 202.328777, 202.522514, 202.725336, 202.922712, 203.118585, 203.310899, 203.506889, 203.705165, 203.89578, 204.088625, 204.282195, 204.481429, 204.681743, 204.87644, 205.115818, 205.309587, 205.50457, 205.699984, 205.898367, 206.098853, 206.293922, 206.492527, 206.689159, 206.886301, 207.087236, 207.284215, 207.480938, 207.677056, 207.876746, 208.127799, 208.323371, 208.518189, 208.711797, 208.907921, 209.109292, 209.308893, 209.510127, 209.710942, 209.897841, 210.097271, 210.29231, 210.492197, 210.688233, 210.934939, 211.136814, 211.335433, 211.531912, 211.727549, 211.92934, 212.128286, 212.332985, 212.52827, 212.728253, 212.929975, 213.131872, 213.33097, 213.534855, 213.727446, 213.969163, 214.172583, 214.376352, 214.57019, 214.768642, 214.975594, 215.178507, 215.37906, 215.575795, 215.779801, 215.982137, 216.177933, 216.37909, 216.583275, 216.785411, 217.033144, 217.236532, 217.436988, 217.644254, 217.844928, 218.049143, 218.255726, 218.452054, 218.65539, 218.850615, 219.053052, 219.259299, 219.496224, 219.699097, 219.893203, 220.096592, 220.292252, 220.494761, 220.699838, 220.89861, 221.101921, 221.301911, 221.502038, 221.708513, 221.912842, 222.11689, 222.32337, 222.577755, 222.78191, 222.985151, 223.190881, 223.3972, 223.603883, 223.811612, 224.015725, 224.222089, 224.428123, 224.634955, 224.841762, 225.049902, 225.255935, 225.511913, 225.711853, 225.906154, 226.113693, 226.321198, 226.535099, 226.744082, 226.948377, 227.154618, 227.361, 227.566855, 227.772105, 227.970497, 228.177276, 228.429971, 228.637991, 228.845669, 229.053585, 229.263804, 229.471039, 229.679769, 229.890467, 230.097621, 230.305908, 230.512614, 230.717019, 230.925663, 231.128955, 231.338983, 231.595167, 231.802703, 232.010812, 232.217218, 232.424726, 232.631985, 232.843092, 233.053009, 233.250174, 233.463016, 233.67593, 233.883421, 234.096156, 234.304011, 234.549297, 234.751269, 234.958923, 235.169251, 235.380983, 235.591532, 235.805, 236.01925, 236.230743, 236.440362, 236.647493, 236.850965, 237.056678, 237.26594, 237.517571, 237.727411, 237.934776, 238.125024, 238.33247, 238.543757, 238.755646, 238.95314, 239.166383, 239.379958, 239.591959, 239.803523, 240.017606, 240.239124, 240.45036, 240.70347, 240.918136, 241.138923, 241.34651, 241.558188, 241.773831, 241.972884, 242.17358, 242.387129, 242.584471, 242.811789, 243.025627, 243.242509, 243.454559, 243.66694, 243.915278, 244.128029, 244.31349, 244.51756, 244.777474, 244.989731, 245.198354, 245.413179, 245.617162, 245.810982, 246.009081, 246.212014, 246.421901, 246.629977, 246.886015, 247.09108, 247.299449, 247.506729, 247.723079, 247.938304, 248.143667, 248.347518, 248.56252, 248.778884, 248.995176, 249.211128, 249.427444, 249.653979, 249.870029, 250.152989, 250.375654, 250.592018, 250.811049, 251.023574, 251.241577, 251.456492, 251.68746, 251.904305, 252.125665, 252.341707, 252.556821, 252.771863, 252.990629, 253.207424, 253.46367, 253.6808, 253.892328, 254.104143, 254.320467, 254.528348, 254.732399, 254.989948, 255.235665, 255.450711, 255.643778, 255.836943, 256.033222, 256.23254, 256.427176, 256.672146, 256.873681, 257.084967, 257.279198, 257.471317, 257.6656, 257.861012, 258.056811, 258.252905, 258.447924, 258.643014, 258.854925, 259.070273, 259.285945, 259.499132, 259.77537, 259.9896, 260.204211, 260.420212, 260.636963, 260.854725, 261.072467, 261.289221, 261.507802, 261.725737, 261.939131, 262.153407, 262.364214, 262.584827, 262.848605, 263.085331, 263.299608, 263.516682, 263.733189, 263.953432, 264.170435, 264.392598, 264.612161, 264.831939, 265.050461, 265.269774, 265.484788, 265.69089, 265.897043, 266.163268, 266.363375, 266.565503, 266.788183, 267.001462, 267.218858, 267.416741, 267.616003, 267.83558, 268.057833, 268.280571, 268.503353, 268.723227, 268.943853, 269.212226, 269.436161, 269.658742, 269.881609, 270.107263, 270.32917, 270.549935, 270.77223, 270.991604, 271.214856, 271.436327, 271.657995, 271.881969, 272.105011, 272.329426, 272.601448, 272.82388, 273.049679, 273.274642, 273.49788, 273.721907, 273.950002, 274.176052, 274.396839, 274.620858, 274.842351, 275.069451, 275.286265, 275.509718, 275.733558, 276.013316, 276.243196, 276.469282, 276.691908, 276.907688, 277.140103, 277.372867, 277.596916, 277.821729, 278.044851, 278.270336, 278.495214, 278.7223, 278.951862, 279.232949, 279.475858, 279.698771, 279.924077, 280.149349, 280.373614, 280.599159, 280.82692, 281.052486, 281.280219, 281.506062, 281.7313, 282.025475, 282.302794, 282.737767, 283.025787, 283.254554, 283.51024, 283.739671, 284.090568, 284.317812, 284.546903, 284.774488, 285.002435, 285.229928, 285.459835, 285.688538, 285.91634, 286.144547, 286.372207, 286.644549, 286.874022, 287.10182, 287.330879, 287.558271, 287.782759, 287.996576, 288.217565, 288.44541, 288.675625, 288.904024, 289.134229, 289.363301, 289.59317, 289.817263, 290.1045, 290.33198, 290.536103, 290.755321, 290.984495, 291.210781, 291.422846, 291.650117, 291.874432, 292.103448, 292.334312, 292.561212, 292.792247, 293.024414, 293.305982, 293.536068, 293.768656, 294.000587, 294.232594, 294.463903, 294.693839, 294.924433, 295.154829, 295.433747, 295.663034, 295.89622, 296.126995, 296.357504, 296.591077, 296.824653, 297.05799, 297.288236, 297.520358, 297.753388, 297.984239, 298.216676, 298.448783, 298.728771, 298.96122, 299.192364, 299.425479, 299.658475, 299.890688, 300.119478, 300.351143, 300.579903, 300.809304, 301.038271, 301.316536, 301.547648, 301.778479, 302.011113, 302.243323, 302.474948, 302.706755, 302.937151, 303.167755, 303.401416, 303.635025, 303.866827, 304.101819, 304.332713, 304.574154, 304.866216, 305.098847, 305.329519, 305.562438, 305.794956, 306.029914, 306.264645, 306.49502, 306.72928, 306.963677, 307.198232, 307.432047, 307.6669, 307.902756, 308.187757, 308.420345, 308.656035, 308.891201, 309.124864, 309.361218, 309.595332, 309.83236, 310.063103, 310.295635, 310.526876, 310.762676, 310.995837, 311.230709, 311.519014, 311.755327, 311.991122, 312.226753, 312.456714, 312.692207, 312.930694, 313.184303, 313.468039, 313.703486, 313.937167, 314.171299, 314.4082, 314.644183, 314.893505, 315.131029, 315.368461, 315.619765, 315.851246, 316.087681, 316.32079, 316.55682, 316.841444, 317.078519, 317.312673, 317.546872, 317.776782, 318.01282, 318.249711, 318.487409, 318.72606, 318.963437, 319.201408, 319.44182, 319.680511, 319.915262, 320.151686, 320.432496, 320.673192, 320.928655, 321.181843, 321.420767, 321.657445, 321.893785, 322.133662, 322.37096, 322.606163, 322.846412, 323.082127, 323.319664, 323.558779, 323.856925, 324.091277, 324.330902, 324.56753, 324.807029, 325.046804, 325.283923, 325.522593, 325.761906, 326.005742, 326.264085, 326.515983, 326.777417, 327.023781, 327.266164, 327.557875, 327.818134, 328.075687, 328.328469, 328.567896, 328.810431, 329.056377, 329.298913, 329.546486, 329.785098, 330.025191, 330.262929, 330.503894, 330.745856, 331.037213, 331.278654, 331.517092, 331.758319, 331.998297, 332.237927, 332.479467, 332.721294, 332.963626, 333.206565, 333.449133, 333.689657, 333.930038, 334.186138, 334.489921, 334.729641, 334.969706, 335.211511, 335.453114, 335.717266, 335.976471, 336.216192, 336.460464, 336.702042, 336.943527, 337.188045, 337.429585, 337.673369, 337.974599, 338.215565, 338.456542, 338.698017, 338.94225, 339.187045, 339.431486, 339.674905, 339.916872, 340.160002, 340.403122, 340.646892, 340.891042, 341.135128, 341.379738, 341.673531, 341.91737, 342.160818, 342.4015, 342.668473, 342.913464, 343.159655, 343.405267, 343.649471, 343.895738, 344.140385, 344.384697, 344.683651, 344.927428, 345.172147, 345.417884, 345.662779, 345.906802, 346.151652, 346.395793, 346.640635, 346.88536, 347.130508, 347.374349, 347.622669, 347.857019, 348.098135, 348.396532, 348.644523, 348.888799, 349.139277, 349.383699, 349.614117, 349.847463, 350.087842, 350.336274, 350.579572, 350.82435, 351.073543, 351.319501, 351.567089, 351.813593, 352.116952, 352.342845, 352.5809, 352.820964, 353.071941, 353.31256, 353.547812, 353.795314, 354.041696, 354.286636, 354.515743, 354.764317, 355.010634, 355.256401, 355.558966, 355.807114, 356.054091, 356.302186, 356.549166, 356.797894, 357.041762, 357.290286, 357.537281, 357.780629, 358.021782, 358.271741, 358.521551, 358.76763, 359.00008, 359.309653, 359.558278, 359.805929, 360.051136, 360.302253, 360.55198, 360.821315, 361.073662, 361.323043, 361.573352, 361.820085, 362.068263, 362.318698, 362.567208, 362.816845, 363.12131, 363.371461, 363.622352, 363.870469, 364.121238, 364.370447, 364.620896, 364.871318, 365.120446, 365.371319, 365.624118, 365.876606, 366.124823, 366.375227, 366.684575, 366.933916, 367.184226, 367.434465, 367.684231, 367.935939, 368.183991, 368.436127, 368.683634, 368.931847, 369.185558, 369.438678, 369.688925, 369.939838, 370.190211, 370.494035, 370.746748, 370.999639, 371.250779, 371.498176, 371.748042, 372.000495, 372.253222, 372.502853, 372.75654, 373.011224, 373.263549, 373.51705, 373.769955, 374.027044, 374.331168, 374.581092, 374.833497, 375.085407, 375.339658, 375.591588, 375.844169, 376.097744, 376.350697, 376.603247, 376.856275, 377.105608, 377.363209, 377.615879, 377.92867, 378.182946, 378.436924, 378.683501, 378.931256, 379.171062, 379.412984, 379.683407, 379.919856, 380.169559, 380.422558, 380.677166, 380.92938, 381.186745, 381.437415, 381.75025, 382.005689, 382.267069, 382.525189, 382.78319, 383.044307, 383.304475, 383.562353, 383.82163, 384.078516, 384.3353, 384.592103, 384.847268, 385.102925, 385.361279, 385.677042, 385.931697, 386.185483, 386.442716, 386.700796, 386.96138, 387.216819, 387.472632, 387.733917, 387.98995, 388.248459, 388.504714, 388.762017, 389.020032, 389.341532, 389.603006, 389.845523, 390.100588, 390.352099, 390.609803, 390.862428, 391.119423, 391.372081, 391.623649, 391.868196, 392.145802, 392.408337, 392.662019, 392.921561, 393.239671, 393.499174, 393.757513, 394.016982, 394.276876, 394.533366, 394.788942, 395.047631, 395.30501, 395.566245, 395.819587, 396.079232, 396.344175, 396.605701, 396.866505, 397.184358, 397.445209, 397.706987, 397.96429, 398.223636, 398.484948, 398.744096, 398.99816, 399.256748, 399.516916, 399.777246, 400.037006, 400.300386, 400.562525, 400.876839, 401.139344, 401.393521, 401.646721, 401.90562, 402.168528, 402.432153, 402.694554, 402.965084, 403.230669, 403.50084, 403.767655, 404.030269, 404.295227, 404.557367, 404.885043, 405.152219, 405.418142, 405.681334, 405.943235, 406.207759, 406.492709, 406.757361, 407.022851, 407.288161, 407.558295, 407.82678, 408.09129, 408.386982, 408.651316, 408.975951, 409.233726, 409.505422, 409.767026, 410.031658, 410.296835, 410.559541, 410.822407, 411.082068, 411.350132, 411.61405, 411.88004, 412.149648, 412.41593, 412.73989, 413.006881, 413.27166, 413.535043, 413.797257, 414.137917, 414.400809, 414.660012, 414.920992, 415.184879, 415.448959, 415.715264, 415.976497, 416.23892, 416.565175, 416.830146, 417.098163, 417.364585, 417.626684, 417.892324, 418.155829, 418.479836, 418.746814, 419.010442, 419.27627, 419.549936, 419.808453, 420.06514, 420.310187, 420.560067, 420.813224, 421.12793, 421.409118, 421.672653, 421.920729, 422.232961, 422.484573, 422.734584, 422.985544, 423.231878, 423.49658, 423.76471, 424.033677, 424.303813, 424.56752, 424.838338, 425.168517, 425.438126, 425.703868, 425.966153, 426.235018, 426.504367, 426.764606, 427.031282, 427.300283, 427.567271, 427.833074, 428.09832, 428.366692, 428.632301, 428.953575, 429.219452, 429.488388, 429.759699, 430.029624, 430.300008, 430.565568, 430.836244, 431.106835, 431.37919, 431.648001, 431.921694, 432.194381, 432.467269, 432.736449, 433.065312, 433.338953, 433.609785, 433.880545, 434.149657, 434.4232, 434.696959, 434.969086, 435.238631, 435.505946, 435.774159, 436.039678, 436.307828, 436.576394, 436.848731, 437.175919, 437.447837, 437.721861, 437.991974, 438.263419, 438.535134, 438.80633, 439.143986, 439.41257, 439.687444, 439.960644, 440.23224, 440.501911, 440.772175, 441.041128, 441.311707, 441.585315, 441.853292, 442.127292, 442.397936, 442.670564, 443.001536, 443.274417, 443.550371, 443.820141, 444.088153, 444.361449, 444.633278, 444.903951, 445.177619, 445.454025, 445.725933, 445.995901, 446.269071, 446.542602, 446.81873, 447.161999, 447.436545, 447.708955, 447.98016, 448.255925, 448.529286, 448.80584, 449.080147, 449.35152, 449.622004, 449.8965, 450.174447, 450.446132, 450.718652, 451.064247, 451.33762, 451.612259, 451.889852, 452.162194, 452.439711, 452.715572, 452.990411, 453.266799, 453.542774, 453.81789, 454.09407, 454.37043, 454.644811, 454.981654, 455.253488, 455.52577, 455.798696, 456.071995, 456.342454, 456.616737, 456.893063, 457.166468, 457.443011, 457.718913, 457.985666, 458.259602, 458.53928, 458.813568, 459.152539, 459.423695, 459.6945, 459.972137, 460.242863, 460.518911, 460.796843, 461.075178, 461.352914, 461.630406, 461.908993, 462.184481, 462.463639, 462.744444, 463.019293, 463.362899, 463.640171, 463.919435, 464.192581, 464.470433, 464.748822, 465.030584, 465.305107, 465.582731, 465.865898, 466.140012, 466.411869, 466.690655, 466.966544, 467.301407, 467.579171, 467.853882, 468.129368, 468.407741, 468.680658, 468.958634, 469.239382, 469.514881, 469.797309, 470.070146, 470.346298, 470.623254, 470.8991, 471.172281, 471.521033, 471.797469, 472.139143, 472.417419, 472.694632, 472.973056, 473.25231, 473.532737, 473.814501, 474.094809, 474.371188, 474.66121, 474.941449, 475.22033, 475.496905, 475.775246, 476.053822, 476.407096, 476.684869, 476.964669, 477.244968, 477.525801, 477.804374, 478.078614, 478.35413, 478.616948, 478.891724, 479.17175, 479.445401, 479.723789, 479.999906, 480.349223, 480.628543, 480.906951, 481.185461, 481.467971, 481.746369, 482.021268, 482.302473, 482.58281, 482.86164, 483.135579, 483.416128, 483.693307, 483.9627, 484.235226, 484.580183, 484.858237, 485.135643, 485.412638, 485.696082, 485.975729, 486.254992, 486.531056, 486.813282, 487.09545, 487.375702, 487.657149, 487.938082, 488.205435, 488.48633, 488.831195, 489.111394, 489.391576, 489.669473, 489.951202, 490.231044, 490.511715, 490.789635, 491.070969, 491.355669, 491.637017, 491.917504, 492.197739, 492.478447, 492.759291, 493.110131, 493.39161, 493.674445, 493.949929, 494.232498, 494.51414, 494.794912, 495.07374, 495.355825, 495.642436, 495.92289, 496.206589, 496.485051, 496.772121, 497.052061, 497.414019, 497.700592, 497.980612, 498.262255, 498.545723, 498.830972, 499.108399, 499.388124, 499.670516, 499.953972, 500.238804, 500.521153, 500.805561, 501.088443, 501.370246, 501.654819, 502.012346, 502.292999, 502.575274, 502.85798, 503.140325, 503.425633, 503.706608, 503.990331, 504.275348, 504.554617, 504.835863, 505.121951, 505.403931, 505.690008, 506.037791, 506.322236, 506.60707, 506.887268, 507.167934, 507.451377, 507.730051, 508.012712, 508.296959, 508.581471, 508.862666, 509.144121, 509.429712, 509.718364, 510.003695, 510.286264, 510.646685, 510.930609, 511.213702, 511.501055, 511.785203, 512.069549, 512.353105, 512.640748, 512.920189, 513.204564, 513.48936, 513.772731, 514.05627, 514.341001, 514.626011, 514.982816, 515.266548, 515.550264, 515.83187, 516.119549, 516.405755, 516.689819, 516.972585, 517.253447, 517.5427, 517.826219, 518.111425, 518.397396, 518.686998, 518.973388, 519.32697, 519.618279, 519.901875, 520.18657, 520.473745, 520.758526, 521.041573, 521.329893, 521.616928, 521.900468, 522.181387, 522.467006, 522.754559, 523.042147, 523.325282, 523.686133, 523.975264, 524.257837, 524.54325, 524.831785, 525.115592, 525.400633, 525.684946, 525.97603, 526.259416, 526.549284, 526.838769, 527.126155, 527.41346, 527.697784, 528.061658, 528.351331, 528.638, 528.926578, 529.213357, 529.497728, 529.787043, 530.07294, 530.357181, 530.646012, 530.935081, 531.22252, 531.507498, 531.794594, 532.079381, 532.367565, 532.725862, 533.011739, 533.300271, 533.586606, 533.87337, 534.159099, 534.449771, 534.73637, 535.027433, 535.321394, 535.609295, 535.897038, 536.183915, 536.472816, 536.76153, 537.12213, 537.409016, 537.696236, 537.984077, 538.273864, 538.563532, 538.852349, 539.141731, 539.432026, 539.719743, 540.00917, 540.294643, 540.584119, 540.870729, 541.162067, 541.524071, 541.812891, 542.102582, 542.394076, 542.684085, 542.974179, 543.264281, 543.553436, 543.843631, 544.13292, 544.425594, 544.714371, 545.001945, 545.292787, 545.585737, 545.896797, 547.262267, 547.553387, 547.843082, 548.133148, 548.418902, 548.70883, 549.000032, 549.285824, 549.575098, 549.863997, 550.151992, 550.443122, 550.733649, 551.024282, 551.312593, 551.671959, 551.963472, 552.253189, 552.548039, 552.843368, 553.135462, 553.423297, 553.715856, 554.006411, 554.293939, 554.582941, 554.873538, 555.163082, 555.452162, 555.741806, 556.032072, 556.398991, 556.688698, 556.978138, 557.268263, 557.561309, 557.852032, 558.143201, 558.438652, 558.734156, 559.024074, 559.314412, 559.609089, 559.906127, 560.202346, 560.495374, 560.863118, 561.154877, 561.445352, 561.736579, 562.02739, 562.318466, 562.61231, 562.906363, 563.195783, 563.490673, 563.779178, 564.070113, 564.360922, 564.654588, 564.946295, 565.238734, 565.533468, 565.89908, 566.190715, 566.482367, 566.773267, 567.084912, 567.420958, 567.713487, 568.011068, 568.307352, 568.599196, 568.892451, 569.186909, 569.483038, 569.781872, 570.07901, 570.376054, 570.742601, 571.042774, 571.334796, 571.62726, 571.923131, 572.214978, 572.50668, 572.797626, 573.092679, 573.40692, 573.702364, 573.996959, 574.293336, 574.5878, 574.881571, 575.175789, 575.548837, 575.849702, 576.14687, 576.439872, 576.733288, 577.022389, 577.311929, 577.602126, 577.893411, 578.186249, 578.478004, 578.768916, 579.061531, 579.352559, 579.645229, 579.939039, 580.317554, 580.61054, 580.906067, 581.198945, 581.493841, 581.786033, 582.079405, 582.369154, 582.664628, 582.956174, 583.249494, 583.54348, 583.837613, 584.132267, 584.428729, 584.725938, 585.103005, 585.397044, 585.690377, 585.984, 586.278373, 586.572624, 586.865268, 587.15883, 587.452376, 587.748214, 588.045168, 588.33925, 588.634775, 588.932806, 589.228492, 589.522401, 589.893551, 590.188017, 590.48171, 590.776324, 591.070175, 591.365205, 591.659328, 591.959825, 592.258547, 592.558575, 592.85695, 593.158122, 593.459174, 593.759843, 594.059267, 594.359957, 594.662823, 595.041504, 595.375501, 595.670125, 595.964565, 596.262603, 596.559494, 596.856078, 597.153925, 597.4521, 597.748485, 598.042907, 598.346346, 598.650621, 598.955921, 599.256737, 599.557566, 599.942476, 600.245694, 600.542555, 600.862296, 601.170375, 601.471336, 601.777765, 602.08359, 602.388422, 602.697616, 602.996611, 603.293121, 603.592274, 603.891519, 604.190152, 604.489695, 604.880306, 605.178235, 605.481501, 605.786177, 606.093958, 606.399734, 606.701798, 607.004292, 607.310021, 607.614608, 607.911641, 608.210535, 608.511484, 608.808774, 609.104134, 609.402349, 609.707033, 610.089152, 610.391532, 610.692315, 610.992134, 611.290238, 611.58488, 611.889402, 612.196249, 612.501875, 612.803597, 613.10494, 613.403169, 613.702385, 614.000165, 614.299303, 614.599774, 614.900479, 615.280767, 615.580336, 615.884266, 616.185418, 616.494299, 616.795358, 617.101993, 617.40042, 617.712563, 618.018849, 618.326537, 618.627763, 618.932846, 619.237005, 619.539638, 619.848927, 620.157021, 620.5496, 620.859328, 621.184991, 621.488056, 621.804716, 622.107322, 622.416547, 622.719706, 623.022265, 623.322501, 623.622231, 623.926114, 624.229216, 624.530087, 624.836275, 625.141786, 625.446276, 625.839402, 626.149464, 626.451744, 626.760006, 627.088631, 627.395982, 627.700606, 628.00621, 628.310326, 628.610737, 628.913469, 629.219826, 629.52697, 629.83163, 630.137153, 630.444433, 630.757505, 631.193187, 631.504642, 631.810412, 632.112788, 632.41665, 632.7215, 633.025528, 633.324439, 633.629762, 633.937937, 634.244843, 634.550513, 634.856957, 635.163397, 635.469654, 635.781023, 636.090415, 636.646063, 637.040626, 637.343415, 638.165882, 638.531092, 638.845663, 639.152263, 639.458839, 639.765531, 640.079, 640.386317, 640.695314, 641.003224, 641.309594, 641.620246, 641.926799, 642.231719, 642.615539, 642.923818, 643.229322, 643.534712, 643.841354, 644.1472, 644.454442, 644.759543, 645.066118, 645.371008, 645.677021, 645.985349, 646.797437, 647.571991, 647.917595, 648.304562, 648.666635, 649.07145, 649.37789, 649.698622, 650.106458, 650.435871, 650.753109, 651.082673, 651.398128, 651.773863, 652.121239, 652.439964, 652.766298, 653.123419, 653.436899, 653.754738, 654.072274, 654.580931, 654.989753, 655.774125, 656.185544, 656.628732, 656.956322, 657.415286, 657.784412, 658.327265, 658.657089, 659.034274, 659.450612, 659.806211, 660.225705, 660.676139, 661.000674, 661.326082, 661.644667, 661.966961, 662.363576, 662.808256, 663.189461, 663.590823, 663.921009, 664.305435, 664.65159, 664.974242, 665.408931, 665.761809, 666.180256, 666.519421, 666.945719, 667.304162, 667.732924, 668.261546, 668.650309, 669.043657, 669.58571, 669.904844, 670.236062, 670.546001, 670.857462, 671.19169, 671.502572, 671.813306, 672.126691, 672.43627, 672.749961, 673.059492, 673.370098, 673.68024, 673.98884, 674.300715, 674.613305, 674.923664, 675.326481, 675.652356, 675.966601, 676.287826, 676.59945, 676.918905, 677.230963, 677.545502, 677.855599, 678.178135, 678.492184, 678.809417, 679.151722, 679.473351, 679.788515, 680.10477, 680.440678, 680.864176, 681.201411, 681.51899, 681.835475, 682.171895, 682.513632, 682.835519, 683.159981, 683.543457, 683.878014, 684.206739, 684.528041, 684.849153, 685.165432, 685.482426, 685.804367, 686.129593, 686.470607, 686.908547, 687.225519, 687.55152, 687.871949, 688.200754, 688.521944, 688.884868, 689.220322, 689.582849, 689.906139, 690.260251, 690.615503, 690.980074, 691.366048, 691.710352, 692.072496, 692.409172, 692.847464, 693.188756, 693.525146, 693.866394, 694.194067, 694.533977, 694.874249, 695.20218, 695.519733, 695.833922, 696.147753, 696.46525, 696.791583, 697.165642, 697.484841, 697.803169, 698.1272, 698.443313, 698.848165, 699.171645, 699.499083, 699.821578, 700.139868, 700.465545, 700.786961, 701.111248, 701.435595, 701.757825, 702.076243, 702.397749, 702.719251, 703.039053, 703.364868, 703.684993, 704.01136, 704.338293, 704.784428, 705.110794, 705.43729, 705.758993, 706.082808, 706.412698, 706.741045, 707.067638, 707.39024, 707.719029, 708.043454, 708.378419, 708.755029, 709.080024, 709.403729, 709.732075, 710.058081, 710.465758, 710.78925, 711.110737, 711.433714, 711.765893, 712.095552, 712.422075, 712.750249, 713.074338, 713.396889, 713.720461, 714.057119, 714.383469, 714.711196, 715.045381, 715.370853, 715.691938, 716.019186, 716.433231, 716.764303, 717.091854, 717.424742, 717.75674, 718.080696, 718.398075, 718.723855, 719.055816, 719.381609, 719.707772, 720.043026, 721.201473, 721.784574, 722.119273, 722.458018, 722.791811, 723.128647, 723.569981, 723.903183, 724.242706, 724.570905, 724.89911, 725.226892, 725.557424, 725.882153, 726.206116, 726.537858, 726.869399, 727.200896, 727.531328, 727.854047, 728.181364, 728.510267, 728.83528, 729.161094, 729.576869, 729.904197, 730.2251, 730.551944, 730.877754, 731.204912, 731.528735, 731.854662, 732.189525, 732.526952, 732.852221, 733.180271, 733.508469, 733.835569, 734.160038, 734.487711, 734.811745, 735.160133, 735.491675, 735.901686, 736.231254, 736.561831, 736.900096, 737.226258, 737.552716, 737.878841, 738.203922, 738.532594, 738.854722, 739.179692, 739.504646, 739.826849, 740.172775, 740.535072, 740.888398, 741.217225, 741.54629, 742.009897, 742.379914, 742.72967, 743.067424, 743.413887, 743.745209, 744.074382, 744.401031, 744.730506, 745.057914, 745.386164, 745.714169, 746.04121, 746.372392, 746.702723, 747.031429, 747.358204, 747.684656, 748.10365, 748.430385, 748.757774, 749.083605, 749.409825, 749.738454, 750.065553, 750.393592, 750.7223, 751.050685, 751.381766, 751.709559, 752.035019, 752.363411, 752.692131, 753.019845, 753.348292, 753.682167, 754.10418, 754.43625, 754.764809, 755.093902, 755.425755, 755.75493, 756.076512, 756.410618, 756.741153, 757.070686, 757.39652, 757.726806, 758.057356, 758.387072, 758.718182, 759.050829, 759.383993, 759.712413, 760.045459, 760.47069, 760.797224, 761.134589, 761.478461, 761.829023, 762.159549, 762.487307, 762.819045, 763.149978, 763.482381, 763.811894, 764.140157, 764.469488, 764.7973, 765.129595, 765.461999, 765.795257, 766.12859, 766.551132, 766.884754, 767.216977, 767.547419, 767.87983, 768.212258, 768.544831, 768.878229, 769.213085, 769.547197, 769.879436, 770.210667, 770.54388, 770.894293, 771.228128, 771.561197, 771.898932, 772.233709, 772.567804, 772.995875, 773.328882, 773.661668, 773.993141, 774.336406, 774.677107, 775.045043, 775.465888, 775.816682, 776.156302, 776.499332, 776.849382, 777.189248, 777.52762, 777.875707, 778.224331, 778.57224, 778.929572, 779.274767, 779.710941, 780.048925, 780.405003, 780.746458, 781.09508, 781.449451, 781.801684, 782.146969, 782.49782, 782.844924, 783.187171, 783.529612, 783.873562, 784.215228, 784.557118, 784.896983, 785.25005, 785.593851, 785.933003, 786.375594, 786.719609, 787.061527, 787.40059, 787.754741, 788.092281, 788.428649, 788.77045, 789.108392, 789.448535, 789.789839, 790.128216, 790.466331, 790.80651, 791.155693, 791.503965, 791.852853, 792.202577, 792.55092, 792.993851, 793.344146, 793.685007, 794.024024, 794.361679, 794.698973, 795.037318, 795.379176, 795.718482, 796.060881, 796.400255, 796.74054, 797.08683, 797.429504, 797.783321, 798.120506, 798.45703, 798.803381, 799.144801, 799.584324, 799.922344, 800.264183, 800.612934, 800.952265, 801.290847, 801.636604, 801.982522, 802.320296, 802.662242, 803.00398, 803.436071, 803.877444, 804.228861, 804.579543, 804.931943, 805.279987, 805.623839, 805.967152, 806.320402, 806.676427, 807.032295, 807.379866, 807.726915, 808.071084, 808.423684, 808.780542, 809.132846, 809.484716, 809.837719, 810.282823, 810.633866, 810.980381, 811.325412, 811.671757, 812.016649, 812.374751, 812.744097, 813.110038, 813.457276, 813.803194, 814.148525, 814.490123, 814.831464, 815.172971, 815.606079, 815.945273, 816.287435, 816.632, 816.975424, 817.329989, 817.671337, 818.015341, 818.357532, 818.699144, 819.041298, 819.399175, 819.750858, 820.106906, 820.456437, 820.803568, 821.153979, 821.499933, 821.844312, 822.189412, 822.62518, 822.972412, 823.320628, 823.6866, 824.032861, 824.380616, 824.736121, 825.096977, 825.452848, 825.800151, 826.157665, 826.5046, 826.850379, 827.222428, 827.586196, 827.940698, 828.296696, 828.652046, 829.015571, 829.46465, 829.81828, 830.171383, 830.527331, 830.914658, 831.288522, 831.645163, 832.002113, 832.414769, 832.778312, 833.134848, 833.498129, 833.944003, 834.330077, 834.688873, 835.044217, 835.404788, 835.766854, 836.125964, 836.485035, 836.835059, 837.185773, 837.549719, 837.895693, 838.249174, 838.605333, 838.958413, 839.314461, 839.672349, 840.026472, 840.383632, 840.736564, 841.201268, 841.571407, 841.927363, 842.287154, 842.638709, 843.001035, 843.37167, 843.748019, 844.112387, 844.483971, 844.849591, 845.210251, 845.580977, 845.950085, 846.313659, 846.67883, 847.046857, 847.421351, 847.783234, 848.148671, 848.652824, 849.005235, 849.357701, 849.727937, 850.082481, 850.434366, 850.7924, 851.153515, 851.523679, 851.891755, 852.252498, 852.606444, 852.963396, 853.318253, 853.67572, 854.027023, 854.377397, 854.732296, 855.084956, 855.549737, 855.909706, 856.27303, 856.658093, 857.02283, 857.37969, 857.741709, 858.105419, 858.466646, 858.824083, 859.18843, 859.549565, 859.91078, 860.256771, 860.611686, 860.979049, 861.345961, 861.705182, 862.060246, 862.418383, 862.886182, 863.247739, 863.607754, 863.962994, 864.318896, 864.682315, 865.042439, 865.406279, 865.766416, 866.12657, 866.481884, 866.83626, 867.192557, 867.545445, 867.899432, 868.256993, 868.621639, 868.988613, 869.344687, 869.709488, 870.158033, 870.519133, 870.873964, 871.242982, 871.705034, 872.076325, 872.458322, 872.824206, 873.189245, 873.550807, 873.917586, 874.278887, 874.65071, 875.112764, 875.488544, 875.870716, 876.227641, 876.583294, 876.950148, 877.311055, 877.675344, 878.031883, 878.391366, 878.756554, 879.125694, 879.486084, 879.846192, 880.213893, 880.578919, 880.938267, 881.309165, 881.67646, 882.033748, 882.405429, 882.865956, 883.222003, 883.57969, 883.935743, 884.293763, 884.660155, 885.029863, 885.396565, 885.761282, 886.127699, 886.501196, 886.870049, 887.237024, 887.597347, 887.96041, 888.320242, 888.684958, 889.045028, 889.408701, 889.770604, 890.244697, 890.603939, 890.966599, 891.325716, 891.695627, 892.064344, 892.420822, 892.781791, 893.150239, 893.523958, 893.895598, 894.265405, 894.63458, 895.00674, 895.375779, 895.743721, 896.11086, 896.475081, 896.847699, 897.217587, 897.586203, 898.063894, 898.425059, 898.796323, 899.161318, 899.525309, 899.889869, 900.257413, 900.628895, 900.997635, 901.363867, 901.735613, 902.106722, 902.484966, 902.848017, 903.220122, 903.5985, 903.973814, 904.347234, 904.731715, 905.113767, 905.619351, 905.999875, 906.366808, 906.736192, 907.102987, 907.465452, 907.835442, 908.205949, 908.57625, 908.937153, 909.30929, 909.680243, 910.051765, 910.425616, 910.799516, 911.165605, 911.531358, 911.907172, 912.283681, 912.649333, 913.020297, 913.484914, 913.850694, 914.216914, 914.58919, 914.95952, 915.335087, 915.760041, 916.130193, 916.505926, 916.872452, 917.243668, 917.611522, 917.978968, 918.349416, 918.714099, 919.089349, 919.468013, 919.838353, 920.204196, 920.577178, 921.062467, 921.432492, 921.800437, 922.170989, 922.548289, 922.922356, 923.290331, 923.661689, 924.026728, 924.395124, 924.763975, 925.142187, 925.52317, 925.907464, 926.278464, 926.662489, 927.036903, 927.414609, 927.78678, 928.159003, 928.532336, 928.998386, 929.372344, 929.74435, 930.115863, 930.48368, 930.850415, 931.232119, 931.602684, 931.981807, 932.36043, 932.735904, 933.116698, 933.497598, 933.949367, 934.322747, 934.70232, 935.076364, 935.458573, 935.838241, 936.216193, 936.597874, 937.084639, 937.464977, 937.854614, 938.243048, 938.623697, 939.010511, 939.387968, 939.769701, 940.146965, 940.524581, 940.917614, 941.293935, 941.673612, 942.047719, 942.432762, 942.807436, 943.185459, 943.557105, 943.934809, 944.314628, 944.690157, 945.154767, 945.533516, 945.926091, 946.302781, 946.67868, 947.078244, 947.471106, 947.854469, 948.229879, 948.609799, 948.991832, 949.365548, 949.742465, 950.122333, 950.505854, 950.892138, 951.271047, 951.650719, 952.04125, 952.431173, 952.824602, 953.205769, 953.707184, 954.087722, 954.475574, 954.854391, 955.229304, 955.6218, 956.024416, 956.405406, 956.779897, 957.158649, 957.536799, 957.912339, 958.294255, 958.671928, 959.044068, 959.421667, 959.824731, 960.205, 960.588032, 961.091322, 961.47047, 961.859942, 962.240289, 962.620156, 962.999065, 963.375411, 963.754868, 964.13161, 964.504995, 964.883174, 965.263252, 965.638412, 966.015477, 966.391464, 966.779966, 967.158716, 967.533639, 967.910833, 968.289239, 968.676836, 969.056267, 969.544489, 969.91958, 970.296875, 970.676413, 971.056358, 971.43338, 971.812038, 972.20154, 972.582601, 972.959628, 973.351253, 973.740784, 974.207738, 974.586403, 974.969723, 975.356378, 975.741416, 976.126583, 976.506199, 976.888394, 977.27101, 977.753695, 978.131395, 978.505904, 978.886237, 979.268841, 979.64598, 980.027051, 980.405314, 980.784924, 981.164923, 981.545993, 981.92583, 982.309551, 982.690436, 983.069483, 983.449449, 983.831396, 984.213599, 984.594959, 984.978022, 985.358003, 985.741991, 986.12376, 986.612088, 986.994998, 987.389935, 987.819637, 988.236594, 988.627889, 989.018838, 989.673582, 990.096883, 990.479448, 990.873295, 991.263422, 991.651237, 992.044858, 992.433198, 992.82669, 993.216963, 993.601756, 993.987138, 994.375112, 994.771442, 995.170419, 995.76343, 996.171741, 996.651518, 997.127913, 997.628546, 998.127595, 998.62434, 999.041891, 999.443132, 999.841497, 1000.241061, 1000.634348, 1001.029163, 1001.428404, 1001.824212, 1002.2288, 1002.622292, 1003.01084, 1003.397488, 1003.782992, 1004.164495, 1004.544973, 1005.044111, 1005.442107, 1005.824717, 1006.216468, 1006.609385, 1007.006779, 1007.407084, 1007.798363, 1008.183189, 1008.568774, 1008.957347, 1009.340142, 1009.726955, 1010.1097, 1010.494136, 1010.878858, 1011.260794, 1011.643352, 1012.026505, 1012.427202, 1012.822286, 1013.21789, 1013.720146, 1014.108558, 1014.492541, 1014.876125, 1015.262131, 1015.654035, 1016.040674, 1016.424799, 1016.813959, 1017.203015, 1017.585775, 1017.982626, 1018.384711, 1018.772973, 1019.174192, 1019.57026, 1019.95636, 1020.349429, 1020.738669, 1021.12318, 1021.522681, 1021.90624, 1022.441058, 1022.838654, 1023.232684, 1023.629156, 1024.033033, 1024.43244, 1024.830877, 1025.215573, 1025.610122, 1025.997711, 1026.387406, 1026.779845, 1027.183651, 1027.584053, 1027.985848, 1028.380259, 1028.764822, 1029.14999, 1029.546292, 1029.9411, 1030.331359, 1030.72362, 1031.24261, 1031.645497, 1032.031255, 1032.420164, 1032.815036, 1033.206804, 1033.609797, 1034.010531, 1034.406683, 1034.804797, 1035.203129, 1035.594449, 1035.982266, 1036.371576, 1036.761063, 1037.155483, 1037.543426, 1037.933202, 1038.321951, 1038.713679, 1039.102436, 1039.494297, 1039.995481, 1040.384904, 1040.77254, 1041.159047, 1041.551902, 1041.944446, 1042.336663, 1042.727768, 1043.120275, 1043.512275, 1043.901915, 1044.294026, 1044.683772, 1045.075732, 1045.468423, 1045.862792, 1046.253428, 1046.648783, 1047.044091, 1047.434936, 1047.8262, 1048.228395, 1048.734803, 1049.125355, 1049.52112, 1049.93381, 1050.331973, 1050.725173, 1051.118315, 1051.510686, 1051.904119, 1052.296451, 1052.68625, 1053.079583, 1053.472589, 1053.867933, 1054.259037, 1054.659573, 1055.108035, 1055.523778, 1055.930619, 1056.328261, 1056.764111, 1057.254066, 1057.797652, 1058.200687, 1058.603574, 1059.004398, 1059.436698, 1059.977674, 1060.542004, 1061.000954, 1061.424327, 1061.842894, 1062.258061, 1062.672154, 1063.086126, 1063.50344, 1064.064229, 1064.491519, 1065.038751, 1065.45444, 1065.891269, 1066.390032, 1066.827557, 1067.257939, 1067.698299, 1068.291407, 1068.697341, 1069.101856, 1069.514953, 1069.939352, 1070.379578, 1070.821323, 1071.239339, 1071.647512, 1072.060399, 1072.499162, 1072.944288, 1073.391167, 1073.827142, 1074.256763, 1074.718799, 1075.157059, 1075.686485, 1076.103425, 1076.508682, 1076.910243, 1077.316561, 1077.913552, 1078.364993, 1078.776071, 1079.180857, 1079.581453, 1079.982791, 1080.396738, 1080.807852, 1081.224358, 1081.638916, 1082.04301, 1082.444335, 1082.857841, 1083.262003, 1083.664748, 1084.08981, 1084.494767, 1084.897177, 1085.33993, 1085.75353, 1086.157254, 1086.558786, 1086.961772, 1087.493524, 1087.945454, 1088.370703, 1088.794518, 1089.19589, 1089.601343, 1090.008256, 1090.416734, 1090.829792, 1091.233785, 1091.631634, 1092.029339, 1092.427768, 1092.838504, 1093.239307, 1093.638779, 1094.037734, 1094.439072, 1094.854729, 1095.261126, 1095.669563, 1096.085094, 1096.639793, 1097.037261, 1097.436998, 1097.846471, 1098.260487, 1098.659184, 1099.070261, 1099.477128, 1099.88664, 1100.306348, 1100.711722, 1101.120202, 1101.523572, 1101.931488, 1102.341133, 1102.753294, 1103.163448, 1103.589651, 1103.995478, 1104.403541, 1104.810351, 1105.225597, 1105.627984, 1106.149457, 1106.554171, 1106.962176, 1107.378708, 1107.786014, 1108.200072, 1108.626249, 1109.030089, 1109.443964, 1109.853651, 1110.26771, 1110.68753, 1111.091296, 1111.494337, 1111.904617, 1112.320098, 1112.731317, 1113.14054, 1113.554731, 1113.971378, 1114.388083, 1114.808958, 1115.218726, 1115.803364, 1116.214902, 1116.623053, 1117.038586, 1117.45736, 1117.868177, 1118.29195, 1118.705891, 1119.115673, 1119.527132, 1119.939085, 1120.348892, 1120.76105, 1121.182403, 1121.587702, 1122.000585, 1122.416455, 1122.823564, 1123.230738, 1123.634542, 1124.042287, 1124.455032, 1124.865841, 1125.387721, 1125.792222, 1126.199727, 1126.608007, 1127.014332, 1127.419213, 1127.826645, 1128.231263, 1128.639493, 1129.047512, 1129.454126, 1129.85784, 1130.262724, 1130.66755, 1131.078415, 1131.49188, 1131.905928, 1132.319322, 1132.731045, 1133.140946, 1133.550345, 1133.957384, 1134.372804, 1134.897322, 1135.321917, 1135.727605, 1136.139034, 1136.56036, 1136.973893, 1137.382946, 1137.790195, 1138.20153, 1138.614639, 1139.018763, 1139.427358, 1139.833906, 1140.243079, 1140.651047, 1141.059567, 1141.468148, 1141.879801, 1142.289396, 1142.698988, 1143.107567, 1143.521661, 1143.940567, 1144.397158, 1145.036113, 1145.468281, 1145.912092, 1146.367635, 1146.905616, 1147.381791, 1147.848559, 1148.290821, 1148.741049, 1149.239945, 1149.66991, 1150.124528, 1150.549776, 1150.971877, 1151.47425, 1151.945119, 1152.369094, 1152.78836, 1153.264373, 1153.694604, 1154.138306, 1154.569337, 1154.984089, 1155.543426, 1156.049116, 1156.46186, 1156.880809, 1157.312412, 1157.726195, 1158.148134, 1158.565763, 1158.982672, 1159.40336, 1159.823697, 1160.280371, 1160.70513, 1161.118052, 1161.529803, 1161.980761, 1162.397842, 1162.823927, 1163.29255, 1163.715568, 1164.140081, 1164.557158, 1164.979395, 1165.391133, 1165.929348, 1166.341537, 1166.757595, 1167.167982, 1167.579427, 1167.994762, 1168.408043, 1168.818293, 1169.229532, 1169.647457, 1170.063265, 1170.476452, 1170.889519, 1171.301445, 1171.718177, 1172.135764, 1172.548052, 1172.962185, 1173.378945, 1173.795138, 1174.213594, 1174.625705, 1175.038644, 1175.577359, 1175.994, 1176.409235, 1176.824199, 1177.259749, 1177.676653, 1178.094086, 1178.507423, 1178.922341, 1179.338389, 1179.751106, 1180.165872, 1180.580597, 1180.998307, 1181.420207, 1181.837952, 1182.251059, 1182.666418, 1183.089482, 1183.503639, 1183.918552, 1184.34041, 1184.7643, 1185.185795, 1185.59951, 1186.130908, 1186.550064, 1186.965923, 1187.384245, 1187.808414, 1188.228402, 1188.643124, 1189.061027, 1189.47736, 1189.896922, 1190.311678, 1190.727351, 1191.143464, 1191.562144, 1191.98112, 1192.398278, 1192.812181, 1193.230886, 1193.645636, 1194.062512, 1194.483174, 1194.903489, 1195.32524, 1195.747832, 1196.280969, 1196.696855, 1197.114991, 1197.537354, 1197.952248, 1198.37101, 1198.790155, 1199.211147, 1199.629771, 1200.04608, 1200.465579, 1200.884072, 1201.303655, 1201.720582, 1202.141731, 1202.562462, 1202.985372, 1203.406047, 1203.822825, 1204.244117, 1204.66967, 1205.090746, 1205.509924, 1206.051577, 1206.470312, 1206.889084, 1207.308402, 1207.727126, 1208.146696, 1208.569409, 1208.989326, 1209.407576, 1209.830179, 1210.250156, 1210.668135, 1211.086346, 1211.506768, 1211.930585, 1212.359126, 1212.781074, 1213.199028, 1213.622639, 1214.045339, 1214.467112, 1214.888418, 1215.310376, 1215.731948, 1216.153249, 1216.694009, 1217.113964, 1217.536979, 1217.959523, 1218.377044, 1218.801103, 1219.226668, 1219.651361, 1220.07671, 1220.501709, 1220.926507, 1221.352763, 1221.776676, 1222.198885, 1222.622571, 1223.044416, 1223.470599, 1223.894969, 1224.318514, 1224.745662, 1225.173173, 1225.599224, 1226.018983, 1226.444656, 1227.002701, 1227.424309, 1227.849363, 1228.28088, 1228.704351, 1229.134943, 1229.562136, 1229.985735, 1230.446026, 1230.876053, 1231.29837, 1231.728302, 1232.173437, 1232.599949, 1233.02302, 1233.447245, 1233.870277, 1234.298913, 1234.724257, 1235.150038, 1235.582067, 1236.009984, 1236.442888, 1236.868925, 1237.417849, 1237.844003, 1238.270085, 1238.699629, 1239.127334, 1239.552616, 1239.980142, 1240.403962, 1240.832828, 1241.259178, 1241.684341, 1242.10942, 1242.535373, 1242.965835, 1243.39589, 1243.823648, 1244.251397, 1244.681734, 1245.11073, 1245.537726, 1245.964243, 1246.39154, 1246.820817, 1247.255542, 1247.685701, 1248.250151, 1248.676304, 1249.104335, 1249.540773, 1249.973987, 1250.463804, 1250.958997, 1251.400097, 1251.820287, 1252.237389, 1252.656183, 1253.076764, 1253.496495, 1253.915451, 1254.336208, 1254.756967, 1255.176114, 1255.596505, 1256.017051, 1256.439246, 1256.860625, 1257.281812, 1257.702567, 1258.122987, 1258.54583, 1259.078823, 1259.500592, 1259.922813, 1260.341268, 1260.761733, 1261.183823, 1261.605138, 1262.025993, 1262.448091, 1262.867936, 1263.288195, 1263.709729, 1264.129066, 1264.551274, 1264.976074, 1265.396405, 1265.819641, 1266.241454, 1266.662855, 1267.084515, 1267.510905, 1267.935275, 1268.358669, 1268.78192, 1269.322948, 1269.752642, 1270.183081, 1270.616303, 1271.051335, 1271.48709, 1271.924047, 1272.365163, 1272.801331, 1273.243616, 1273.67496, 1274.096677, 1274.523181, 1274.953962, 1275.389377, 1275.826463, 1276.259354, 1276.687444, 1277.114146, 1277.537644, 1277.967071, 1278.395914, 1278.833881, 1279.271641, 1279.707974, 1280.143357, 1280.696632, 1281.122669, 1281.548158, 1281.974525, 1282.397604, 1282.827901, 1283.259728, 1283.70388, 1284.144557, 1284.58082, 1285.009222, 1285.436873, 1285.863963, 1286.290355, 1286.716892, 1287.141917, 1287.568029, 1287.992397, 1288.419279, 1288.846828, 1289.272371, 1289.699413, 1290.126739, 1290.553082, 1290.97893, 1291.524427, 1291.950523, 1292.379163, 1292.803254, 1293.229901, 1293.654925, 1294.081872, 1294.508354, 1294.934594, 1295.363198, 1295.790288, 1296.220517, 1296.647808, 1297.07957, 1297.50743, 1297.935178, 1298.364167, 1298.791997, 1299.21912, 1299.647526, 1300.07443, 1300.504203, 1300.932504, 1301.359243, 1301.790047, 1302.346018, 1302.775039, 1303.205817, 1303.633327, 1304.067628, 1304.495573, 1304.924256, 1305.352177, 1305.782034, 1306.209858, 1306.639031, 1307.069947, 1307.498216, 1307.929015, 1308.359392, 1308.789094, 1309.218594, 1309.647423, 1310.075731, 1310.50743, 1310.938952, 1311.370663, 1311.800967, 1312.23002, 1312.66362, 1313.22806, 1313.668825, 1314.10606, 1314.557467, 1314.999108, 1315.436712, 1315.887597, 1316.339568, 1316.814571, 1317.261493, 1317.693791, 1318.131743, 1318.561959, 1319.00363, 1319.453796, 1319.895549, 1320.347197, 1320.799341, 1321.253027, 1321.707236, 1322.20539, 1322.653477, 1323.095627, 1323.539242, 1323.98662, 1324.575293, 1325.025695, 1325.466181, 1325.910085, 1326.352844, 1326.857773, 1327.302722, 1327.766905, 1328.242412, 1328.686116, 1329.132957, 1329.585354, 1330.047947, 1330.49073, 1330.951992, 1331.410191, 1331.858801, 1332.30425, 1332.753092, 1333.245799, 1333.689906, 1334.128356, 1334.574388, 1335.016524, 1335.461145, 1336.065372, 1336.532781] }] }, { - labels: [0, 0.7, 1.3, 1.9, 2.6, 3.5, 4.2, 4.9, 5.5, 6.2, 6.8, 7.4, 8.1, 8.7, 9.3, 10, 10.6, 11.2, 11.9, 12.5, 13.1, 13.8, 14.4, 15, 15.7, 16.3, 16.9, 17.6, 18.2, 18.8, 19.5, 20.1, 20.7, 21.4, 22, 22.6, 23.3, 23.9, 24.6, 25.2, 25.8, 26.5, 27.1, 27.7, 28.4, 29, 29.6, 30.3, 30.9, 31.5], + labels: [0, 1.1, 2.1, 3.1, 4.1, 5.2, 6.4, 7.4, 8.4, 9.4, 10.5, 11.5, 12.5, 13.5, 14.5, 15.6, 16.6, 17.6, 18.6, 19.6, 20.7, 21.7, 22.7, 23.7, 24.7, 25.7, 26.7, 27.7, 28.8, 29.8, 30.8, 31.8, 32.8, 33.8, 34.9, 35.9, 36.9, 37.9, 38.9, 39.9, 40.9, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51.1, 52.1, 53.1, 54.1, 55.1, 56.1, 57.2, 58.2, 59.2, 60.2, 61.2, 62.2, 63.2, 64.2, 65.2, 66.2, 67.3, 68.3, 69.3, 70.3, 71.3, 72.3, 73.3, 74.3, 75.3, 76.3, 77.3, 78.3, 79.3, 80.3, 81.3, 82.4, 83.4, 84.4, 85.4, 86.4, 87.5, 88.5, 89.5, 90.5, 91.5, 92.6, 93.6, 94.6, 95.7, 96.7, 97.7, 98.7, 99.8, 100.8, 101.8, 102.9, 103.9, 104.9, 105.9, 107, 108, 109, 110.1, 111.1, 112.1, 113.1, 114.1, 115.2, 116.2, 117.2, 118.2, 119.3, 120.3, 121.3, 122.4, 123.4, 124.4, 125.4, 126.5, 127.5, 128.5, 129.6, 130.6, 131.6, 132.6, 133.7, 134.7, 135.7, 136.7, 137.7, 138.8, 139.8, 140.8, 141.8, 142.8, 143.8, 144.8, 145.8, 146.8, 147.9, 148.9, 149.9, 150.9, 151.9, 152.9, 154, 155, 156, 157, 158, 159, 160, 161.1, 162.1, 163.1, 164.1, 165.1, 166.1, 167.2, 168.2, 169.2, 170.2, 171.2, 172.2, 173.3, 174.3, 175.3, 176.3, 177.4, 178.4, 179.4, 180.4, 181.5, 182.5, 183.5, 184.5, 185.5, 186.6, 187.6, 188.6, 189.7, 190.7, 191.7, 192.8, 193.8, 194.8, 195.8, 196.8, 197.8, 198.9, 199.9, 200.9, 201.9, 203, 204, 205, 206, 207, 208, 209, 210.1, 211.1, 212.1, 213.2, 214.2, 215.2, 216.3, 217.3, 218.3, 219.4, 220.4, 221.4, 222.5, 223.5, 224.5, 225.6, 226.6, 227.6, 228.6, 229.6, 230.7, 231.7, 232.7, 233.7, 234.7, 235.8, 236.8, 237.8, 238.8, 239.9, 240.9, 241.9, 243, 244, 245, 246, 247, 248.1, 249.1, 250.1, 251.1, 252.2, 253.2, 254.3, 255.3, 256.3, 257.3, 258.4, 259.4, 260.4, 261.4, 262.5, 263.5, 264.5, 265.5, 266.5, 267.6, 268.6, 269.6, 270.6, 271.7, 272.7, 273.7, 274.8, 275.8, 276.8, 277.8, 278.9, 279.9, 281, 282, 283, 284, 285, 286, 287.1, 288.1, 289.1, 290.1, 291.2, 292.2, 293.2, 294.3, 295.3, 296.3, 297.3, 298.3, 299.3, 300.4, 301.4, 302.5, 303.5, 304.5, 305.5, 306.5, 307.5, 308.5, 309.5, 310.5, 311.6, 312.6, 313.7, 314.7, 315.7, 316.8, 317.8, 318.8, 319.9, 320.9, 321.9, 322.9, 323.9, 325, 326, 327, 328, 329.1, 330.1, 331.1, 332.2, 333.2, 334.2, 335.2, 336.3, 337.3, 338.3, 339.3, 340.4, 341.4, 342.4, 343.5, 344.5, 345.5, 346.6, 347.6, 348.6, 349.6, 350.6, 351.6, 352.7, 353.7, 354.8, 355.8, 356.8, 357.8, 358.8, 359.9, 360.9, 361.9, 363, 364, 365, 366, 367, 368, 369.1, 370.1, 371.1, 372.2, 373.2, 374.2, 375.3, 376.3, 377.3, 378.4, 379.4, 380.4, 381.4, 382.5, 383.5, 384.6, 385.6, 386.6, 387.6, 388.7, 389.7, 390.7, 391.7, 392.8, 393.8, 394.8, 395.8, 396.8, 397.8, 398.8, 399.8, 400.8, 401.8, 402.8, 403.8, 404.8, 405.8, 406.8, 407.8, 408.8, 409.8, 410.8, 411.8, 412.8, 413.8, 414.8, 415.8, 416.8, 417.8, 418.8, 419.8, 420.8, 421.8, 422.8, 423.8, 424.8, 425.8, 426.8, 427.8, 428.8, 429.8, 430.8, 431.8, 432.8, 433.8, 434.8, 435.8, 436.8, 437.8, 438.8, 439.8, 440.8, 441.8, 442.8, 443.8, 444.8, 445.8, 446.8, 447.8, 448.8, 449.8, 450.9, 451.9, 452.9, 453.9, 454.9, 455.9, 456.9, 457.9, 458.9, 459.9, 460.9, 461.9, 462.9, 463.9, 464.9, 465.9, 466.9, 467.9, 468.9, 469.9, 470.9, 471.9, 472.9, 473.9, 474.9, 475.9, 476.9, 477.9, 478.9, 479.9, 480.9, 481.9, 482.9, 483.9, 484.9, 485.9, 486.9, 487.9, 488.9, 490, 491, 492, 493, 494.1, 495.1, 496.1, 497.2, 498.2, 499.3, 500.3, 501.3, 502.4, 503.4, 504.5, 505.5, 506.5, 507.6, 508.6, 509.6, 510.6, 511.7, 512.7, 513.7, 514.8, 515.8, 516.8, 517.8, 518.9, 519.9, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533.2, 534.2, 535.2, 536.2, 537.2, 538.2, 539.2, 540.2, 541.2, 542.2, 543.2, 544.2, 545.2, 546.2, 547.2, 548.2, 549.2, 550.2, 551.2, 552.2, 553.2, 554.2, 555.2, 556.2, 557.2, 558.2, 559.2, 560.2, 561.3, 562.3, 563.4, 564.4, 565.4, 566.5, 567.5, 568.5, 569.6, 570.6, 571.6, 572.7, 573.7, 574.8, 575.8, 576.8, 577.9, 578.9, 579.9, 581, 582, 583, 584.1, 585.1, 586.2, 587.2, 588.2, 589.3, 590.3, 591.4, 592.5, 593.5, 594.5, 595.6, 596.6, 597.7, 598.7, 599.8, 600.8, 601.8, 602.9, 603.9, 605, 606, 607.1, 608.1, 609.2, 610.2, 611.2, 612.3, 613.3, 614.4, 615.4, 616.5, 617.5, 618.6, 619.6, 620.6, 621.7, 622.7, 623.8, 624.8, 625.9, 626.9, 627.9, 629, 630.1, 631.1, 632.2, 633.2, 634.3, 635.3, 636.4, 637.4, 638.5, 639.5, 640.6, 641.6, 642.7, 643.7, 644.7, 645.8, 646.9, 647.9, 648.9, 650, 651, 652.1, 653.1, 654.2, 655.2, 656.3, 657.3, 658.4, 659.4, 660.4, 661.5, 662.5, 663.6, 664.6, 665.7, 666.7, 667.8, 668.8, 669.9, 670.9, 672, 673, 674, 675.1, 676.1, 677.2, 678.2, 679.3, 680.3, 681.3, 682.3, 683.4, 684.4, 685.5, 686.5, 687.6, 688.6, 689.7, 690.7, 691.7, 692.8, 693.8, 694.9, 696.1, 697.1, 698.2, 699.3, 700.3, 701.4, 702.4, 703.5, 704.5, 705.6, 706.6, 707.7, 708.7, 709.7, 710.8, 711.8, 712.9, 714, 715, 716, 717.1, 718.1, 719.1, 720.2, 721.2, 722.2, 723.3, 724.4, 725.4, 726.5, 727.5, 728.6, 729.6, 730.7, 731.7, 732.7, 733.8, 734.9, 735.9, 737, 738, 739, 740, 741.1, 742.1, 743.2, 744.3, 745.3, 746.4, 747.4, 748.5, 749.5, 750.6, 751.6, 752.7, 753.7, 754.8, 755.9, 756.9, 758, 759, 760.1, 761.1, 762.1, 763.2, 764.3, 765.3, 766.4, 767.4, 768.4, 769.5, 770.5, 771.6, 772.6, 773.7, 774.7, 775.8, 776.8, 777.9, 778.9, 780, 781, 782.1, 783.2, 784.3, 785.4, 786.4, 787.5, 788.5, 789.5, 790.6, 791.6, 792.6, 793.6, 794.6, 795.6, 796.6, 797.6, 798.6, 799.6, 800.7, 801.7, 802.7, 803.7, 804.7, 805.7, 806.8, 807.8, 808.8, 809.9, 811, 812.2, 813.3, 814.3, 815.3, 816.4, 817.5, 818.6, 819.6, 820.7, 821.8, 822.9, 824, 825.2, 826.2, 827.4, 828.4, 829.6, 830.6, 831.8, 832.9, 834, 835.1, 836.2, 837.3, 838.4, 839.4, 840.5, 841.6, 842.7, 843.8, 845, 846.1, 847.2, 848.3, 849.4, 850.5, 851.7, 852.8, 854, 855.1, 856.3, 857.4, 858.5, 859.6, 860.7, 861.8, 862.9, 864, 865, 866, 867, 868.1, 869.1, 870.1, 871.2, 872.2, 873.2, 874.2, 875.2, 876.2, 877.2, 878.2, 879.2, 880.3, 881.3, 882.4, 883.4, 884.5, 885.5, 886.6, 887.6, 888.7, 889.8, 890.9, 892, 893, 894.1, 895.2, 896.3, 897.3, 898.5, 899.5, 900.6, 901.7, 902.7, 903.8, 904.9, 906, 907.1, 908.2, 909.2, 910.3, 911.4, 912.5, 913.6, 914.6, 915.7, 916.8, 917.9, 919, 920.1, 921.2, 922.2, 923.3, 924.4, 925.4, 926.5, 927.6, 928.6, 929.7, 930.8, 931.9, 932.9, 934.1, 935.2, 936.3, 937.4, 938.4, 939.6, 940.7, 941.8, 942.9, 944, 945.1, 946.3, 947.4, 948.4, 949.5, 950.6, 951.8, 952.9, 954.1, 955.2, 956.3, 957.4, 958.6, 959.7, 960.8, 961.9, 963, 964.1, 965.2, 966.4, 967.5, 968.7, 969.8, 970.9, 972.1, 973.2, 974.3, 975.5, 976.6, 977.8, 979, 980.2, 981.3, 982.5, 983.6, 984.8, 986, 987.1, 988.2, 989.3, 990.5, 991.6, 992.8, 994, 995.2, 996.3, 997.5, 998.7, 999.8, 1001, 1002.2, 1003.3, 1004.5, 1005.7, 1006.8, 1008, 1009.2, 1010.3, 1011.5, 1012.6, 1013.8, 1015, 1016.2, 1017.4, 1018.5, 1019.6, 1020.8, 1022, 1023.1, 1024.3, 1025.5, 1026.6, 1027.8, 1028.9, 1030.1, 1031.2, 1032.4, 1033.6, 1034.7, 1035.9, 1037.1, 1038.2, 1039.4, 1040.6, 1041.7, 1042.9, 1044, 1045.2, 1046.4, 1047.6, 1048.7, 1049.9, 1051.1, 1052.2, 1053.2, 1054.4, 1055.6, 1056.7, 1057.9, 1059.1, 1060.3, 1061.4, 1062.6, 1063.8, 1064.9, 1066, 1067.2, 1068.4, 1069.6, 1070.7, 1071.9, 1073, 1074.2, 1075.4, 1076.6, 1077.7, 1078.9, 1080.1, 1081.3, 1082.4, 1083.6, 1084.8, 1086, 1087.2, 1088.3, 1089.5, 1090.7, 1091.9, 1093.1, 1094.3, 1095.4, 1096.6, 1097.8, 1099, 1100.2, 1101.4, 1102.6, 1103.8, 1104.9, 1106.1, 1107.3, 1108.5, 1109.7, 1110.9, 1112.1, 1113.3, 1114.5, 1115.6, 1116.8, 1118, 1119.2, 1120.4, 1121.5, 1122.7, 1123.9, 1125.1, 1126.3, 1127.5, 1128.7, 1129.9, 1131.1, 1132.3, 1133.5, 1134.6, 1135.8, 1137, 1138.1, 1139.3, 1140.5, 1141.7, 1142.9, 1144.1, 1145.3, 1146.4, 1147.6, 1148.8, 1150, 1151.2, 1152.4, 1153.6, 1154.7, 1155.9, 1157.2, 1158.4, 1159.6, 1160.7, 1161.9, 1163.1, 1164.2, 1165.3, 1166.5, 1167.7, 1168.9, 1170, 1171.2, 1172.4, 1173.6, 1174.8, 1176, 1177.2, 1178.4, 1179.6, 1180.8, 1181.9, 1183.1, 1184.3, 1185.3, 1186.5, 1187.7, 1188.9, 1190.1, 1191.3, 1192.4, 1193.6, 1194.8, 1196, 1197.2, 1198.4, 1199.6, 1200.7, 1201.9, 1203, 1204.2, 1205.4, 1206.6, 1207.8, 1209, 1210.1, 1211.3, 1212.5, 1213.6, 1214.8, 1216, 1217.2, 1218.4, 1219.6, 1220.8, 1222, 1223.2, 1224.3, 1225.5, 1226.7, 1227.9, 1229, 1230.2, 1231.4, 1232.6, 1233.8, 1235, 1236.2, 1237.4, 1238.6, 1239.8, 1241, 1242.2, 1243.4, 1244.6, 1245.8, 1247, 1248.2, 1249.4, 1250.6, 1251.8, 1253, 1254.2, 1255.4, 1256.5, 1257.7, 1258.9, 1260, 1261.2, 1262.4, 1263.6, 1264.8, 1266, 1267.2, 1268.4, 1269.6, 1270.8, 1272, 1273.2, 1274.4, 1275.6, 1276.8, 1278, 1279.2, 1280.4, 1281.6, 1282.8, 1284, 1285.2, 1286.4, 1287.6, 1288.8, 1290, 1291.2, 1292.4, 1293.5, 1294.7, 1295.9, 1297.1, 1298.3, 1299.5, 1300.7, 1301.9, 1303, 1304.2, 1305.4, 1306.6, 1307.8, 1309, 1310.2, 1311.3, 1312.5, 1313.7, 1314.9, 1316.1, 1317.3, 1318.3, 1319.5, 1320.7, 1321.9, 1323, 1324.2, 1325.4, 1326.5, 1327.7, 1328.9, 1330.1, 1331.2, 1332.4, 1333.6, 1334.8, 1336, 1337.2, 1338.4, 1339.6, 1340.8, 1342, 1343.1, 1344.3, 1345.5, 1346.7, 1347.9, 1349, 1350.2, 1351.4, 1352.6, 1353.8, 1355, 1356.1, 1357.3, 1358.5, 1359.7, 1360.9, 1362.1, 1363.3, 1364.5, 1365.7, 1366.9, 1368, 1369.2, 1370.4, 1371.5, 1372.7, 1373.8, 1375, 1376.2, 1377.3, 1378.5, 1379.6, 1380.8, 1382, 1383.2, 1384.4, 1385.6, 1386.8, 1388, 1389.2, 1390.4, 1391.6, 1392.8, 1394, 1395.1, 1396.3, 1397.5, 1398.7, 1399.9, 1401.1, 1402.3, 1403.5, 1404.7, 1405.9, 1407.1, 1408.3, 1409.5, 1410.7, 1411.9, 1413.1, 1414.3, 1415.5, 1416.7, 1417.9, 1419.1, 1420.3, 1421.5, 1422.7, 1423.9, 1425.1, 1426.3, 1427.5, 1428.7, 1429.9, 1431.1, 1432.3, 1433.5, 1434.7, 1435.9, 1437.1, 1438.2, 1439.4, 1440.6, 1441.8, 1443, 1444.2, 1445.4, 1446.6, 1447.8, 1449, 1450.2, 1451.4, 1452.6, 1453.7, 1454.9, 1456.1, 1457.3, 1458.5, 1459.7, 1460.9, 1462.1, 1463.3, 1464.5, 1465.7, 1466.9, 1468.1, 1469.3, 1470.5, 1471.7, 1472.9, 1474.1, 1475.3, 1476.5, 1477.6, 1478.8, 1480, 1481.2, 1482.4, 1483.6, 1484.8, 1485.9, 1487.1, 1488.3, 1489.5, 1490.7, 1491.9, 1493.1, 1494.3, 1495.5, 1496.7, 1497.9, 1499.1, 1500.3, 1501.5, 1502.7, 1503.8, 1505, 1506.2, 1507.4, 1508.6, 1509.8, 1511, 1512.1, 1513.3, 1514.5, 1515.7, 1516.9, 1518.1, 1519.3, 1520.5, 1521.7, 1522.9, 1524.1, 1525.2, 1526.4, 1527.6, 1528.8, 1530, 1531.2, 1532.3, 1533.5, 1534.7, 1535.9, 1537.1, 1538.4, 1539.6, 1540.8, 1542, 1543.2, 1544.4, 1545.6, 1546.7, 1547.9, 1549.1, 1550.3, 1551.5, 1552.7, 1553.9, 1555.1, 1556.3, 1557.5, 1558.7, 1559.9, 1561.1, 1562.3, 1563.5, 1564.7, 1565.8, 1567, 1568.2, 1569.4, 1570.6, 1571.8, 1573, 1574.2, 1575.4, 1576.6, 1577.8, 1579, 1580.2, 1581.4, 1582.6, 1583.8, 1585, 1586.2, 1587.4, 1588.6, 1589.8, 1591, 1592.2, 1593.4, 1594.6, 1595.8, 1597, 1598.2, 1599.4, 1600.6, 1601.8, 1603, 1604.2, 1605.4, 1606.6, 1607.8, 1609, 1610.2, 1611.4, 1612.6, 1613.8, 1615, 1616.2, 1617.4, 1618.6, 1619.8, 1621, 1622.2, 1623.4, 1624.6, 1625.8, 1627, 1628.2, 1629.4, 1630.6, 1631.8, 1633, 1634.2, 1635.4, 1636.6, 1637.8, 1639, 1640.2, 1641.4, 1642.6, 1643.8, 1645, 1646.2, 1647.4, 1648.6, 1649.8, 1651, 1652.2, 1653.4, 1654.6, 1655.8, 1657, 1658.2, 1659.4, 1660.6, 1661.8, 1663, 1664.2, 1665.4, 1666.6, 1667.8, 1669, 1670.2, 1671.4, 1672.6, 1673.8, 1675, 1676.2, 1677.4, 1678.5, 1679.8, 1681, 1682.2, 1683.4, 1684.6, 1685.8, 1687, 1688.2, 1689.4, 1690.6, 1691.8, 1693, 1694.2, 1695.4, 1696.6, 1697.8, 1699, 1700.2, 1701.4, 1702.6, 1703.8, 1705, 1706.2, 1707.4, 1708.6, 1709.8, 1711, 1712.2, 1713.4, 1714.6, 1715.8, 1717, 1718.2, 1719.4, 1720.6, 1721.8, 1723, 1724.2, 1725.4, 1726.6, 1727.8, 1729, 1730.2, 1731.4, 1732.6, 1733.8, 1735, 1736.2, 1737.4, 1738.6, 1739.8, 1741, 1742.2, 1743.4, 1744.6, 1745.8, 1747, 1748.2, 1749.4, 1750.6, 1751.8, 1753, 1754.2, 1755.4, 1756.6, 1757.8, 1759, 1760.2, 1761.4, 1762.6, 1763.8, 1765, 1766.2, 1767.4, 1768.6, 1769.8, 1771, 1772.2, 1773.4, 1774.6, 1775.8, 1777, 1778.2, 1779.5, 1780.7, 1781.9, 1783.1, 1784.3, 1785.5, 1786.7, 1787.9, 1789.1, 1790.3, 1791.5, 1792.7, 1793.9, 1795.1, 1796.3, 1797.5, 1798.7, 1799.9, 1801.1, 1802.3, 1803.5, 1804.7, 1805.9, 1807.1, 1808.3, 1809.5, 1810.7, 1811.9, 1813.1, 1814.3, 1815.5, 1816.7, 1817.9, 1819.1, 1820.3, 1821.5, 1822.7, 1823.9, 1825.1, 1826.3, 1827.5, 1828.7, 1829.9, 1831.1, 1832.3, 1833.5, 1834.7, 1835.9, 1837.1, 1838.3, 1839.5, 1840.7, 1841.9, 1843.2, 1844.4, 1845.6, 1846.8, 1848, 1849.2, 1850.4, 1851.6, 1852.8, 1854, 1855.2, 1856.4, 1857.6, 1858.8, 1860, 1861.2, 1862.4, 1863.6, 1864.8, 1866, 1867.2, 1868.4, 1869.6, 1870.8, 1872, 1873.2, 1874.4, 1875.6, 1876.8, 1878, 1879.2, 1880.4, 1881.6, 1882.8, 1884, 1885.2, 1886.4, 1887.6, 1888.8, 1890, 1891.2, 1892.4, 1893.6, 1894.8, 1896, 1897.2, 1898.4, 1899.7, 1900.8, 1902.1, 1903.3, 1904.5, 1905.7, 1906.9, 1908.1, 1909.3, 1910.5, 1911.7, 1912.9, 1914.1, 1915.3, 1916.5, 1917.7, 1918.9, 1920.1, 1921.3, 1922.5, 1923.7, 1924.9, 1926.1, 1927.3, 1928.5, 1929.7, 1930.9, 1932.1, 1933.3, 1934.5, 1935.7, 1936.9, 1938.1, 1939.3, 1940.5, 1941.7, 1943, 1944.2, 1945.4, 1946.6, 1947.8, 1949, 1950.2, 1951.4, 1952.6, 1953.8, 1955, 1956.2, 1957.4, 1958.6, 1959.8, 1961, 1962.2, 1963.4, 1964.6, 1965.8, 1967, 1968.2, 1969.4, 1970.6, 1971.8, 1973, 1974.2, 1975.4, 1976.6, 1977.8, 1979, 1980.2, 1981.4, 1982.6, 1983.8, 1985, 1986.2, 1987.4, 1988.6, 1989.8, 1991, 1992.2, 1993.4, 1994.6, 1995.8, 1997, 1998.2, 1999.4, 2000.6, 2001.9, 2003.1, 2004.3, 2005.5, 2006.7, 2007.9, 2009.1, 2010.3, 2011.5, 2012.7, 2013.9, 2015.1, 2016.3, 2017.5, 2018.7, 2019.9, 2021.1, 2022.3, 2023.5, 2024.7, 2025.9, 2027.1, 2028.3, 2029.5, 2030.7, 2031.9, 2033.1, 2034.3, 2035.5, 2036.7, 2037.9, 2039.1, 2040.3, 2041.5, 2042.7, 2043.9, 2045.1, 2046.3, 2047.5, 2048.7, 2049.9, 2051.1, 2052.3, 2053.5, 2054.7, 2055.9, 2057.1, 2058.4, 2059.5, 2060.7, 2061.9, 2063.2, 2064.4, 2065.6, 2066.8, 2068, 2069.2, 2070.4, 2071.6, 2072.8, 2074, 2075.2, 2076.4, 2077.6, 2078.8, 2080, 2081.2, 2082.4, 2083.6, 2084.8, 2086, 2087.2, 2088.4, 2089.6, 2090.8, 2092, 2093.2, 2094.4, 2095.6, 2096.8, 2098, 2099.2, 2100.4, 2101.6, 2102.8, 2104, 2105.2, 2106.4, 2107.6, 2108.8, 2110, 2111.2, 2112.4, 2113.6, 2114.8, 2116, 2117.2, 2118.4, 2119.6, 2120.8, 2122, 2123.2, 2124.4, 2125.7, 2126.9, 2128.1, 2129.3, 2130.5, 2131.7, 2132.9, 2134.1, 2135.3, 2136.5, 2137.7, 2138.9, 2140.1, 2141.5, 2142.8, 2144, 2145.2, 2146.4, 2147.7, 2148.9, 2150.1, 2151.3, 2152.5, 2153.7, 2154.9, 2156.1, 2157.3, 2158.5, 2159.7, 2160.9, 2162.1, 2163.3, 2164.5, 2165.7, 2166.9, 2168.1, 2169.3, 2170.5, 2171.7, 2172.9, 2174.1, 2175.3, 2176.5, 2177.7, 2179, 2180.1, 2181.3, 2182.6, 2183.8, 2184.9, 2186.2, 2187.4, 2188.6, 2189.8, 2191, 2192.2, 2193.4, 2194.6, 2195.8, 2197, 2198.2, 2199.4, 2200.6, 2201.8, 2203, 2204.2, 2205.4, 2206.6, 2207.8, 2209, 2210.2, 2211.4, 2212.6, 2213.8, 2215, 2216.2, 2217.4, 2218.6, 2219.8, 2221, 2222.2, 2223.4, 2224.6, 2225.8, 2227, 2228.2, 2229.4, 2230.6, 2231.8, 2233, 2234.2, 2235.4, 2236.6, 2237.8, 2239, 2240.2, 2241.5, 2242.7, 2243.9, 2245.1, 2246.3, 2247.5, 2248.7, 2249.9, 2251.1, 2252.3, 2253.5, 2254.7, 2255.9, 2257.1, 2258.3, 2259.5, 2260.7, 2261.9, 2263.1, 2264.3, 2265.5, 2266.7, 2267.9, 2269.1, 2270.3, 2271.5, 2272.7, 2273.9, 2275.1, 2276.3, 2277.5, 2278.7, 2279.9, 2281.1, 2282.3, 2283.5, 2284.7, 2285.9, 2287.1, 2288.4, 2289.6, 2290.8, 2292, 2293.2, 2294.4, 2295.6, 2296.8, 2298, 2299.2, 2300.4, 2301.6, 2302.8, 2304, 2305.2, 2306.4, 2307.6, 2308.8, 2310, 2311.2, 2312.4, 2313.6, 2314.8, 2316, 2317.2, 2318.4, 2319.6, 2320.8, 2322, 2323.2, 2324.4, 2325.6, 2326.8, 2328, 2329.2, 2330.4, 2331.6, 2332.8, 2334, 2335.2, 2336.4, 2337.6, 2338.8, 2340, 2341.2, 2342.4, 2343.6, 2344.8, 2346, 2347.2, 2348.4, 2349.7, 2350.9, 2352.1, 2353.3, 2354.5, 2355.7, 2356.9, 2358.1, 2359.3, 2360.5, 2361.7, 2362.9, 2364.1, 2365.3, 2366.5, 2367.7, 2369, 2370.2, 2371.4, 2372.6, 2373.8, 2375, 2376.2, 2377.4, 2378.6, 2379.8, 2381, 2382.2, 2383.4, 2384.6, 2385.8, 2387, 2388.2, 2389.4, 2390.6, 2391.8, 2393, 2394.2, 2395.4, 2396.6, 2397.8, 2399, 2400.2, 2401.5, 2402.7, 2403.9, 2405.1, 2406.3, 2407.5, 2408.7, 2409.9, 2411.1, 2412.3, 2413.5, 2414.7, 2415.9, 2417.1, 2418.3, 2419.5, 2420.7, 2421.9, 2423.1, 2424.3, 2425.5, 2426.7, 2427.9, 2429.1, 2430.3, 2431.5, 2432.7, 2433.9, 2435.1, 2436.3, 2437.5, 2438.7, 2439.9, 2441.2, 2442.4, 2443.6, 2444.8, 2446, 2447.2, 2448.4, 2449.6, 2450.8, 2452, 2453.2, 2454.4, 2455.6, 2456.8, 2458, 2459.2, 2460.4, 2461.6, 2462.8, 2464, 2465.2, 2466.4, 2467.6, 2468.8, 2470, 2471.2, 2472.5, 2473.7, 2474.9, 2476.1, 2477.3, 2478.5, 2479.7, 2480.9, 2482.1, 2483.3, 2484.5, 2485.7, 2486.9, 2488.1, 2489.3, 2490.5, 2491.7, 2492.9, 2494.1, 2495.3, 2496.5, 2497.7, 2498.9, 2500.1, 2501.3, 2502.5, 2503.7, 2504.9, 2506.1, 2507.3, 2508.5, 2509.7, 2510.9, 2512.1, 2513.3, 2514.5, 2515.7, 2516.9, 2518.1, 2519.3, 2520.5, 2521.8, 2523, 2524.2, 2525.4, 2526.6, 2527.8, 2529, 2530.2, 2531.4, 2532.6, 2533.8, 2535, 2536.2, 2537.4, 2538.6, 2539.8, 2541, 2542.2, 2543.4, 2544.6, 2545.8, 2547, 2548.2, 2549.4, 2550.6, 2551.8, 2553, 2554.2, 2555.4, 2556.7, 2557.9, 2559.1, 2560.3, 2561.5, 2562.7, 2563.9, 2565.1, 2566.3, 2567.5, 2568.7, 2569.9, 2571.1, 2572.3, 2573.5, 2574.7, 2575.9, 2577.1, 2578.3, 2579.5, 2580.8, 2581.9, 2583.2, 2584.4, 2585.6, 2586.8, 2588, 2589.2, 2590.4, 2591.6, 2592.8, 2594, 2595.2, 2596.4, 2597.6, 2598.8, 2600, 2601.2, 2602.4, 2603.6, 2604.8, 2606, 2607.2, 2608.4, 2609.6, 2610.8, 2612, 2613.2, 2614.4, 2615.6, 2616.8, 2618, 2619.2, 2620.4, 2621.6, 2622.9, 2624.1, 2625.3, 2626.5, 2627.7, 2628.9, 2630.1, 2631.3, 2632.5, 2633.7, 2634.9, 2636.1, 2637.3, 2638.5, 2639.7, 2640.9, 2642.2, 2643.4, 2644.5, 2645.8, 2647, 2648.2, 2649.4, 2650.6, 2651.8, 2653, 2654.2, 2655.4, 2656.6, 2657.8, 2659, 2660.2, 2661.4, 2662.6, 2663.9, 2665.1, 2666.3, 2667.5, 2668.7, 2669.9, 2671.1, 2672.3, 2673.5, 2674.7, 2675.9, 2677.1, 2678.3, 2679.5, 2680.8, 2682, 2683.2, 2684.4, 2685.6, 2686.8, 2688, 2689.2, 2690.4, 2691.6, 2692.8, 2694, 2695.2, 2696.4, 2697.6, 2698.9, 2700.1, 2701.3, 2702.5, 2703.7, 2705, 2706.2, 2707.4, 2708.6, 2709.8, 2711, 2712.2, 2713.4, 2714.6, 2715.9, 2717.1, 2718.3, 2719.5, 2720.7, 2721.9, 2723.1, 2724.3, 2725.5, 2726.7, 2727.9, 2729.1, 2730.4, 2731.6, 2732.8, 2734, 2735.2, 2736.4, 2737.6, 2738.8, 2740.1, 2741.3, 2742.5, 2743.7, 2744.9, 2746.2, 2747.4, 2748.6, 2749.8, 2751.1, 2752.3, 2753.5, 2754.7, 2755.9, 2757.1, 2758.3, 2759.5, 2760.7, 2761.9, 2763.1, 2764.4, 2765.6, 2766.8, 2768, 2769.2, 2770.4, 2771.6, 2772.8, 2774, 2775.3, 2776.5, 2777.7, 2778.9, 2780.1, 2781.3, 2782.5, 2783.7, 2784.9, 2786.1, 2787.3, 2788.5, 2789.7, 2790.9, 2792.2, 2793.4, 2794.6, 2795.8, 2797, 2798.2, 2799.4, 2800.6, 2801.8, 2803, 2804.2, 2805.4, 2806.7, 2807.9, 2809.1, 2810.3, 2811.5, 2812.7, 2813.9, 2815.1, 2816.3, 2817.5, 2818.7, 2819.9, 2821.1, 2822.4, 2823.6, 2824.8, 2826, 2827.2, 2828.4, 2829.6, 2830.8, 2832, 2833.2, 2834.5, 2835.7, 2836.9, 2838.1, 2839.3, 2840.5, 2841.7, 2843, 2844.2, 2845.4, 2846.6, 2847.8, 2849, 2850.2, 2851.5, 2852.7, 2853.9, 2855.1, 2856.3, 2857.5, 2858.7, 2860, 2861.2, 2862.4, 2863.6, 2864.8, 2866, 2867.3, 2868.5, 2869.7, 2870.9, 2872.2, 2873.4, 2874.6, 2875.8, 2877, 2878.2, 2879.4, 2880.7, 2881.9, 2883.1, 2884.3, 2885.5, 2886.7, 2887.9, 2889.2, 2890.4, 2891.6, 2892.8, 2894, 2895.2, 2896.4, 2897.7, 2898.9, 2900.1, 2901.3, 2902.5, 2903.7, 2904.9, 2906.2, 2907.4, 2908.6, 2909.8, 2911, 2912.2, 2913.4, 2914.6, 2915.9, 2917.1, 2918.3, 2919.5, 2920.7, 2921.9, 2923.1, 2924.4, 2925.6, 2926.8, 2928, 2929.2, 2930.5, 2931.7, 2932.9, 2934.1, 2935.3, 2936.5, 2937.7, 2939, 2940.2, 2941.4, 2942.6, 2943.8, 2945.1, 2946.3, 2947.5, 2948.7, 2949.9, 2951.2, 2952.4, 2953.6, 2954.8, 2956, 2957.2, 2958.4, 2959.7, 2960.9, 2962.1, 2963.3, 2964.5, 2965.8, 2967, 2968.2, 2969.4, 2970.6, 2971.8, 2973, 2974.3, 2975.5, 2976.7, 2977.9, 2979.1, 2980.3, 2981.5, 2982.8, 2984, 2985.2, 2986.4, 2987.6, 2988.8, 2990.1, 2991.3, 2992.5, 2993.7, 2994.9, 2996.1, 2997.4, 2998.6, 2999.8, 3001, 3002.2, 3003.5, 3004.7, 3005.9, 3007.1, 3008.3, 3009.5, 3010.8, 3012, 3013.2, 3014.4, 3015.6, 3016.8, 3018.1, 3019.3, 3020.5, 3021.7, 3022.9, 3024.1, 3025.3, 3026.6, 3027.8, 3029, 3030.2, 3031.4, 3032.7, 3033.9, 3035.1, 3036.3, 3037.5, 3038.8, 3040, 3041.2, 3042.4, 3043.6, 3044.8, 3046, 3047.2, 3048.5, 3049.7, 3050.9, 3052.2, 3053.4, 3054.7, 3055.9, 3057.1, 3058.3, 3059.5, 3060.7, 3061.9, 3063.1, 3064.4, 3065.6, 3066.8, 3068, 3069.2, 3070.4, 3071.7, 3072.9, 3074.1, 3075.3, 3076.5, 3077.7, 3079, 3080.2, 3081.4, 3082.6, 3083.9, 3085.1, 3086.3, 3087.5, 3088.7, 3089.9, 3091.2, 3092.4, 3093.6, 3094.8, 3096, 3097.2, 3098.5, 3099.7, 3100.9, 3102.2, 3103.4, 3104.6, 3105.8, 3107.1, 3108.3, 3109.5, 3110.8, 3112, 3113.3, 3114.5, 3115.7, 3116.9, 3118.2, 3119.4, 3120.7, 3122, 3123.2, 3124.5, 3125.7, 3126.9, 3128.2, 3129.4, 3130.6, 3131.9, 3133.1, 3134.4, 3135.6, 3136.9, 3138.1, 3139.4, 3140.6, 3141.9, 3143.1, 3144.4, 3145.6, 3146.9, 3148.1, 3149.4, 3150.6, 3151.8, 3153.1, 3154.3, 3155.6, 3156.8, 3158.1, 3159.3, 3160.6, 3161.8, 3163.1, 3164.3, 3165.6, 3166.8, 3168.1, 3169.3, 3170.6, 3171.8, 3173.1, 3174.3, 3175.5, 3176.8, 3178, 3179.3, 3180.5, 3181.8, 3183, 3184.3, 3185.5, 3186.8, 3188, 3189.2, 3190.5, 3191.7, 3193, 3194.2, 3195.5, 3196.8, 3198, 3199.3, 3200.5, 3201.8, 3203, 3204.3, 3205.5, 3206.8, 3208, 3209.3, 3210.5, 3211.7, 3213, 3214.2, 3215.5, 3216.8, 3218, 3219.3, 3220.5, 3221.8, 3223, 3224.2, 3225.5, 3226.7, 3228, 3229.2, 3230.4, 3231.7, 3232.9, 3234.2, 3235.5, 3236.7, 3238, 3239.2, 3240.5, 3241.7, 3243, 3244.2, 3245.4, 3246.7, 3247.9, 3249.1, 3250.4, 3251.6, 3252.9, 3254.2, 3255.4, 3256.7, 3257.9, 3259.1, 3260.4, 3261.6, 3262.9, 3264.1, 3265.4, 3266.6, 3267.9, 3269.1, 3270.4, 3271.7, 3272.9, 3274.1, 3275.4, 3276.6, 3277.9, 3279.2, 3280.4, 3281.6, 3282.9, 3284.1, 3285.4, 3286.6, 3287.9, 3289.1, 3290.3, 3291.6, 3292.9, 3294.1, 3295.4, 3296.6, 3297.9, 3299.1, 3300.4, 3301.6, 3302.9, 3304.1, 3305.4, 3306.6, 3307.9, 3309.1, 3310.4, 3311.7, 3312.9, 3314.1, 3315.4, 3316.6, 3317.9, 3319.1, 3320.4, 3321.6, 3322.9, 3324.1, 3325.4, 3326.6, 3327.8, 3329.1, 3330.4, 3331.6, 3332.9, 3334.1, 3335.4, 3336.6, 3337.9, 3339.1, 3340.4, 3341.6, 3342.9, 3344.1, 3345.4, 3346.6, 3347.9, 3350.1, 3351.4, 3352.6, 3353.8, 3355, 3356.2, 3357.4, 3358.7, 3359.9, 3361.1, 3362.3, 3363.6, 3364.8, 3366.1, 3367.3, 3368.6, 3369.8, 3371, 3372.3, 3373.5, 3374.7, 3375.9, 3377.2, 3378.4, 3379.6, 3380.8, 3382, 3383.3, 3384.5, 3385.7, 3386.9, 3388.2, 3389.4, 3390.7, 3391.9, 3393.1, 3394.4, 3395.6, 3396.8, 3398.1, 3399.3, 3400.5, 3401.8, 3403, 3404.2, 3405.4, 3406.7, 3408, 3409.2, 3410.4, 3411.7, 3412.9, 3414.1, 3415.4, 3416.6, 3417.8, 3419.1, 3420.3, 3421.5, 3422.8, 3424, 3425.2, 3426.4, 3427.7, 3428.9, 3430.1, 3431.4, 3432.6, 3433.9, 3435.1, 3436.3, 3437.6, 3438.8, 3440, 3441.2, 3442.5, 3443.7, 3445, 3446.2, 3447.4, 3448.6, 3449.8, 3451, 3452.3, 3453.5, 3454.7, 3455.9, 3457.1, 3458.3, 3459.5, 3460.7, 3461.9, 3463.1, 3464.4, 3465.6, 3466.9, 3468.1, 3469.3, 3470.5, 3471.7, 3472.9, 3474.1, 3475.3, 3476.5, 3477.7, 3478.9, 3480.1, 3481.3, 3482.6, 3483.8, 3485, 3486.2, 3487.5, 3488.7, 3489.9, 3491.1, 3492.3, 3493.5, 3494.7, 3496, 3497.2, 3498.4, 3499.6, 3500.8, 3502, 3503.2, 3504.4, 3505.7, 3506.9, 3508.1, 3509.3, 3510.5, 3511.7, 3512.9, 3514.1, 3515.3, 3516.6, 3517.8, 3519, 3520.2, 3521.4, 3522.6, 3523.8, 3525.1, 3526.3, 3527.5, 3528.7, 3529.9, 3531.1, 3532.3, 3533.5, 3534.7, 3536, 3537.2, 3538.4, 3539.6, 3540.8, 3542.1, 3543.3, 3544.6, 3545.9, 3547.1, 3548.4, 3549.6, 3550.8, 3552.1, 3553.3, 3554.5, 3555.7, 3557, 3558.2, 3559.4, 3560.7, 3561.9, 3563.1, 3564.4, 3565.6, 3566.9, 3568.1, 3569.4, 3570.6, 3571.9, 3573.1, 3574.3, 3575.6, 3576.8, 3578, 3579.3, 3580.5, 3581.8, 3583, 3584.2, 3585.5, 3586.7, 3587.9, 3589.2, 3590.4, 3591.6, 3592.9, 3594.1, 3595.3, 3596.6, 3597.8, 3599, 3600.3, 3601.5, 3602.7, 3603.9, 3605.2, 3606.5, 3607.7, 3609, 3610.2, 3611.5, 3612.7, 3613.9, 3615.1, 3616.4, 3617.6, 3618.8, 3620.1, 3621.3, 3622.5, 3623.8, 3625, 3626.3, 3627.6, 3628.8, 3630, 3631.3, 3632.5, 3633.7, 3635, 3636.2, 3637.4, 3638.6, 3639.9, 3641.1, 3642.3, 3643.6, 3644.8, 3646.1, 3647.3, 3648.6, 3649.8, 3651.1, 3652.3, 3653.5, 3654.8, 3656, 3657.3, 3658.5, 3659.7, 3661, 3662.2, 3663.5, 3664.7, 3666, 3667.2, 3668.5, 3669.8, 3671, 3672.2, 3673.5, 3674.7, 3676, 3677.2, 3678.5, 3679.7, 3681, 3682.2, 3683.5, 3684.7, 3686, 3687.2, 3688.5, 3689.7, 3691.1, 3692.3, 3693.6, 3694.8, 3696.1, 3697.3, 3698.6, 3699.8, 3701, 3702.3, 3703.5, 3704.7, 3705.9, 3707.2, 3708.4, 3709.7, 3711.2, 3712.7, 3714, 3715.2, 3716.7, 3718, 3719.2, 3720.4, 3721.7, 3722.9, 3724.1, 3725.4, 3726.6, 3727.9, 3729.1, 3730.4, 3731.6, 3732.9, 3734.1, 3735.4, 3736.6, 3737.9, 3739.1, 3740.3, 3741.6, 3742.8, 3744.1, 3745.3, 3746.6, 3747.8, 3749.6, 3751.3, 3752.6, 3753.9, 3755.3, 3756.5, 3757.7, 3759, 3760.4, 3761.6, 3762.9, 3764.1, 3765.3, 3766.7, 3768, 3769.2, 3770.5, 3771.8, 3773, 3774.2, 3775.5, 3776.9, 3778.3, 3780, 3781.4, 3782.9, 3784.1, 3785.6, 3786.9, 3788.4, 3789.7, 3791, 3792.4, 3793.7, 3795.1, 3796.6, 3797.8, 3799.1, 3800.3, 3801.6, 3803, 3804.3, 3805.7, 3807.1, 3808.4, 3809.7, 3811, 3812.3, 3813.7, 3815, 3816.4, 3817.7, 3819.1, 3820.5, 3821.8, 3823.3, 3824.7, 3826, 3827.5, 3828.8, 3830, 3831.3, 3832.5, 3833.8, 3835, 3836.3, 3837.5, 3838.8, 3840, 3841.3, 3842.5, 3843.8, 3845, 3846.2, 3847.5, 3848.8, 3850, 3851.3, 3852.5, 3853.8, 3855, 3856.2, 3857.5, 3858.7, 3860, 3861.2, 3862.5, 3863.7, 3865, 3866.3, 3867.5, 3868.7, 3870, 3871.4, 3872.7, 3873.9, 3875.2, 3876.4, 3877.7, 3879, 3880.2, 3881.5, 3882.8, 3884.1, 3885.3, 3886.5, 3887.7, 3888.9, 3890.2, 3891.4, 3892.7, 3894, 3895.3, 3896.5, 3897.8, 3899, 3900.3, 3901.6, 3902.8, 3904.2, 3905.4, 3906.7, 3908, 3909.3, 3910.6, 3911.9, 3913.2, 3914.5, 3915.8, 3917, 3918.3, 3919.6, 3920.9, 3922.2, 3923.4, 3924.7, 3925.9, 3927.2, 3928.5, 3929.7, 3931, 3932.3, 3933.5, 3934.8, 3936, 3937.3, 3938.6, 3939.8, 3941.1, 3942.3, 3943.6, 3944.8, 3946.1, 3947.3, 3948.6, 3949.8, 3951.1, 3952.3, 3953.6, 3954.8, 3956.1, 3957.3, 3958.6, 3959.8, 3961.2, 3962.4, 3963.7, 3965, 3966.2, 3967.5, 3968.7, 3970, 3971.2, 3972.5, 3973.7, 3975, 3976.4, 3977.6, 3978.9, 3980.1, 3981.4, 3982.7, 3984, 3985.2, 3986.5, 3987.8, 3989, 3990.3, 3991.5, 3992.8, 3994, 3995.3, 3996.5, 3997.8, 3999, 4000.3, 4001.6, 4002.8, 4004.1, 4005.4, 4006.7, 4008, 4009.3, 4010.6, 4011.9, 4013.1, 4014.4, 4015.6, 4016.9, 4018.1, 4019.4, 4021.5, 4023, 4024.3, 4025.6, 4026.9, 4028.1, 4029.5, 4030.8, 4032.1, 4033.4, 4034.6, 4035.9, 4037.2, 4038.4, 4039.7, 4040.9, 4042.2, 4043.4, 4044.7, 4046, 4047.2, 4048.5, 4049.7, 4051, 4052.3, 4053.5, 4054.7, 4056, 4057.2, 4058.5, 4059.8, 4061, 4062.3, 4063.6, 4064.9, 4066.1, 4067.4, 4068.7, 4069.9, 4071.2, 4072.4, 4073.8, 4075, 4076.3, 4077.6, 4078.8, 4080.1, 4081.3, 4082.6, 4083.8, 4085.1, 4086.4, 4087.6, 4088.8, 4090.1, 4091.4, 4092.7, 4094, 4095.2, 4096.5, 4097.7, 4099.1, 4100.4, 4101.7, 4103.1, 4104.4, 4105.7, 4107, 4108.2, 4109.5, 4110.8, 4112, 4113.3, 4114.5, 4115.8, 4117.1, 4118.3, 4119.6, 4120.8, 4122.2, 4123.4, 4124.7, 4126, 4127.2, 4128.4, 4129.7, 4131, 4132.2, 4133.5, 4134.7, 4136, 4137.3, 4138.5, 4139.8, 4141.1, 4142.3, 4143.6, 4144.9, 4146.2, 4147.5, 4148.7, 4150, 4151.2, 4152.5, 4153.8, 4155, 4156.3, 4157.5, 4158.8, 4160, 4161.3, 4162.6, 4163.8, 4165.1, 4166.3, 4167.6, 4168.9, 4170.2, 4171.4, 4172.7, 4174, 4175.3, 4176.5, 4177.8, 4179, 4180.3, 4181.5, 4182.8, 4184, 4185.3, 4186.5, 4187.8, 4189.1, 4190.3, 4191.6, 4192.9, 4194.1, 4195.4, 4196.6, 4197.9, 4199.1, 4200.4, 4201.7, 4202.9, 4204.2, 4205.5, 4206.7, 4208, 4209.3, 4210.5, 4211.8, 4213, 4214.3, 4215.6, 4216.9, 4218.1, 4219.4, 4220.7, 4221.9, 4223.2, 4224.6, 4225.9, 4227.1, 4228.4, 4229.7, 4230.9, 4232.2, 4233.5, 4234.8, 4236.1, 4237.5, 4238.8, 4240.2, 4241.4, 4242.7, 4244, 4245.2, 4246.6, 4247.9, 4249.2, 4250.6, 4251.9, 4253.2, 4254.5, 4255.8, 4257, 4258.3, 4259.6, 4261, 4262.2, 4263.5, 4264.9, 4266.2, 4267.4, 4268.7, 4270, 4271.2, 4272.5, 4273.7, 4275, 4276.3, 4277.6, 4278.8, 4280.1, 4281.4, 4282.7, 4284, 4285.2, 4286.6, 4287.9, 4289.2, 4290.5, 4291.8, 4293.1, 4294.3, 4295.6, 4296.9, 4298.1, 4299.4, 4300.7, 4302, 4303.2, 4304.5, 4305.8, 4307, 4308.3, 4309.6, 4310.8, 4312.1, 4313.4, 4314.7, 4316, 4317.2, 4318.5, 4319.7, 4321, 4322.3, 4323.6, 4324.8, 4326.1, 4327.3, 4328.7, 4330, 4331.3, 4332.7, 4334, 4335.3, 4336.5, 4337.8, 4339.1, 4340.4, 4341.7, 4343, 4344.2, 4345.5, 4346.9, 4348.2, 4349.4, 4350.7, 4352.1, 4353.4, 4354.7, 4355.9, 4357.2, 4358.5, 4359.8, 4361.1, 4362.4, 4363.7, 4364.9, 4366.2, 4367.5, 4368.8, 4370, 4371.4, 4372.6, 4373.9, 4375.2, 4376.4, 4377.8, 4379, 4380.3, 4381.5, 4382.8, 4384.1, 4385.4, 4386.8, 4388.1, 4389.4, 4390.7, 4392, 4393.3, 4394.6, 4395.8, 4397.1, 4398.4, 4399.7, 4401.1, 4402.3, 4403.6, 4404.9, 4406.3, 4407.6, 4408.9, 4410.3, 4411.6, 4412.8, 4414.2, 4415.4, 4416.7, 4418, 4419.3, 4420.7, 4422, 4423.3, 4424.6, 4425.9, 4427.3, 4428.7, 4430, 4431.3, 4432.7, 4434, 4435.4, 4436.8, 4438.1, 4439.5, 4440.8, 4442.2, 4443.5, 4444.9, 4446.1, 4447.4, 4448.7, 4450, 4451.4, 4452.7, 4453.9, 4455.3, 4456.6, 4457.9, 4459.2, 4460.5, 4461.9, 4463.2, 4464.6, 4466, 4467.3, 4468.7, 4470, 4471.3, 4472.7, 4474.1, 4475.4, 4476.7, 4478.1, 4479.4, 4480.8, 4482.2, 4483.5, 4484.9, 4486.3, 4487.6, 4488.9, 4490.3, 4491.8, 4493.1, 4494.4, 4495.7, 4497, 4498.3, 4499.6, 4501, 4502.3, 4503.7, 4505, 4506.3, 4507.6, 4508.9, 4510.2, 4511.5, 4512.8, 4514.1, 4515.4, 4516.8, 4518.1, 4519.5, 4520.8, 4522.2, 4523.4, 4524.8, 4526.1, 4527.5, 4528.8, 4530.1, 4531.4, 4532.8, 4534, 4535.3, 4536.7, 4538.1, 4539.4, 4540.7, 4542, 4543.4, 4544.7, 4546.1, 4547.4, 4548.7, 4550.1, 4551.4, 4552.8, 4554.1, 4555.4, 4556.8, 4558.1, 4559.4, 4560.7, 4562, 4563.3, 4564.6, 4566, 4567.3, 4568.7, 4570.1, 4571.4, 4572.7, 4574, 4575.5, 4576.9, 4578.3, 4579.6, 4581, 4582.3, 4583.7, 4585.1, 4586.4, 4587.7, 4589, 4590.3, 4591.7, 4593, 4594.3, 4595.7, 4597, 4598.3, 4599.6, 4601, 4602.3, 4603.6, 4604.9, 4606.3, 4607.7, 4609, 4610.4, 4611.8, 4613.1, 4614.5, 4616, 4617.3, 4618.6, 4619.9, 4621.2, 4622.5, 4623.9, 4625.3, 4626.7, 4628, 4629.4, 4630.8, 4632.2, 4633.5, 4634.8, 4636.2, 4637.5, 4638.8, 4640.2, 4641.5, 4642.9, 4644.2, 4645.6, 4646.9, 4648.3, 4649.6, 4650.9, 4652.2, 4653.6, 4654.9, 4656.3, 4657.7, 4659.1, 4660.5, 4661.9, 4663.3, 4664.6, 4665.9, 4667.3, 4668.7, 4670.1, 4671.4, 4672.7, 4674.1, 4675.5, 4676.9, 4678.2, 4679.6, 4681, 4682.4, 4683.7, 4685.1, 4686.4, 4687.8, 4689.1, 4690.4, 4691.8, 4693.2, 4694.5, 4695.9, 4697.3, 4698.8, 4700.1, 4701.5, 4702.9, 4704.2, 4705.5, 4706.9, 4708.3, 4709.7, 4711, 4712.4, 4713.8, 4715.2, 4716.6, 4717.9, 4719.3, 4720.6, 4722, 4723.3, 4724.6, 4726, 4727.5, 4728.8, 4730.2, 4731.5, 4732.9, 4734.3, 4735.7, 4737.1, 4738.5, 4739.8, 4741.2, 4742.5, 4743.9, 4745.3, 4746.6, 4747.9, 4749.3, 4750.6, 4752, 4753.4, 4754.8, 4756.2, 4757.5, 4758.9, 4760.3, 4761.6, 4762.9, 4764.3, 4765.6, 4767, 4768.3, 4769.6, 4771, 4772.4, 4773.7, 4775, 4776.4, 4777.8, 4779.2, 4780.6, 4782, 4783.4, 4784.8, 4786.2, 4787.5, 4788.9, 4790.3, 4791.7, 4793, 4794.4, 4795.7, 4797.1, 4798.4, 4799.8, 4801.3, 4802.6, 4804, 4805.4, 4806.8, 4808.2, 4809.6, 4811, 4812.4, 4813.8, 4815.2, 4816.6, 4818, 4819.4, 4820.8, 4822.2, 4823.6, 4824.9, 4826.4, 4827.7, 4829.1, 4830.5, 4831.9, 4833.3, 4834.7, 4836.1, 4837.5, 4838.9, 4840.2, 4841.6, 4843, 4844.4, 4845.8, 4847.2, 4848.6, 4850, 4851.4, 4852.8, 4854.2, 4855.6, 4856.9, 4858.3, 4859.7, 4861.1, 4862.5, 4863.9, 4865.3, 4866.7, 4868.1, 4869.5, 4870.9, 4872.3, 4873.7, 4875.1, 4876.5, 4877.8, 4879.2, 4880.6, 4882, 4883.3, 4884.6, 4886, 4887.4, 4888.8, 4890.1, 4891.6, 4893, 4894.4, 4895.7, 4897.1, 4898.6, 4900, 4901.4, 4902.8, 4904.2, 4905.6, 4907, 4908.4, 4909.8, 4911.2, 4912.6, 4914, 4915.3, 4916.7, 4918.1, 4919.5, 4920.9, 4922.3, 4923.7, 4925.1, 4926.5, 4927.9, 4929.3, 4930.7, 4932.1, 4933.5, 4934.9, 4936.3, 4937.7, 4939.1, 4940.5, 4941.9, 4943.3, 4944.7, 4946.1, 4947.5, 4948.9, 4950.3, 4951.7, 4953.1, 4954.5, 4955.9, 4957.3, 4958.7, 4960.1, 4961.5, 4962.9, 4964.3, 4965.7, 4967.1, 4968.4, 4969.8, 4971.2, 4972.6, 4974, 4975.4, 4976.8, 4978.2, 4979.6, 4981, 4982.4, 4983.8, 4985.2, 4986.6, 4988, 4989.4, 4990.9, 4992.3, 4993.7, 4995.1, 4996.5, 4997.9, 4999.3, 5000.9, 5002.4, 5003.8, 5005.2, 5006.6, 5008, 5009.4, 5010.8, 5012.2, 5013.6, 5015, 5016.4, 5017.8, 5019.2, 5020.6, 5022.1, 5023.5, 5025, 5026.5, 5028, 5029.4, 5030.9, 5032.3, 5033.7, 5035.1, 5036.5, 5037.9, 5039.3, 5040.7, 5042.1, 5043.5, 5044.9, 5046.3, 5047.7, 5049.1, 5050.5, 5051.9, 5053.4, 5054.8, 5056.2, 5057.6, 5059, 5060.4, 5061.8, 5063.2, 5064.6, 5066, 5067.4, 5068.8, 5070.2, 5071.6, 5073, 5074.4, 5075.8, 5077.2, 5078.6, 5080, 5081.4, 5082.8, 5084.2, 5085.6, 5087, 5088.4, 5089.8, 5091.3, 5092.7, 5094.1, 5095.5, 5096.9, 5098.3, 5099.7, 5101.1, 5102.5, 5103.9, 5105.3, 5106.7, 5108.1, 5109.5, 5110.9, 5112.3, 5113.7, 5115.1, 5116.5, 5117.9, 5119.3, 5120.7, 5122.1, 5123.5, 5124.9, 5126.3, 5127.7, 5129.1, 5130.6, 5131.9, 5133.4, 5134.8, 5136.2, 5137.6, 5139, 5140.4, 5141.8, 5143.2, 5144.6, 5146, 5147.4, 5148.8, 5150.3, 5151.6, 5153.1, 5154.5, 5155.9, 5157.3, 5158.7, 5160.1, 5161.5, 5162.9, 5164.3, 5165.7, 5167.1, 5168.5, 5169.9, 5171.3, 5172.7, 5174.1, 5175.5, 5177, 5178.4, 5179.8, 5181.2, 5182.6, 5184, 5185.4, 5186.8, 5188.2, 5189.6, 5191, 5192.4, 5193.8, 5195.2, 5196.6, 5198, 5199.4, 5200.8, 5202.2, 5203.6, 5205, 5206.4, 5207.9, 5209.3, 5210.7, 5212.1, 5213.5, 5214.9, 5216.3, 5217.7, 5219.1, 5220.5, 5221.9, 5223.3, 5224.7, 5226.1, 5227.5, 5228.9, 5230.3, 5231.7, 5233.1, 5234.5, 5235.9, 5237.4, 5238.9, 5240.3, 5241.7, 5243.1, 5244.5, 5246, 5247.6, 5249, 5250.4, 5251.8, 5253.2, 5254.6, 5256, 5257.4, 5259, 5260.4, 5261.9, 5263.3, 5264.7, 5266.2, 5267.6, 5269, 5270.4, 5271.8, 5273.2, 5274.6, 5276.1, 5277.5, 5278.9, 5280.3, 5281.7, 5283.1, 5284.5, 5285.9, 5287.3, 5288.8, 5290.2, 5291.6, 5293, 5294.4, 5295.9, 5297.3, 5298.7, 5300.1, 5301.5, 5303, 5304.5, 5305.9, 5307.3, 5308.7, 5310.1, 5311.5, 5312.9, 5314.3, 5315.7, 5317.1, 5318.5, 5319.9, 5321.3, 5322.7, 5324.1, 5325.5, 5326.9, 5328.3, 5329.7, 5331.1, 5332.5, 5333.9, 5335.4, 5336.8, 5338.2, 5339.6, 5341, 5342.4, 5343.8, 5345.2, 5346.6, 5348, 5349.4, 5350.8, 5352.2, 5353.6, 5355, 5356.4, 5357.8, 5359.2, 5360.6, 5362, 5363.4, 5364.8, 5366.3, 5367.7, 5369.1, 5370.5, 5371.9, 5373.3, 5374.7, 5376.1, 5377.5, 5378.9, 5380.3, 5381.7, 5383.1, 5384.5, 5386, 5387.3, 5388.7, 5390.2, 5391.6, 5393, 5394.3, 5395.8, 5397.2, 5398.6, 5400, 5401.4, 5402.8, 5404.2, 5405.6, 5407, 5408.4, 5409.9, 5411.2, 5412.7, 5414.1, 5415.5, 5416.9, 5418.3, 5419.7, 5421.1, 5422.5, 5423.9, 5425.3, 5426.7, 5428.1, 5429.5, 5431, 5432.3, 5433.7, 5435.1, 5436.6, 5438, 5439.4, 5440.8, 5442.2, 5443.6, 5445, 5446.4, 5447.8, 5449.2, 5450.6, 5452, 5453.4, 5454.8, 5456.2, 5457.6, 5459, 5460.4, 5461.8, 5463.3, 5464.7, 5466.1, 5467.5, 5468.9, 5470.3, 5471.7, 5473.1, 5474.5, 5475.9, 5477.3, 5478.7, 5480.1, 5481.5, 5482.9, 5484.3, 5485.7, 5487.1, 5488.5, 5489.9, 5491.3, 5492.7, 5494.1, 5495.6, 5497, 5498.4, 5499.8, 5501.2, 5502.6, 5504, 5505.4, 5506.8, 5508.2, 5509.6, 5511, 5512.4, 5513.8, 5515.2, 5516.6, 5518, 5519.4, 5520.8, 5522.2, 5523.6, 5525, 5526.4, 5527.8, 5529.4, 5530.8, 5532.2, 5533.6, 5535.1, 5536.5, 5537.9, 5539.3, 5540.7, 5542.2, 5543.6, 5545, 5546.4, 5547.8, 5549.3, 5550.7, 5552.1, 5553.5, 5555.1, 5556.5, 5558, 5559.4, 5560.8, 5562.3, 5563.8, 5565.2, 5566.6, 5568, 5569.4, 5570.8, 5572.2, 5573.6, 5575, 5576.4, 5577.8, 5579.3, 5580.7, 5582.1, 5583.5, 5584.9, 5586.3, 5587.7, 5589.1, 5590.5, 5591.9, 5593.3, 5594.7, 5596.2, 5597.6, 5599, 5600.4, 5601.8, 5603.2, 5604.6, 5606, 5607.4, 5608.8, 5610.2, 5611.6, 5613, 5614.4, 5615.8, 5617.2, 5618.6, 5620, 5621.4, 5622.8, 5624.2, 5625.6, 5627, 5628.5, 5629.9, 5631.3, 5632.7, 5634.1, 5635.5, 5636.9, 5638.3, 5639.7, 5641.1, 5642.5, 5643.9, 5645.3, 5646.7, 5648.1, 5649.5, 5650.9, 5652.3, 5653.7, 5655.2, 5656.6, 5658, 5659.4, 5660.8, 5662.2, 5663.6, 5665, 5666.4, 5667.8, 5669.2, 5670.6, 5672, 5673.4, 5674.8, 5676.2, 5677.6, 5679, 5680.4, 5681.8, 5683.2, 5684.6, 5686, 5687.4, 5688.8, 5690.2, 5691.6, 5693, 5694.5, 5695.9, 5697.3, 5698.7, 5700.1, 5701.5, 5702.9, 5704.3, 5705.7, 5707.1, 5708.5, 5709.9, 5711.3, 5712.7, 5714.1, 5715.5, 5716.9, 5718.3, 5719.7, 5721.1, 5722.5, 5723.9, 5725.3, 5726.7, 5728.1, 5729.5, 5730.9, 5732.3, 5733.7, 5735.2, 5736.5, 5738, 5739.4, 5740.8, 5742.2, 5743.6, 5745, 5746.4, 5747.8, 5749.2, 5750.6, 5752, 5753.4, 5754.8, 5756.2, 5757.6, 5759, 5760.4, 5761.8, 5763.2, 5764.6, 5766, 5767.4, 5768.8, 5770.2, 5771.6, 5773, 5774.4, 5775.8, 5777.3, 5778.7, 5780.1, 5781.5, 5782.9, 5784.3, 5785.7, 5787.1, 5788.5, 5789.9, 5791.3, 5792.7, 5794.1, 5795.5, 5796.9, 5798.4, 5799.8, 5801.2, 5802.6, 5804, 5805.4, 5806.8, 5808.2, 5809.6, 5811, 5812.4, 5813.8, 5815.2, 5816.6, 5818, 5819.4, 5820.8, 5822.2, 5823.6, 5825, 5826.4, 5827.8, 5829.2, 5830.6, 5832.1, 5833.5, 5834.9, 5836.3, 5837.8, 5839.2, 5840.6, 5842, 5843.4, 5844.8, 5846.2, 5847.6, 5849, 5850.4, 5851.8, 5853.2, 5854.6, 5856, 5857.4, 5858.8, 5860.2, 5861.6, 5863, 5864.4, 5865.8, 5867.3, 5868.7, 5870.1, 5871.5, 5872.9, 5874.3, 5875.8, 5877.2, 5878.6, 5880, 5881.4, 5882.8, 5884.2, 5885.6, 5887, 5888.4, 5889.8, 5891.2, 5892.6, 5894.1, 5895.5, 5896.9, 5898.3, 5899.7, 5901.1, 5902.5, 5903.9, 5905.3, 5906.7, 5908.1, 5909.6, 5911, 5912.4, 5913.8, 5915.2, 5916.6, 5918, 5919.4, 5920.8, 5922.3, 5923.7, 5925.1, 5926.5, 5928, 5929.4, 5930.8, 5932.3, 5933.7, 5935.1, 5936.6, 5938, 5939.4, 5940.8, 5942.2, 5943.7, 5945.1, 5946.5, 5947.9, 5949.4, 5950.8, 5952.2, 5953.7, 5955.1, 5956.5, 5957.9, 5959.4, 5960.8, 5962.2, 5963.7, 5965.1, 5966.5, 5967.9, 5969.4, 5970.8, 5972.3, 5973.7, 5975.2, 5976.6, 5978, 5979.4, 5980.8, 5982.2, 5983.7, 5985.1, 5986.5, 5987.9, 5989.4, 5990.8, 5992.2, 5993.6, 5995, 5996.4, 5997.8, 5999.3, 6000.7, 6002.1, 6003.5, 6005, 6006.4, 6007.9, 6009.3, 6010.8, 6012.2, 6013.6, 6015.1, 6016.5, 6017.9, 6019.4, 6020.8, 6022.2, 6023.6, 6025.1, 6026.5, 6028, 6029.4, 6030.8, 6032.2, 6033.7, 6035.1, 6036.5, 6037.9, 6039.4, 6040.8, 6042.2, 6043.6, 6045.1, 6046.5, 6047.9, 6049.4, 6050.8, 6052.3, 6053.7, 6055.1, 6056.5, 6057.9, 6059.4, 6060.8, 6062.2, 6063.7, 6065.1, 6066.5, 6068, 6069.4, 6070.8, 6072.3, 6073.7, 6075.2, 6076.6, 6078, 6079.4, 6081, 6082.4, 6083.8, 6085.2, 6086.6, 6088, 6089.5, 6090.9, 6092.3, 6093.7, 6095.1, 6096.6, 6098, 6099.4, 6100.8, 6102.2, 6103.6, 6105.1, 6106.5, 6107.9, 6109.3, 6110.7, 6112.2, 6113.6, 6115, 6116.5, 6117.9, 6119.3, 6120.7, 6122.2, 6123.6, 6125, 6126.4, 6127.8, 6129.2, 6130.6, 6132, 6133.5, 6134.9, 6136.3, 6137.7, 6139.2, 6140.6, 6142, 6143.4, 6144.9, 6146.3, 6147.7, 6149.1, 6150.5, 6152, 6153.5], datasets: [{ label: 'JSHeapUsedSize', backgroundColor: 'rgba(163, 104, 70, 0.2)', borderColor: 'rgba(163, 104, 70, 1.00)', - data: [5.3194427490234375, 6.03155517578125, 5.985557556152344, 6.4153289794921875, 5.796791076660156, 6.239433288574219, 6.671974182128906, 6.0579833984375, 6.404762268066406, 6.7397918701171875, 6.041435241699219, 6.315025329589844, 4.508964538574219, 4.4370880126953125, 4.7804718017578125, 5.0569915771484375, 5.3494720458984375, 4.672340393066406, 4.985466003417969, 5.2745513916015625, 5.53814697265625, 4.9271087646484375, 5.1971893310546875, 5.4645843505859375, 4.841468811035156, 5.109764099121094, 5.3697357177734375, 5.626617431640625, 4.9893798828125, 5.25299072265625, 5.529792785644531, 5.773414611816406, 5.109161376953125, 5.3402252197265625, 5.575325012207031, 5.8134765625, 6.044158935546875, 5.3932952880859375, 5.6724395751953125, 5.908287048339844, 6.143058776855469, 5.5333709716796875, 5.774436950683594, 6.010490417480469, 6.24365234375, 5.625343322753906, 5.8661651611328125, 5.6792449951171875, 5.911216735839844, 6.144889831542969] + data: [6.185760498046875, 7.208213806152344, 7.374061584472656, 7.402748107910156, 7.4915008544921875, 7.567024230957031, 7.7178802490234375, 7.729576110839844, 4.838645935058594, 5.809318542480469, 5.478729248046875, 5.613563537597656, 5.7528839111328125, 5.8581390380859375, 5.960182189941406, 5.656318664550781, 6.561897277832031, 6.537101745605469, 6.581230163574219, 6.5355377197265625, 6.510459899902344, 6.488555908203125, 6.6072540283203125, 7.469352722167969, 5.695106506347656, 6.612953186035156, 6.4061279296875, 6.3765411376953125, 6.5056610107421875, 6.3886566162109375, 7.275543212890625, 7.2922515869140625, 7.413093566894531, 7.5175018310546875, 7.673622131347656, 7.335166931152344, 7.332374572753906, 7.3333282470703125, 8.23858642578125, 7.031150817871094, 7.383308410644531, 7.376457214355469, 7.374656677246094, 7.4694061279296875, 8.397247314453125, 9.329521179199219, 7.766288757324219, 8.707481384277344, 9.62066650390625, 8.894248962402344, 9.828437805175781, 8.357017517089844, 9.288177490234375, 10.224395751953125, 8.644088745117188, 9.610267639160156, 8.8692626953125, 9.841316223144531, 10.784858703613281, 10.01776123046875, 10.976005554199219, 9.849563598632812, 10.806465148925781, 11.7628173828125, 12.726593017578125, 13.695465087890625, 14.661567687988281, 10.654075622558594, 11.635551452636719, 12.614097595214844, 13.611320495605469, 14.594398498535156, 11.389472961425781, 10.749122619628906, 11.597099304199219, 12.4503173828125, 13.299644470214844, 14.153839111328125, 15.111984252929688, 15.967201232910156, 16.820877075195312, 12.057853698730469, 12.201675415039062, 12.174758911132812, 11.7381591796875, 12.628028869628906, 12.588699340820312, 12.591827392578125, 12.587158203125, 12.581695556640625, 12.559295654296875, 12.549781799316406, 12.995025634765625, 12.957466125488281, 12.936691284179688, 11.064338684082031, 11.253021240234375, 12.10479736328125, 12.098289489746094, 12.088768005371094, 12.096954345703125, 12.072174072265625, 12.0291748046875, 11.984298706054688, 11.934417724609375, 12.346061706542969, 12.288612365722656, 12.244483947753906, 12.2108154296875, 11.456779479980469, 11.388923645019531, 12.265838623046875, 12.221542358398438, 12.205215454101562, 12.164573669433594, 12.128829956054688, 12.096908569335938, 12.499801635742188, 12.455245971679688, 12.424903869628906, 12.389381408691406, 12.357559204101562, 12.346832275390625, 11.954444885253906, 12.28631591796875, 12.234764099121094, 12.334358215332031, 12.298851013183594, 12.259521484375, 12.224609375, 12.186241149902344, 12.165321350097656, 13.038230895996094, 12.580909729003906, 12.555618286132812, 12.553047180175781, 12.55419921875, 12.447410583496094, 12.464645385742188, 12.459457397460938, 12.464942932128906, 12.4605712890625, 12.459556579589844, 12.480674743652344, 12.490753173828125, 12.936065673828125, 12.922218322753906, 12.919914245605469, 12.926811218261719, 12.944938659667969, 12.051666259765625, 12.018409729003906, 12.910408020019531, 12.95538330078125, 12.984245300292969, 12.52374267578125, 12.49920654296875, 12.510551452636719, 13.401199340820312, 13.409942626953125, 13.43048095703125, 13.44146728515625, 13.469154357910156, 13.014762878417969, 12.845916748046875, 12.989608764648438, 13.001319885253906, 13.022979736328125, 13.04998779296875, 13.075416564941406, 13.099388122558594, 13.142646789550781, 14.049026489257812, 13.6192626953125, 13.675704956054688, 13.693733215332031, 13.721221923828125, 13.776679992675781, 12.56610107421875, 12.580543518066406, 12.613250732421875, 12.64801025390625, 13.555007934570312, 13.376152038574219, 13.422836303710938, 13.447113037109375, 13.486808776855469, 13.529541015625, 13.566764831542969, 13.608985900878906, 14.063873291015625, 12.795585632324219, 13.153190612792969, 13.179618835449219, 13.226226806640625, 13.263458251953125, 13.306686401367188, 13.345626831054688, 13.373725891113281, 13.627525329589844, 14.158050537109375, 14.140708923339844, 14.151023864746094, 13.425765991210938, 13.231903076171875, 13.217391967773438, 13.232398986816406, 13.170242309570312, 13.174346923828125, 14.116531372070312, 14.096595764160156, 14.128921508789062, 14.144668579101562, 14.160804748535156, 14.179931640625, 14.189590454101562, 14.212211608886719, 14.218452453613281, 13.298263549804688, 13.315223693847656, 13.342987060546875, 13.371238708496094, 13.396659851074219, 13.878341674804688, 13.888847351074219, 13.910850524902344, 13.9371337890625, 13.964920043945312, 13.99798583984375, 14.056320190429688, 14.079025268554688, 14.097846984863281, 13.418998718261719, 13.417190551757812, 13.9249267578125, 13.98260498046875, 14.020545959472656, 14.054939270019531, 14.097488403320312, 14.133102416992188, 14.173301696777344, 14.210861206054688, 14.253067016601562, 14.290702819824219, 14.331451416015625, 14.777900695800781, 14.803749084472656, 14.370689392089844, 14.417060852050781, 14.442924499511719, 14.481643676757812, 14.053688049316406, 14.076515197753906, 14.117324829101562, 14.164909362792969, 14.206985473632812, 14.244422912597656, 14.278915405273438, 14.33135986328125, 14.377067565917969, 13.630607604980469, 14.604667663574219, 14.419937133789062, 14.490509033203125, 14.5399169921875, 14.590095520019531, 14.636024475097656, 14.686553955078125, 14.737113952636719, 14.328872680664062, 14.403907775878906, 14.481681823730469, 14.534576416015625, 14.587043762207031, 13.919013977050781, 14.897422790527344, 14.769561767578125, 14.830276489257812, 14.880027770996094, 14.935317993164062, 14.992378234863281, 15.056365966796875, 15.114425659179688, 15.161048889160156, 15.228462219238281, 15.279304504394531, 14.884979248046875, 14.955734252929688, 14.071563720703125, 14.307929992675781, 14.367965698242188, 14.335678100585938, 14.393196105957031, 14.455230712890625, 14.431640625, 14.48883056640625, 14.482170104980469, 14.567832946777344, 15.566726684570312, 15.509590148925781, 15.592369079589844, 15.6839599609375, 14.830169677734375, 14.910713195800781, 14.981002807617188, 15.042884826660156, 15.126091003417969, 15.517509460449219, 15.596343994140625, 15.676902770996094, 15.751235961914062, 15.549400329589844, 15.599922180175781, 15.63848876953125, 15.645126342773438, 14.578605651855469, 15.024696350097656, 15.071868896484375, 15.163192749023438, 15.1221923828125, 15.193931579589844, 15.239540100097656, 15.300933837890625, 15.270088195800781, 15.337982177734375, 15.401626586914062, 15.493888854980469, 15.539253234863281, 15.579460144042969, 14.740547180175781, 15.012718200683594, 15.093429565429688, 15.153877258300781, 15.206779479980469, 15.295921325683594, 15.336036682128906, 16.358863830566406, 14.952537536621094, 14.999473571777344, 15.088630676269531, 15.188446044921875, 15.297149658203125, 15.409416198730469, 15.517875671386719, 15.623085021972656, 15.721626281738281, 15.833724975585938, 15.941184997558594, 16.053909301757812, 15.675086975097656, 15.40728759765625, 15.256752014160156, 15.364234924316406, 15.430282592773438, 15.498069763183594, 15.570938110351562, 15.641838073730469, 15.712722778320312, 15.76129150390625, 15.810447692871094, 15.858444213867188, 15.925064086914062, 16.065032958984375, 16.121810913085938, 15.596931457519531, 15.700164794921875, 15.756187438964844, 15.812095642089844, 15.9462890625, 16.0030517578125, 16.06542205810547, 16.108322143554688, 16.262451171875, 16.32392120361328, 17.3662109375, 16.142868041992188, 17.188980102539062, 16.06554412841797, 17.119857788085938, 18.17426300048828, 16.35302734375, 17.404617309570312, 16.448638916015625, 17.500877380371094, 18.548004150390625, 16.734909057617188, 17.790977478027344, 18.847763061523438, 17.001991271972656, 16.38835906982422, 17.43816375732422, 18.503952026367188, 16.71532440185547, 17.791221618652344, 15.955520629882812, 17.031944274902344, 18.093795776367188, 16.211631774902344, 17.283775329589844, 18.353622436523438, 16.57195281982422, 17.642539978027344, 18.70342254638672, 16.169967651367188, 17.23773193359375, 18.30365753173828, 16.46949005126953, 17.539627075195312, 18.607818603515625, 16.804710388183594, 17.879989624023438, 18.964340209960938, 17.15540313720703, 18.226531982421875, 19.309967041015625, 17.43268585205078, 18.51020050048828, 16.010025024414062, 17.088027954101562, 18.18321990966797, 16.3839111328125, 17.45752716064453, 18.53337860107422, 16.733352661132812, 17.821426391601562, 18.90160369873047, 17.083999633789062, 18.1751708984375, 19.255821228027344, 17.462242126464844, 18.55042266845703, 16.34601593017578, 17.427047729492188, 16.307395935058594, 17.412635803222656, 18.496131896972656, 16.720481872558594, 17.809608459472656, 18.90367889404297, 16.671737670898438, 17.762771606445312, 18.862655639648438, 19.962921142578125, 21.069496154785156, 22.16547393798828, 17.54944610595703, 18.65160369873047, 19.750709533691406, 20.858352661132812, 21.95502471923828, 17.22063446044922, 18.33167266845703, 19.4342041015625, 20.533935546875, 17.540611267089844, 18.648895263671875, 19.75457000732422, 20.86646270751953, 21.982025146484375, 17.81757354736328, 18.93164825439453, 20.041954040527344, 21.161468505859375, 22.279190063476562, 17.586578369140625, 18.70380401611328, 19.818641662597656, 20.940261840820312, 17.36425018310547, 18.486480712890625, 20.07294464111328, 21.19330596923828, 22.319480895996094, 17.74835968017578, 18.870094299316406, 19.988906860351562, 21.107444763183594, 22.24829864501953, 23.36669158935547, 18.640342712402344, 19.77313995361328, 20.89868927001953, 17.892623901367188, 19.01903533935547, 20.15599822998047, 21.272552490234375, 22.404258728027344, 18.00279998779297, 19.121627807617188, 20.2564697265625, 21.38604736328125, 22.50531768798828, 17.782737731933594, 18.92107391357422, 20.055130004882812, 21.182861328125, 17.732101440429688, 18.875518798828125, 20.0147705078125, 21.15569305419922, 22.297218322753906, 17.64563751220703, 18.787109375, 19.933876037597656, 21.072242736816406, 22.214088439941406, 23.361351013183594, 18.66363525390625, 19.803428649902344, 20.945693969726562, 22.090492248535156, 18.51897430419922, 19.673179626464844, 20.828262329101562, 21.97491455078125, 23.1265869140625, 18.652175903320312, 19.814308166503906, 20.9639892578125, 22.146636962890625, 23.313392639160156, 18.612266540527344, 20.800437927246094, 22.854515075683594, 24.015594482421875, 18.624732971191406, 19.785125732421875, 20.95458221435547, 22.123985290527344, 23.285125732421875, 18.73412322998047, 19.89311981201172, 21.057464599609375, 22.226844787597656, 23.394195556640625, 18.751182556152344, 19.920440673828125, 21.09393310546875, 22.265853881835938, 18.729263305664062, 19.895370483398438, 21.06378173828125, 22.228057861328125, 23.40142822265625, 18.84874725341797, 20.014404296875, 21.183258056640625, 22.362815856933594, 23.534629821777344, 18.912986755371094, 20.090126037597656, 21.265182495117188, 22.431732177734375, 18.030197143554688, 19.215484619140625, 20.402198791503906, 21.58208465576172, 22.76439666748047, 23.953750610351562, 19.267234802246094, 20.452430725097656, 21.643882751464844, 22.82465362548828, 24.016952514648438, 19.364105224609375, 20.55884552001953, 21.74463653564453, 22.929885864257812, 18.652137756347656, 19.866241455078125, 21.06024169921875, 22.253494262695312, 23.445404052734375, 18.91100311279297, 20.09973907470703, 21.29076385498047, 22.492340087890625, 23.695396423339844, 18.983016967773438, 20.185585021972656, 21.383644104003906, 22.581809997558594, 23.78412628173828, 19.44257354736328, 20.639541625976562, 21.841087341308594, 23.045631408691406, 24.248069763183594, 19.35582733154297, 20.563621520996094, 21.769805908203125, 22.979782104492188, 24.185150146484375, 25.392410278320312, 26.600173950195312, 27.810997009277344, 29.01946258544922, 30.2384033203125, 19.87757110595703, 21.091140747070312, 22.306304931640625, 23.518341064453125, 18.971519470214844, 20.191566467285156, 21.414520263671875, 22.636016845703125, 23.847213745117188, 25.07318115234375, 26.295303344726562, 27.516983032226562, 28.73297882080078, 29.957786560058594, 19.71611785888672, 20.950729370117188, 22.18016815185547, 23.40174102783203, 24.629905700683594, 19.36345672607422, 20.593093872070312, 21.819252014160156, 23.045623779296875, 24.269615173339844, 25.49634552001953, 26.73699951171875, 27.961219787597656, 29.188987731933594, 30.414405822753906, 19.933876037597656, 21.173545837402344, 22.40514373779297, 23.637779235839844, 24.872451782226562, 19.852005004882812, 21.083938598632812, 22.317413330078125, 23.552017211914062, 24.787033081054688, 26.029891967773438, 27.27758026123047, 28.526214599609375, 29.768409729003906, 31.011978149414062, 20.236099243164062, 21.485214233398438, 22.72718048095703, 23.964805603027344, 25.213417053222656, 20.510482788085938, 21.76386260986328, 23.014541625976562, 24.26628875732422, 25.51947021484375, 26.778945922851562, 28.029556274414062, 29.28155517578125, 30.53154754638672, 31.79047393798828, 20.87207794189453, 22.137069702148438, 23.40215301513672, 24.658477783203125, 19.65593719482422, 20.915504455566406, 22.1800537109375, 23.430694580078125, 24.704689025878906, 25.969093322753906, 27.24738311767578, 28.502761840820312, 29.76598358154297, 31.030349731445312, 20.3336181640625, 21.60260009765625, 22.863296508789062, 24.126373291015625, 25.390663146972656, 20.29920196533203, 21.57701873779297, 22.83802032470703, 24.108596801757812, 26.551124572753906, 27.819625854492188, 29.09349822998047, 30.417205810546875, 31.699203491210938, 21.12127685546875, 22.39769744873047, 23.685157775878906, 24.956260681152344, 26.246070861816406, 20.01074981689453, 21.29400634765625, 22.574981689453125, 23.85588836669922, 25.135826110839844, 26.416526794433594, 27.701255798339844, 28.98778533935547, 30.27606964111328, 31.556777954101562, 21.149208068847656, 22.43407440185547, 23.725006103515625, 25.01294708251953, 26.308921813964844, 20.701072692871094, 21.992233276367188, 23.283798217773438, 24.57801055908203, 25.868423461914062, 27.162635803222656, 28.455825805664062, 29.751304626464844, 31.74810028076172, 33.03953552246094, 22.092453002929688, 23.391204833984375, 24.72270965576172, 26.07007598876953, 21.94007110595703, 23.241439819335938, 24.54883575439453, 25.848464965820312, 27.15137481689453, 28.449127197265625, 29.754539489746094, 31.10845184326172, 32.41416931152344, 21.48199462890625, 22.790420532226562, 24.103530883789062, 25.41301727294922, 26.724197387695312, 21.19709014892578, 22.510055541992188, 23.84124755859375, 25.155479431152344, 26.47246551513672, 27.78168487548828, 29.09644317626953, 30.40880584716797, 31.71851348876953, 21.655250549316406, 22.978668212890625, 24.298553466796875, 25.62042999267578, 26.93647003173828, 28.299057006835938, 21.663833618164062, 22.998924255371094, 24.324562072753906, 25.651695251464844, 26.97040557861328, 28.296485900878906, 29.620101928710938, 30.95269012451172, 32.26873779296875, 33.58892059326172, 22.660919189453125, 23.99560546875, 25.31878662109375, 26.63836669921875, 27.959205627441406, 22.488563537597656, 23.814239501953125, 25.19348907470703, 26.52337646484375, 27.85211944580078, 29.188270568847656, 30.527267456054688, 31.85698699951172, 21.80164337158203, 23.140640258789062, 24.470535278320312, 25.852447509765625, 27.188438415527344, 28.526382446289062, 21.63079071044922, 22.967079162597656, 24.31023406982422, 25.651901245117188, 26.997169494628906, 28.34223175048828, 29.689109802246094, 31.04261016845703, 32.39564514160156, 33.74413299560547, 23.21668243408203, 24.61632537841797, 25.971435546875, 27.3232421875, 28.67449951171875, 22.15888214111328, 23.514724731445312, 24.865562438964844, 26.227073669433594, 27.590682983398438, 28.93798065185547, 30.297828674316406, 31.65904998779297, 33.02086639404297, 23.013938903808594, 24.379310607910156, 25.741409301757812, 27.105453491210938, 28.47222137451172, 29.83814239501953, 22.866928100585938, 24.23975372314453, 25.59400177001953, 26.961952209472656, 28.32788848876953, 29.698036193847656, 31.060455322265625, 32.4327392578125, 33.80824279785156, 23.40477752685547, 24.771652221679688, 26.147811889648438, 27.51581573486328, 28.896087646484375, 22.278221130371094, 23.654434204101562, 25.03070831298828, 26.40985107421875, 27.789688110351562, 29.171669006347656, 30.547103881835938, 31.932937622070312, 33.307655334472656, 34.692955017089844, 23.832374572753906, 25.220260620117188, 26.610084533691406, 27.994850158691406, 29.438758850097656, 22.356536865234375, 23.743194580078125, 25.136985778808594, 26.534690856933594, 27.92657470703125, 29.315826416015625, 30.705474853515625, 32.10126495361328, 33.494422912597656, 23.13116455078125, 24.518592834472656, 25.904296875, 27.29559326171875, 28.684539794921875, 30.087196350097656, 31.484657287597656, 23.860633850097656, 25.26305389404297, 26.655792236328125, 28.07286834716797, 29.471786499023438, 30.871994018554688, 32.273773193359375, 33.67059326171875, 35.08026123046875, 24.293899536132812, 25.701461791992188, 27.106201171875, 28.519287109375, 29.931442260742188, 22.783050537109375, 24.190933227539062, 25.61096954345703, 27.016448974609375, 28.434837341308594, 29.85106658935547, 31.261398315429688, 32.66992950439453, 34.08149719238281, 23.89441680908203, 25.312644958496094, 26.728355407714844, 28.14366912841797, 29.560302734375, 30.971359252929688, 32.393653869628906, 24.208099365234375, 25.626373291015625, 27.046371459960938, 28.4732666015625, 29.896522521972656, 31.321205139160156, 32.75092315673828, 34.18247985839844, 23.9669189453125, 25.39130401611328, 26.825027465820312, 28.25885772705078, 29.710060119628906, 31.132888793945312, 32.56414031982422, 24.266517639160156, 25.70209503173828, 27.140464782714844, 28.57329559326172, 30.007286071777344, 31.43756866455078, 32.872352600097656, 34.30723571777344, 24.266433715820312, 25.702545166015625, 27.142784118652344, 28.582786560058594, 30.01678466796875, 31.459915161132812, 32.89678955078125, 24.350738525390625, 25.80272674560547, 27.246688842773438, 28.689735412597656, 30.13298797607422, 31.58202362060547, 33.03057098388672, 34.47722625732422, 35.92499542236328, 25.100440979003906, 26.544044494628906, 27.994163513183594, 29.443580627441406, 30.895339965820312, 32.338470458984375, 24.729217529296875, 26.180892944335938, 27.641212463378906, 29.098167419433594, 30.55748748779297, 32.017738342285156, 33.47990417480469, 34.93870544433594, 24.209266662597656, 25.67327880859375, 27.1412353515625, 28.60778045654297, 30.06829071044922, 31.526992797851562, 32.99668884277344, 24.548477172851562, 26.012130737304688, 27.48096466064453, 28.95130157470703, 30.415550231933594, 31.883819580078125, 33.35693359375, 34.82196807861328, 36.30052185058594, 25.588912963867188, 27.056991577148438, 28.52411651611328, 29.999778747558594, 31.47199249267578, 32.94512939453125, 24.78387451171875, 26.26354217529297, 27.728805541992188, 29.212982177734375, 30.70195770263672, 32.16698455810547, 33.65333557128906, 35.13243103027344, 25.001853942871094, 26.48320770263672, 27.966323852539062, 29.450942993164062, 30.935943603515625, 32.421051025390625, 33.90644073486328, 24.828163146972656, 26.310752868652344, 27.790611267089844, 29.28821563720703, 30.7828369140625, 32.28765106201172, 33.77931213378906, 35.27586364746094, 25.121971130371094, 26.605514526367188, 28.10162353515625, 29.58916473388672, 31.078842163085938, 32.569801330566406, 34.07160186767578, 25.459205627441406, 26.95928192138672, 28.45868682861328, 29.96001434326172, 31.460113525390625, 32.967132568359375, 34.46357727050781, 35.962921142578125, 25.325424194335938, 26.82054901123047, 28.328041076660156, 29.829246520996094, 31.33167266845703, 32.835365295410156, 34.340179443359375, 25.945449829101562, 27.455352783203125, 28.962112426757812, 30.46715545654297, 31.978851318359375, 33.48993682861328, 35.003196716308594, 36.50615692138672, 25.788116455078125, 27.295516967773438, 28.806488037109375, 30.323410034179688, 31.83935546875, 33.35307312011719, 25.27983856201172, 26.794517517089844, 28.32158660888672, 29.838478088378906, 31.3515625, 32.869361877441406, 34.39080047607422, 35.91014099121094, 25.91004180908203, 27.431907653808594, 28.959754943847656, 30.48503875732422, 32.001930236816406, 33.53307342529297, 35.056373596191406, 25.988815307617188, 27.51696014404297, 29.04376983642578, 30.57501983642578, 32.100547790527344, 33.62860107421875, 35.159019470214844, 36.692848205566406, 26.567893981933594, 28.106109619140625, 29.637062072753906, 31.173599243164062, 32.716766357421875, 34.26271057128906, 35.80078125, 26.566635131835938, 28.097824096679688, 29.638992309570312, 31.179908752441406, 32.72523498535156, 34.26637268066406, 35.805320739746094, 25.877418518066406, 27.425987243652344, 28.975379943847656, 30.518951416015625, 32.076515197753906, 33.633026123046875, 35.18641662597656, 25.47570037841797, 27.033226013183594, 28.57665252685547, 30.13385009765625, 31.689682006835938, 33.23466491699219, 34.787635803222656, 36.34137725830078, 25.963531494140625, 27.522476196289062, 29.075042724609375, 30.636428833007812, 32.189971923828125, 33.776161193847656, 35.3360595703125, 26.250953674316406, 27.819976806640625, 29.379005432128906, 30.948509216308594, 33.577110290527344, 35.14484405517578, 36.702049255371094, 25.795570373535156, 26.523361206054688, 26.328262329101562, 26.116355895996094, 26.307350158691406, 26.106231689453125, 26.81920623779297, 26.60247039794922, 26.379188537597656, 27.08898162841797, 26.814476013183594, 27.520828247070312, 26.801773071289062, 27.407302856445312, 26.683181762695312, 26.091529846191406, 26.64563751220703, 26.319000244140625, 26.930564880371094, 26.591033935546875, 27.19628143310547, 26.836830139160156, 27.444931030273438, 27.102462768554688, 26.78606414794922, 27.371047973632812, 27.056884765625, 27.631179809570312, 27.13426971435547, 27.178977966308594, 26.846603393554688, 26.43262481689453, 27.11357879638672, 26.672134399414062, 27.415054321289062, 29.016876220703125, 27.680763244628906, 29.289100646972656, 27.8851318359375, 27.830596923828125, 26.63745880126953, 28.237457275390625, 26.976791381835938, 28.58697509765625, 28.155990600585938, 26.88733673095703, 28.494216918945312, 28.02770233154297, 29.63225555419922, 28.45263671875, 27.995384216308594, 29.609512329101562, 28.358497619628906, 27.236045837402344, 28.85222625732422, 27.577682495117188, 29.20812225341797, 27.831085205078125, 29.445556640625, 28.25334930419922, 27.750877380371094, 29.359786987304688, 28.160079956054688, 27.682083129882812, 29.30199432373047, 28.07019805908203, 29.67693328857422, 27.19983673095703, 28.814483642578125, 27.95355224609375, 29.57929229736328, 28.333526611328125, 29.953216552734375, 28.565750122070312, 27.32391357421875, 28.944442749023438, 27.616127014160156, 29.240882873535156, 27.844650268554688, 29.463790893554688, 28.207542419433594, 29.834854125976562, 28.529342651367188, 27.483612060546875, 29.110244750976562, 27.860977172851562, 29.489425659179688, 28.08203887939453, 29.7197265625, 28.45873260498047, 30.092178344726562, 28.87464141845703, 30.508384704589844, 29.14154815673828, 27.24584197998047, 28.87950897216797, 30.514869689941406, 32.139556884765625, 27.910865783691406, 29.55884552001953, 31.199737548828125, 32.83897399902344, 28.596389770507812, 30.242568969726562, 31.89397430419922, 33.53386688232422, 29.406829833984375, 31.05535888671875, 32.69709777832031, 28.510581970214844, 30.152725219726562, 31.80274200439453, 27.683189392089844, 29.329971313476562, 30.96820068359375, 32.62062072753906, 28.5384521484375, 30.187889099121094, 31.841323852539062, 33.501739501953125, 29.303085327148438, 30.962181091308594, 32.617103576660156, 27.521133422851562, 29.17638397216797, 30.835784912109375, 32.496185302734375, 28.34839630126953, 30.005470275878906, 31.663429260253906, 33.32714080810547, 29.131927490234375, 30.79193878173828, 32.445350646972656, 28.22447967529297, 29.884750366210938, 31.53924560546875, 33.1966552734375, 28.95037841796875, 30.6142578125, 32.288414001464844, 28.32410430908203, 29.995216369628906, 31.671981811523438, 33.334083557128906, 29.146156311035156, 30.812217712402344, 32.489654541015625, 28.38823699951172, 30.05883026123047, 31.73284149169922, 33.41551971435547, 28.353965759277344, 30.03650665283203, 31.72142791748047, 33.39656066894531, 29.30872344970703, 30.987945556640625, 32.67035675048828, 28.529380798339844, 30.20909881591797, 31.89226531982422, 33.570030212402344, 29.300086975097656, 30.99207305908203, 32.67278289794922, 34.36231994628906, 29.276153564453125, 30.965957641601562, 32.655967712402344, 28.790237426757812, 30.468360900878906, 32.16026306152344, 33.86033630371094, 29.56848907470703, 31.26605224609375, 32.95960998535156, 28.824447631835938, 30.521018981933594, 32.21257781982422, 33.915679931640625, 28.623558044433594, 30.325439453125, 32.028587341308594, 33.72471618652344, 30.08385467529297, 31.780113220214844, 33.49275207519531, 29.196609497070312, 30.89642333984375, 32.597984313964844, 34.30139923095703, 30.10602569580078, 31.80146026611328, 33.50447082519531, 29.34003448486328, 30.109375, 31.814910888671875, 33.51971435546875, 29.633399963378906, 31.343063354492188, 33.058692932128906, 34.77796173095703, 30.52092742919922, 32.240623474121094, 33.95494842529297, 29.925514221191406, 31.646408081054688, 33.363365173339844, 35.074256896972656, 29.35369873046875, 31.073776245117188, 32.788665771484375, 34.504188537597656, 30.2919921875, 32.01502990722656, 33.744483947753906, 29.50757598876953, 31.237655639648438, 32.96684265136719, 34.70343780517578, 30.568099975585938, 32.29322052001953, 34.01731872558594, 29.773544311523438, 30.145240783691406, 31.87543487548828, 33.62425231933594, 35.36079406738281, 37.11067199707031, 38.84541320800781, 40.582122802734375, 30.327880859375, 32.06890106201172, 33.80329132080078, 35.53722381591797, 37.27763366699219, 39.01837158203125, 40.761802673339844, 29.368560791015625, 31.113037109375, 32.8538818359375, 34.59551239013672, 36.336326599121094, 38.06898498535156, 39.81120300292969, 41.55500793457031, 31.308006286621094, 33.051780700683594, 34.78595733642578, 36.53522491455078, 38.27801513671875, 40.03026580810547, 41.77500915527344, 29.723289489746094, 31.480209350585938, 33.23322296142578, 34.98052978515625, 36.736656188964844, 38.49317932128906, 40.246360778808594, 41.99797821044922, 31.404685974121094, 33.16966247558594, 34.92450714111328, 36.678985595703125, 38.43560791015625, 40.19712829589844, 41.975059509277344, 30.679733276367188, 32.44524383544922, 34.20985412597656, 35.978004455566406, 37.73291015625, 39.500083923339844, 41.263511657714844, 30.867507934570312, 32.63037872314453, 34.401611328125, 36.17229461669922, 37.93046569824219, 39.69824981689453, 41.4759521484375, 31.376266479492188, 31.473678588867188, 33.24198913574219, 35.014312744140625, 36.793731689453125, 38.566612243652344, 40.34126281738281, 30.375747680664062, 32.15320587158203, 33.9344482421875, 35.71058654785156, 37.48875427246094, 39.26568603515625, 41.04322052001953, 30.992462158203125, 30.513633728027344, 32.30072021484375, 34.09221649169922, 35.88124084472656, 37.66199493408203, 39.443023681640625, 41.22997283935547, 30.883346557617188, 32.669578552246094, 34.45850372314453, 36.25164794921875, 38.04474639892578, 39.83172607421875, 41.620201110839844, 31.693275451660156, 30.98889923095703, 32.78181457519531, 34.57386016845703, 36.37364196777344, 38.17229461669922, 39.969566345214844, 41.76495361328125, 31.613990783691406, 33.41102600097656, 35.214027404785156, 37.046241760253906, 38.8486328125, 40.640663146972656, 42.44627380371094, 32.44969177246094, 31.556167602539062, 33.35765838623047, 35.16362762451172, 36.96546173095703, 38.77928161621094, 40.60139465332031, 42.408363342285156, 32.46649932861328, 34.27362823486328, 36.089027404785156, 37.90070343017578, 39.71351623535156, 41.521812438964844, 31.634963989257812, 33.44972229003906, 32.02217102050781, 33.84413146972656, 35.665626525878906, 37.48876953125, 39.30211639404297, 41.118408203125, 42.93266296386719, 32.528656005859375, 34.35480499267578, 36.18058776855469, 38.01490020751953, 39.829132080078125, 41.65510559082031, 31.705062866210938, 31.060012817382812, 32.88978576660156, 34.718971252441406, 36.548004150390625, 38.37419891357422, 40.20817565917969, 42.04100036621094, 31.9261474609375, 33.75096130371094, 35.58966064453125, 37.42749786376953, 39.254791259765625, 41.08845520019531, 42.914276123046875, 33.002777099609375, 31.589889526367188, 33.421180725097656, 35.258392333984375, 37.09523010253906, 38.928504943847656, 40.758331298828125, 42.593711853027344, 32.17401123046875, 34.01513671875, 35.86186981201172, 37.71226501464844, 39.558494567871094, 41.398597717285156, 43.24309539794922, 33.31853485107422, 32.127845764160156, 33.9637451171875, 35.81800842285156, 37.662696838378906, 39.5169677734375, 41.36420440673828, 43.214561462402344, 32.742225646972656, 34.58916473388672, 36.4510498046875, 38.30602264404297, 40.151405334472656, 42.00091552734375, 43.84740447998047, 33.90229797363281, 32.95899200439453, 34.81211853027344, 36.667991638183594, 38.526527404785156, 40.39105224609375, 42.250999450683594, 32.44898223876953, 34.308326721191406, 36.17567443847656, 38.041587829589844, 39.908897399902344, 41.77928924560547, 43.64740753173828, 33.800872802734375, 31.899932861328125, 33.77092742919922, 35.63612365722656, 37.49977111816406, 39.37000274658203, 41.24122619628906, 43.113555908203125, 33.29521179199219, 35.16242980957031, 37.030067443847656, 38.903038024902344, 40.773773193359375, 42.64912414550781, 32.738365173339844, 34.619537353515625, 33.243309020996094, 35.12413024902344, 37.00823974609375, 39.075157165527344, 40.95484924316406, 42.832847595214844, 32.537078857421875, 34.425315856933594, 36.31322479248047, 38.20057678222656, 40.08008575439453, 41.96228790283203, 43.841087341308594, 33.828163146972656, 35.72667694091797, 33.800880432128906, 35.70293426513672, 37.58556365966797, 39.47294616699219, 41.35625457763672, 43.242958068847656, 33.66136169433594, 35.551170349121094, 37.442718505859375, 39.32237243652344, 41.218780517578125, 43.11290740966797, 33.16380310058594, 35.0596923828125, 32.890098571777344, 34.797882080078125, 36.704437255859375, 38.609413146972656, 40.51152801513672, 42.41368865966797, 44.30725860595703, 33.862892150878906, 35.760009765625, 37.667686462402344, 39.5762939453125, 41.49108123779297, 43.401329040527344, 33.41846466064453, 35.32537841796875, 33.69719696044922, 35.61365509033203, 37.51599884033203, 39.425506591796875, 41.341697692871094, 43.246063232421875, 33.430580139160156, 35.34717559814453, 37.26551055908203, 39.196563720703125, 41.115142822265625, 43.037139892578125, 44.96315002441406, 35.06061553955078, 36.98554992675781, 34.538673400878906, 36.468299865722656, 38.391693115234375, 40.312042236328125, 42.23139953613281, 44.16118621826172, 33.99748992919922, 35.92857360839844, 37.85984802246094, 39.79267120361328, 41.722564697265625, 43.656394958496094, 33.940521240234375, 35.88008117675781, 33.01221466064453, 34.93806457519531, 36.87068176269531, 38.79621124267578, 40.72431182861328, 42.64911651611328, 44.570159912109375, 34.81304168701172, 36.748069763183594, 38.6767578125, 40.61424255371094, 42.550201416015625, 44.497459411621094, 34.590782165527344, 36.527183532714844, 34.07244110107422, 36.012359619140625, 37.95606994628906, 39.898719787597656, 41.845977783203125, 43.79737091064453, 33.73091125488281, 35.674903869628906, 37.61785125732422, 39.568260192871094, 41.52863311767578, 43.48280334472656, 45.43894958496094, 35.583343505859375, 37.5382080078125, 35.076744079589844, 37.03028106689453, 38.98777770996094, 40.94706726074219, 42.90020751953125, 44.86485290527344, 34.88496398925781, 36.847557067871094, 38.80602264404297, 40.766082763671875, 42.72950744628906, 44.70057678222656, 34.842376708984375, 36.80901336669922, 38.768455505371094, 40.730995178222656, 42.69853973388672, 44.662811279296875, 34.800819396972656, 36.776954650878906, 38.74394989013672, 40.71443176269531, 42.682579040527344, 44.6458740234375, 34.83472442626953, 36.81085205078125, 38.78913116455078, 36.11442565917969, 38.08234405517578, 40.057472229003906, 42.027069091796875, 44.004608154296875, 45.97229766845703, 36.223777770996094, 38.19280242919922, 40.17152404785156, 42.14734649658203, 44.12769317626953, 46.10450744628906, 36.191444396972656, 38.180931091308594, 35.94816589355469, 37.94606018066406, 39.936363220214844, 41.93174743652344, 43.92772674560547, 45.923133850097656, 35.86521911621094, 37.857826232910156, 39.859886169433594, 41.858856201171875, 43.863487243652344, 45.861846923828125, 36.044776916503906, 38.054176330566406, 35.53668975830078, 37.54167175292969, 39.543373107910156, 41.546058654785156, 43.54512023925781, 45.551307678222656, 35.7481689453125, 37.75366973876953, 39.769386291503906, 41.77461242675781, 43.778526306152344, 45.78374481201172, 35.90068054199219, 37.91230773925781, 39.92976379394531, 36.8934326171875, 38.90381622314453, 40.91614532470703, 42.92981719970703, 44.936744689941406, 46.95667266845703, 36.578033447265625, 38.59947204589844, 40.613929748535156, 42.62488555908203, 44.64270782470703, 46.652259826660156, 36.988525390625, 39.01264953613281, 36.01036071777344, 38.02961730957031, 40.06133270263672, 42.10547637939453, 44.113807678222656, 46.12836456298828, 36.60643005371094, 38.62830352783203, 40.64659118652344, 42.669654846191406, 44.678749084472656, 46.701133728027344, 36.996986389160156, 39.018089294433594, 35.49578857421875, 37.525421142578125, 39.554656982421875, 41.58453369140625, 43.60699462890625, 45.63323974609375, 35.78594970703125, 37.81703186035156, 39.849586486816406, 41.878570556640625, 43.904319763183594, 45.937461853027344, 36.13042449951172, 38.16105651855469, 40.19160461425781, 36.71281433105469, 38.75288391113281, 40.79801940917969, 42.828033447265625, 44.86280059814453, 46.90705108642578, 37.13081359863281, 39.17732238769531, 41.22709655761719, 43.26947021484375, 45.31184387207031, 47.35737609863281, 37.523231506347656, 39.566131591796875, 41.61151885986328, 37.26631164550781, 39.310401916503906, 41.36305236816406, 43.410614013671875, 45.4688720703125, 47.51434326171875, 37.59624481201172, 39.643943786621094, 41.698020935058594, 43.74778747558594, 45.80821228027344, 47.86387634277344, 38.11113739013672, 40.167259216308594, 35.993324279785156, 38.05769348144531, 40.11969757080078, 42.169044494628906, 44.220741271972656, 46.285186767578125, 36.26880645751953, 38.32892608642578, 40.394866943359375, 42.45582580566406, 44.51575469970703, 46.57377624511719, 36.77284240722656, 38.839385986328125, 40.89744567871094, 36.823997497558594, 38.89006042480469, 40.958961486816406, 43.032127380371094, 45.10540771484375, 47.1702880859375, 36.97297668457031, 39.04505920410156, 41.112335205078125, 43.175926208496094, 45.24613952636719, 47.32598114013672, 37.652740478515625, 39.726593017578125, 41.817962646484375, 37.22089385986328, 39.300270080566406, 41.38818359375, 43.45537567138672, 45.55656433105469, 47.634864807128906, 38.04237365722656, 40.130699157714844, 42.21177673339844, 44.29833221435547, 46.38294982910156, 48.47486114501953, 38.72699737548828, 40.816871643066406, 42.90760040283203, 38.315162658691406, 40.40911865234375, 42.49559020996094, 44.59184265136719, 46.68799591064453, 37.01372528076172, 39.11259460449219, 41.210899353027344, 43.310890197753906, 45.410560607910156, 47.50762939453125, 37.85334014892578, 39.95429992675781, 42.05097961425781, 44.162841796875, 38.678627014160156, 40.782203674316406, 42.87773895263672, 44.97856140136719, 47.07133483886719, 37.419586181640625, 39.52452087402344, 41.63555145263672, 43.73657989501953, 45.845611572265625, 47.956268310546875, 38.094635009765625, 40.20118713378906, 42.309288024902344, 37.647438049316406, 39.76612091064453, 41.88291931152344, 43.99640655517578, 46.10655975341797, 48.21666717529297, 38.84454345703125, 40.962425231933594, 43.07965850830078, 45.202964782714844, 47.31952667236328, 37.572547912597656, 39.684791564941406, 41.80530548095703, 43.91889953613281, 39.052696228027344, 41.17784118652344, 43.30531311035156, 45.43133544921875, 47.56150817871094, 49.683021545410156, 39.414573669433594, 41.54735565185547, 43.67521667480469, 45.80126953125, 47.94493103027344, 38.40977478027344, 40.541473388671875, 42.677650451660156, 37.356292724609375, 39.48816680908203, 41.61931610107422, 43.7484130859375, 45.88801574707031, 48.023948669433594, 38.02476501464844, 40.166481018066406, 42.31587219238281, 44.45359802246094, 46.60063171386719, 48.74181365966797, 39.06561279296875, 41.202354431152344, 43.340309143066406, 38.65998077392578, 40.804908752441406, 42.94970703125, 45.09617614746094, 47.24342346191406, 37.844642639160156, 39.98564147949219, 42.134056091308594, 44.27967071533203, 46.42365264892578, 48.56871032714844, 38.93281555175781, 41.075538635253906, 43.222923278808594, 45.36686706542969, 39.53858184814453, 41.68902587890625, 43.855613708496094, 46.011573791503906, 48.1732177734375, 50.33491516113281, 40.056480407714844, 42.21458435058594, 44.38359832763672, 46.54998016357422, 48.702911376953125, 39.129966735839844, 41.2935791015625, 43.44746398925781, 37.93596649169922, 40.104087829589844, 42.26649475097656, 44.431854248046875, 46.60301208496094, 48.76898956298828, 39.150230407714844, 41.313026428222656, 43.47815704345703, 45.64729309082031, 47.827293395996094, 50.00086975097656, 41.02002716064453, 43.65967559814453, 47.59539794921875, 39.069114685058594, 41.24473571777344, 43.664222717285156, 45.84502410888672, 49.093040466308594, 39.63823699951172, 41.81597900390625, 43.99365997314453, 46.172401428222656, 48.35493469238281, 38.74934387207031, 40.928428649902344, 43.11436462402344, 45.300025939941406, 47.49340057373047, 40.001800537109375, 42.19929504394531, 44.37696838378906, 46.56780242919922, 48.750579833984375, 39.22723388671875, 41.42364501953125, 43.605712890625, 45.79698181152344, 47.984214782714844, 50.179931640625, 40.61450958251953, 42.809539794921875, 44.99657440185547, 47.192710876464844, 40.584434509277344, 42.78558349609375, 44.98194122314453, 47.188697814941406, 49.38236999511719, 39.96959686279297, 42.169830322265625, 44.377464294433594, 46.581764221191406, 48.78892517089844, 39.248985290527344, 41.45818328857422, 43.661888122558594, 45.870826721191406, 38.80712127685547, 41.02228546142578, 43.23113250732422, 45.4483642578125, 47.65814208984375, 49.8717041015625, 39.82167053222656, 42.03150939941406, 44.247230529785156, 39.2127685546875, 39.67644500732422, 39.002342224121094, 39.42597961425781, 39.69245910644531, 39.21067810058594, 39.44659423828125, 39.927154541015625, 40.181373596191406, 39.68822479248047, 39.92095947265625, 40.19348907470703, 40.43470764160156, 39.794578552246094, 39.20048522949219, 39.4840087890625, 39.735389709472656, 39.092681884765625, 39.317848205566406, 39.591766357421875, 39.83833312988281, 41.250648498535156, 40.414024353027344, 39.7508544921875, 41.984474182128906, 40.15202331542969, 40.09894561767578, 39.251556396484375, 41.49688720703125, 40.81385040283203, 40.13960266113281, 39.49138641357422, 41.7314453125, 40.83789825439453, 40.16193389892578, 42.40370178222656, 41.76836395263672, 41.096832275390625, 40.354530334472656, 42.73490905761719, 41.283180236816406, 40.67363739013672, 39.957420349121094, 42.21417236328125, 41.56494140625, 40.909393310546875, 40.074058532714844, 42.33930969238281, 41.64103698730469, 40.973899841308594, 40.29936981201172, 42.55329895019531, 41.887733459472656, 42.094993591308594, 40.733001708984375, 40.11357116699219, 42.399505615234375, 41.74280548095703, 41.041114807128906, 40.357933044433594, 42.62477111816406, 41.908241271972656, 41.265045166015625, 40.537498474121094, 42.803466796875, 41.9959716796875, 41.33361053466797, 40.65583038330078, 40.125701904296875, 42.390869140625, 41.889495849609375, 41.15863037109375, 40.499298095703125, 42.77021789550781, 42.08525085449219, 41.392059326171875, 40.21605682373047, 42.48802185058594, 44.767417907714844, 41.35746765136719, 43.63983154296875, 45.91297149658203, 42.232147216796875, 44.51103210449219, 40.881004333496094, 43.156532287597656, 45.44318389892578, 41.820396423339844, 44.09998321533203, 46.38294982910156, 40.24162292480469, 42.532859802246094, 44.81884765625, 41.11830139160156, 43.410606384277344, 45.700408935546875, 42.029296875, 44.319190979003906, 40.68598937988281, 42.97460174560547, 45.27239990234375, 41.648414611816406, 43.935829162597656, 46.23241424560547, 42.5123291015625, 41.82737731933594, 44.122718811035156, 40.91313171386719, 43.21601104736328, 45.51153564453125, 41.86243438720703, 44.16502380371094, 40.682701110839844, 42.984947204589844, 45.29224395751953, 41.594940185546875, 43.89891052246094, 46.19873809814453, 42.74677276611328, 40.82612609863281, 43.13086700439453, 45.44939422607422, 42.318328857421875, 44.62714385986328, 41.13599395751953, 43.43531799316406, 45.749778747558594, 42.012420654296875, 44.31714630126953, 46.62797546386719, 42.91136932373047, 45.223724365234375, 41.751495361328125, 44.06273651123047, 42.61711883544922, 44.94132995605469, 41.556678771972656, 43.86957550048828, 46.18675231933594, 42.469825744628906, 44.78953552246094, 41.23792266845703, 43.55461120605469, 45.88414764404297, 42.352989196777344, 44.671142578125, 46.99585723876953, 43.284393310546875, 42.738059997558594, 45.057861328125, 41.712135314941406, 44.0404052734375, 46.37770080566406, 42.84893035888672, 45.18870544433594, 41.63545227050781, 43.96764373779297, 46.296844482421875, 42.764625549316406, 45.10442352294922, 47.4307861328125, 43.69928741455078, 42.66731262207031, 45.004608154296875, 41.36634063720703, 43.71189880371094, 46.05451202392578, 42.445960998535156, 44.79283142089844, 47.133575439453125, 43.60558319091797, 45.946380615234375, 42.21299743652344, 44.56098937988281, 46.90650177001953, 43.34466552734375, 41.636497497558594, 43.98914337158203, 46.35050964355469, 43.280067443847656, 45.62736511230469, 42.086814880371094, 44.431785583496094, 46.781341552734375, 43.21435546875, 45.560935974121094, 41.9627685546875, 44.31916809082031, 46.68092346191406, 43.11839294433594, 45.500244140625, 43.63011169433594, 45.987525939941406, 43.179786682128906, 45.53620910644531, 41.84101104736328, 44.21399688720703, 46.580116271972656, 43.18952941894531, 45.56324768066406, 41.96428680419922, 44.32733154296875, 46.68804931640625, 42.50883483886719, 44.87547302246094, 47.24263000488281, 49.60717010498047, 51.97270202636719, 42.518394470214844, 44.89105224609375, 47.26182556152344, 49.635902404785156, 52.006187438964844, 42.60572052001953, 44.98381042480469, 47.36998748779297, 49.766510009765625, 52.13987731933594, 43.80913543701172, 46.17869567871094, 48.563751220703125, 50.94606018066406, 53.331443786621094, 44.11540222167969, 46.496185302734375, 48.88013458251953, 51.276100158691406, 53.65711212158203, 44.23138427734375, 46.61931610107422, 49.00524139404297, 51.390869140625, 53.777992248535156, 44.347251892089844, 46.748085021972656, 49.14215850830078, 51.529640197753906, 42.39564514160156, 44.78889465332031, 47.17481994628906, 49.55821990966797, 51.95276641845703, 54.34858703613281, 44.8402099609375, 47.22437286376953, 49.61729431152344, 52.016998291015625, 42.928794860839844, 45.32743835449219, 47.726043701171875, 50.121131896972656, 52.529197692871094, 42.99336242675781, 45.3974609375, 47.813209533691406, 50.216270446777344, 52.625083923339844, 43.25682067871094, 45.656585693359375, 48.06056213378906, 50.46910858154297, 52.8760986328125, 43.49546813964844, 45.905853271484375, 48.31672668457031, 50.72728729248047, 53.14312744140625, 43.964515686035156, 46.529273986816406, 48.94746398925781, 51.355010986328125, 53.76575469970703, 44.26542663574219, 46.67866516113281, 49.10045623779297, 51.519752502441406, 53.947105407714844, 44.7381591796875, 47.15777587890625, 49.575592041015625, 51.98717498779297, 54.406959533691406, 45.192909240722656, 47.620086669921875, 50.04528045654297, 52.462493896484375, 54.887611389160156, 45.521751403808594, 47.95263671875, 50.386688232421875, 52.80664825439453, 43.489959716796875, 45.932960510253906, 48.364234924316406, 50.79840850830078, 53.23222351074219, 43.91209411621094, 46.34803771972656, 48.77838134765625, 51.21434783935547, 53.64897918701172, 44.274383544921875, 46.713401794433594, 49.15733337402344, 51.600013732910156, 54.03916931152344, 44.330230712890625, 46.78199768066406, 49.22792053222656, 51.666259765625, 54.10912322998047, 44.39491271972656, 46.839447021484375, 49.28632354736328, 51.72698211669922, 54.183135986328125, 44.898704528808594, 47.34663391113281, 49.804473876953125, 52.249061584472656, 54.69929504394531, 45.085968017578125, 47.535888671875, 50.014183044433594, 52.466270446777344, 54.927894592285156, 45.04835510253906, 47.507041931152344, 49.952919006347656, 52.409690856933594, 54.8717041015625, 45.351646423339844, 47.824615478515625, 50.28178405761719, 52.74536895751953, 43.756446838378906, 46.22144317626953, 48.690650939941406, 51.15282440185547, 53.60381317138672, 44.246002197265625, 46.701316833496094, 49.15772247314453, 51.613494873046875, 54.07695007324219, 44.715911865234375, 47.18711853027344, 49.649314880371094, 52.142242431640625, 54.61833953857422, 44.49205017089844, 46.96287536621094, 49.43792724609375, 51.91856384277344, 54.39116668701172, 45.10651397705078, 47.58008575439453, 50.05126953125, 52.527549743652344, 55.000244140625, 45.586219787597656, 48.063270568847656, 50.540489196777344, 53.02667236328125, 55.50544738769531, 45.32543182373047, 47.807273864746094, 50.28845977783203, 52.76262664794922, 55.2708740234375, 46.14231872558594, 48.633575439453125, 51.11857604980469, 53.60784149169922, 56.096336364746094, 46.69683837890625, 49.19273376464844, 51.68560791015625, 54.18043518066406, 44.073402404785156, 46.56958770751953, 49.064064025878906, 51.551597595214844, 54.04811096191406, 44.594268798828125, 47.08781433105469, 49.579010009765625, 52.07957458496094, 54.5718994140625, 45.36456298828125, 47.86698913574219, 50.3624267578125, 52.87327575683594, 55.378631591796875, 45.131507873535156, 47.63739776611328, 50.14385223388672, 52.649879455566406, 55.156761169433594, 46.10039520263672, 48.60858917236328, 51.12120056152344, 53.62525177001953, 56.13921356201172, 46.80497741699219, 49.3150634765625, 51.82575988769531, 54.332427978515625, 56.84193420410156, 46.063568115234375, 48.58369445800781, 51.100616455078125, 53.61387634277344, 56.13720703125, 46.48851776123047, 48.99878692626953, 51.51775360107422, 54.038185119628906, 56.56572723388672, 47.24022674560547, 49.75678253173828, 52.278709411621094, 54.798072814941406, 44.8812255859375, 47.398651123046875, 49.918739318847656, 52.441917419433594, 54.962135314941406, 45.720787048339844, 48.258155822753906, 50.781700134277344, 53.31671905517578, 55.84581756591797, 46.32366180419922, 48.86164093017578, 51.398956298828125, 53.94859313964844, 56.48773193359375, 45.957496643066406, 48.49481964111328, 51.034210205078125, 53.57328796386719, 56.10870361328125, 46.53960418701172, 49.08069610595703, 51.61626434326172, 54.152076721191406, 56.690574645996094, 47.23944091796875, 49.7777099609375, 52.327659606933594, 55.023406982421875, 45.830665588378906, 47.412750244140625, 49.95733642578125, 52.50382995605469, 55.063232421875, 57.60767364501953, 47.60480499267578, 50.16089630126953, 52.713653564453125, 55.265403747558594, 45.952789306640625, 48.516082763671875, 51.07183074951172, 53.63367462158203, 56.18157196044922, 45.9647216796875, 48.52484130859375, 51.09113311767578, 53.65178680419922, 56.215126037597656, 47.78972625732422, 50.345619201660156, 52.916419982910156, 55.487937927246094, 46.12745666503906, 48.695335388183594, 53.639060974121094, 56.21009063720703, 58.77800750732422, 47.1932373046875, 49.762474060058594, 52.33210754394531, 54.90483093261719, 57.483306884765625, 48.283287048339844, 50.846099853515625, 47.280189514160156, 46.67205047607422, 47.372169494628906, 47.03901672363281, 46.69091796875, 47.180442810058594, 46.84765625, 47.530357360839844, 47.17931365966797, 47.678443908691406, 47.32787322998047, 48.0091552734375, 47.65513610839844, 48.14666748046875, 46.98137664794922, 46.67023468017578, 47.35856628417969, 47.00550079345703, 47.480735778808594, 47.14884948730469, 47.834259033203125, 49.44416809082031, 49.061920166015625, 49.548789978027344, 49.18537902832031, 48.05396270751953, 47.938446044921875, 47.573081970214844, 47.170509338378906, 49.76903533935547, 49.409019470214844, 49.04869842529297, 48.64173889160156, 48.32600402832031, 47.948951721191406, 47.585426330566406, 50.18981170654297, 49.816123962402344, 49.45885467529297, 47.16240692138672, 47.18561553955078, 47.73058319091797, 47.372413635253906, 49.97828674316406, 49.59559631347656, 49.216453552246094, 48.86039733886719, 48.4744873046875, 48.11608123779297, 47.95887756347656, 48.46247863769531, 48.10270690917969, 47.69921112060547, 50.31640625, 48.69280242919922, 49.1776123046875, 49.62403869628906, 49.287391662597656, 48.8779296875, 48.718414306640625, 49.22434997558594, 48.85040283203125, 48.509315490722656, 48.15235137939453, 48.018585205078125, 48.454750061035156, 48.076324462890625, 50.69340515136719, 50.35975646972656, 47.458465576171875, 50.076454162597656, 49.67694854736328, 49.526161193847656, 50.03343963623047, 52.65772247314453, 49.46367645263672, 49.48932647705078, 52.119895935058594, 49.14092254638672, 51.77227020263672, 48.342201232910156, 50.97315216064453, 53.60918426513672, 50.24717712402344, 52.885894775390625, 49.72923278808594, 52.363243103027344, 49.039581298828125, 51.68182373046875, 48.27330017089844, 48.561492919921875, 51.20250701904297, 53.835052490234375, 50.44795227050781, 53.08197021484375, 49.682350158691406, 52.32324981689453, 48.96513366699219, 51.61151123046875, 48.456199645996094, 51.11338806152344, 53.75341796875, 50.487098693847656, 53.129234313964844, 49.79713439941406, 50.30305480957031, 52.960540771484375, 50.16099548339844, 52.812339782714844, 49.613922119140625, 52.25944519042969, 48.954566955566406, 51.615631103515625, 48.374107360839844, 51.02582550048828, 53.674705505371094, 50.30279541015625, 52.963104248046875, 49.79821014404297, 49.401756286621094, 52.0584716796875, 49.31086730957031, 51.967247009277344, 48.49547576904297, 51.148109436035156, 53.81109619140625, 50.647804260253906, 53.31787109375, 50.119720458984375, 52.779685974121094, 49.35565948486328, 52.01519012451172, 48.87593078613281, 48.537391662597656, 51.207252502441406, 53.882537841796875, 50.849639892578125, 53.51716613769531, 50.27229309082031, 52.95508575439453, 49.75773620605469, 52.43737030029297, 49.26402282714844, 51.94269561767578, 54.61565399169922, 51.36894226074219, 54.041053771972656, 50.81134033203125, 49.88963317871094, 52.56919860839844, 49.25787353515625, 51.93878173828125, 54.61658477783203, 51.43540954589844, 54.12275695800781, 50.630043029785156, 53.3232421875, 50.05962371826172, 52.74342346191406, 49.56543731689453, 52.25799560546875, 54.949684143066406, 51.678443908691406, 50.90605926513672, 53.59930419921875, 50.417877197265625, 53.11028289794922, 49.789306640625, 52.48146057128906, 49.235572814941406, 51.92115020751953, 54.62522888183594, 51.41783905029297, 54.12001037597656, 50.89207458496094, 53.583473205566406, 50.306732177734375, 49.34855651855469, 52.04707336425781, 54.74127960205078, 51.46116638183594, 54.16956329345703, 50.92371368408203, 53.63453674316406, 50.57795715332031, 53.28760528564453, 50.06060791015625, 52.769264221191406, 49.525970458984375, 52.234222412109375, 54.947410583496094, 51.62555694580078, 50.673828125, 53.37855529785156, 50.169586181640625, 52.884620666503906, 55.603515625, 58.32117462158203, 61.043060302734375, 51.90375518798828, 54.630897521972656, 57.346832275390625, 60.06291961669922, 50.97126770019531, 53.684356689453125, 56.40478515625, 59.13188171386719, 49.88072967529297, 52.599700927734375, 51.378456115722656, 54.11241149902344, 56.831764221191406, 59.55400085449219, 49.76799011230469, 52.49323272705078, 55.2222900390625, 57.96013641357422, 60.696319580078125, 51.61650085449219, 54.3609619140625, 57.09165954589844, 59.82624053955078, 50.80615997314453, 49.574134826660156, 52.31736755371094, 55.05146026611328, 57.79132080078125, 60.53997039794922, 51.564849853515625, 54.29780578613281, 57.036537170410156, 59.77497100830078, 50.6690673828125, 53.402244567871094, 56.14805603027344, 58.894691467285156, 61.64434814453125, 52.52348327636719, 50.156494140625, 52.91004180908203, 55.65575408935547, 58.41297149658203, 61.167579650878906, 51.56139373779297, 54.31291198730469, 57.062294006347656, 59.813720703125, 50.663726806640625, 53.42223358154297, 56.17543029785156, 58.933509826660156, 61.6937255859375, 52.778167724609375, 50.451072692871094, 53.211578369140625, 55.96453094482422, 58.72782897949219, 61.48419952392578, 51.84983825683594, 54.60395050048828, 57.373260498046875, 60.126792907714844, 50.86994934082031, 53.62525177001953, 56.384765625, 59.148155212402344, 61.91697692871094, 53.02268981933594, 50.85193634033203, 53.62159729003906, 56.387489318847656, 59.164337158203125, 50.34996795654297, 53.12385559082031, 55.89201354980469, 58.6636962890625, 61.43446350097656, 52.29755401611328, 55.073944091796875, 57.85082244873047, 60.63136291503906, 51.6351318359375, 54.42021179199219, 50.813941955566406, 53.59513854980469, 56.377784729003906, 59.166961669921875, 61.94994354248047, 52.474754333496094, 55.26484680175781, 58.04151153564453, 60.8260498046875, 51.752784729003906, 54.547821044921875, 57.33281707763672, 60.11778259277344, 51.09021759033203, 53.88008117675781, 56.67156982421875, 53.14935302734375, 55.944854736328125, 58.726707458496094, 61.51097106933594, 52.13737487792969, 54.937599182128906, 57.73370361328125, 60.52165985107422, 51.55260467529297, 54.34764862060547, 57.14399719238281, 59.950843811035156, 62.751800537109375, 53.68891143798828, 50.817657470703125, 53.622718811035156, 56.424964904785156, 59.23450469970703, 62.04345703125, 52.83618927001953, 55.643646240234375, 58.440940856933594, 61.25303649902344, 52.22314453125, 55.03434753417969, 57.845802307128906, 60.65565490722656, 51.768211364746094, 54.57593536376953, 57.392730712890625, 53.52777099609375, 56.341094970703125, 59.15470886230469, 61.9744873046875, 52.813377380371094, 55.63502502441406, 58.445960998535156, 61.2633056640625, 52.365142822265625, 55.18102264404297, 58.00553894042969, 60.82945251464844, 51.702171325683594, 54.52801513671875, 57.35594940185547, 51.941070556640625, 54.769325256347656, 57.586692810058594, 60.406280517578125, 63.235679626464844, 53.75098419189453, 56.576934814453125, 59.411582946777344, 62.23804473876953, 53.370147705078125, 56.20417785644531, 59.030860900878906, 61.86137390136719, 52.606414794921875, 55.44505310058594, 51.90290832519531, 54.73875427246094, 57.578033447265625, 60.42176818847656, 63.26361846923828, 54.26246643066406, 57.103065490722656, 59.946075439453125, 62.786407470703125, 53.59886169433594, 56.438926696777344, 59.278236389160156, 62.1248779296875, 53.052001953125, 55.89439392089844, 53.057891845703125, 55.90198516845703, 58.73875427246094, 61.5875244140625, 52.822540283203125, 55.66529083251953, 58.51263427734375, 61.363243103027344, 52.34545135498047, 55.189849853515625, 58.04613494873047, 60.90312194824219, 63.75801086425781, 54.80388641357422, 57.65575408935547, 52.577064514160156, 55.43921661376953, 58.30448913574219, 61.159095764160156, 52.312461853027344, 55.17430114746094, 58.030921936035156, 60.88953399658203, 63.753448486328125, 54.71013641357422, 57.57477569580078, 60.44245910644531, 63.309608459472656, 54.41301727294922, 57.28642272949219, 60.15941619873047, 54.14629364013672, 57.02384948730469, 59.89665222167969, 62.76691436767578, 53.869773864746094, 56.74031066894531, 59.61851501464844, 62.490089416503906, 53.72765350341797, 56.59626007080078, 59.471923828125, 62.34130096435547, 53.18501281738281, 56.0487060546875, 58.935707092285156, 53.72172546386719, 56.60149383544922, 59.479393005371094, 62.36207580566406, 52.931175231933594, 55.808128356933594, 58.69468688964844, 61.57740783691406, 64.4623794555664, 55.390663146972656, 58.292152404785156, 61.18303680419922, 64.07197570800781, 55.13373565673828, 58.026939392089844, 53.439842224121094, 56.33018493652344, 59.21415710449219, 62.10950469970703, 52.95362091064453, 55.84739685058594, 58.74603271484375, 61.64270782470703, 64.53530883789062, 55.624794006347656, 58.52216339111328, 61.422210693359375, 64.32199096679688, 55.314666748046875, 58.21473693847656, 61.11639404296875, 55.266929626464844, 58.16767120361328, 61.075347900390625, 63.98773193359375, 55.28886413574219, 58.197669982910156, 61.099647521972656, 64.00455474853516, 55.121742248535156, 58.03411102294922, 60.93894958496094, 63.85041809082031, 54.799293518066406, 57.701820373535156, 60.61981201171875, 54.1199951171875, 57.03929138183594, 59.95587921142578, 62.87726593017578, 53.55955505371094, 56.46440124511719, 59.38451385498047, 62.303688049316406, 53.39630889892578, 56.307594299316406, 59.23297882080078, 62.165283203125, 65.08792114257812, 56.255523681640625, 59.18341064453125, 62.11559295654297, 55.92967987060547, 58.84790802001953, 61.77545166015625, 64.704345703125, 55.22852325439453, 58.16297149658203, 61.104583740234375, 64.03164672851562, 55.065948486328125, 57.99341583251953, 60.92420196533203, 63.85675048828125, 54.982269287109375, 57.91815185546875, 60.862022399902344, 53.777076721191406, 56.70885467529297, 59.65208435058594, 62.59733581542969, 65.53596496582031, 55.963623046875, 58.90252685546875, 61.85261535644531, 64.7962875366211, 55.93750762939453, 58.87397003173828, 61.811309814453125, 64.758056640625, 55.762062072753906, 58.705589294433594, 61.652610778808594, 64.60273742675781, 56.24235534667969, 59.1956787109375, 62.14171600341797, 65.1236572265625, 55.97611999511719, 58.91886901855469, 61.86670684814453, 64.82123565673828, 55.78118896484375, 58.72650909423828, 61.685096740722656, 64.64163970947266, 55.71098327636719, 58.66648864746094, 61.61885070800781, 64.58132934570312, 56.4779052734375, 59.43348693847656, 62.39866638183594, 65.36144256591797, 55.95843505859375, 58.92303466796875, 61.885101318359375, 64.85250091552734, 56.02168273925781, 58.98835754394531, 61.94209289550781, 64.90632629394531, 55.93879699707031, 58.90657043457031, 61.87236022949219, 64.8358154296875, 55.97180938720703, 58.943397521972656, 61.90974426269531, 64.88985443115234, 56.180397033691406, 59.154823303222656, 62.130958557128906, 65.10709381103516, 56.23278045654297, 59.216758728027344, 62.183921813964844, 65.15880584716797, 56.2164306640625, 59.19734191894531, 62.17863464355469, 65.15467834472656, 55.44200897216797, 58.428733825683594, 61.40679931640625, 64.39033508300781, 55.69734191894531, 58.68360900878906, 61.66523742675781, 64.65989685058594, 55.65135192871094, 58.63236999511719, 61.61732482910156, 64.60493469238281, 55.90153503417969, 58.89408874511719, 61.89012145996094, 64.88505554199219, 55.114013671875, 58.11940002441406, 61.114891052246094, 64.11278533935547, 55.40996551513672, 58.40599822998047, 61.39971160888672, 64.39464569091797, 55.451698303222656, 58.455665588378906, 61.46582794189453, 64.4649429321289, 55.683380126953125, 58.69109344482422, 61.698768615722656, 64.70225524902344, 54.838134765625, 57.85009765625, 60.85710144042969, 63.860198974609375, 55.217262268066406, 58.225311279296875, 61.23908233642578, 64.2590560913086, 55.37263488769531, 58.38774108886719, 61.40394592285156, 64.41874694824219, 55.681785583496094, 58.699668884277344, 61.714744567871094, 64.74712371826172, 55.64606475830078, 57.39469909667969, 60.40803527832031, 63.43220520019531, 66.45133972167969, 57.11670684814453, 60.138343811035156, 63.159217834472656, 66.18106842041016, 57.42938232421875, 60.462066650390625, 63.48052978515625, 66.51400756835938, 57.60437774658203, 60.63945770263672, 63.67509460449219, 66.71664428710938, 56.62486267089844, 59.66194152832031, 62.69309997558594, 65.73030090332031, 56.34632110595703, 59.383506774902344, 62.41899871826172, 65.4544448852539, 56.80989074707031, 59.85404968261719, 62.88294982910156, 65.91717529296875, 57.06230926513672, 60.086997985839844, 63.12196350097656, 66.15736389160156, 55.57269287109375, 58.6063232421875, 61.649261474609375, 64.69488525390625, 55.81056213378906, 58.85247039794922, 61.897377014160156, 64.95115661621094, 56.01630401611328, 59.06324005126953, 62.114044189453125, 65.1722640991211, 56.547340393066406, 59.600799560546875, 62.65648651123047, 65.71025848388672, 56.746368408203125, 56.863914489746094, 59.91851043701172, 62.975608825683594, 66.03596496582031, 56.60997009277344, 59.66954040527344, 62.72978210449219, 65.79130554199219, 56.784446716308594, 59.849891662597656, 62.91212463378906, 65.97779846191406, 57.266937255859375, 60.33966064453125, 63.412315368652344, 66.48409271240234, 57.75933074951172, 57.46266174316406, 60.539459228515625, 63.614410400390625, 66.68310546875, 57.29163360595703, 60.36732482910156, 63.44147491455078, 66.5214614868164, 57.845611572265625, 60.923095703125, 63.999755859375, 67.07971954345703, 58.26708984375, 61.33360290527344, 64.40861511230469, 67.47810363769531, 58.75163269042969, 58.835716247558594, 61.912254333496094, 64.9912338256836, 68.07315063476562, 58.65099334716797, 61.73815155029297, 64.81649017333984, 67.90676879882812, 59.13933563232422, 62.22032928466797, 65.30355072021484, 68.39422607421875, 59.542701721191406, 62.633544921875, 65.72793579101562, 56.94910430908203, 60.049957275390625, 58.574668884277344, 61.66627502441406, 64.76596069335938, 67.86166381835938, 58.810089111328125, 61.908363342285156, 65.00507354736328, 68.10662841796875, 59.36554718017578, 62.46961212158203, 65.5761489868164, 68.67051696777344, 59.75623321533203, 62.86598205566406, 65.95906066894531, 57.18055725097656, 60.28025817871094, 58.33142852783203, 61.43718719482422, 64.54866027832031, 67.65025329589844, 58.5107421875, 61.62450408935547, 64.7326889038086, 67.8440170288086, 59.02018737792969, 62.13298797607422, 65.25237274169922, 68.3693618774414, 59.77970886230469, 62.88441467285156, 65.99971008300781, 69.10930633544922, 60.247703552246094, 59.189842224121094, 63.083961486816406, 66.20460510253906, 60.61589050292969, 64.18536376953125, 67.30371856689453, 58.62989044189453, 61.75115203857422, 64.87371063232422, 67.98759460449219, 59.366912841796875, 62.49158477783203, 65.61966705322266, 68.75675964355469, 59.92149353027344, 63.05305480957031, 66.17992401123047, 58.29789733886719, 61.42858123779297, 64.5549545288086, 67.6889419555664, 59.330230712890625, 62.452423095703125, 65.59769439697266, 68.7345962524414, 60.07823181152344, 63.21208953857422, 66.3438949584961, 57.638641357421875, 60.781951904296875, 63.92022705078125, 67.06195831298828, 58.099212646484375, 61.25043487548828, 57.52478790283203, 60.67008972167969, 63.81578063964844, 66.96092987060547, 58.465545654296875, 61.60962677001953, 64.75180053710938, 67.89625549316406, 59.203102111816406, 62.37213897705078, 65.52681732177734, 68.68721771240234, 59.94121551513672, 63.100433349609375, 66.24877166748047, 69.40699005126953, 60.73069763183594, 63.87931823730469, 59.771026611328125, 62.928199768066406, 66.07779693603516, 69.23417663574219, 60.01969909667969, 63.17457580566406, 66.3330307006836, 69.48815155029297, 60.78272247314453, 63.942359924316406, 67.11790466308594, 58.341033935546875, 61.50763702392578, 64.68169403076172, 67.85096740722656, 59.09149169921875, 62.260292053222656, 65.42112731933594, 60.30449676513672, 63.470062255859375, 66.64437866210938, 69.81717681884766, 60.81282043457031, 63.98651123046875, 67.15984344482422, 58.36335754394531, 61.537620544433594, 64.7087173461914, 67.88458251953125, 59.14073944091797, 62.32121276855469, 65.50536346435547, 68.68419647216797, 60.20628356933594, 63.38789367675781, 58.817230224609375, 62.00395202636719, 65.18831634521484, 68.36593627929688, 59.461265563964844, 62.84674835205078, 66.02314758300781, 69.21470642089844, 60.496116638183594, 63.676551818847656, 66.87873077392578, 70.06956481933594, 61.496002197265625, 64.6698226928711, 67.86035919189453, 59.04425048828125, 62.23957061767578, 65.43284606933594, 61.122406005859375, 64.32392883300781, 67.52948760986328, 58.62492370605469, 61.82073211669922, 65.02142333984375, 68.22018432617188, 59.6396484375, 62.83965301513672, 66.04583740234375, 69.24592590332031, 60.6822509765625, 63.88408660888672, 67.09095001220703, 70.29243469238281, 61.50050354003906, 64.70409393310547, 59.49739074707031, 62.69744873046875, 65.9072036743164, 69.11832427978516, 60.22343444824219, 63.43205261230469, 66.65209197998047, 69.86990356445312, 61.2030029296875, 64.41912078857422, 67.63886260986328, 70.85292053222656, 62.092506408691406, 65.31144714355469, 68.52974700927734, 59.79615020751953, 63.01487731933594, 66.23287200927734, 60.76142883300781, 63.98326873779297, 67.20889282226562, 70.4339370727539, 61.78875732421875, 65.02191925048828, 68.25381469726562, 59.63172149658203, 62.86077880859375, 66.09281158447266, 69.32671356201172, 60.63990020751953, 63.86890411376953, 67.09626770019531, 70.31868743896484, 61.66181945800781, 64.88414764404297, 59.111671447753906, 62.34196472167969, 65.57503509521484, 68.8114242553711, 60.450233459472656, 63.690887451171875, 66.92457580566406, 70.17357635498047, 61.480010986328125, 64.72406768798828, 67.96424865722656, 59.56439971923828, 62.805328369140625, 66.0530776977539, 69.29997253417969, 60.53717041015625, 63.781639099121094, 67.029052734375, 60.44762420654297, 63.7061767578125, 66.94768524169922, 70.1917724609375, 61.751747131347656, 65.00672912597656, 68.25789642333984, 59.57826232910156, 62.833091735839844, 66.08175659179688, 69.33573150634766, 60.57350158691406, 63.83314514160156, 67.07994842529297, 70.33819580078125, 61.90489196777344, 65.1650619506836, 68.42144775390625, 62.36268615722656, 65.62590789794922, 68.88357543945312, 59.8712158203125, 63.13465118408203, 66.40553283691406, 69.66756439208984, 60.92681121826172, 64.19195556640625, 67.46626281738281, 70.73174285888672, 62.18238830566406, 65.44280242919922, 68.72186279296875, 71.97696685791016, 63.23987579345703, 66.50660705566406, 61.191490173339844, 64.46853637695312, 67.7416763305664, 71.01515197753906, 62.35276794433594, 65.6311264038086, 68.90579223632812, 60.28169250488281, 63.568077087402344, 66.84628295898438, 70.13004302978516, 61.599586486816406, 64.87968444824219, 68.15612030029297, 71.438232421875, 62.63862609863281, 65.9156723022461, 69.200439453125, 61.80309295654297, 65.08819580078125, 68.3648452758789, 71.65071105957031, 63.08372497558594, 66.37642669677734, 69.66387939453125, 61.10322570800781, 64.38992309570312, 67.68202209472656, 70.9768295288086, 62.43206024169922, 65.7030029296875, 68.99823760986328, 72.29057312011719, 63.726890563964844, 67.01663208007812, 70.31156158447266, 60.87824249267578, 64.18299865722656, 67.48497772216797, 70.782958984375, 62.24633026123047, 65.55307006835938, 68.86304473876953, 72.16801452636719, 63.56764221191406, 66.87384033203125, 70.17233276367188, 61.61405944824219, 64.91304779052734, 68.21591186523438, 71.5271987915039, 62.88396453857422, 66.19085693359375, 69.49317169189453, 60.7047119140625, 64.01498413085938, 67.32845306396484, 70.6341552734375, 61.381866455078125, 64.69979095458984, 68.01565551757812, 71.32913970947266, 62.7420654296875, 66.0618667602539, 69.37574768066406, 60.98957061767578, 64.3104019165039, 67.63353729248047, 70.94802856445312, 62.32514190673828, 65.63490295410156, 68.95812225341797, 72.27838134765625, 63.410552978515625, 66.73828887939453, 70.06461334228516, 61.08135986328125, 64.4161376953125, 67.74044036865234, 71.063232421875, 62.460418701171875, 65.7906265258789, 69.11851501464844, 72.4493408203125, 63.74311828613281, 67.08309173583984, 70.4208755493164, 61.99610900878906, 65.33099365234375, 68.66584014892578, 72.01307678222656, 62.87922668457031, 66.2171859741211, 69.56156921386719, 72.90431213378906, 64.1109390258789, 67.45137786865234, 70.79251098632812, 62.191368103027344, 65.53995513916016, 68.87882995605469, 72.22125244140625, 63.73783874511719, 67.0787582397461, 70.42194366455078, 61.73016357421875, 65.07738494873047, 68.42303466796875, 71.76746368408203, 62.832542419433594, 66.17922973632812, 69.53205108642578, 72.89339447021484, 64.10794067382812, 67.46220397949219, 70.8167953491211, 62.08131408691406, 65.44366455078125, 68.79776763916016, 72.15738677978516, 63.67572021484375, 67.0318374633789, 70.3965072631836, 61.973106384277344, 65.33628845214844, 68.70189666748047, 72.06867980957031, 62.45940399169922, 65.82567596435547, 69.20158386230469, 72.5620346069336, 63.27476501464844, 66.64009857177734, 70.00318145751953, 73.37287902832031, 64.89540100097656, 68.26577758789062, 71.63251495361328, 63.23439025878906, 66.60710144042969, 69.98377227783203, 73.34431457519531, 64.7296371459961, 68.1065444946289, 71.48829650878906, 62.99327850341797, 64.17311096191406, 67.55858612060547, 70.94202423095703, 62.68987274169922, 66.07720947265625, 69.46519470214844, 72.8486557006836, 64.58161163330078, 67.97097778320312, 71.3432388305664, 62.783416748046875, 66.16426086425781, 69.54451751708984, 72.92554473876953, 64.47434997558594, 67.86334228515625, 71.24890899658203, 62.66388702392578, 62.126731872558594, 65.5186767578125, 68.91456604003906, 72.30413055419922, 63.78199005126953, 67.17811584472656, 70.57110595703125, 62.31645202636719, 65.7137451171875, 69.1142349243164, 72.5068588256836, 63.919281005859375, 67.30713653564453, 70.7005844116211, 74.10256958007812, 65.5435562133789, 68.95854949951172, 72.35730743408203, 63.737144470214844, 63.61961364746094, 67.0266342163086, 70.44058990478516, 73.84721374511719, 65.16133117675781, 68.5714111328125, 71.97498321533203, 63.667747497558594, 67.07424926757812, 70.48689270019531, 73.8967514038086, 65.402587890625, 68.8202896118164, 72.23735809326172, 63.80316925048828, 67.21380615234375, 70.64048767089844, 74.0514144897461, 65.46715545654297, 64.12030792236328, 67.54304504394531, 70.9599609375, 74.38219451904297, 65.71756744384766, 69.14256286621094, 72.57180786132812, 64.2466049194336, 67.664306640625, 71.09538269042969, 74.51678466796875, 66.21122741699219, 69.63363647460938, 73.06046295166016, 64.3664321899414, 67.79261779785156, 71.22128295898438, 74.64784240722656, 66.26786041259766, 65.30442810058594, 68.74322509765625, 72.18156433105469, 63.427833557128906, 66.86068725585938, 70.29966735839844, 73.73795318603516, 65.06554412841797, 68.50836944580078, 71.94190979003906, 63.535865783691406, 66.97972869873047, 70.41333770751953, 73.85395812988281, 65.45911407470703, 68.90776824951172, 72.35186767578125, 63.956817626953125, 67.40608215332031, 66.08878326416016, 69.53192138671875, 72.97941589355469, 64.50508880615234, 67.95655822753906, 71.40046691894531, 74.8494873046875, 66.51077270507812, 69.96003723144531, 73.4140853881836, 64.97030639648438, 68.42576599121094, 71.8800048828125, 75.34680938720703, 66.85903930664062, 70.30847930908203, 73.76338958740234, 65.36397552490234, 68.82239532470703, 65.83211517333984, 69.29724884033203, 72.75975799560547, 63.95648193359375, 67.4173355102539, 70.87816619873047, 74.3481216430664, 65.88307189941406, 69.3433837890625, 72.81135559082031, 67.90943908691406, 64.54883575439453, 64.9121322631836, 64.60948181152344, 65.28260803222656, 64.98007202148438, 64.68721008300781, 64.96472930908203, 64.76972961425781, 65.43347930908203, 65.13835906982422, 65.27604675292969, 65.07752990722656, 65.4124526977539, 65.21147918701172, 65.55510711669922, 65.3671875, 65.71649169921875, 66.35884094238281, 65.85577392578125, 65.4908218383789, 64.99613189697266, 65.34718322753906, 65.13021850585938, 65.48725128173828, 65.00584411621094, 65.62574005126953, 65.14483642578125, 65.74552154541016, 65.2855453491211, 65.90967559814453, 67.41521453857422, 67.80694580078125, 65.52992248535156, 65.88796997070312, 65.38386535644531, 66.32199096679688, 66.67806243896484, 67.28992462158203, 67.96062469482422, 65.38945007324219, 65.72511291503906, 66.38093566894531, 67.05835723876953, 67.3899917602539, 68.0223159790039, 65.48834991455078, 66.14140319824219, 66.75460815429688, 67.07125091552734, 67.7671127319336, 68.3815689086914, 65.87590026855469, 66.49988555908203, 66.84461975097656, 65.74779510498047, 66.07334899902344, 66.70597839355469, 67.3818359375, 67.73101806640625, 65.48641967773438, 65.7902603149414, 66.45386505126953, 67.08378601074219, 67.67022705078125, 68.04652404785156, 65.84732055664062, 66.1836929321289, 66.77703857421875, 67.4405288696289, 67.79840850830078, 68.38539123535156, 69.07687377929688, 66.53966522216797, 66.21026611328125, 66.9063720703125, 67.23893737792969, 67.89212036132812, 68.5399398803711, 65.97676086425781, 66.62709045410156, 67.24871063232422, 70.77216339111328, 68.24051666259766, 71.77474212646484, 69.2801513671875, 66.0647964477539, 69.59198760986328, 67.4244155883789, 70.96202850341797, 68.7039566040039, 66.11396026611328, 69.65514373779297, 67.40837097167969, 70.939208984375, 68.3805160522461, 66.13098907470703, 69.66890716552734, 67.10157775878906, 70.64318084716797, 68.4464340209961, 71.98731231689453, 69.74114990234375, 68.00509643554688, 71.55271911621094, 69.24906158447266, 68.79263305664062, 66.52135467529297, 70.06941986083984, 67.76505279541016, 71.34138488769531, 68.74266052246094, 66.48538970947266, 70.04122161865234, 67.81224060058594, 71.36117553710938, 68.76972961425781, 66.52758026123047, 70.0890884399414, 67.50206756591797, 71.06319427490234, 68.7816162109375, 72.34580993652344, 70.03929901123047, 67.47757720947266, 71.0412826538086, 69.3326416015625, 67.38127136230469, 70.94064331054688, 68.64611053466797, 66.3257064819336, 69.89642333984375, 67.33428955078125, 70.89546966552734, 68.62210083007812, 72.20246887207031, 69.9322509765625, 67.35517120361328, 70.92788696289062, 68.64580535888672, 72.22321319580078, 69.92007446289062, 67.29312133789062, 70.86903381347656, 68.69959259033203, 67.00273132324219, 70.58695220947266, 68.51813507080078, 72.1059341430664, 69.79723358154297, 67.50630950927734, 71.0908432006836, 68.79646301269531, 72.37249755859375, 69.78396606445312, 67.55227661132812, 71.13802337646484, 68.79492950439453, 72.36528778076172, 69.7968978881836, 67.4719009399414, 71.06185150146484, 68.83919525146484, 72.42102813720703, 70.13727569580078, 67.85462188720703, 71.44263458251953, 69.14144897460938, 72.72969055175781, 70.11344146728516, 67.81910705566406, 71.41775512695312, 69.12416076660156, 72.72473907470703, 70.41033172607422, 68.1073989868164, 71.71385955810547, 69.37110137939453, 72.9754638671875, 70.6325454711914, 68.0988998413086, 71.70658874511719, 69.32553100585938, 72.93247985839844, 70.69039916992188, 67.86555480957031, 71.46775817871094, 69.68907165527344, 67.3297119140625, 70.93589782714844, 68.6158218383789, 72.22344207763672, 69.95256805419922, 67.64461517333984, 71.26114654541016, 68.9958724975586, 72.61450958251953, 70.2620620727539, 67.31670379638672, 70.9377212524414, 74.55535125732422, 78.17243957519531, 69.99195098876953, 73.61360931396484, 77.23454284667969, 69.03052520751953, 72.64584350585938, 76.27418518066406, 68.00817108154297, 71.62754821777344, 75.25763702392578, 78.88592529296875, 70.34076690673828, 73.95409393310547, 77.57127380371094, 69.23595428466797, 72.86768341064453, 76.492431640625, 68.29805755615234, 70.1575698852539, 73.7861557006836, 77.42182922363281, 69.115478515625, 72.74333953857422, 76.38062286376953, 68.09906005859375, 71.74095916748047, 75.36957550048828, 79.0303726196289, 70.71205139160156, 74.36914825439453, 78.00717163085938, 69.6951675415039, 73.33270263671875, 76.97828674316406, 68.99134826660156, 72.63510131835938, 76.27922821044922, 79.9164810180664, 68.32750701904297, 71.97831726074219, 75.63473510742188, 79.28746795654297, 71.26559448242188, 74.92677307128906, 78.57889556884766, 70.53662109375, 74.18388366699219, 77.83719635009766, 69.48123931884766, 73.14248657226562, 76.80216979980469, 68.47081756591797, 72.124755859375, 75.78721618652344, 79.44400787353516, 71.37289428710938, 75.03722381591797, 78.69245147705078, 70.3564453125, 70.73843383789062, 74.40043640136719, 78.07050323486328, 69.40145111083984, 73.06865692138672, 76.73844146728516, 68.4008560180664, 72.07479095458984, 75.74054718017578, 79.41253662109375, 71.03362274169922, 74.7008056640625, 78.36141967773438, 70.24711608886719, 73.90332794189453, 77.57161712646484, 69.21220397949219, 72.88159942626953, 76.5542221069336, 80.23262023925781, 69.1838607788086, 72.87214660644531, 76.5602798461914, 68.4512710571289, 72.12814331054688, 75.79945373535156, 79.4778823852539, 71.08953094482422, 74.77335357666016, 78.45181274414062, 70.37430572509766, 74.06298828125, 77.74341583251953, 69.29883575439453, 72.9766845703125, 76.65318298339844, 80.34500885009766, 72.29008483886719, 75.97354888916016, 79.65481567382812, 71.57610321044922, 71.06100463867188, 74.77967834472656, 78.46930694580078, 69.37545776367188, 73.06010437011719, 76.75934600830078, 80.44915771484375, 72.33057403564453, 76.02547454833984, 79.72023010253906, 71.57373046875, 75.26756286621094, 78.96234893798828, 70.5743179321289, 74.27273559570312, 77.97908782958984, 69.84022521972656, 73.54862213134766, 77.255615234375, 80.95882415771484, 68.88540649414062, 72.59870147705078, 76.30757904052734, 80.01338195800781, 71.83811950683594, 75.54583740234375, 79.24715423583984, 71.0766830444336, 74.77867126464844, 78.48612213134766, 70.3575210571289, 74.06906127929688, 77.77705383300781, 69.6165771484375, 73.32279205322266, 77.03079223632812, 80.74345397949219, 72.56620025634766, 76.27294921875, 79.9887924194336, 71.95635223388672, 69.5040283203125, 73.2353744506836, 76.95713806152344, 80.67035675048828, 72.4128646850586, 76.12968444824219, 79.84989166259766, 71.6594009399414, 75.38249969482422, 79.11589050292969, 70.9414291381836, 74.66386413574219, 78.38111114501953, 70.49983215332031, 74.22564697265625, 77.95891571044922, 81.69471740722656, 73.47364807128906, 77.2020263671875, 80.93560028076172, 72.73136138916016, 70.40093231201172, 74.14515686035156, 77.87722778320312, 69.91509246826172, 73.64997863769531, 77.38516998291016, 81.11862182617188, 72.91234588623047, 76.65036010742188, 80.3969955444336, 72.13516998291016, 75.8677978515625, 79.61256408691406, 71.38206481933594, 75.1332778930664, 78.87429809570312, 70.92730712890625, 74.67391204833984, 78.41053771972656, 82.16126251220703, 74.05377960205078, 69.76732635498047, 73.52246856689453, 77.27001953125, 81.02706909179688, 72.98910522460938, 76.74120330810547, 80.49171447753906, 72.28201293945312, 76.03157806396484, 79.77912902832031, 71.5217514038086, 75.28031921386719, 79.0317153930664, 71.09986877441406, 74.85285186767578, 78.60873413085938, 82.37129974365234, 74.08329772949219, 77.8462905883789, 81.60256958007812, 73.30402374267578, 77.06796264648438, 72.52301788330078, 76.28756713867188, 80.05086517333984, 71.40218353271484, 75.17185974121094, 78.94184112548828, 70.95038604736328, 74.73126220703125, 78.50328826904297, 82.27061462402344, 74.04430389404297, 77.81675720214844, 81.59156036376953, 73.55815887451172, 77.33247375488281, 81.11270904541016, 72.7646255493164, 76.53689575195312, 80.31316375732422, 71.20964813232422, 74.99076843261719, 78.77106475830078, 82.5544204711914, 73.70063018798828, 77.48773193359375, 81.2799301147461, 73.19117736816406, 76.97086334228516, 80.76162719726562, 72.71552276611328, 76.50387573242188, 80.29439544677734, 71.97065734863281, 75.75635528564453, 79.53903198242188, 71.48052978515625, 75.2699203491211, 79.06410217285156, 82.85785675048828, 74.8530502319336, 78.64823913574219, 73.80644989013672, 77.59965515136719, 81.40140533447266, 72.95790100097656, 76.75828552246094, 80.54923248291016, 72.51860046386719, 76.32240295410156, 80.12613677978516, 72.05152130126953, 75.85025024414062, 79.64116668701172, 71.63274383544922, 75.4251937866211, 79.22700500488281, 83.0368423461914, 74.63138580322266, 78.435791015625, 82.2394027709961, 74.18460845947266, 77.995361328125, 71.19994354248047, 75.01646423339844, 78.82972717285156, 82.64151763916016, 74.5700454711914, 78.38140869140625, 82.19500732421875, 74.06712341308594, 77.88301086425781, 81.69428253173828, 73.70631408691406, 77.52983093261719, 81.34400177001953, 73.13467407226562, 76.95367431640625, 80.78301239013672, 72.7328109741211, 76.55207824707031, 80.38495635986328, 72.23819732666016, 76.06513214111328, 79.89205932617188, 83.72020721435547, 74.73269653320312, 78.56063079833984, 82.38500213623047, 74.17790222167969, 78.00309753417969, 81.83679962158203, 73.75444793701172, 77.61124420166016, 81.45059967041016, 73.30703735351562, 77.1385498046875, 80.9702377319336, 72.85103607177734, 76.69508361816406, 80.5389175415039, 72.70296478271484, 76.54026794433594, 80.3843765258789, 72.23802947998047, 76.0814208984375, 79.92538452148438, 83.7711410522461, 74.36737060546875, 78.20819091796875, 82.0543441772461, 74.15382385253906, 78.0035171508789, 81.8489761352539, 74.02871704101562, 77.88558197021484, 81.74413299560547, 73.61669158935547, 77.46626281738281, 81.3128433227539, 73.1429214477539, 76.99713134765625, 80.8572998046875, 72.9804458618164, 76.8326416015625, 80.69072723388672, 72.53964233398438, 76.39244079589844, 80.25611877441406, 84.12329864501953, 74.35897064208984, 78.21321105957031, 82.08134460449219, 73.83976745605469, 77.70291900634766, 81.56805419921875, 73.41373443603516, 77.27576446533203, 81.148193359375, 73.3525161743164, 77.22919464111328, 81.09506225585938, 72.83139038085938, 76.70391082763672, 80.57518005371094, 72.66815185546875, 76.55081176757812, 80.4240951538086, 84.29103088378906, 76.03948974609375, 79.91692352294922, 83.7957992553711, 74.6737289428711, 78.55168914794922, 82.42882537841797, 73.53468322753906, 77.40126037597656, 81.2771987915039, 73.3712158203125, 77.25249481201172, 81.1308822631836, 73.2203369140625, 77.09566497802734, 80.97465515136719, 72.79318237304688, 76.67762756347656, 80.55292510986328, 84.4364013671875, 76.50286865234375, 80.39248657226562, 84.27922821044922, 76.38509368896484, 80.27174377441406, 84.15272521972656, 75.0256118774414, 78.92626953125, 82.82720947265625, 74.74580383300781, 78.63993072509766, 82.53604888916016, 74.6440658569336, 78.54179382324219, 82.44447326660156, 74.50228118896484, 78.40733337402344, 82.31184387207031, 74.32035827636719, 78.21833801269531, 82.1221694946289, 73.89990997314453, 77.79986572265625, 81.706787109375, 73.72421264648438, 77.63739013671875, 81.54003143310547, 73.56340789794922, 75.62752532958984, 79.54319763183594, 83.45420837402344, 75.41014099121094, 79.31965637207031, 83.22296905517578, 75.26806640625, 79.18869018554688, 83.10396575927734, 75.1298828125, 79.05022430419922, 82.96797943115234, 74.95955657958984, 78.88146209716797, 82.80022430419922, 74.7922592163086, 78.71666717529297, 82.62785339355469, 74.68282318115234, 78.59944915771484, 82.52116394042969, 74.5239486694336, 75.31114959716797, 79.23724365234375, 83.15923309326172, 75.40747833251953, 79.33490753173828, 83.26290893554688, 75.23027038574219, 79.1537857055664, 83.0766372680664, 75.12995910644531, 79.06092071533203, 82.98938751220703, 74.96912384033203, 78.9031753540039, 82.83594512939453, 74.76139068603516, 78.6984634399414, 82.63140869140625, 74.65058135986328, 78.57595825195312, 82.5196533203125, 74.47506713867188, 75.31814575195312, 79.25802612304688, 83.20159149169922, 75.35188293457031, 79.29826354980469, 83.24283599853516, 75.50363159179688, 79.44890594482422, 83.39498138427734, 75.36031341552734, 79.30461883544922, 83.25243377685547, 75.25228118896484, 79.20735931396484, 83.15306854248047, 75.0536117553711, 79.00231170654297, 82.95976257324219, 75.25320434570312, 79.20211791992188, 83.15715789794922, 75.07086181640625, 74.25827026367188, 78.2096176147461, 82.15743255615234, 74.02593231201172, 77.9940414428711, 81.95958709716797, 74.22014617919922, 78.18975067138672, 82.14739227294922, 74.02974700927734, 77.99422454833984, 81.95796966552734, 85.92460632324219, 77.8243408203125, 81.79177856445312, 85.75765991210938, 78.03980255126953, 82.0048828125, 85.973388671875, 77.8529052734375, 81.81832885742188, 85.7957763671875, 78.08171844482422, 77.44717407226562, 81.42025756835938, 85.38739013671875, 76.96784973144531, 80.95091247558594, 84.92475128173828, 77.12382507324219, 81.10411071777344, 85.07611846923828, 77.00041198730469, 80.98526763916016, 84.9676284790039, 77.14057922363281, 81.12342834472656, 85.10877990722656, 77.00065612792969, 80.99028015136719, 84.98042297363281, 77.21367645263672, 81.21215057373047, 85.20336151123047, 77.38101196289062, 75.23322296142578, 79.23209381103516, 83.22650909423828, 75.2976303100586, 79.2816390991211, 83.27278900146484, 75.48497009277344, 79.48002624511719, 83.47251892089844, 75.65288543701172, 79.6530990600586, 83.65404510498047, 75.5268783569336, 79.53365325927734, 83.5361557006836, 75.67288208007812, 79.67929077148438, 83.6842041015625, 75.84418487548828, 79.84540557861328, 83.8415298461914, 76.06593322753906, 80.07185363769531, 78.2190933227539, 82.2220230102539, 86.23114776611328, 77.93118286132812, 81.94869995117188, 85.95919799804688, 78.13949584960938, 82.16183471679688, 86.18002319335938, 78.30728912353516, 82.3216323852539, 86.33374786376953, 78.47483825683594, 82.49058532714844, 86.51390075683594, 78.6262435913086, 82.6500473022461, 86.68016815185547, 78.8289794921875, 82.84841918945312, 86.86611938476562, 78.9593276977539, 76.19418334960938, 80.21612548828125, 84.22832489013672, 76.23021697998047, 80.26183319091797, 84.2916488647461, 76.42768859863281, 80.45069885253906, 84.47792053222656, 76.57707977294922, 80.61299896240234, 84.6472396850586, 76.80207061767578, 80.83203887939453, 84.87299346923828, 76.92130279541016, 80.95877838134766, 84.99707794189453, 77.11979675292969, 81.15776824951172, 85.18733978271484, 77.30636596679688, 81.3470458984375, 76.48605346679688, 80.52899932861328, 84.57868194580078, 76.54710388183594, 80.59498596191406, 84.64623260498047, 76.73267364501953, 80.77481842041016, 84.81660461425781, 77.22695922851562, 81.27505493164062, 85.32086181640625, 77.4388198852539, 81.48831939697266, 85.53412628173828, 77.59516906738281, 81.65010070800781, 85.71690368652344, 77.7437973022461, 81.79061126708984, 85.8438949584961, 77.91061401367188, 81.967529296875, 77.82645416259766, 81.88040924072266, 85.94403839111328, 77.5751724243164, 81.63043975830078, 85.6875991821289, 77.74404907226562, 81.8076171875, 85.87066650390625, 77.9533462524414, 82.02973937988281, 86.09696960449219, 78.38854217529297, 82.46383666992188, 86.52618408203125, 78.56451416015625, 82.64099884033203, 86.70670318603516, 79.13365936279297, 83.20812225341797, 87.28365325927734, 79.23898315429688, 83.31275177001953, 77.16472625732422, 81.24230194091797, 85.31444549560547, 76.8790283203125, 80.9571533203125, 85.03153228759766, 77.0547103881836, 81.14189910888672, 85.21786499023438, 77.5376968383789, 81.61824035644531, 85.69416809082031, 77.69554138183594, 81.76451873779297, 85.8454818725586, 77.8460922241211, 81.92864990234375, 86.00729370117188, 78.38398742675781, 82.47273254394531, 86.56120300292969, 78.87496948242188, 82.95791625976562, 77.22434997558594, 81.31263732910156, 85.39891052246094, 77.17135620117188, 81.26239013671875, 85.35157012939453, 77.6961441040039, 81.79251861572266, 85.88846588134766, 78.19927215576172, 82.29717254638672, 86.40111541748047, 78.36770629882812, 82.46612548828125, 86.56768798828125, 78.85679626464844, 82.95936584472656, 87.06151580810547, 79.43963623046875, 83.54351806640625, 87.64437866210938, 79.5827407836914, 83.69389343261719, 87.80421447753906, 79.47654724121094, 83.5886459350586, 87.70272064208984, 79.51734924316406, 83.62779235839844, 87.73455047607422, 79.7051773071289, 83.81910705566406, 87.93009948730469, 80.21444702148438, 84.33212280273438, 88.45187377929688, 80.77861022949219, 84.9020004272461, 77.10993194580078, 81.2281723022461, 85.35498046875, 77.6926498413086, 81.80681610107422, 85.92870330810547, 77.86067199707031, 81.97694396972656, 86.10157775878906, 77.38872528076172, 81.5149154663086, 85.62835693359375, 77.8202133178711, 81.94979858398438, 86.07745361328125, 78.30754852294922, 82.44085693359375, 86.568603515625, 78.97663879394531, 83.11150360107422, 87.2473373413086, 79.35711669921875, 83.49369049072266, 87.62848663330078, 80.18494415283203, 84.322265625, 88.45914459228516, 80.64961242675781, 84.79866790771484, 88.93419647216797, 81.21537780761719, 85.36219787597656, 89.50594329833984, 80.69134521484375, 84.83706665039062, 77.14331817626953, 81.28990173339844, 85.43626403808594, 77.61112976074219, 81.7702865600586, 85.93004608154297, 78.17717742919922, 82.3264389038086, 86.48013305664062, 78.99836730957031, 83.14817810058594, 87.30571746826172, 79.47897338867188, 83.62799072265625, 87.78290557861328, 80.01069641113281, 84.16167449951172, 88.3259506225586, 80.51480865478516, 84.6769790649414, 88.83815002441406, 77.92981719970703, 82.09156799316406, 86.25450134277344, 78.460205078125, 82.6154556274414, 86.77994537353516, 79.30345916748047, 83.47380828857422, 87.63922119140625, 79.88575744628906, 84.05567932128906, 88.22969818115234, 80.36367797851562, 84.52896118164062, 88.7016372680664, 80.87629699707031, 85.04915618896484, 89.22588348388672, 81.74293518066406, 85.91004943847656, 90.08824920654297, 82.29428100585938, 86.48350524902344, 78.66828155517578, 82.84185028076172, 81.4603500366211, 85.63284301757812, 89.8082275390625, 81.5683364868164, 85.74488830566406, 77.91929626464844, 82.10618591308594, 86.28074645996094, 78.78544616699219, 82.97203826904297, 87.1573715209961, 79.28064727783203, 83.47068786621094, 87.6560287475586, 79.79135131835938, 83.979736328125, 88.16767120361328, 80.66094207763672, 84.86447143554688, 89.0507583618164, 81.17640686035156, 85.37724304199219, 89.57073211669922, 82.09693908691406, 81.76114654541016, 85.96223449707031, 78.41130828857422, 82.60202026367188, 86.7999038696289, 79.25741577148438, 83.45816802978516, 87.65464782714844, 79.80155944824219, 84.00849914550781, 88.2066879272461, 80.66693878173828, 84.86708068847656, 89.07817840576172, 81.15585327148438, 85.3531494140625, 89.56195831298828, 82.04113006591797, 86.25167083740234, 90.47308349609375, 82.54895782470703, 86.75853729248047, 79.20958709716797, 78.2813720703125, 82.50263977050781, 86.71107482910156, 79.1098861694336, 83.31796264648438, 87.53421020507812, 79.96967315673828, 84.17774200439453, 88.38853454589844, 80.47017669677734, 84.694580078125, 88.91703033447266, 81.3298568725586, 85.55239868164062, 89.7672119140625, 82.19927215576172, 86.42137908935547, 90.64736938476562, 82.74637603759766, 86.97776794433594, 79.4014663696289, 83.63260650634766, 87.85398864746094, 80.21392822265625, 84.45020294189453, 82.46151733398438, 86.69947052001953, 79.05196380615234, 83.28662109375, 87.52106475830078, 79.94912719726562, 84.18360137939453, 88.41789245605469, 80.76543426513672, 85.0288314819336, 89.26235961914062, 81.68644714355469, 85.9306869506836, 90.17355346679688, 82.22138977050781, 86.46318817138672, 90.70101928710938, 83.10307312011719, 87.34859466552734, 79.71910858154297, 83.97039031982422, 88.21051025390625, 80.55268859863281, 84.79891204833984, 81.81930541992188, 86.07462310791016, 90.31245422363281, 82.93655395507812, 87.184814453125, 79.5444564819336, 83.79669189453125, 88.04895782470703, 80.40354919433594, 84.65447235107422, 88.90740966796875, 80.97576904296875, 85.23169708251953, 89.48768615722656, 81.842041015625, 86.09305572509766, 90.35367584228516, 82.72527313232422, 86.99496459960938, 91.25858306884766, 83.56343841552734, 87.82894897460938, 80.20105743408203, 84.46642303466797, 80.32354736328125, 84.59491729736328, 88.85847473144531, 80.80209350585938, 85.07129669189453, 89.33836364746094, 81.64944458007812, 85.92566680908203, 90.19636535644531, 82.53570556640625, 86.8090591430664, 91.08253479003906, 83.40988159179688, 87.68671417236328, 80.0797119140625, 84.35580444335938, 88.63431549072266, 80.87212371826172, 85.1573486328125, 89.42294311523438, 81.75936126708984, 86.05167388916016, 90.32810974121094, 82.66598510742188, 86.9511489868164, 82.57015228271484, 86.84921264648438, 91.13562774658203, 83.26361083984375, 87.54923248291016, 79.8610610961914, 84.15736389160156, 88.45726776123047, 81.08494567871094, 85.38780975341797, 89.68673706054688, 81.9913558959961, 86.28375244140625, 90.5827407836914, 82.88668060302734, 87.17462158203125, 91.46646881103516, 83.74999237060547, 88.0450439453125, 80.69649505615234, 84.98800659179688, 89.27924346923828, 81.53838348388672, 85.84222412109375, 90.14282989501953, 83.29535675048828, 87.5990219116211, 80.0423812866211, 84.33642578125, 88.64374542236328, 80.89861297607422, 85.20309448242188, 89.51251983642578, 82.16202545166016, 86.46083068847656, 90.77362060546875, 83.04666900634766, 87.36137390136719, 91.66759490966797, 83.95282745361328, 88.26463317871094, 80.89522552490234, 85.21058654785156, 89.52102661132812, 81.71387481689453, 86.03990936279297, 90.35260009765625, 82.97512817382812, 87.28604888916016, 80.61052703857422, 84.93799591064453, 89.25981140136719, 81.45833587646484, 85.7781753540039, 90.09953308105469, 82.71461486816406, 87.03902435302734, 91.36917114257812, 83.58485412597656, 87.91277313232422, 92.2388916015625, 84.79683685302734, 89.11721801757812, 81.3837661743164, 85.72166442871094, 90.05242156982422, 82.60306549072266, 86.93736267089844, 91.26338958740234, 83.5244140625, 87.85782623291016, 92.20075988769531, 84.71500396728516, 89.05116271972656, 93.39144134521484, 84.48441314697266, 88.83031463623047, 81.4609146118164, 85.80857849121094, 90.15499877929688, 82.70274353027344, 87.04718017578125, 91.39356231689453, 83.61408996582031, 87.9522705078125, 92.29456329345703, 84.8023910522461, 89.14408111572266, 81.70479583740234, 86.04898834228516, 90.39454650878906, 82.6163101196289, 86.96395111083984, 91.32009887695312, 83.85643768310547, 88.21258544921875, 92.55738067626953, 85.09649658203125, 89.4454116821289, 93.80138397216797, 84.83845520019531, 89.1910400390625, 81.79414367675781, 86.13961029052734, 90.49735260009766, 83.08635711669922, 87.44132232666016, 91.79908752441406, 84.30045318603516, 88.65959167480469, 93.02315521240234, 85.19815826416016, 89.56977844238281, 82.04071044921875, 86.40873718261719, 90.7795639038086, 83.301513671875, 87.67108917236328, 92.03536224365234, 84.54165649414062, 88.90550231933594, 93.27877044677734, 85.77814483642578, 90.15233612060547, 82.69731140136719, 85.21627807617188, 89.59278106689453, 81.78935241699219, 86.16866302490234, 90.54559326171875, 83.03543090820312, 87.41339874267578, 91.79442596435547, 84.2803955078125, 88.67027282714844, 93.05562591552734, 85.54203796386719, 89.9205551147461, 82.4017105102539, 86.78527069091797, 91.17428588867188, 83.67032623291016, 88.06419372558594, 92.44857788085938, 84.91168975830078, 89.30490112304688, 93.69144439697266, 85.81343078613281, 90.20281982421875, 82.71944427490234, 84.20951080322266, 88.6124496459961, 93.00912475585938, 85.36886596679688, 89.76313781738281, 82.24113464355469, 86.638427734375, 91.03800201416016, 83.52079772949219, 87.91854095458984, 92.3167495727539, 84.80043029785156, 89.20474243164062, 93.60822296142578, 86.04391479492188, 90.44574737548828, 82.8709945678711, 87.28009796142578, 91.69158172607422, 84.11522674560547, 88.52462768554688, 92.93147277832031, 85.7753677368164, 90.18589782714844, 94.59365844726562, 84.16058349609375, 88.58069610595703, 92.9936752319336, 85.00814819335938, 89.43378448486328, 82.23905944824219, 86.6556625366211, 91.064697265625, 83.50428771972656, 87.9251708984375, 92.34547424316406, 84.7695083618164, 89.19038391113281, 93.61099243164062, 86.01017761230469, 90.4249267578125, 82.88404846191406, 87.304443359375, 91.73096466064453, 84.5118179321289, 88.93978881835938, 93.36515045166016, 85.787841796875, 90.21647644042969, 94.6451416015625, 82.57351684570312, 87.01182556152344] }, { label: 'JSHeapTotalSize', backgroundColor: 'rgba(118, 118, 118, 0.2)', borderColor: 'rgba(118, 118, 118, 1.00)', - data: [9.87109375, 10.12109375, 10.62109375, 10.62109375, 10.62109375, 10.66796875, 10.66796875, 10.66796875, 10.66796875, 10.66796875, 7.66796875, 7.66796875, 7.5390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.0390625, 7.2890625, 7.2890625, 7.2890625, 7.2890625, 7.2890625, 7.2890625, 7.2890625, 7.2890625, 7.2890625] + data: [11.12109375, 11.37109375, 11.62109375, 11.62109375, 11.62109375, 11.66796875, 11.91796875, 12.16796875, 8.0390625, 8.0390625, 9.0390625, 9.0390625, 9.0390625, 9.0390625, 9.0390625, 11.0390625, 11.0390625, 11.0390625, 11.0390625, 11.0390625, 11.2890625, 8.2890625, 11.2890625, 11.2890625, 11.7890625, 11.7890625, 11.7890625, 8.7890625, 11.7890625, 11.7890625, 11.7890625, 9.0390625, 10.0390625, 10.0390625, 12.5390625, 12.5390625, 12.5390625, 12.7890625, 12.7890625, 12.7890625, 12.7890625, 12.7890625, 12.7890625, 17.0390625, 17.0390625, 17.0390625, 17.2890625, 17.2890625, 17.2890625, 17.7890625, 17.7890625, 18.2890625, 18.2890625, 18.2890625, 18.2890625, 18.2890625, 18.5390625, 18.5390625, 18.5390625, 19.0390625, 19.0390625, 27.5390625, 27.5390625, 27.5390625, 27.5390625, 27.5390625, 27.5390625, 27.5390625, 27.5390625, 27.5390625, 27.5390625, 27.5390625, 28.7890625, 29.2890625, 29.2890625, 29.2890625, 29.2890625, 29.2890625, 29.2890625, 29.2890625, 29.2890625, 14.5390625, 14.2890625, 15.2890625, 15.2890625, 15.5390625, 15.5390625, 14.5390625, 14.5390625, 14.5390625, 14.5390625, 14.5390625, 14.5390625, 14.5390625, 14.5390625, 14.5390625, 14.5390625, 14.5390625, 14.5390625, 14.5390625, 14.5390625, 14.5390625, 14.5390625, 14.5390625, 14.5390625, 14.5390625, 14.5390625, 14.5390625, 14.5390625, 14.5390625, 14.7890625, 14.7890625, 14.7890625, 14.7890625, 14.7890625, 14.7890625, 14.7890625, 14.7890625, 14.7890625, 14.7890625, 14.7890625, 14.7890625, 14.7890625, 14.7890625, 14.7890625, 14.7890625, 14.9296875, 14.9296875, 14.9296875, 14.9296875, 14.9296875, 15.1796875, 15.1796875, 15.1796875, 15.1796875, 15.1796875, 15.1796875, 15.1796875, 15.1796875, 15.1796875, 15.1796875, 15.1796875, 15.1796875, 15.1796875, 16.1796875, 15.1796875, 15.1796875, 15.1796875, 15.1796875, 15.1796875, 16.1796875, 15.1796875, 15.1796875, 15.1796875, 15.1796875, 15.1796875, 15.1796875, 15.1796875, 15.1796875, 15.1796875, 15.1796875, 15.1796875, 15.1796875, 15.1796875, 15.1796875, 15.1796875, 15.1796875, 15.1796875, 15.1796875, 15.1796875, 15.1796875, 18.1796875, 18.1796875, 15.1796875, 15.1796875, 15.4296875, 15.4296875, 15.6796875, 16.6796875, 16.6796875, 16.6796875, 18.6796875, 18.6796875, 15.6796875, 15.6796875, 15.6796875, 15.6796875, 15.6796875, 16.6796875, 16.6796875, 15.6796875, 16.6796875, 15.6796875, 15.6796875, 15.6796875, 16.6796875, 16.6796875, 16.6796875, 16.6796875, 16.890625, 19.140625, 19.140625, 19.140625, 19, 19, 19, 19, 19, 19, 19, 16, 16, 16, 16, 16, 16.25, 16.25, 16.25, 17.25, 17.25, 17.25, 17.25, 17.25, 16.25, 16.25, 16.25, 16.25, 16.25, 17.25, 17.5, 17.75, 17.75, 17.75, 17.75, 16.75, 16.75, 16.75, 16.75, 16.75, 17.75, 17.75, 17.75, 17.75, 17.75, 17.75, 17.75, 16.75, 17.75, 16.75, 16.75, 16.75, 17.75, 17.75, 17.75, 17.75, 17.75, 17.75, 17.75, 17.75, 17.75, 20, 20, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18.5, 18.5, 20.75, 20.25, 20.25, 17.25, 17.25, 17.25, 17.25, 17.25, 18.25, 18.25, 18.25, 18.25, 18.25, 18.25, 20.25, 20.5, 20.5, 20.5, 20.5, 20.5, 20.5, 20.5, 20.5, 20.5, 20.5, 20.5, 20.5, 17.75, 17.75, 18.75, 18.75, 18.75, 18.75, 18.75, 19.06640625, 18.06640625, 19.06640625, 21.06640625, 21.06640625, 21.06640625, 21.06640625, 21.06640625, 20.85546875, 20.85546875, 20.85546875, 20.85546875, 20.85546875, 20.85546875, 20.85546875, 20.85546875, 20.85546875, 20.85546875, 20.85546875, 21.10546875, 21.35546875, 21.60546875, 21.10546875, 21.10546875, 21.10546875, 21.10546875, 21.10546875, 21.10546875, 25.35546875, 25.35546875, 18.10546875, 19.35546875, 19.35546875, 19.35546875, 19.35546875, 19.35546875, 19.35546875, 19.35546875, 19.35546875, 19.35546875, 19.35546875, 21.35546875, 21.35546875, 21.35546875, 21.35546875, 21.35546875, 21.35546875, 21.35546875, 21.35546875, 21.35546875, 21.35546875, 21.35546875, 21.35546875, 21.35546875, 21.35546875, 21.35546875, 21.35546875, 21.35546875, 21.35546875, 21.35546875, 21.35546875, 21.35546875, 21.35546875, 21.35546875, 21.35546875, 21.35546875, 25.35546875, 25.35546875, 25.35546875, 25.35546875, 25.35546875, 25.35546875, 25.35546875, 25.35546875, 25.35546875, 25.35546875, 25.35546875, 25.35546875, 25.35546875, 25.35546875, 25.35546875, 25.35546875, 25.35546875, 25.35546875, 25.35546875, 25.35546875, 25.35546875, 25.60546875, 25.60546875, 25.60546875, 25.85546875, 25.85546875, 25.85546875, 25.85546875, 25.85546875, 25.85546875, 26.10546875, 26.10546875, 26.10546875, 26.10546875, 26.10546875, 26.10546875, 26.35546875, 26.35546875, 26.35546875, 26.35546875, 26.35546875, 26.35546875, 26.35546875, 26.35546875, 26.35546875, 26.35546875, 26.35546875, 26.35546875, 26.35546875, 26.35546875, 26.35546875, 26.35546875, 26.35546875, 26.35546875, 26.35546875, 26.35546875, 26.35546875, 26.35546875, 26.35546875, 26.35546875, 26.35546875, 26.35546875, 26.35546875, 26.35546875, 26.35546875, 26.35546875, 34.35546875, 34.35546875, 34.35546875, 34.35546875, 34.35546875, 34.35546875, 34.35546875, 34.35546875, 34.35546875, 34.35546875, 34.35546875, 34.35546875, 34.35546875, 34.35546875, 34.35546875, 34.35546875, 34.35546875, 34.35546875, 34.35546875, 34.35546875, 34.35546875, 34.35546875, 34.35546875, 34.35546875, 34.35546875, 34.60546875, 34.60546875, 34.60546875, 34.60546875, 34.60546875, 34.60546875, 35.078125, 35.078125, 35.078125, 35.828125, 35.828125, 35.828125, 35.828125, 35.828125, 35.828125, 36.078125, 36.078125, 36.078125, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 35.76171875, 36.01171875, 36.01171875, 36.01171875, 36.01171875, 36.01171875, 36.01171875, 36.01171875, 36.01171875, 36.01171875, 36.01171875, 36.01171875, 36.01171875, 36.01171875, 36.01171875, 36.01171875, 36.26171875, 36.26171875, 36.26171875, 36.26171875, 36.26171875, 36.26171875, 36.26171875, 36.26171875, 36.26171875, 36.51171875, 36.51171875, 36.51171875, 36.51171875, 36.51171875, 37.01171875, 37.01171875, 37.01171875, 37.01171875, 37.01171875, 37.01171875, 37.01171875, 37.01171875, 37.01171875, 37.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.01171875, 53.76171875, 53.76171875, 53.76171875, 53.76171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.26171875, 54.96875, 54.96875, 54.96875, 54.96875, 55.21875, 55.21875, 54.74609375, 54.74609375, 54.74609375, 54.74609375, 54.74609375, 54.74609375, 54.74609375, 54.74609375, 54.74609375, 54.74609375, 54.74609375, 54.74609375, 54.74609375, 54.74609375, 54.49609375, 54.49609375, 54.74609375, 54.74609375, 54.74609375, 54.74609375, 54.74609375, 54.74609375, 54.74609375, 54.99609375, 54.99609375, 54.99609375, 54.99609375, 54.99609375, 54.99609375, 54.99609375, 54.99609375, 54.99609375, 54.99609375, 54.99609375, 54.99609375, 54.99609375, 54.99609375, 54.99609375, 54.99609375, 54.99609375, 54.99609375, 54.99609375, 54.99609375, 54.99609375, 55.24609375, 55.24609375, 55.24609375, 55.24609375, 55.24609375, 55.24609375, 55.24609375, 55.24609375, 55.74609375, 55.74609375, 55.74609375, 55.74609375, 55.74609375, 55.74609375, 55.99609375, 55.99609375, 55.99609375, 55.99609375, 55.99609375, 55.99609375, 55.99609375, 55.99609375, 55.99609375, 55.99609375, 56.24609375, 56.24609375, 56.24609375, 56.24609375, 56.24609375, 55.99609375, 55.99609375, 55.99609375, 55.99609375, 55.99609375, 55.99609375, 55.99609375, 55.99609375, 55.99609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 55.99609375, 55.99609375, 55.99609375, 55.99609375, 55.99609375, 55.99609375, 55.99609375, 55.99609375, 55.99609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.49609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 56.74609375, 56.74609375, 56.74609375, 56.74609375, 56.74609375, 56.74609375, 56.74609375, 56.74609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 56.99609375, 57.49609375, 57.49609375, 57.49609375, 57.49609375, 57.49609375, 57.49609375, 57.74609375, 57.74609375, 57.74609375, 57.74609375, 57.74609375, 57.74609375, 57.74609375, 57.74609375, 57.74609375, 57.74609375, 57.74609375, 57.74609375, 57.74609375, 57.74609375, 57.74609375, 57.74609375, 57.74609375, 57.74609375, 57.74609375, 57.74609375, 57.74609375, 57.74609375, 57.74609375, 57.74609375, 58.49609375, 58.49609375, 58.49609375, 58.49609375, 58.49609375, 58.49609375, 57.99609375, 57.99609375, 57.99609375, 57.99609375, 57.99609375, 57.99609375, 57.99609375, 57.99609375, 58.49609375, 58.49609375, 58.49609375, 58.49609375, 58.49609375, 58.49609375, 58.49609375, 57.99609375, 57.99609375, 57.99609375, 57.99609375, 57.99609375, 57.99609375, 57.99609375, 57.99609375, 58.24609375, 58.24609375, 58.24609375, 58.24609375, 58.24609375, 58.24609375, 58.24609375, 58.24609375, 58.24609375, 58.24609375, 58.24609375, 58.24609375, 58.24609375, 58.24609375, 58.24609375, 58.24609375, 58.24609375, 58.24609375, 58.24609375, 58.24609375, 58.24609375, 58.24609375, 58.24609375, 58.24609375, 58.24609375, 58.24609375, 58.24609375, 58.24609375, 58.24609375, 58.24609375, 58.49609375, 58.49609375, 58.49609375, 58.49609375, 58.49609375, 58.49609375, 58.74609375, 58.74609375, 58.74609375, 58.74609375, 58.74609375, 58.74609375, 58.74609375, 58.74609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 58.99609375, 59.49609375, 59.49609375, 59.49609375, 59.49609375, 59.49609375, 59.49609375, 59.49609375, 59.49609375, 59.49609375, 59.49609375, 59.49609375, 60.5546875, 60.5546875, 60.5546875, 28.84765625, 29.84765625, 29.84765625, 29.84765625, 29.84765625, 29.84765625, 29.84765625, 29.84765625, 30.09765625, 30.09765625, 30.34765625, 32.34765625, 32.59765625, 32.59765625, 32.59765625, 32.59765625, 32.59765625, 32.59765625, 32.59765625, 32.59765625, 32.59765625, 32.59765625, 32.59765625, 32.59765625, 32.59765625, 32.59765625, 32.59765625, 32.59765625, 32.59765625, 32.59765625, 32.59765625, 32.59765625, 32.59765625, 32.59765625, 36.59765625, 36.59765625, 36.59765625, 36.59765625, 36.59765625, 36.59765625, 36.59765625, 36.59765625, 36.59765625, 36.59765625, 36.59765625, 36.59765625, 36.59765625, 36.59765625, 36.59765625, 36.59765625, 36.84765625, 36.84765625, 37.09765625, 36.59765625, 36.59765625, 36.59765625, 36.84765625, 36.84765625, 36.84765625, 37.09765625, 37.09765625, 37.09765625, 37.09765625, 37.09765625, 37.09765625, 37.09765625, 37.09765625, 37.09765625, 37.09765625, 37.09765625, 37.09765625, 37.09765625, 37.09765625, 37.09765625, 37.09765625, 37.09765625, 37.09765625, 37.09765625, 37.09765625, 37.09765625, 37.34765625, 37.34765625, 37.34765625, 37.34765625, 37.34765625, 37.34765625, 37.34765625, 37.34765625, 37.34765625, 37.59765625, 37.59765625, 37.59765625, 37.59765625, 37.59765625, 45.59765625, 45.59765625, 45.59765625, 45.59765625, 45.59765625, 45.59765625, 45.59765625, 45.59765625, 45.59765625, 45.59765625, 45.59765625, 45.59765625, 46.09765625, 46.09765625, 46.09765625, 45.59765625, 45.59765625, 45.59765625, 45.59765625, 45.59765625, 45.59765625, 45.59765625, 45.59765625, 45.59765625, 45.59765625, 45.59765625, 45.84765625, 45.84765625, 45.84765625, 45.59765625, 45.59765625, 45.59765625, 45.59765625, 45.59765625, 45.59765625, 45.59765625, 45.59765625, 45.59765625, 45.59765625, 45.59765625, 45.84765625, 45.84765625, 45.84765625, 45.84765625, 45.84765625, 45.84765625, 45.84765625, 45.84765625, 45.84765625, 45.84765625, 45.84765625, 45.84765625, 45.84765625, 45.84765625, 46.34765625, 46.34765625, 46.34765625, 46.34765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.59765625, 46.84765625, 46.84765625, 46.84765625, 46.84765625, 46.84765625, 46.84765625, 46.84765625, 47.09765625, 47.09765625, 47.09765625, 47.09765625, 47.09765625, 47.09765625, 47.09765625, 47.09765625, 47.09765625, 47.09765625, 47.09765625, 47.09765625, 47.09765625, 47.09765625, 47.09765625, 47.34765625, 47.34765625, 47.34765625, 47.34765625, 47.34765625, 47.34765625, 47.34765625, 47.34765625, 47.34765625, 47.34765625, 47.34765625, 47.34765625, 47.34765625, 47.34765625, 47.34765625, 63.34765625, 63.34765625, 63.34765625, 63.34765625, 63.34765625, 63.34765625, 63.34765625, 63.34765625, 63.34765625, 63.34765625, 63.34765625, 63.34765625, 63.34765625, 63.34765625, 63.34765625, 63.34765625, 63.34765625, 63.34765625, 63.34765625, 63.34765625, 63.34765625, 63.34765625, 63.34765625, 63.34765625, 63.34765625, 63.34765625, 63.34765625, 63.34765625, 63.34765625, 63.59765625, 63.59765625, 63.59765625, 63.59765625, 63.59765625, 63.59765625, 63.59765625, 63.59765625, 63.59765625, 63.59765625, 63.59765625, 63.59765625, 63.59765625, 63.59765625, 63.59765625, 64.09765625, 64.09765625, 64.09765625, 64.09765625, 64.09765625, 64.09765625, 64.09765625, 64.09765625, 64.09765625, 64.09765625, 64.09765625, 64.09765625, 64.09765625, 64.09765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.34765625, 64.84765625, 64.59765625, 64.59765625, 64.59765625, 64.59765625, 64.59765625, 64.59765625, 64.59765625, 64.84765625, 64.84765625, 64.84765625, 64.84765625, 64.84765625, 64.84765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.84765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.59765625, 65.84765625, 65.84765625, 65.84765625, 65.84765625, 65.84765625, 65.84765625, 65.84765625, 65.84765625, 65.84765625, 65.84765625, 65.84765625, 65.84765625, 65.84765625, 65.84765625, 66.59765625, 66.59765625, 66.34765625, 66.34765625, 66.34765625, 66.34765625, 66.34765625, 66.34765625, 66.34765625, 66.34765625, 66.34765625, 66.34765625, 66.34765625, 66.34765625, 66.34765625, 66.34765625, 66.34765625, 66.34765625, 66.34765625, 66.34765625, 66.34765625, 66.34765625, 66.34765625, 66.34765625, 66.34765625, 66.34765625, 66.34765625, 66.34765625, 66.34765625, 66.59765625, 66.59765625, 66.59765625, 66.59765625, 66.59765625, 66.59765625, 66.59765625, 66.59765625, 66.59765625, 66.59765625, 66.59765625, 66.59765625, 66.59765625, 66.59765625, 66.59765625, 67.09765625, 67.09765625, 66.84765625, 66.84765625, 66.84765625, 66.84765625, 66.84765625, 66.84765625, 66.84765625, 66.84765625, 66.84765625, 66.84765625, 66.84765625, 66.84765625, 66.84765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.09765625, 67.34765625, 67.34765625, 67.34765625, 67.34765625, 67.34765625, 67.34765625, 67.34765625, 67.84765625, 67.84765625, 67.59765625, 67.59765625, 67.59765625, 67.59765625, 67.59765625, 67.59765625, 67.59765625, 67.59765625, 67.59765625, 67.59765625, 67.59765625, 67.59765625, 68.125, 68.125, 68.125, 68.125, 68.125, 68.125, 68.125, 68.125, 68.125, 68.125, 68.125, 68.125, 68.875, 68.875, 68.875, 68.875, 68.875, 68.875, 68.875, 68.875, 68.875, 68.875, 68.875, 68.875, 68.875, 68.875, 68.875, 69.125, 69.125, 68.875, 68.875, 68.875, 68.875, 68.875, 68.875, 68.875, 68.875, 68.875, 68.875, 68.875, 68.875, 68.875, 68.875, 68.875, 68.875, 68.875, 68.875, 68.875, 68.875, 68.875, 68.875, 68.875, 68.875, 68.875, 68.875, 69.125, 69.125, 69.125, 69.125, 69.125, 69.125, 69.125, 69.125, 69.125, 69.125, 69.125, 69.125, 69.125, 69.125, 69.125, 69.375, 69.375, 69.375, 69.375, 69.375, 69.375, 69.375, 69.375, 69.375, 69.375, 69.375, 69.375, 69.375, 69.375, 69.375, 69.375, 69.375, 69.375, 69.375, 69.375, 69.375, 69.375, 69.375, 69.375, 69.375, 69.375, 69.375, 69.375, 69.625, 69.625, 69.625, 69.625, 69.625, 69.625, 69.625, 69.625, 69.625, 69.625, 69.625, 69.625, 69.625, 69.625, 69.625, 69.875, 69.875, 69.875, 69.875, 69.875, 69.875, 69.875, 69.875, 69.875, 69.875, 69.875, 69.875, 69.875, 69.875, 69.875, 70.375, 70.375, 69.875, 69.875, 69.875, 69.875, 69.875, 69.875, 70.125, 70.125, 70.125, 70.125, 70.125, 70.125, 70.375, 70.375, 70.375, 70.375, 70.375, 70.375, 70.375, 70.375, 70.375, 70.375, 70.375, 70.375, 70.375, 70.375, 70.375, 70.625, 70.625, 70.625, 70.625, 70.625, 70.625, 70.625, 70.625, 70.625, 70.625, 70.625, 70.625, 70.625, 70.625, 70.625, 70.625, 70.625, 70.625, 70.625, 70.625, 70.625, 70.625, 70.625, 70.625, 70.625, 70.625, 70.625, 70.625, 70.625, 71.125, 71.125, 71.125, 71.125, 70.875, 70.875, 70.875, 70.875, 70.875, 70.875, 70.875, 70.875, 70.875, 70.875, 70.875, 71.375, 71.375, 71.375, 71.375, 71.375, 71.375, 71.375, 71.375, 71.375, 71.375, 71.375, 71.375, 71.375, 71.375, 71.375, 71.375, 71.375, 71.375, 71.375, 71.375, 71.375, 71.375, 71.375, 71.375, 71.375, 71.375, 71.375, 71.375, 71.375, 71.625, 71.625, 71.625, 71.625, 71.625, 71.625, 71.625, 71.625, 71.625, 71.625, 71.625, 71.625, 71.625, 71.625, 71.625, 71.625, 71.625, 71.625, 71.625, 71.625, 71.625, 71.625, 71.625, 71.625, 71.625, 71.625, 71.625, 71.625, 71.625, 71.875, 71.875, 71.875, 71.875, 71.875, 71.875, 71.875, 71.875, 71.875, 71.875, 71.875, 71.875, 71.875, 71.875, 71.875, 72.875, 72.875, 72.875, 72.375, 72.375, 72.375, 72.375, 72.375, 72.375, 72.375, 72.375, 72.375, 72.375, 72.375, 72.375, 72.625, 72.625, 72.625, 72.625, 72.625, 72.625, 72.625, 72.625, 72.625, 72.625, 72.625, 72.625, 72.625, 72.875, 72.875, 72.875, 72.875, 72.875, 72.875, 72.875, 72.875, 72.875, 72.875, 72.875, 72.875, 72.875, 72.875, 72.875, 72.875, 72.875, 72.875, 72.875, 72.875, 72.875, 72.875, 72.875, 72.875, 72.875, 72.875, 72.875, 72.875, 72.875, 72.875, 73.375, 73.375, 73.375, 73.375, 72.875, 72.875, 72.875, 72.875, 72.875, 72.875, 72.875, 72.875, 72.875, 45.125, 45.125, 45.125, 45.125, 45.125, 45.125, 45.125, 45.125, 45.125, 45.125, 45.625, 45.625, 45.875, 45.875, 45.875, 45.875, 45.875, 45.875, 45.875, 45.875, 45.875, 49.875, 49.875, 49.875, 49.875, 49.875, 49.875, 49.875, 49.875, 49.875, 49.875, 49.875, 49.875, 49.875, 49.875, 49.875, 49.875, 49.875, 49.875, 49.875, 49.875, 49.875, 49.875, 49.875, 49.875, 49.875, 49.875, 49.875, 49.875, 49.875, 49.875, 49.875, 49.875, 49.875, 49.875, 49.875, 50.125, 50.125, 50.125, 50.125, 50.125, 50.125, 50.125, 50.125, 50.125, 50.125, 50.125, 50.125, 50.375, 50.375, 50.375, 50.375, 50.375, 50.375, 50.375, 50.375, 58.375, 58.375, 58.375, 58.375, 58.375, 58.375, 58.375, 58.375, 58.375, 58.375, 58.375, 58.875, 58.875, 58.875, 58.375, 58.375, 58.375, 58.375, 58.375, 58.375, 58.375, 58.375, 58.625, 58.625, 58.625, 59.125, 59.125, 59.125, 59.125, 58.625, 58.625, 58.625, 58.625, 58.625, 58.625, 58.625, 58.625, 58.625, 58.625, 58.875, 58.875, 58.875, 59.375, 58.875, 58.875, 58.875, 58.875, 58.875, 59.125, 59.125, 59.125, 59.625, 59.625, 59.625, 59.625, 59.625, 59.625, 59.625, 59.625, 59.625, 59.625, 59.625, 59.625, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 60.375, 60.375, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 59.875, 60.125, 60.125, 60.125, 60.125, 60.125, 76.375, 76.375, 76.375, 76.375, 76.375, 76.375, 76.375, 76.375, 76.375, 76.375, 76.375, 76.375, 76.375, 76.375, 76.375, 76.375, 76.375, 76.375, 76.375, 76.375, 76.625, 76.625, 76.625, 76.625, 76.625, 76.625, 76.625, 76.625, 76.625, 76.625, 76.625, 76.625, 76.625, 76.625, 76.625, 76.625, 76.625, 76.625, 76.625, 76.625, 76.625, 76.625, 76.625, 76.625, 76.625, 76.625, 76.625, 76.625, 76.625, 76.875, 76.875, 76.875, 76.875, 76.875, 77.125, 77.125, 77.125, 77.125, 77.125, 77.125, 77.125, 77.125, 77.125, 77.125, 77.125, 77.125, 77.125, 77.125, 77.125, 77.125, 77.125, 77.125, 77.125, 77.125, 77.125, 77.125, 77.125, 77.125, 77.125, 77.125, 77.125, 77.125, 77.125, 77.125, 77.625, 77.625, 77.625, 77.625, 77.375, 77.375, 77.375, 77.375, 77.375, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 77.875, 79.125, 79.125, 79.125, 79.125, 79.125, 79.125, 79.125, 79.125, 79.125, 79.125, 79.125, 79.125, 79.125, 79.125, 79.125, 79.125, 79.125, 79.125, 79.125, 79.125, 79.125, 79.125, 79.125, 79.125, 79.125, 79.125, 79.125, 79.125, 79.125, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.375, 79.875, 79.875, 79.875, 79.875, 80.125, 80.125, 80.125, 80.125, 80.125, 80.125, 80.125, 80.125, 80.125, 80.125, 80.125, 80.125, 80.125, 80.125, 80.125, 80.125, 80.125, 80.125, 80.125, 80.125, 80.125, 80.125, 80.125, 80.125, 80.125, 80.125, 82.5, 82.5, 82.5, 80.9140625, 80.9140625, 80.9140625, 80.9140625, 80.9140625, 80.9140625, 80.9140625, 53.1640625, 53.1640625, 53.1640625, 53.1640625, 53.1640625, 53.1640625, 53.1640625, 53.1640625, 53.1640625, 53.1640625, 53.1640625, 53.4140625, 53.6640625, 53.6640625, 53.6640625, 53.6640625, 53.6640625, 53.6640625, 53.6640625, 53.6640625, 53.6640625, 57.6640625, 57.6640625, 57.6640625, 57.6640625, 57.6640625, 57.6640625, 57.6640625, 57.6640625, 57.6640625, 57.6640625, 57.6640625, 57.6640625, 57.6640625, 57.6640625, 57.6640625, 57.6640625, 57.6640625, 57.6640625, 57.6640625, 57.6640625, 57.6640625, 57.6640625, 57.6640625, 57.6640625, 57.6640625, 57.6640625, 57.6640625, 57.6640625, 57.6640625, 57.6640625, 57.9140625, 58.1640625, 58.1640625, 57.6640625, 57.6640625, 57.6640625, 57.6640625, 57.6640625, 57.6640625, 57.9140625, 57.9140625, 58.1640625, 58.4140625, 58.4140625, 58.4140625, 58.4140625, 58.4140625, 58.6640625, 58.1640625, 58.1640625, 58.1640625, 58.1640625, 66.1640625, 66.1640625, 66.1640625, 66.1640625, 66.1640625, 66.4140625, 66.4140625, 66.4140625, 66.4140625, 66.4140625, 66.6640625, 66.6640625, 66.9140625, 66.9140625, 66.9140625, 66.9140625, 66.9140625, 66.4140625, 66.4140625, 66.4140625, 66.4140625, 66.4140625, 66.4140625, 66.4140625, 66.4140625, 66.4140625, 66.4140625, 66.4140625, 66.4140625, 66.4140625, 66.4140625, 66.9140625, 66.4140625, 66.4140625, 66.4140625, 66.4140625, 66.4140625, 66.4140625, 66.4140625, 66.4140625, 66.6640625, 66.6640625, 66.6640625, 66.9140625, 66.9140625, 67.4140625, 67.4140625, 67.4140625, 67.4140625, 67.4140625, 67.4140625, 67.4140625, 67.4140625, 67.4140625, 67.4140625, 67.4140625, 67.4140625, 67.4140625, 67.4140625, 67.4140625, 67.4140625, 67.4140625, 67.4140625, 67.4140625, 67.4140625, 67.4140625, 67.4140625, 67.4140625, 67.4140625, 67.4140625, 67.4140625, 67.4140625, 67.6640625, 67.6640625, 67.6640625, 67.6640625, 67.6640625, 67.6640625, 67.6640625, 67.6640625, 67.6640625, 67.6640625, 67.6640625, 67.6640625, 67.6640625, 67.6640625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 67.9140625, 83.9140625, 83.9140625, 83.9140625, 83.9140625, 83.9140625, 83.9140625, 83.9140625, 83.9140625, 83.9140625, 83.9140625, 83.9140625, 83.9140625, 83.9140625, 84.6640625, 84.6640625, 84.1640625, 84.1640625, 84.1640625, 84.1640625, 84.1640625, 84.1640625, 84.1640625, 84.1640625, 84.1640625, 84.4140625, 84.4140625, 84.4140625, 84.4140625, 84.6640625, 84.6640625, 84.6640625, 84.6640625, 84.6640625, 84.6640625, 84.6640625, 84.6640625, 84.6640625, 84.6640625, 84.6640625, 84.6640625, 84.6640625, 84.6640625, 84.6640625, 84.6640625, 84.6640625, 84.6640625, 84.6640625, 84.6640625, 84.6640625, 84.6640625, 84.6640625, 84.6640625, 84.6640625, 84.6640625, 84.6640625, 84.6640625, 84.6640625, 84.6640625, 84.9140625, 84.9140625, 84.9140625, 84.9140625, 84.9140625, 84.9140625, 84.9140625, 84.9140625, 84.9140625, 84.9140625, 85.1640625, 85.1640625, 85.1640625, 85.1640625, 85.1640625, 85.6640625, 84.9140625, 84.9140625, 84.9140625, 84.9140625, 84.9140625, 84.9140625, 84.9140625, 84.9140625, 84.9140625, 84.9140625, 84.9140625, 84.9140625, 84.9140625, 85.9140625, 85.9140625, 85.9140625, 85.9140625, 85.9140625, 85.9140625, 85.9140625, 85.9140625, 85.9140625, 85.9140625, 85.9140625, 85.9140625, 85.9140625, 85.9140625, 85.9140625, 85.9140625, 85.9140625, 85.9140625, 85.9140625, 85.9140625, 85.9140625, 85.9140625, 85.9140625, 85.9140625, 85.9140625, 85.9140625, 85.9140625, 85.9140625, 85.9140625, 85.9140625, 85.9140625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 86.1640625, 87.1640625, 87.1640625, 87.1640625, 87.1640625, 87.1640625, 87.1640625, 86.9140625, 86.9140625, 86.9140625, 86.9140625, 86.9140625, 86.9140625, 86.9140625, 86.9140625, 87.1640625, 87.1640625, 87.1640625, 87.1640625, 87.1640625, 87.9140625, 87.9140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.4140625, 87.6640625, 87.6640625, 87.6640625, 87.6640625, 87.6640625, 87.6640625, 87.6640625, 87.6640625, 87.6640625, 87.6640625, 87.6640625, 87.6640625, 87.6640625, 87.6640625, 87.6640625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 88.1640625, 88.1640625, 88.1640625, 88.1640625, 88.1640625, 88.6640625, 88.6640625, 88.6640625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 87.9140625, 88.4140625, 88.4140625, 88.4140625, 88.4140625, 88.4140625, 88.4140625, 88.4140625, 88.4140625, 88.4140625, 88.4140625, 88.4140625, 88.4140625, 88.4140625, 88.4140625, 88.4140625, 88.4140625, 88.4140625, 88.4140625, 88.4140625, 88.4140625, 88.9140625, 88.9140625, 88.9140625, 88.9140625, 88.4140625, 88.4140625, 88.4140625, 88.4140625, 88.6640625, 88.6640625, 88.6640625, 88.6640625, 88.6640625, 88.6640625, 88.6640625, 88.6640625, 89.1640625, 89.1640625, 89.1640625, 89.1640625, 88.6640625, 88.6640625, 88.6640625, 88.6640625, 88.6640625, 88.6640625, 88.6640625, 88.6640625, 89.6640625, 89.6640625, 89.6640625, 89.6640625, 89.6640625, 89.6640625, 89.6640625, 89.6640625, 89.1640625, 89.1640625, 89.1640625, 89.1640625, 89.1640625, 89.1640625, 89.1640625, 89.1640625, 89.1640625, 89.1640625, 89.1640625, 89.1640625, 89.9140625, 89.9140625, 89.9140625, 89.9140625, 89.4140625, 89.4140625, 89.4140625, 89.4140625, 89.4140625, 89.4140625, 89.4140625, 89.4140625, 89.4140625, 89.4140625, 89.4140625, 89.4140625, 89.4140625, 89.4140625, 89.4140625, 89.4140625, 89.6640625, 89.6640625, 89.6640625, 89.6640625, 89.6640625, 89.6640625, 89.6640625, 89.6640625, 89.6640625, 89.6640625, 89.6640625, 89.6640625, 89.9140625, 89.9140625, 89.9140625, 89.9140625, 89.9140625, 89.9140625, 89.9140625, 89.9140625, 89.9140625, 89.9140625, 89.9140625, 89.9140625, 89.9140625, 89.9140625, 89.9140625, 89.9140625, 89.9140625, 89.9140625, 89.9140625, 89.9140625, 90.6640625, 89.9140625, 89.9140625, 89.9140625, 89.9140625, 89.9140625, 89.9140625, 89.9140625, 89.9140625, 89.9140625, 89.9140625, 89.9140625, 89.9140625, 90.1640625, 90.1640625, 90.1640625, 90.1640625, 90.1640625, 90.1640625, 90.1640625, 90.1640625, 90.1640625, 90.1640625, 90.1640625, 90.1640625, 90.1640625, 90.1640625, 90.1640625, 90.1640625, 90.6640625, 90.6640625, 90.6640625, 90.6640625, 90.6640625, 90.6640625, 90.6640625, 90.6640625, 90.6640625, 90.6640625, 90.6640625, 90.6640625, 90.9140625, 90.9140625, 90.9140625, 90.9140625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.4140625, 91.4140625, 91.4140625, 91.9140625, 91.9140625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.1640625, 91.6640625, 91.6640625, 91.6640625, 91.6640625, 91.9140625, 91.9140625, 91.9140625, 92.1640625, 92.1640625, 91.6640625, 91.6640625, 91.6640625, 91.6640625, 91.6640625, 91.6640625, 91.6640625, 91.6640625, 91.6640625, 91.6640625, 91.6640625, 91.6640625, 91.9140625, 91.9140625, 91.9140625, 91.9140625, 91.9140625, 91.9140625, 91.9140625, 91.9140625, 91.9140625, 91.9140625, 91.9140625, 92.1640625, 92.1640625, 92.1640625, 92.1640625, 92.4140625, 92.4140625, 92.4140625, 92.4140625, 92.4140625, 92.4140625, 92.4140625, 92.4140625, 92.4140625, 92.4140625, 92.4140625, 92.4140625, 92.4140625, 92.4140625, 92.4140625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.6640625, 92.9140625, 92.9140625, 92.9140625, 92.9140625, 92.9140625, 92.9140625, 92.9140625, 92.9140625, 92.9140625, 92.9140625, 92.9140625, 92.9140625, 92.9140625, 92.9140625, 93.4140625, 93.4140625, 93.4140625, 93.4140625, 93.4140625, 93.4140625, 92.9140625, 92.9140625, 92.9140625, 92.9140625, 93.4140625, 93.4140625, 93.4140625, 93.4140625, 93.6640625, 93.6640625, 93.6640625, 93.6640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 93.4140625, 93.4140625, 93.4140625, 93.4140625, 93.4140625, 93.4140625, 93.4140625, 93.4140625, 93.4140625, 93.4140625, 93.4140625, 93.6640625, 93.6640625, 93.6640625, 93.6640625, 93.9140625, 93.9140625, 93.9140625, 93.9140625, 93.9140625, 93.9140625, 93.9140625, 93.9140625, 93.9140625, 93.9140625, 93.9140625, 93.9140625, 93.9140625, 93.9140625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.1640625, 94.4140625, 94.4140625, 94.4140625, 94.4140625, 94.9140625, 94.9140625, 94.9140625, 94.9140625, 94.9140625, 94.9140625, 94.9140625, 94.4140625, 94.4140625, 94.4140625, 94.4140625, 94.4140625, 94.4140625, 94.4140625, 94.6640625, 94.6640625, 94.6640625, 94.6640625, 94.9140625, 94.9140625, 94.9140625, 94.9140625, 95.1640625, 95.1640625, 94.6640625, 94.6640625, 94.6640625, 94.6640625, 95.1640625, 95.1640625, 95.1640625, 95.4140625, 95.4140625, 95.4140625, 95.4140625, 95.4140625, 95.4140625, 95.4140625, 95.4140625, 95.6640625, 95.6640625, 95.6640625, 95.4140625, 95.4140625, 95.4140625, 95.4140625, 95.4140625, 95.4140625, 95.4140625, 95.4140625, 95.4140625, 95.4140625, 95.4140625, 95.4140625, 95.4140625, 95.4140625, 95.4140625, 95.4140625, 95.4140625, 95.4140625, 95.4140625, 95.4140625, 95.4140625, 95.4140625, 95.4140625, 95.4140625, 95.4140625, 95.4140625, 95.4140625, 95.4140625, 95.4140625, 95.9140625, 95.9140625, 95.9140625, 95.9140625, 95.9140625, 95.9140625, 95.9140625, 95.9140625, 95.9140625, 95.9140625, 95.9140625, 95.9140625, 95.9140625, 95.9140625, 95.9140625, 95.9140625, 95.9140625, 95.9140625, 95.9140625, 95.9140625, 95.9140625, 95.9140625, 96.1640625, 96.1640625, 96.1640625, 96.1640625, 96.1640625, 96.1640625, 96.1640625, 96.1640625, 96.1640625, 96.1640625, 96.1640625, 96.1640625, 96.1640625, 96.1640625, 96.1640625, 96.1640625, 96.1640625, 96.1640625, 96.6640625, 96.6640625, 96.6640625, 96.6640625, 96.1640625, 96.1640625, 96.1640625, 96.1640625, 96.1640625, 96.1640625, 96.1640625, 96.1640625, 96.1640625, 96.1640625, 96.1640625, 96.4140625, 96.4140625, 96.4140625, 96.6640625, 96.6640625, 96.6640625, 96.6640625, 96.1640625, 96.1640625, 96.1640625, 96.1640625, 96.1640625, 96.1640625, 96.1640625, 96.4140625, 96.4140625, 96.4140625, 96.4140625, 96.9140625, 96.9140625, 96.9140625, 97.1640625, 97.1640625, 97.1640625, 97.1640625, 96.6640625, 96.6640625, 96.6640625, 96.6640625, 96.6640625, 96.6640625, 96.6640625, 96.6640625, 96.6640625, 96.6640625, 96.6640625, 97.1640625, 97.1640625, 97.1640625, 97.1640625, 97.1640625, 97.1640625, 97.1640625, 97.4140625, 96.9140625, 96.9140625, 96.9140625, 97.1640625, 97.1640625, 97.1640625, 97.1640625, 97.1640625, 97.1640625, 97.1640625, 97.1640625, 97.1640625, 97.1640625, 97.1640625, 97.6640625, 97.6640625, 97.6640625, 97.6640625, 97.1640625, 97.1640625, 97.1640625, 97.1640625, 97.1640625, 97.1640625, 97.1640625, 97.1640625, 97.1640625, 97.1640625, 97.1640625, 97.4140625, 97.4140625, 97.4140625, 97.4140625, 97.6640625, 97.6640625, 97.6640625, 98.1640625, 97.4140625, 97.4140625, 97.4140625, 97.4140625, 97.6640625, 97.6640625, 97.6640625, 97.6640625, 97.6640625, 97.6640625, 97.6640625, 98.1640625, 98.1640625, 98.1640625, 98.1640625, 98.1640625, 98.1640625, 98.1640625, 98.4140625, 97.9140625, 97.9140625, 97.9140625, 97.9140625, 97.9140625, 97.9140625, 97.9140625, 97.9140625, 97.9140625, 97.9140625, 97.9140625, 98.1640625, 98.1640625, 98.1640625, 98.1640625, 98.1640625, 98.1640625, 98.1640625, 98.1640625, 98.1640625, 98.1640625, 98.1640625, 98.1640625, 98.1640625, 98.1640625, 98.1640625, 98.6640625, 98.6640625, 98.6640625, 98.6640625, 98.6640625, 98.6640625, 98.6640625, 98.6640625, 98.6640625, 98.6640625, 98.6640625, 98.6640625, 98.6640625, 98.6640625, 98.6640625, 98.6640625, 98.6640625, 98.6640625, 98.6640625, 98.6640625, 98.6640625, 98.6640625, 98.6640625, 98.6640625, 98.6640625, 98.6640625, 98.6640625, 98.6640625, 98.6640625, 98.9140625, 98.9140625, 98.9140625, 98.9140625, 98.9140625, 98.9140625, 98.9140625, 98.9140625, 98.9140625, 98.9140625, 98.9140625, 98.9140625, 102.4765625, 69.1015625, 69.3515625, 69.3515625, 69.6015625, 69.6015625, 69.6015625, 69.6015625, 69.6015625, 69.6015625, 69.8515625, 72.1015625, 72.3515625, 72.3515625, 72.3515625, 72.3515625, 72.3515625, 72.3515625, 72.3515625, 72.3515625, 72.3515625, 72.3515625, 72.3515625, 72.3515625, 72.3515625, 72.3515625, 72.3515625, 72.3515625, 72.3515625, 72.3515625, 72.3515625, 76.3515625, 76.3515625, 76.3515625, 76.6015625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 77.1015625, 77.1015625, 77.3515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 76.8515625, 77.1015625, 85.1015625, 85.1015625, 85.1015625, 85.1015625, 85.3515625, 85.3515625, 85.3515625, 85.3515625, 85.3515625, 85.3515625, 85.3515625, 85.3515625, 85.3515625, 85.3515625, 85.3515625, 85.3515625, 85.3515625, 85.3515625, 85.3515625, 85.3515625, 85.3515625, 85.6015625, 85.6015625, 85.6015625, 85.6015625, 85.6015625, 85.6015625, 85.6015625, 85.6015625, 85.6015625, 85.6015625, 85.6015625, 85.6015625, 85.6015625, 85.6015625, 85.6015625, 85.8515625, 85.8515625, 85.8515625, 85.8515625, 86.1015625, 86.1015625, 86.1015625, 86.6015625, 86.6015625, 85.8515625, 85.8515625, 85.8515625, 85.8515625, 85.8515625, 85.8515625, 85.8515625, 85.8515625, 85.8515625, 85.8515625, 86.1015625, 86.1015625, 86.1015625, 86.1015625, 86.1015625, 86.1015625, 86.1015625, 86.1015625, 86.3515625, 86.3515625, 86.3515625, 86.3515625, 86.3515625, 86.3515625, 86.3515625, 86.3515625, 86.3515625, 86.3515625, 86.3515625, 86.3515625, 86.3515625, 86.3515625, 86.3515625, 86.3515625, 86.3515625, 86.3515625, 86.8515625, 86.8515625, 87.1015625, 86.3515625, 86.3515625, 86.3515625, 86.3515625, 86.6015625, 86.6015625, 86.6015625, 86.6015625, 86.6015625, 86.6015625, 86.6015625, 86.6015625, 86.6015625, 86.6015625, 86.6015625, 86.6015625, 86.6015625, 86.6015625, 86.6015625, 86.8515625, 86.8515625, 86.8515625, 86.8515625, 86.8515625, 86.8515625, 86.8515625, 86.8515625, 86.8515625, 86.8515625, 86.8515625, 86.8515625, 86.8515625, 86.8515625, 103.1015625, 103.1015625, 103.1015625, 103.1015625, 103.1015625, 103.1015625, 103.1015625, 103.1015625, 103.1015625, 103.1015625, 103.3515625, 103.3515625, 103.3515625, 103.3515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 104.3515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 103.8515625, 104.1015625, 104.1015625, 104.1015625, 104.3515625, 104.3515625, 104.3515625, 104.3515625, 104.3515625, 104.3515625, 104.3515625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 104.6015625, 105.1015625, 105.1015625, 105.1015625, 105.1015625, 104.8515625, 104.8515625, 104.8515625, 104.8515625, 104.8515625, 104.8515625, 104.8515625, 105.3515625, 105.3515625, 105.3515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 106.3515625, 106.3515625, 106.3515625, 106.3515625, 106.3515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 105.8515625, 106.1015625, 106.1015625, 106.1015625, 106.6015625, 106.6015625, 106.6015625, 106.6015625, 106.6015625, 106.6015625, 106.6015625, 106.6015625, 106.6015625, 106.6015625, 106.6015625, 106.6015625, 106.6015625, 106.8515625, 106.8515625, 106.8515625, 106.8515625, 106.8515625, 106.8515625, 107.1015625, 107.1015625, 107.1015625, 107.1015625, 107.1015625, 107.1015625, 107.1015625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 107.3515625, 108.1015625, 108.1015625, 108.1015625, 108.3515625, 108.3515625, 108.3515625, 108.3515625, 108.8515625, 108.8515625, 108.8515625, 108.8515625, 108.8515625, 108.8515625, 108.8515625, 108.8515625, 108.8515625, 108.8515625, 108.8515625, 108.8515625, 108.8515625, 108.8515625, 108.8515625, 108.8515625, 108.8515625, 108.8515625, 108.8515625, 108.8515625, 108.8515625, 108.8515625, 108.3515625, 108.3515625, 108.3515625, 108.3515625, 108.3515625, 108.3515625, 108.3515625, 108.3515625, 108.3515625, 108.3515625, 108.3515625, 108.3515625, 108.3515625, 108.3515625, 108.3515625, 108.3515625, 108.3515625, 108.3515625, 108.3515625, 108.3515625, 108.3515625, 108.3515625, 108.6015625, 108.6015625, 108.6015625, 108.6015625, 108.6015625, 108.6015625, 108.6015625, 108.6015625, 108.6015625, 108.6015625, 108.6015625, 108.6015625, 108.6015625, 108.6015625, 108.6015625, 108.6015625, 108.6015625, 108.6015625, 108.6015625, 109.1015625, 109.1015625, 109.1015625, 108.6015625, 108.6015625, 108.6015625, 108.6015625, 108.6015625, 108.6015625, 108.6015625, 108.6015625, 108.6015625, 108.6015625, 108.6015625, 108.6015625, 108.8515625, 108.8515625, 108.8515625, 109.8515625, 109.8515625, 109.8515625, 109.8515625, 109.8515625, 109.8515625, 109.8515625, 109.1015625, 109.1015625, 109.1015625, 109.1015625, 109.1015625, 109.1015625, 109.3515625, 109.3515625, 109.3515625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.6015625, 109.8515625, 109.8515625, 109.8515625, 110.3515625, 110.3515625, 110.3515625, 110.6015625, 110.6015625, 110.6015625, 110.6015625, 110.6015625, 110.6015625, 110.6015625, 110.1015625, 110.1015625, 110.1015625, 110.1015625, 110.1015625, 110.1015625, 110.1015625, 110.1015625, 110.1015625, 110.1015625, 110.1015625, 110.1015625, 110.1015625, 110.1015625, 110.1015625, 110.1015625, 110.1015625, 110.1015625, 110.1015625, 110.3515625, 110.3515625, 110.3515625, 110.8515625, 110.3515625, 110.3515625, 110.3515625, 110.3515625, 110.3515625, 110.3515625, 110.3515625, 110.3515625, 110.3515625, 110.3515625, 110.3515625, 110.3515625, 110.3515625, 110.3515625, 110.3515625, 110.3515625, 110.3515625, 110.3515625, 111.1015625, 111.1015625, 111.1015625, 111.8515625, 110.6015625, 110.6015625, 110.6015625, 110.6015625, 110.6015625, 110.6015625, 110.8515625, 110.8515625, 110.8515625, 111.1015625, 111.1015625, 111.1015625, 111.3515625, 111.3515625, 111.3515625, 111.3515625, 111.3515625, 111.3515625, 111.3515625, 111.3515625, 111.3515625, 111.3515625, 111.3515625, 111.3515625, 111.3515625, 111.3515625, 111.3515625, 111.3515625, 111.3515625, 111.3515625, 111.3515625, 111.3515625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 112.3515625, 112.3515625, 112.3515625, 112.3515625, 112.3515625, 112.3515625, 112.3515625, 112.3515625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 111.6015625, 112.3515625, 112.3515625, 112.3515625, 112.3515625, 112.3515625, 112.3515625, 112.3515625, 112.3515625, 112.3515625, 112.3515625, 112.3515625, 112.3515625, 112.6015625, 112.6015625, 112.6015625, 112.6015625, 112.6015625, 112.6015625, 112.6015625, 112.6015625, 112.6015625, 112.6015625, 112.6015625, 112.8515625, 112.8515625, 112.8515625, 112.8515625, 112.8515625, 112.8515625, 112.8515625, 112.8515625, 112.8515625, 112.8515625, 112.8515625, 112.8515625, 112.8515625, 112.8515625, 112.8515625, 112.8515625, 112.8515625, 112.8515625, 112.8515625, 112.8515625, 112.8515625, 112.8515625, 112.8515625, 112.8515625, 112.8515625, 112.8515625, 112.8515625, 112.8515625, 112.8515625, 113.3515625, 113.3515625, 113.3515625, 113.3515625, 113.3515625, 113.3515625, 113.3515625, 113.3515625, 113.3515625, 113.3515625, 113.3515625, 113.3515625, 113.3515625, 113.3515625, 113.3515625, 113.3515625, 113.3515625, 113.3515625, 113.3515625, 113.3515625, 113.3515625, 113.3515625, 113.3515625, 113.3515625, 113.3515625, 113.3515625, 113.3515625, 113.3515625, 113.3515625, 113.3515625, 113.3515625, 113.3515625, 113.6015625, 113.6015625, 113.6015625, 113.6015625, 113.6015625, 113.6015625, 113.6015625, 113.6015625, 113.6015625, 113.6015625, 113.6015625, 113.6015625, 113.6015625, 113.6015625, 113.6015625, 113.6015625, 113.6015625, 113.6015625, 113.6015625, 113.6015625, 113.6015625, 113.6015625, 113.6015625, 113.6015625, 113.8515625, 113.8515625, 113.8515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.6015625, 114.6015625, 115.1015625, 115.1015625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.3515625, 114.6015625, 114.6015625, 114.6015625, 114.8515625, 114.8515625, 114.8515625, 114.8515625, 114.8515625, 114.8515625, 115.3515625, 114.8515625, 114.8515625, 114.8515625, 114.8515625, 114.8515625, 114.8515625, 114.8515625, 114.8515625, 114.8515625, 114.8515625, 114.8515625, 114.8515625, 114.8515625, 114.8515625, 114.8515625, 114.8515625, 114.8515625, 115.3515625, 115.3515625, 115.3515625, 115.3515625, 115.3515625, 115.3515625, 115.3515625, 115.3515625, 115.3515625, 115.3515625, 115.3515625, 115.3515625, 115.3515625, 115.3515625, 115.3515625, 115.3515625, 115.3515625, 115.3515625, 115.3515625, 115.3515625, 115.3515625, 115.3515625, 115.3515625, 115.3515625, 115.3515625, 115.3515625, 115.8515625, 115.8515625, 115.8515625, 116.1015625, 116.1015625, 115.3515625, 115.3515625, 115.3515625, 115.3515625, 115.3515625, 115.6015625, 115.6015625, 115.6015625, 115.6015625, 115.6015625, 115.6015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.6015625, 116.6015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.1015625, 116.3515625, 116.3515625, 116.3515625, 116.3515625, 116.3515625, 116.6015625, 116.6015625, 116.6015625, 116.6015625, 116.6015625, 116.6015625, 117.1015625, 117.1015625, 116.6015625, 116.6015625, 116.6015625, 116.6015625, 116.6015625, 116.6015625, 116.6015625, 116.6015625, 116.6015625, 116.6015625, 116.6015625, 116.8515625, 116.8515625, 116.8515625, 117.1015625, 117.1015625, 117.1015625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.8515625, 117.8515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.3515625, 117.8515625, 117.8515625, 117.8515625, 117.8515625, 117.8515625, 117.8515625, 118.1015625, 118.1015625, 118.1015625, 118.1015625, 118.1015625, 118.1015625, 118.1015625, 118.1015625, 118.1015625, 118.1015625, 118.1015625, 118.1015625, 118.1015625, 118.1015625, 118.1015625, 118.1015625, 118.1015625, 118.1015625, 118.1015625, 118.1015625, 118.1015625, 118.1015625, 118.1015625, 118.1015625, 118.1015625, 118.3515625, 118.3515625, 118.3515625, 118.3515625, 118.3515625, 118.3515625, 118.3515625, 118.3515625, 118.3515625, 118.3515625, 118.3515625, 118.3515625, 118.3515625, 118.3515625, 118.3515625, 118.3515625, 118.3515625, 118.3515625, 118.3515625, 118.3515625, 118.3515625, 118.3515625, 118.6015625, 118.6015625, 119.1015625, 118.3515625, 118.3515625, 118.3515625, 118.3515625, 118.3515625, 118.3515625, 118.3515625, 118.3515625, 118.3515625, 118.3515625, 118.3515625, 118.6015625, 118.6015625, 118.6015625, 118.6015625, 118.6015625, 118.8515625, 118.8515625, 118.8515625, 118.8515625, 118.8515625, 118.8515625, 119.3515625, 119.3515625, 119.6015625, 118.8515625, 118.8515625, 118.8515625, 118.8515625, 118.8515625, 118.8515625, 118.8515625, 118.8515625, 118.8515625, 118.8515625, 118.8515625, 118.8515625, 118.8515625, 118.8515625, 119.1015625, 119.1015625, 119.1015625, 119.1015625, 119.1015625, 119.1015625, 119.1015625, 119.1015625, 119.1015625, 119.1015625, 119.1015625, 119.1015625, 119.1015625, 119.1015625, 119.1015625, 119.1015625, 119.1015625, 119.1015625, 119.1015625, 119.1015625, 119.1015625, 119.1015625, 119.3515625, 119.3515625, 119.3515625, 119.3515625, 119.3515625, 119.6015625, 119.6015625, 119.6015625, 120.1015625, 120.1015625, 120.1015625, 120.6015625, 120.6015625, 120.6015625, 119.3515625, 119.3515625] }] }] \ No newline at end of file diff --git a/test/tests/eventlistener/hammerjs.html b/test/tests/eventlistener/hammerjs.html new file mode 100644 index 0000000..d1754e6 --- /dev/null +++ b/test/tests/eventlistener/hammerjs.html @@ -0,0 +1,92 @@ + + + + + + Test EventListener + + + + + + +
    +
    +

    + Memory Test EventListener with HammerJS +

    +

    Test EventListener in dynamic content!

    +
    +
    + +
    +
    + +
    +
    + + + + diff --git a/test/tests/eventlistener/hammerjs.js b/test/tests/eventlistener/hammerjs.js new file mode 100644 index 0000000..e55b8ed --- /dev/null +++ b/test/tests/eventlistener/hammerjs.js @@ -0,0 +1,155 @@ +/* eslint no-console: ["error", { allow: ["log", "warn", "error"] }] */ + +const puppeteer = require('puppeteer') +const fse = require('fs-extra') +const _ = require('lodash') + +const CYCLES = 5000 +const TIMEOUT = 250 + +;(async () => { + const browser = await puppeteer.launch({ + headless: false, + args: ['--disable-web-security'], + defaultViewport: { + width: 1920, + height: 1280, + hasTouch: true + } + }) + const page = await browser.newPage() + await page.goto(`file://${__dirname}/hammerjs.html`) + + console.log('App loaded') + + const metrics = [] + + for (let i = 0; i < CYCLES; i++) { + console.log(`Cycle ${i + 1} of ${CYCLES}`) + + await sleep(TIMEOUT) + metrics.push(await page.metrics()) + + await page.tap('#add') // button 1 + await sleep(100) + for (let j = 0; j < 10; j++) { + await page.tap('#contentRandom') // button in card + } + await sleep(100) + await page.tap('#delete') // button 2 + } + + await writeMetrics(metrics) + + await page.setViewport({ + width: 1920, + height: 1280, + deviceScaleFactor: 1 + }) + + await page.goto(`file://${__dirname}/../../chart/index.html`) + + //await browser.close() +})() + +function sleep(milliseconds) { + return new Promise(resolve => setTimeout(resolve, milliseconds)) +} + +async function writeMetrics(metrics) { + const first = metrics[0].Timestamp + const timestamp = metrics.map(it => _.round(it.Timestamp - first, 1)) + const documents = metrics.map(it => it.Documents) + const frames = metrics.map(it => it.Frames) + const jsEventListeners = metrics.map(it => it.JSEventListeners) + const nodes = metrics.map(it => it.Nodes) + const layoutCount = metrics.map(it => it.LayoutCount) + const recalcStyleCount = metrics.map(it => it.RecalcStyleCount) + const layoutDuration = metrics.map(it => it.LayoutDuration) + const recalcStyleDuration = metrics.map(it => it.RecalcStyleDuration) + const scriptDuration = metrics.map(it => it.ScriptDuration) + const taskDuration = metrics.map(it => it.TaskDuration) + const jsHeapUsedSize = metrics.map(it => it.JSHeapUsedSize / 1024 / 1024) + const jsHeapTotalSize = metrics.map(it => it.JSHeapTotalSize / 1024 / 1024) + + const labels = `[${timestamp.join(', ')}]` + + await fse.outputFile( + `${__dirname}/../../chart/data.js`, + ` + var data = [{ + labels: ${labels}, + datasets: [{ + label: 'Documents', + backgroundColor: 'rgba(205, 37, 44, 0.2)', + borderColor: 'rgba(205, 37, 44, 1.00)', + data: [${documents.join(', ')}] + }, { + label: 'Frames', + backgroundColor: 'rgba(239, 116, 55, 0.2)', + borderColor: 'rgba(239, 116, 55, 1.00)', + data: [${frames.join(', ')}] + }] + }, { + labels: ${labels}, + datasets: [{ + label: 'JSEventListeners', + backgroundColor: 'rgba(248, 189, 64, 0.2)', + borderColor: 'rgba(248, 189, 64, 1.00)', + data: [${jsEventListeners.join(', ')}] + }, { + label: 'Nodes', + backgroundColor: 'rgba(181, 202, 62, 0.2)', + borderColor: 'rgba(181, 202, 62, 1.00)', + data: [${nodes.join(', ')}] + }, { + label: 'LayoutCount', + backgroundColor: 'rgba(50, 184, 79, 0.2)', + borderColor: 'rgba(50, 184, 79, 1.00)', + data: [${layoutCount.join(', ')}] + }, { + label: 'RecalcStyleCount', + backgroundColor: 'rgba(37, 180, 171, 0.2)', + borderColor: 'rgba(37, 180, 171, 1.00)', + data: [${recalcStyleCount.join(', ')}] + }] + }, { + labels: ${labels}, + datasets: [{ + label: 'LayoutDuration', + backgroundColor: 'rgba(45, 134, 203, 0.2)', + borderColor: 'rgba(45, 134, 203, 1.00)', + data: [${layoutDuration.join(', ')}] + }, { + label: 'RecalcStyleDuration', + backgroundColor: 'rgba(100, 58, 195, 0.2)', + borderColor: 'rgba(100, 58, 195, 1.00)', + data: [${recalcStyleDuration.join(', ')}] + }, { + label: 'ScriptDuration', + backgroundColor: 'rgba(161, 59, 195, 0.2)', + borderColor: 'rgba(161, 59, 195, 1.00)', + data: [${scriptDuration.join(', ')}] + }, { + label: 'TaksDuration', + backgroundColor: 'rgba(221, 65, 150, 0.2)', + borderColor: 'rgba(221, 65, 150, 1.00)', + data: [${taskDuration.join(', ')}] + }] + }, { + labels: ${labels}, + datasets: [{ + label: 'JSHeapUsedSize', + backgroundColor: 'rgba(163, 104, 70, 0.2)', + borderColor: 'rgba(163, 104, 70, 1.00)', + data: [${jsHeapUsedSize.join(', ')}] + }, { + label: 'JSHeapTotalSize', + backgroundColor: 'rgba(118, 118, 118, 0.2)', + borderColor: 'rgba(118, 118, 118, 1.00)', + data: [${jsHeapTotalSize.join(', ')}] + }] + }] + ` + ) +} diff --git a/test/tests/eventlistener/images/1280x960.png b/test/tests/eventlistener/images/1280x960.png new file mode 100644 index 0000000000000000000000000000000000000000..6c54c1aaa8fbef20008260d96c3023760d049ab0 GIT binary patch literal 35880 zcmeHwXIN8P6K;r62{uFpK|qwIAVoxqR6#+y1p-Kkf)r7DuK`3XG!a8DdXOe1GzmQj z3J6G~Nhe@{(0dIexf|j+-|_qWb${LGKJgFHP4=2SYt1|FyfcX}ZfdI@Vqjwcfk21U zZd|(!0__D}?x~^Q2mG)Z==21E7_L54R=%mGtju-O$=>qeV+#=I#-XHWcilU^%+Ih@ zl2zZC&T{dtuz5kb+GTE>fZTea=6@3$9K`2#ZLiAlqvv4{bZh8TpPe z664MKPq(gJ9~%sP1f9>lygU?7YB0q0642efR`b5y<)E9}fsk4k13G{4cLvAjrau`o z9c%u)4nE09ci4cgX2jAGqPlSn+__yP7Z;a#qrPZuPT2oJMgIlNO+M!z6h!1%NoAgW zAcpH*60&}LEMwp|cZ$BSicugaHPR2i zeXYBYm{P;C_;f<=*2EiV&#CVaRvAWVaHxlI>A?8IU5KkX4erY$NdG+j_@wI~y51e@a zy1<%>3wrzs%=Bu%%UcHV0AW$^g?oqC{VzG}8R7y3`QKpN6TL_H2Kb>Or0}YI4{!u8 z_RzUKv2g%(26%mkXa`C->@$Yw*Bo*ks6;k8lpijDMp z+EfhaPc2?kdS$>vcl6Ao$g}UkS=ZxV9e#hREbK<4LG$BmrGwfc(J)``Xf;~O=XJpt9 zH`K8HWOwi@J!vdvcR3G&KGGdp;Xhq>XoPRkqf%h#_K5bOv}T*T>m z4F4lr5Zb*cGPjT zU>=s+Jm=$z19a7F&YJMa@l~CP`g-Mos?$kBMN^$To)j)P?~&IEH{YD&JFcV7eqE_o zTUxzL(Nob=IqmkLOuJ5l53%J*cXg_+`KtShs776iS&qSf&5g>Ae1x2i@#fWe(;ed; z0~b!=ho3>Hlhe0L!M8pse!3Honh$%YGE!VC_f+kA{9j13=VtL{FU+3&y!_=BZ{_QN z*Jvi4EXB$EcHXozY)Tzzp6#W@TE$oTEc!$_R3+bUbwo{mSvfsXwF0%^wJ;hxH^x53 zHdfShdta^Sy^Tw^S<^zJLMuWemc_@*uy}001nQwFrSd#-Q@~EZ2YD80iKIhDe9+Xh z?>gR<^uhLnPN%31pUr)nUYo5h;p{MM2G%_pn*36w#vl&8d z^6v+;<#Nq4iwvw%wToJhnYqw?debe(LYPpW6arr-g&5QC5;=0Rroh1m;t zgr+Z?Hau^**TA-TDxX-__c{KNiMek>unpe4s5O0X{9|sG5Y7!V>njs)l0V2?p%g&0o-=mVrw$Y(3w4s5SM# zL6!xUPN9=dZH^`sxw4}?SE9uDt1_4<+cyVJxLt?n>_+h^O)gFSM+q|zt^#d^BMA2%>l!fz z7YvI=RYLEEa;3{LpFVZMo5#&5YrTC?;~9SDCj)*?_>ysS(M+Gy$FZztY~CyQCqqX8 z&Qqs3aEz1}$7-|2H1k&AW$t5;?x>1qTdxWAf`qU|lMRdQNJvajVNlz(n9n9J%+>PL zPN?C*I#)jqyB5Ni0!Fjmyn2&*{!&(3*0+a2#T&&PO1$@9<_nr!lH;!usS{5XRW5IO z*fpnj>@UT(NX>K3hL#nv;bhI#8=*W2yiW`d6xkFGS*cp2G~H@BI=(U*KWf*^@pbv@ zmfvN|%kHjL)o$eA?N68I9v#ko`XkS{zf9ZR`YV~x4Etl<$-i2nB<}iy>IJ=ia zowwfJ%CEj>T{J&luT-XVYoto3)#&i!FON?=o*lF-%C+f_IcwUsYS#SoI_SdoeAzG0d7Qlx(YSu| zQSMdSFZTyVa_X?te@&HRtPpU-wb>hskyzEIs%Z_i5w2Y_o!yd|l5Zqx!(P`H;2j(6 zNyDqk-p8^hZ(d3*+ki-&kzV}SuyJ}m`JimC=S$xYll-KVwUY05U*3K9W8lY&lJ^o1 zy*0gYll~n^9IYHe3JDaSmC&`g_@X8&4QyoViNply6nDQRrTV9fAum{-UD0=uFE1W# zPs+>B8)^=SL76U=Ic4=%ZEfqtWLxD)o5=Vk`Bu#alfr&*RwPHmXZ#*cew??hnsg{4 zMdNeBtM~d6h$dSiLu=)}W8svfQ+q=85$A-fy(y*xa+AJ8q_+K8M@$u3yrf9hB=Z^k zU;GR@0?8i~a!Fkq-IiHZD>HAq?_rCcTSWwyDvMB%n<$;Sz1S?Qph~gIlxnUjHgq#| z(5qnO%R+N#Ob7lc<~+G%9od$h;^)3qWo7pD^TMOH={N=Tq0DM&;*T|3!h?y?4)=%i z=@~DFva1!=0!Z(+%vTyBCuejvbdV`w3hqA8?IjOBTg!3WdeHKg*cC%R5J(ZEcI~RJ z2i?rzWHfshQeyals2OAG=g@=9QI1D2L^8_%bXB?c<;K@>1lBW*_d4t_7W=hdvbDCp z)Vx0HWtK}U3_jWFx%R_m*^mFMo%d>&KBc_yD3_u?hz<;)XZ+8L@3)87qKm}N|NgJk z-&=z~{MiEj`yGn@isp25_wYaC+5YQZJMW@<%lV(1|Fhh814U3zX=%F3|E#a52+G|5 zZ-ailN1T}vBq5xa^#_|7K~sNN7#y}2;vW|B$mX}lquveT@Abb6(;kDi8~+Ie+M)W7 zFMt51h4}vh1`VnH!Smf0G{F7eq)AJEzolkc7XM#rLn9-cH9TktJQ_*y)znfSz z4fi*Qq{YT>5J^=XXnEr|r_kz+f69!1UeM|dTD?K5H)!?7Z^@LFH)wf-R&UV8!v5X6 zqSYI}K_so-_zfay^~OJp`adtknM;cn2Q9z*e4tvjNyy}gQ{tRuY5tETfR*5v2Q2+7yOJkPr&gme2QqZBBcSOr9yemhHt zzSmgw)|}CxTfc3BX}u$b@jL!5btd+Ljv}bEGXCVzojpwy3qVx^pLm$eNJ;kSMC1In zrZx#F3X7iMSFS2Wh+wvzkQdZwK)k5oZgRDho2nb zL}z18bG>rd2ob67*-{_AQphXoHyWwBMwB5Hz84iGk;fD453lvn%TVdjsPshCHtI$N^G)j`q3*2m# z;tOMx%8Wt21$J`H^!pW$#(;{n1`&95WfOs^L`Qz}!Rikq`$I>@a1;{Go!M=Aaip*( za@U{%F*>?op;Y(#J2KY9+58odC|zF)c_pI?iEvJ^a_u`HQkn1Gyf8p$-DDcyUW`B( z50*Nb|L7pB4YR;~9PRanbNGkc3v*zVZnJ$0A98)4QGPZA`5S(+mNDkaHahlt42F{~ zfz(4omR$w)_gIe2AxPbb*+DURG1LJT;m5w07sU_D$*XPf?1EV{^8(W=i|&Sr-7{PB z0>VV*Rn!nI3=_)kBd;SUXcxi72`MMWaoj z%(8`^QEhI})e`uDQ8%0i_5^v1p}>zqT3@%TBCVcqUr%Te!iKUBG8xR7b>J&*x*ggT z@kAs1K@Oa%R%doC2|0GdBT|tEO}2AxcE&J)TRAFuN?Xd%AGPGmd>!Xzi?H(jMy}HC z1~L7LIN$ZbvS;2?*ci6z#rji5393_Z1j(V7LUM2VajIz9EfH+xz*>3(T4-i_x464! z3b?&8xs^I4%*_2N-@1d)s>dJM<>h(xld+Lqb~4`ZDL4LWDdFIhStQb{zt5~__NKd$ zIj-LGm@NN=R-0~HJE*C1#dIFpxQHo;(3{vlw6an1G%00wUt2`DK#90cR_G24)(EjQ z3gwl#I>s0UzLXvcPLwPePh+jXK#L*Duka%(;Bo?wO2CG7^JR_2{4X9R;k zWK)uTmcDj9J;1VN%IVN=i=I7ne&lv->68Y4;n`^b2To}To-tmvIIAPO_&J#Z*j45J ztwjzi-%>;p$UeG!`$^Eb1Upvmv9hO_&2RQF!vbW@BByy+4T>!A3@&qV#%hgY)A;s4N%Wi1+XQv#49qp zkVyvspvOHVs;*?fw7eOVPy8zovL7qE+=2>5%ng+31%9f$wbJ+TQQiH!;MWkrgvuAi zUfvdg-6T2#m3jryp?{^th=XcAsACcU&eB>A#W~E&tJLhgW@bgGl0(-RURv@-d<|PFi^z0W#&rFSAT|xM4Kkxf*z1uOoZXWIV(aWDN~DWHa!u$ z5p?0sy%~gwu=9+{b?UhC%&{BK^`LDkPo4m|Vxy+U1~-NvJ9dCXv&&V`K`|Y(P0u(k z6=I16Cn{F)Oe$g3*LctubkKsR6mz2deZ4Wa)~OF)C$D6XikNCGkfXP-A2o-)bYm-V z0@=ps&6!V4QyAIx`OFiITMgBdSTCPD(hbx!VnI(2in+Bvb;oaX;3E1_p|n&ZJLPY- z)!asbC8^2Ir4)APjSogJIXxw0(CY?UsIS1t4PJj^j2myL*Y;vV_Yt{;tr=(IQfUr@ zvNe~MhZN18c)~*1miXxYNMG)NwtNpn;t&2ge#Brjg`lx{N z7!D+4Uvqt`5i-XzA^s7vOE(@GbDwE)sf9dD75tfQE?}->;N1B#Z!&R{9mURk zSLZ{{A!K0*x#|NJ-P9HPk1>Mmus`Cc;n})ZfDXocviX`yVD`gWC`DyY{A6qs8QQLb zZmLG2KWTSkOH~I2$C1A16DnHH#(h>}hG9tm95Ykax=eT=rYRxJ{UcE)A_Df^j~YB> zU~tXYkNU>lyrXFNmPtKyh%9sHEc$(TUU~CHq#~*uVZn~{Rn<4u;@iv_n3FC4AVSEU zk@1pw+}eNt)a>%gV>{Q=gG)@&ZEw9@4yJau`gumSq)@gA@06F=zp9r?yR<92wd0@F zY+R;7=yhPpJGvK?e?YA^3z0uWj9KiEqpY#<0J^ykmw1kjr5)?<9~M0R<-Kf z0}52a*KLHnoEV*=x+Oc*C6BfJ$lX72Ql<6s?DEL7)7m)Bt+<%4q4NAoJy9G*PdF9! zHKtIVcAk+DlpJ`L_3ZBQCr_L-`2;gOf%cotdBryP0o@TEF4v6;#W16pOBm5)_l2ywLKR*k~uHQS~qb(@dMVlMM`x~ z&5X>I@EPwubelYCpin+eH=Nbi6z4KmC-0mLP|Brz1(oF`UsL6Cfn- zo?g5_b>fQ}Yp#oI5;+m?3W*{OdUY{P#$(I4q^dXfmLmSut5JDa(0kDtFi^9iJ_)#0d*yK27a-Z zhdqn^4y#6eH6o;A8ilD|hv8+HXP>f|#*RrlLn(PC6(#H7H!*NOPgnBxCMiakBFk23 zyA(Y@H6sv?Agwx_mRqRVlMS%j^~{cMWWXRjqAQ#ASZtF)`tlZ)AwtN)_x8TkrlLX^ zM5Qi7E3mc+;bXs48)CcHADN#o7F?|L<-ONjB8DkEag=#@bwQ+?G?k57Q>uvCXMATP z#(A6#;Ed9X>NP8K))W|Q*&?)8pdqo7zuRbO3KNRbh_Dit*!8(XH1NSUt1{xa_Rc=f z?yS}Zvf!BLx5t=J78~c$93WWob%S0sTf1JX33QnccpBte=PL;L^=F6?BO{@YM#ECeY@J*x{7A%!yzH&H3VRRSjFg#NQa zb9L0SfWG~<@TV~4D*RA;dYPV`BRlIIJ2-olt8{l>Uj7FN6Y{P3Qlp1T!myOLLZ~~XQsmVg)I3q~7K%o8_6@GYL>A{hN ziJjm%6(N77c4Bd-BAH5ZACg|VYiP0xl5!N*^bGjoGS_5eFZeO8RlzqrxWiM}Vzu{8$K~-2 z_Svkqcy{shm-q>f!{y;P>h2U>-~!1ucS*YM#*Qf0s|A#k(I}tbZdm2H(z?_*l zCKUF|y*!{C_B+tL9}V!b%f6H;4Exp&dJX|_(FIiYWh{XRfb3)g;9Xek<>)J`>Z{Oq zC-t)Q#9gGhYJ>B4*X{6KW|wF|CqgIvFFS9R>0Pv6t)X@KL0{IpvGsj=dzdJM*(r#8C}*4fsaZZ#LAwgrK663dE_xgcszq zG4jkR^6SgW99hkYi-o+$PY$}1d<;LW0(wSFin3&qxp-)%EZXkM`ih~nn~Q8mSq4^1 zx#s1j@d&)$2dD<#<%fK%mMUr+1q*ml)g}x{;V)lM#uK9AXP1q z0Nq+lkXnLWs>F`#3nnS(8uZ}I@>!3BUt;bzb%17nqF29OqoIt0qANeOIcQ+ zTslskMfL7K?UP^bG}iRO{=i%(ek*KSbNBSOz6R3&1-*XbUC30t#f4=%HR!Z8YmDX? zk1r!F!pURsH9Kr>&^>PaH)jUQERJmJ`kHVed>=O}R;?Z`U9yx@|0J>GC{W^)Ee2BQ z?yZpkX=V9hu?5m3EiVD$?-`6+#~~ENlV$toc`kobuN(NQYEoK&87V)gu-R0Q&}u=s zO!{R^JYYZe84_Ac3#?6X)x>+K|i#*d@sf} zoO9mnKIg8p-=5_H%^l^NDVMzR(r-4 z>W*}YSURbD@e-B1HUs>p$k^AJe-{Iv(d*W|s#J47g$-{;%n-h1P&QL2W$UovC~^Y= z=0O6KoAs%wuIx0cI*!`nQg}+Im9G*%ln%{Gwg`oS1nCBVjOsg+Tje?JGRFE6$>=n= z3P_XF3Uf1C+cH!6-+J*JvMtmM6v{vkQcato>IAK?6q8B%n@47CbI8s8I&kmVk6jh> z)kX}KDot|Nbt3mM)=eG82Qn zbM^o%vEOd_Lgf>1wJc#S7d>=$?5QNuwu4||SIC4C%d1=aw!LKkp)lzwC(5Jem&Yvw zWOSB?!;*IW&ln5mqO`%wNRruA!p5bd(~9W}sHJ_~Q=p~bo=4qzvsJbpQ6T3RBR4EG zxlN%rj)m)?D?PXajD`v;b3vEr?(r6DOe7%RXSu?%EsZ@{Ra+xZpt@!Ol*{ETWKpy$ z%7{4ioj=8=upB789V*@+g?^}`Pg62fev(;4b3IYQwYVGa}gnnCz>zxiSquSfT z$pc6I97hn_ukOvQcEfSKLgn_Ai}gdNo@LuZ<~Z-ZKf?6Wwp=S)5PbryjSb3yC>hcj zK+zHLTYQ2bNfT1cD>+Il)0Oer9_Z2K$90us=tADuT!{amccqyXoQeW{08_}Q3ar=J z4NXhtjfvCIdqn81w*00uEEOq8wU(a!BP6#F(6pN@BpTG&y>GS4GPZ14; zVt}ME`=k~9jZqZMZ#DLC>KFvlp|SRc}gQM#tdp%;>0Ql!hIjTIBtPGoVU{!jR}y1j+rP`L99}a`;5!%fFh8)K3Hat9R%_ z!d2e4jkYh5LV^WM!4F(@Vd`URBSA`KADzVw8ee{>^b<^g=(oGb7u8*Rz5{$J0b7lptf;bv&+n_6zItE*GDs#`A%lc)n@jOeI!( zz=pmtRzYEQ(EdWOL!QtX#j&)*o*gsJSUGp=#+ZV!`BbB1Zv)@-zKJrOLO3tG^jC%& zn~fMQJ~`2HTS3V7;Jn{@c0Z7IizodO@<2JVMwd!bKbekceUr2w8gS_|lCjg5tNsX; zx=3AqFR=Wbn>@P!0?3q8vvLjOp69K4Yx)v-%H-C{ z@^kpOvEimvl0pj7Uj|(mVaK{YLH1M`pNL)#j~(?%B{_fpxI-ieZ>Kjn{)Dg;#>Od3 z6C#KZT^BWA=f&s)1BKfmyKbe5$TogF27a4!&vF%Z%vrh{PO`l z^9ah85hr-u4JZk_5hlC`a~^xTJpg}$G;#k(MUQcc2djgmm>f`Wa~DeGMJanQ=b*NC zL_})`RT+6(0TlAyPrp%BF?Q}(qHmYR2X_=SWQ=`Fl^(c8z0tYb#Qo5-I{-v|%p z=Kj>qo($OL9E9kIHLna}6va2b{5%k!$fSD3LZaE1IQKErv7Z|8zImsFZVv?;uCnWr>Ez#GeUG zm;wVBy6IxUNt25n@!pj-)>I<)-LQtCrnT#`Bozch6_s8zH7hXr^MD5GCCUZPj~HL} z&w&J|;-7!=dhYT@jd!~j&{PXf#N@ovP;?uJmY&1RuIHPlGdl1ne#`B}Dp0obNA7pa z&aFeYncOVKOlvEAFc`a3%D%$e4wQlh69myaEj&TCIls^>Uo5(96V@snrw>8bMeLzQLaK+SopVtX6iRK$;vpE!*R zU2}KCy>Afwh*QzgYc0d21IUuRg~D6?O$`54LR;PC3i!N3fgis@N&+0EK+n!OH^{TY zK=9qwvAxh#LYOP>Xl#8F_EtitmCMH;#LXiI=$!K^+098$Pfs^+tdee>8Gc=hX}Q1B zi&)I8ylIKiNh2o!xnx7dJ}oaOlEcdfA@nyh{A-69!UhwmWDEzX-uM~vj*zTn04Roa z{*$q7SaqqwuO|frKkNvmnOQB4PR#}?4R_-3F62pP1ijQ#1TrR9lMpX|gn=%Gnan%$ zO`s=I$Q;$_O_5fej>W4ysU&rul*?-mK}zel%7ppq%gLKyf3--mcOdny=Q7_8rd$%a zX-JCsZflfHx&2&S>b1iM04G0Z21OLNhjt!^Vc{)5vvbEq}H>D zm?oxwYy%|Jm?-@+`lIWAKxL&UKSfV}GO)PMQc zYccB2C47D&W(=S_5>SxplgNV^Oe!!XbdE&!P_=OxN10f3-Bc8#=+!}XLVVuEr~c5_ z5?O;T$z=+62yOice8Jb;@6+aaEmiHP>7D0Xn$K-NknygeyUK@};eRLJH42cOj^+Ij zh-AOl^1S$S^$7_!Crv`D)sBQC5MVkscDADj&;bJDC%5i`O?@?4S7dkX?TFkrmwoh;rhC*ITHNB+jw{ z^k89|Y=g;u#L3(|aip!*HOa-vZRrCY$Pq1GSNAW@Mnzv|z~U*`8Y%=+*&p zaIt{%hIZolb1U&wUy4B>{>_C_q)e}^uY9#e=@MN(=#foA$^Dr@171E%Yg9Q>8@(flc4H@~?oxZpR=de2i!khN9O<5%_GzM4dh<`3e z-puG+doM!SAoSMbGL5pfT*yrqy?kyjQ&(yY2UeQt?9<#?X*l%2Xf6isw>g$yo2C&H ztbgH9%E~Ja!GLSL6S2bjo@7(r(3VX=c}V9BRUKDuus z_3O|~_U%Add;{OexVDzH?cGf09C;0UC@@r* zA}|}ZOWPmwae)R}zTKi$uewklpzzNIfY`^QWv6SlQ0+V`#U}QcDICy=IU2<0cO*CB zS|fHK*qBvyjl-nu9J};uGC={Rv{1R}KBtFFty%@z_((6_W16MX1fL3ao=F%JGvvsUtVmP(k8I z-@X2KE+3}k1PvR8UFmLC_@Sx`9TJdBcoe#(0i)>YmrX6M3J{a2g`oD%8aWBK{$681 ztYW1L5vR%Pamx2aU66P=0vtcJ+~(9WA%sjtr&tc`NU-AD<_dfL8<=th&TMc;$ck-O zR^w6ISUCZ@VQcL8jOW(;1Q~fzle-%q6{JH2c&{DKk9Jep)kq=15T|}~aA2g6J*i6X ze)|MNO-t&MSQLai72OU~YIMc6orq#xw-!<%#4b2S-L&%E9>id$Fj)Dm#~$&(titF* zHIif5{?UqI%nr$4$m+nSVnLnwx*RtuIm`uuG`H!Y74B)KB7&!Vb@md^ht{oLlf?A$G#H)i76rP2kX>!Vztt8GJ-`q2`Cu z!hn}Iph}+^$r<37L?-4G*6K$bS?qtY>&RlD^;9C51*M8y2!I+=#?tnqop=ocUjV|; zbjlNjpB0ri@uYQ}f>{KHa$XRlvgbQ{!DK=NaM+FUfC&GsA+jH+ecVTJ-IQ3+cehf- zRpt%bTyla+tiPknsmUiTsCGQk)a10)n3P<#Fu{A*v-t;s9Tc0ocbt0o-2w*IhyW=* zm?SCKSi<2GdT=e71B+8{Bh4VHS{ zw*s{6NU}Dj)7`DJnAC0)g}Dp9DP4$EvgR;3f7t;FJ-g$k=Hg*_Od0ziN%HO zZoYnAJ|=bRR9~+^2Rwvh0eX=X*8_^3+3*&9L3Tq=y! z(l6Df_wsqY@C*D>07zQtYI#nD^a3!HrBKPvMdPL$p!T*6Mhwokr)iwZJ=fAKUdUv> zlEz`!i)7?M@3C5i1tJI55pGxJRH2nFIcw)fvFYyVsVx2i zY@fv{96a5`&{>D_T7lo5hG38cru2s8d1>?!0#4OS*8UCWp^c2AN#elCje7qpP>8_E z%|KbIP^F^q6OFl;RKd`2x!%L>H>6$z6-K*&5lmSRrZlVI4ztj+`!;~^@zdUjjmhNc zIW=epaIdCrKBL;iHuMpDCvt~h3tu+nhklQ(GZ_jxHlYWu4D#FTb7}ryELWYCjHhDc zB+J6Vnhv<~rJc%#4vb;EkqHoy^^hkl3w603tY7UBTm6QX$p!Yr=&mLZlkV6LtNsx% zl4W>w)2+f-E6z%C+^x^VPDg>XB4T%DXr=F8jcFr6E>Pu1avnACEm;~bVGGaB72EAh zXbGSh=WP<4c})U==`U})X=UsIBfGIv326CG$4uW6EeCS040cUn9@=ExhlS0VX`GYm zp8e+K!*as;*DwwS=zaO!vHB(SYjRck?D-6yc8Exlkgzd+^31r#Ydcp>U zO<@JOi}OD#frvH?i-~ER@oN51w=iX+Xr7n!O?%$FM(Q%OUju_DOBN!g0( zm5`$wfK;k)Nb0<=A?n`F;>o6y3CHoQON5U5B%bQxxy@A z3up}L1M_l|3*yOuf^9S&7vt5!p@`Cv&0aMH>U6ziN9pzS1_HCIJT;h20M)rS4^>2k z<0J+b1CnF_Z)K^^=8`}*8_;oVp6o92;akxVeck2K-y^n`Q{HsSi10xTW@6DIoiXbW z(3F5MFZED|MRIbrtR!c<8Iuwe+TR0=gXkvxN@zMYl)!=H+)ID2 z=L39E(P@_3sb?%}u{npE7yIvKmCCms#_1=MSa3bU78+r2&oQK)9Uj}gI^C@y2rfD+ za>fiMp5E`Rg#>P zF%d-XR!i<1&k{Ho<72s3xAxV5e1iWd%)ac4^WCgCX-zn*dwn?>`MqPd8eMLNo+D09 zuBgKx%dz(f_(Z3n23*K5bL`!=(#%0Ef4fpFFYq z{M1AJ>zx6H0O}NpUV;AMk_8~8#u&1sp54WUe=WtxB^m<6AF~SoFFoy4G5$rsEz)=-2miU9Xh&&Ws$r; zu-8}g^#0J)qkmv{DPZt00dD+jru#pua4B*D)b*GO_aB(6{9Z^67E}5M;;INxa=uWN z{~`iArus0@`==lr|3t`v;z;vk*uR(l1&SL0`vj&=|HN5e_=93a+5SMr7XVi6NB*Ms z2eX;z=tS>}|ADU#1J%Ozc1ZRg%;o`u@6}rWiHB$SgElr<^#4G^X&VG!IBkPy5wx4i zX%Pe_8(4G?G9g34gcmX(WM05@;mhZ=IZ`B+!(E-5wB)B+y6#jU>=W!fv-^H#^YU z4L}J=Qxg8~l>|c6_aqRA?xotbtGcxI_x}UUyL(K@CGjD9LFYigAGPb+*YcF^1^yq1 Cr3MKA literal 0 HcmV?d00001 diff --git a/test/tests/eventlistener/images/96x96.png b/test/tests/eventlistener/images/96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..ba64ab9a43e776027d1b5074adc3db0ea13fd0bc GIT binary patch literal 3602 zcmcgv=QkS;8;vBbRjai}sh`o>wMvOi1Z`-o*sJzvwGFMBHHxU+7)8;V4cbs6LTyT= zYQ!iSL~J!`Me6PQp7Z_-zYq7h=iGbldA{7|!;@%!8_L4O&jbJfSYXBmcmA@=f5CA6 z?_9_UQ3C*&bba*o&0+fbBIdzCo<9Ef003i_f>$Aycc-`$2>2WLZx=;H#P|81GKzfH zFy;bVB*LQ1f$^~tNP}}moE+DzJuE-dK@&vX4LO;g$G8z0ciGK*J1h(g$+IXw#%+ws z-drB74>3PQX(Ud0ZHE(E0OqGL;Lb<3bWzI1wwzn*9S#>S4R#*_dD-b$ZRtLfJUzkC zBLm>rDISuWTVdRbJ=l_q^1#i=w3|yjoH&b27rmh`b{@cFIIgN0A;CiiX5Gd1@F|{w zzwBpUQ;ff^$X(1>@?LbYyVn1pd|4Vdkb{<3D&|KF^R+4$qHyMOdE%r}6u8(SNBpN( z=`;F!cuQCwfP8p$boA)889;$E*LjE{QS6_nXvoR8mADH8Fl2SBw+6E&AFF#80z%8Y zmXg4UFt;)eVvY}arQh>p2YdI}?YeYU*DcbEP&2}Q{e_nbJW;hluMFwL5dpd0>6;kA z%}vC_viEWO)coa$yEI7uQ>xXD#0H^I7gdOu_uqIgkLLy)h}q=}VcW8;0QCXqb;zXm z@NE&m?m0mH-0Qu|@%~O3-3u2anUgm*{2$U4`N>JI+@Kc41bu0bS3k@h+@e}*l<{as z{{!Pvx@Sl(D=#xO7#h03iY9o_4%yEZKdbwE9q5vIUG$k}CvL^cVkL_)Hqjdwrx|UV zCg;Hv8#zvjY zs>2lDVX8nk7wy9k^NXFUM7Ju9`z>3p-UPdV9m5lSU2`=~P>+6M8heJ$@i&PIUa99* z#ro!u{eK?uw=g(9KY2s{O+@)TjV?TvBL_I@$}$P~6g5?+A;ZmoEAiSZSD-#`;#EImI~r z!4l|vLa}QOFLy8BVgdq1aPD-kh&F-vxS1_}c$mZMYIBDwGa4_#D|J@uzKg%R!ml^_?#cJ2`djrkr|(TG2tjYWrH*E<_UsF< z;P)BtiQls)UnL8Y`N`NXcg}YzxEv|n;d_V5MBz}Wd&zm>a-$WIIZOlR|dx){v#A zI5t_m7*n%ZE<2+2cD5RVaj(GIdX?VB4qtN2kh8y`+vw1EH$)F^DsLJh0@yHbr_HTO>sl6JHf?Ir3G z3t$Rp=s&q|-;`AZ5-i%^+1#=LA_27NeE5AvmQ=9LSDtihL3ZsuaKICcTkJ;l3|h`Mq%ai1&HBm z!z{z4%olim@r=px29G=-H3|gL-LsRBDOwX% zn$46g9h%&iRh~)VCons`K-b!&+tfB@9J+1$ZkKD_)JoJ!(Yn-zY^x5JKXRo3X~>h= zJ>oCQ36Tm1tAXD$t}wj?8-cCqwU`wdFP?i0?&_fHz{Lp5e|Hvh7~=-&o$4dwG#OPc zIC7mlt<-6-;Fa)?f>2nO-|u95 ztS*)4jHH`geTeYH<-Gi3_S+aGmM{Js!Ho6&IOheuSMeryrV9Gs#`M{*PF^e}A zb!{%**zM(By=FZN5?*%Lp4Gp{pUZ!9))R~Iok5E_jr?{STu54gi~q=2pGSn-9M29N z#BSo>9lWE4{6sQ@{Fq&B*|W`cLpV)+tNH1OArI}A>^9K%;^VYHGGaXLSM<|q&@Uhjpj{r-&ib>WP(c-R%v5s z<3~i#O8oxD8=?yV`@$_?-gS;pNsu!J zT>G^@pANG}s*55*sCX~8f$m>^BkQ@^CUX^S>L(Ki0ThpwrO^Cm$hot#psS3`+<^-5zZ5U30GX0f?F(imbrhW#Z|CN(b*l|2mzS-t-&B&m zNTE=+%XA;QJTH@Rr9=VJZo~i>08?}yTQ7^B7@R&KpkY1OfC4|HC+x4 z4n83TB1)F0gLdJ%zCf2dr6YB|4ZdhJ`rwb&Sv6y7YAO@a+%a_q-(1sjn_{Dj8` zK%vkHe^qo@&Hr;QUS5iPGcz*}B@#5kZx-CV8mH&#)0}g-ySp&#-j@I(9vmLZ=6{`D zU$3U_5lekf)E}I|du4go0s;evr-$9Bx}x7#>ml0O8pZ+wMPcWNC$zTBt*z-$O(dg< z*u|Rq+Gbleo>JfVLoUh=rE0;FR^5Qbx~~k_*w_sB*NtmJAnJSem{*Pt4nwn!A8eI* zSsBQ|Q$ke6ip06pZShPPh+Vtne{0J@YU=8_d@qno^hi~d76j5jy03OvHn#fcb@R$z z=!*m#-co9cL@JgB@seIt@eL>M
    - Placeholder image + Placeholder image
    - Placeholder image + Placeholder image
    diff --git a/test/tests/eventlistener/index.js b/test/tests/eventlistener/index.js index e202b9a..69c02df 100644 --- a/test/tests/eventlistener/index.js +++ b/test/tests/eventlistener/index.js @@ -4,7 +4,7 @@ const puppeteer = require('puppeteer') const fse = require('fs-extra') const _ = require('lodash') -const CYCLES = 50 +const CYCLES = 5000 const TIMEOUT = 250 ;(async () => { diff --git a/test/tests/eventlistener/remove.html b/test/tests/eventlistener/remove.html new file mode 100644 index 0000000..c3884f0 --- /dev/null +++ b/test/tests/eventlistener/remove.html @@ -0,0 +1,91 @@ + + + + + + Test EventListener + + + + + +
    +
    +

    + Memory Test EventListener with removal +

    +

    Test EventListener in dynamic content!

    +
    +
    + +
    +
    + +
    +
    + + + + diff --git a/test/tests/eventlistener/remove.js b/test/tests/eventlistener/remove.js new file mode 100644 index 0000000..77e2d9c --- /dev/null +++ b/test/tests/eventlistener/remove.js @@ -0,0 +1,155 @@ +/* eslint no-console: ["error", { allow: ["log", "warn", "error"] }] */ + +const puppeteer = require('puppeteer') +const fse = require('fs-extra') +const _ = require('lodash') + +const CYCLES = 5000 +const TIMEOUT = 250 + +;(async () => { + const browser = await puppeteer.launch({ + headless: false, + args: ['--disable-web-security'], + defaultViewport: { + width: 1920, + height: 1280, + hasTouch: false + } + }) + const page = await browser.newPage() + await page.goto(`file://${__dirname}/remove.html`) + + console.log('App loaded') + + const metrics = [] + + for (let i = 0; i < CYCLES; i++) { + console.log(`Cycle ${i + 1} of ${CYCLES}`) + + await sleep(TIMEOUT) + metrics.push(await page.metrics()) + + await page.click('#add') // button 1 + await sleep(100) + for (let j = 0; j < 10; j++) { + await page.click('#contentRandom') // button in card + } + await sleep(100) + await page.click('#delete') // button 2 + } + + await writeMetrics(metrics) + + await page.setViewport({ + width: 1920, + height: 1280, + deviceScaleFactor: 1 + }) + + await page.goto(`file://${__dirname}/../../chart/index.html`) + + //await browser.close() +})() + +function sleep(milliseconds) { + return new Promise(resolve => setTimeout(resolve, milliseconds)) +} + +async function writeMetrics(metrics) { + const first = metrics[0].Timestamp + const timestamp = metrics.map(it => _.round(it.Timestamp - first, 1)) + const documents = metrics.map(it => it.Documents) + const frames = metrics.map(it => it.Frames) + const jsEventListeners = metrics.map(it => it.JSEventListeners) + const nodes = metrics.map(it => it.Nodes) + const layoutCount = metrics.map(it => it.LayoutCount) + const recalcStyleCount = metrics.map(it => it.RecalcStyleCount) + const layoutDuration = metrics.map(it => it.LayoutDuration) + const recalcStyleDuration = metrics.map(it => it.RecalcStyleDuration) + const scriptDuration = metrics.map(it => it.ScriptDuration) + const taskDuration = metrics.map(it => it.TaskDuration) + const jsHeapUsedSize = metrics.map(it => it.JSHeapUsedSize / 1024 / 1024) + const jsHeapTotalSize = metrics.map(it => it.JSHeapTotalSize / 1024 / 1024) + + const labels = `[${timestamp.join(', ')}]` + + await fse.outputFile( + `${__dirname}/../../chart/data.js`, + ` + var data = [{ + labels: ${labels}, + datasets: [{ + label: 'Documents', + backgroundColor: 'rgba(205, 37, 44, 0.2)', + borderColor: 'rgba(205, 37, 44, 1.00)', + data: [${documents.join(', ')}] + }, { + label: 'Frames', + backgroundColor: 'rgba(239, 116, 55, 0.2)', + borderColor: 'rgba(239, 116, 55, 1.00)', + data: [${frames.join(', ')}] + }] + }, { + labels: ${labels}, + datasets: [{ + label: 'JSEventListeners', + backgroundColor: 'rgba(248, 189, 64, 0.2)', + borderColor: 'rgba(248, 189, 64, 1.00)', + data: [${jsEventListeners.join(', ')}] + }, { + label: 'Nodes', + backgroundColor: 'rgba(181, 202, 62, 0.2)', + borderColor: 'rgba(181, 202, 62, 1.00)', + data: [${nodes.join(', ')}] + }, { + label: 'LayoutCount', + backgroundColor: 'rgba(50, 184, 79, 0.2)', + borderColor: 'rgba(50, 184, 79, 1.00)', + data: [${layoutCount.join(', ')}] + }, { + label: 'RecalcStyleCount', + backgroundColor: 'rgba(37, 180, 171, 0.2)', + borderColor: 'rgba(37, 180, 171, 1.00)', + data: [${recalcStyleCount.join(', ')}] + }] + }, { + labels: ${labels}, + datasets: [{ + label: 'LayoutDuration', + backgroundColor: 'rgba(45, 134, 203, 0.2)', + borderColor: 'rgba(45, 134, 203, 1.00)', + data: [${layoutDuration.join(', ')}] + }, { + label: 'RecalcStyleDuration', + backgroundColor: 'rgba(100, 58, 195, 0.2)', + borderColor: 'rgba(100, 58, 195, 1.00)', + data: [${recalcStyleDuration.join(', ')}] + }, { + label: 'ScriptDuration', + backgroundColor: 'rgba(161, 59, 195, 0.2)', + borderColor: 'rgba(161, 59, 195, 1.00)', + data: [${scriptDuration.join(', ')}] + }, { + label: 'TaksDuration', + backgroundColor: 'rgba(221, 65, 150, 0.2)', + borderColor: 'rgba(221, 65, 150, 1.00)', + data: [${taskDuration.join(', ')}] + }] + }, { + labels: ${labels}, + datasets: [{ + label: 'JSHeapUsedSize', + backgroundColor: 'rgba(163, 104, 70, 0.2)', + borderColor: 'rgba(163, 104, 70, 1.00)', + data: [${jsHeapUsedSize.join(', ')}] + }, { + label: 'JSHeapTotalSize', + backgroundColor: 'rgba(118, 118, 118, 0.2)', + borderColor: 'rgba(118, 118, 118, 1.00)', + data: [${jsHeapTotalSize.join(', ')}] + }] + }] + ` + ) +}