From 9772a4cb43d38cc6b282ffc9a70e57f89e9be096 Mon Sep 17 00:00:00 2001 From: Ewoud Date: Thu, 4 Apr 2024 17:29:08 +0200 Subject: [PATCH] StarMod Leds to StarMod Core (step 1 of 2) app.js: - rename appName to Demo - comment userFun contents index.htm: remove Leds in title and header pio.ini - comment STARMOD_APPMOD_LEDS - comment STARMOD_USERMOD_WLEDAUDIO Add AddModDemo module Remove Led Modules main.cpp - comment STARMOD_APPMOD_LEDS - comment STARMOD_USERMOD_WLEDAUDIO - Add AddModDemo module remove ArtNet, DDP, WLEDAudio --- data/app.js | 590 ++++---- data/index.htm | 4 +- platformio.ini | 32 +- src/App/AppModDemo.h | 41 + src/App/LedEffects.h | 1640 --------------------- src/App/LedFixture.cpp | 456 ------ src/App/LedFixture.h | 58 - src/App/LedLeds.cpp | 119 -- src/App/LedLeds.h | 401 ------ src/App/LedModEffects.h | 672 --------- src/App/LedModFixture.h | 206 --- src/App/LedModFixtureGen.h | 1081 -------------- src/Sys/SysModPins.cpp | 2 +- src/User/UserModArtNet.h | 142 -- src/User/UserModDDP.h | 165 --- src/User/UserModExample.h | 4 +- src/User/UserModWLEDAudio.h | 171 --- src/html_ui.h | 2672 +++++++++++++++++------------------ src/main.cpp | 108 +- 19 files changed, 1707 insertions(+), 6857 deletions(-) create mode 100644 src/App/AppModDemo.h delete mode 100644 src/App/LedEffects.h delete mode 100644 src/App/LedFixture.cpp delete mode 100644 src/App/LedFixture.h delete mode 100644 src/App/LedLeds.cpp delete mode 100644 src/App/LedLeds.h delete mode 100644 src/App/LedModEffects.h delete mode 100644 src/App/LedModFixture.h delete mode 100644 src/App/LedModFixtureGen.h delete mode 100644 src/User/UserModArtNet.h delete mode 100644 src/User/UserModDDP.h delete mode 100644 src/User/UserModWLEDAudio.h diff --git a/data/app.js b/data/app.js index 3e568713..9cb7ed0d 100644 --- a/data/app.js +++ b/data/app.js @@ -8,321 +8,321 @@ // @license For non GPL-v3 usage, commercial licenses must be purchased. Contact moonmodules@icloud.com function appName() { - return "Led"; + return "Demo"; } function userFun(buffer) { - if (buffer[0]==1 && jsonValues.pview) { - let pviewNode = gId("pview"); - - //replace the canvas: in case we switch from 2D to 3D as they cannot be reused between them - //not needed anymore as we do only three.js - // if (jsonValues.pview.new) - // { - // console.log("replace the canvas!", jsonValues.pview); - // let canvasNode = cE("canvas"); - // canvasNode.width = pviewNode.width; - // canvasNode.height = pviewNode.height; - // canvasNode.className = pviewNode.className; - // canvasNode.draggable = true; - // canvasNode.addEventListener('dragstart', (event) => {event.preventDefault(); event.stopPropagation();}); - - // pviewNode.parentNode.replaceChild(canvasNode, pviewNode); - // pviewNode = canvasNode; - // pviewNode.id = "pview"; - // pviewNode.addEventListener('dblclick', (event) => {toggleModal(event.target);}); - // } - - // console.log("userFun", buffer); - - // if (jsonValues.pview.depth == 1) - // preview2D(pviewNode, buffer); - // else - preview3D(pviewNode, buffer); - - return true; - } - return false; -} - -function preview2D(canvasNode, buffer) { - let ctx = canvasNode.getContext('2d'); - let i = 5; - let factor = 10;//fixed value: from mm to cm - ctx.clearRect(0, 0, canvasNode.width, canvasNode.height); - if (jsonValues.pview) { - let pPL = Math.min(canvasNode.width / jsonValues.pview.width, canvasNode.height / jsonValues.pview.height); // pixels per LED (width of circle) - let lOf = Math.floor((canvasNode.width - pPL*jsonValues.pview.width)/2); //left offeset (to center matrix) - if (jsonValues.pview.outputs) { - // console.log("preview2D jsonValues", jsonValues.pview); - for (var output of jsonValues.pview.outputs) { - if (output.buffer) { - for (var led of output.buffer) { - if (buffer[i] + buffer[i+1] + buffer[i+2] > 20) { //do not show nearly blacks - ctx.fillStyle = `rgb(${buffer[i]},${buffer[i+1]},${buffer[i+2]})`; - ctx.beginPath(); - ctx.arc(led[0]*pPL/factor + lOf, led[1]*pPL/factor, pPL*0.4, 0, 2 * Math.PI); - ctx.fill(); - } - i+=3; - } - } - else { - console.log("preview2D jsonValues no leds", jsonValues.pview); - jsonValues.pview = null; - } - } - } - else { - console.log("preview2D jsonValues no outputs", jsonValues.pview); - jsonValues.pview = null; - } - jsonValues.pview.new = null; - } -} - -let renderer = null; -let scene = null; -let camera = null; -var controls = null; -let raycaster = null; -let intersect = null; -let mousePointer = null; - -//https://stackoverflow.com/questions/8426822/rotate-camera-in-three-js-with-mouse - -//inspiration: https://discoverthreejs.com/book/first-steps/transformations/ -function preview3D(canvasNode, buffer) { - //3D vars - import ('three').then((THREE) => { - - function onMouseMove( event ) { - - let canvasRect = canvasNode.getBoundingClientRect(); +// if (buffer[0]==1 && jsonValues.pview) { +// let pviewNode = gId("pview"); + +// //replace the canvas: in case we switch from 2D to 3D as they cannot be reused between them +// //not needed anymore as we do only three.js +// // if (jsonValues.pview.new) +// // { +// // console.log("replace the canvas!", jsonValues.pview); +// // let canvasNode = cE("canvas"); +// // canvasNode.width = pviewNode.width; +// // canvasNode.height = pviewNode.height; +// // canvasNode.className = pviewNode.className; +// // canvasNode.draggable = true; +// // canvasNode.addEventListener('dragstart', (event) => {event.preventDefault(); event.stopPropagation();}); + +// // pviewNode.parentNode.replaceChild(canvasNode, pviewNode); +// // pviewNode = canvasNode; +// // pviewNode.id = "pview"; +// // pviewNode.addEventListener('dblclick', (event) => {toggleModal(event.target);}); +// // } + +// // console.log("userFun", buffer); + +// // if (jsonValues.pview.depth == 1) +// // preview2D(pviewNode, buffer); +// // else +// preview3D(pviewNode, buffer); + +// return true; +// } +// return false; +// } + +// function preview2D(canvasNode, buffer) { +// let ctx = canvasNode.getContext('2d'); +// let i = 5; +// let factor = 10;//fixed value: from mm to cm +// ctx.clearRect(0, 0, canvasNode.width, canvasNode.height); +// if (jsonValues.pview) { +// let pPL = Math.min(canvasNode.width / jsonValues.pview.width, canvasNode.height / jsonValues.pview.height); // pixels per LED (width of circle) +// let lOf = Math.floor((canvasNode.width - pPL*jsonValues.pview.width)/2); //left offeset (to center matrix) +// if (jsonValues.pview.outputs) { +// // console.log("preview2D jsonValues", jsonValues.pview); +// for (var output of jsonValues.pview.outputs) { +// if (output.buffer) { +// for (var led of output.buffer) { +// if (buffer[i] + buffer[i+1] + buffer[i+2] > 20) { //do not show nearly blacks +// ctx.fillStyle = `rgb(${buffer[i]},${buffer[i+1]},${buffer[i+2]})`; +// ctx.beginPath(); +// ctx.arc(led[0]*pPL/factor + lOf, led[1]*pPL/factor, pPL*0.4, 0, 2 * Math.PI); +// ctx.fill(); +// } +// i+=3; +// } +// } +// else { +// console.log("preview2D jsonValues no leds", jsonValues.pview); +// jsonValues.pview = null; +// } +// } +// } +// else { +// console.log("preview2D jsonValues no outputs", jsonValues.pview); +// jsonValues.pview = null; +// } +// jsonValues.pview.new = null; +// } +// } + +// let renderer = null; +// let scene = null; +// let camera = null; +// var controls = null; +// let raycaster = null; +// let intersect = null; +// let mousePointer = null; + +// //https://stackoverflow.com/questions/8426822/rotate-camera-in-three-js-with-mouse + +// //inspiration: https://discoverthreejs.com/book/first-steps/transformations/ +// function preview3D(canvasNode, buffer) { +// //3D vars +// import ('three').then((THREE) => { + +// function onMouseMove( event ) { + +// let canvasRect = canvasNode.getBoundingClientRect(); - if (!mousePointer) mousePointer = new THREE.Vector2(); - mousePointer.x = ((event.clientX - canvasRect.left) / canvasRect.width) * 2 - 1; - mousePointer.y = -((event.clientY - canvasRect.top) / canvasRect.height) * 2 + 1; +// if (!mousePointer) mousePointer = new THREE.Vector2(); +// mousePointer.x = ((event.clientX - canvasRect.left) / canvasRect.width) * 2 - 1; +// mousePointer.y = -((event.clientY - canvasRect.top) / canvasRect.height) * 2 + 1; - let canvasMenuRect = gId("canvasMenu").getBoundingClientRect(); +// let canvasMenuRect = gId("canvasMenu").getBoundingClientRect(); - // console.log(event.clientX, event.clientY, canvasMenuRect); +// // console.log(event.clientX, event.clientY, canvasMenuRect); - //if mousePointer out of menu bounds then hide menu - if (event.clientX < canvasMenuRect.left || event.clientX > canvasMenuRect.right || event.clientY < canvasMenuRect.top || event.clientY > canvasMenuRect.bottom) - gId("canvasMenu").style.display = "none"; - } +// //if mousePointer out of menu bounds then hide menu +// if (event.clientX < canvasMenuRect.left || event.clientX > canvasMenuRect.right || event.clientY < canvasMenuRect.top || event.clientY > canvasMenuRect.bottom) +// gId("canvasMenu").style.display = "none"; +// } - function onMouseDown(event) { - event.preventDefault(); - // var rightclick; - // if (!event) var event = window.event; - // if (event.which) rightclick = (event.which == 3); - // else if (event.button) rightclick = (event.button == 2); - // if (!rightclick) return; +// function onMouseDown(event) { +// event.preventDefault(); +// // var rightclick; +// // if (!event) var event = window.event; +// // if (event.which) rightclick = (event.which == 3); +// // else if (event.button) rightclick = (event.button == 2); +// // if (!rightclick) return; - // var intersects = raycaster.intersectObjects(scene.children); - console.log("onMouseDown", event, intersect); +// // var intersects = raycaster.intersectObjects(scene.children); +// console.log("onMouseDown", event, intersect); - if (intersect) { - // intersect = intersects[0].object; - gId("canvasMenu").style.left = (event.clientX) + "px"; // - rect.left - gId("canvasMenu").style.top = (event.clientY) + "px"; //- rect.top - gId("canvasMenu").style.display = ""; //not none -> show - let sp = intersect.name.split(" - "); //output and led index is encoded in the name - gId("canvasData").innerText = jsonValues.pview.outputs[sp[0]].leds[sp[1]];// event.clientY; - } - // else{ - // intersect = undefined; - // } - } +// if (intersect) { +// // intersect = intersects[0].object; +// gId("canvasMenu").style.left = (event.clientX) + "px"; // - rect.left +// gId("canvasMenu").style.top = (event.clientY) + "px"; //- rect.top +// gId("canvasMenu").style.display = ""; //not none -> show +// let sp = intersect.name.split(" - "); //output and led index is encoded in the name +// gId("canvasData").innerText = jsonValues.pview.outputs[sp[0]].leds[sp[1]];// event.clientY; +// } +// // else{ +// // intersect = undefined; +// // } +// } - import ('three/addons/controls/OrbitControls.js').then((OCModule) => { - - let factor = 10;//fixed value: from mm to cm - let d = 5 / factor; //distanceLED; - - //init three - done once - if (!renderer || (jsonValues.pview && jsonValues.pview.new)) { //init 3D - - console.log("preview3D create new renderer"); - - renderer = new THREE.WebGLRenderer({canvas: canvasNode, antialias: true, alpha: true }); - // THREE.Object3D.DefaultUp = new THREE.Vector3(0,1,1); - renderer.setClearAlpha(0) - renderer.setClearColor( 0x000000, 0 ); - - camera = new THREE.PerspectiveCamera( 45, canvasNode.width/canvasNode.width, 1, 500); //aspectRatio is 1 for the time being - camera.position.set( 0, 0, d*Math.sqrt(jsonValues.pview.width*jsonValues.pview.width + jsonValues.pview.height*jsonValues.pview.height + jsonValues.pview.depth*jsonValues.pview.depth) ); - camera.lookAt( 0, 0, 0 ); - - scene = new THREE.Scene(); - scene.background = null; //new THREE.Color( 0xff0000 ); - - controls = new OCModule.OrbitControls( camera, renderer.domElement ); - controls.target.set( 0, 0.5, 0 ); - controls.update(); - controls.enablePan = false; - controls.enableDamping = true; - - raycaster = new THREE.Raycaster(); - - canvasNode.addEventListener( 'mousemove', onMouseMove ); - canvasNode.addEventListener('mousedown', onMouseDown, false); - //prevent default behavior - // if (gId("canvasMenu").addEventListener) { - // gId("canvasMenu").addEventListener('contextmenu', function (e) { - // console.log("canvasMenu contextmenu", e); - // e.preventDefault(); - // }, false); - // } else { - // gId("canvasMenu").attachEvent('oncontextmenu', function () { - // console.log("canvasMenu oncontextmenu", window); - // window.event.returnValue = false; - // }); - // } - - gId("canvasButton1").innerText = "Set Start position"; - gId("canvasButton2").innerText = "Set End position"; - gId("canvasButton3").innerText = "Set Mid position"; - - //process canvas button click - gId("canvasButton1").addEventListener("click", function(){ - var command = {}; - command["canvasData"] = "start:" + gId("canvasData").innerText; - requestJson(command); - - gId("canvasMenu").style.display = "none"; - }, false); - gId("canvasButton2").addEventListener("click", function(){ - var command = {}; - command["canvasData"] = "end:" + gId("canvasData").innerText; - requestJson(command); - gId("canvasMenu").style.display = "none"; - }, false); - gId("canvasButton3").addEventListener("click", function(){ - var command = {}; - command["canvasData"] = "mid:" + gId("canvasData").innerText; - requestJson(command); - gId("canvasMenu").style.display = "none"; - }, false); +// import ('three/addons/controls/OrbitControls.js').then((OCModule) => { + +// let factor = 10;//fixed value: from mm to cm +// let d = 5 / factor; //distanceLED; + +// //init three - done once +// if (!renderer || (jsonValues.pview && jsonValues.pview.new)) { //init 3D + +// console.log("preview3D create new renderer"); + +// renderer = new THREE.WebGLRenderer({canvas: canvasNode, antialias: true, alpha: true }); +// // THREE.Object3D.DefaultUp = new THREE.Vector3(0,1,1); +// renderer.setClearAlpha(0) +// renderer.setClearColor( 0x000000, 0 ); + +// camera = new THREE.PerspectiveCamera( 45, canvasNode.width/canvasNode.width, 1, 500); //aspectRatio is 1 for the time being +// camera.position.set( 0, 0, d*Math.sqrt(jsonValues.pview.width*jsonValues.pview.width + jsonValues.pview.height*jsonValues.pview.height + jsonValues.pview.depth*jsonValues.pview.depth) ); +// camera.lookAt( 0, 0, 0 ); + +// scene = new THREE.Scene(); +// scene.background = null; //new THREE.Color( 0xff0000 ); + +// controls = new OCModule.OrbitControls( camera, renderer.domElement ); +// controls.target.set( 0, 0.5, 0 ); +// controls.update(); +// controls.enablePan = false; +// controls.enableDamping = true; + +// raycaster = new THREE.Raycaster(); + +// canvasNode.addEventListener( 'mousemove', onMouseMove ); +// canvasNode.addEventListener('mousedown', onMouseDown, false); +// //prevent default behavior +// // if (gId("canvasMenu").addEventListener) { +// // gId("canvasMenu").addEventListener('contextmenu', function (e) { +// // console.log("canvasMenu contextmenu", e); +// // e.preventDefault(); +// // }, false); +// // } else { +// // gId("canvasMenu").attachEvent('oncontextmenu', function () { +// // console.log("canvasMenu oncontextmenu", window); +// // window.event.returnValue = false; +// // }); +// // } + +// gId("canvasButton1").innerText = "Set Start position"; +// gId("canvasButton2").innerText = "Set End position"; +// gId("canvasButton3").innerText = "Set Mid position"; + +// //process canvas button click +// gId("canvasButton1").addEventListener("click", function(){ +// var command = {}; +// command["canvasData"] = "start:" + gId("canvasData").innerText; +// requestJson(command); + +// gId("canvasMenu").style.display = "none"; +// }, false); +// gId("canvasButton2").addEventListener("click", function(){ +// var command = {}; +// command["canvasData"] = "end:" + gId("canvasData").innerText; +// requestJson(command); +// gId("canvasMenu").style.display = "none"; +// }, false); +// gId("canvasButton3").addEventListener("click", function(){ +// var command = {}; +// command["canvasData"] = "mid:" + gId("canvasData").innerText; +// requestJson(command); +// gId("canvasMenu").style.display = "none"; +// }, false); - } //new - - //init fixture - anytime a new fixture - if (jsonValues.pview && jsonValues.pview.new) { //set the new coordinates - var offset_x = -d*(jsonValues.pview.width-1)/2; - var offset_y = -d*(jsonValues.pview.height-1)/2; - var offset_z = -d*(jsonValues.pview.depth-1)/2; - - console.log("preview3D new jsonValues", jsonValues.pview); - - if (jsonValues.pview.outputs) { - // console.log("preview3D jsonValues", jsonValues.pview); - let outputsIndex = 0; - for (var output of jsonValues.pview.outputs) { - if (output.leds) { - let ledsIndex = 0; - for (var led of output.leds) { - if (led.length == 1) //1D: make 2D - led.push(0); - if (led.length <= 2) //1D and 2D: maak 3D - led.push(0); - const geometry = new THREE.SphereGeometry( 0.2); //was 1/factor - const material = new THREE.MeshBasicMaterial({transparent: true, opacity: 0.7}); - // material.color = new THREE.Color(`${x/mW}`, `${y/mH}`, `${z/mD}`); - const sphere = new THREE.Mesh( geometry, material ); - sphere.position.set(offset_x + d*led[0]/factor, -offset_y - d*led[1]/factor, - offset_z - d*led[2]/factor); - sphere.name = outputsIndex + " - " + ledsIndex++; - scene.add( sphere ); - } - } - else { - console.log("preview3D jsonValues no leds", jsonValues.pview); - jsonValues.pview = null; - } - outputsIndex++; - } //outputs - } - else { - console.log("preview3D jsonValues no outputs", jsonValues.pview); - jsonValues.pview = null; - } - jsonValues.pview.new = null; - } - - //animate / render - if (jsonValues.pview) { - //https://stackoverflow.com/questions/29884485/threejs-canvas-size-based-on-container - if (canvasNode.width != canvasNode.clientWidth) { //} || canvasNode.height != canvasNode.clientHeight) { - console.log("3D pview update size", canvasNode.width, canvasNode.clientWidth, canvasNode.height, canvasNode.clientHeight); - renderer.setSize(canvasNode.clientWidth, canvasNode.clientWidth, false); //Setting updateStyle to false prevents any style changes to the output canvas. - } - - //light up the cube - let firstLed = 5; - var i = 1; - if (jsonValues.pview.outputs) { - // console.log("preview3D jsonValues", jsonValues.pview); - for (var output of jsonValues.pview.outputs) { - if (output.leds) { - for (var led of output.leds) { - if (i < scene.children.length) { - scene.children[i].visible = buffer[i*3 + firstLed] + buffer[i*3 + firstLed + 1] + buffer[i*3 + firstLed+2] > 10; //do not show blacks - if (scene.children[i].visible) - scene.children[i].material.color = new THREE.Color(`${buffer[i*3 + firstLed]/255}`, `${buffer[i*3 + firstLed + 1]/255}`, `${buffer[i*3 + firstLed + 2]/255}`); - } - i++; - } - } - else { - console.log("preview3D jsonValues no leds", jsonValues.pview); - jsonValues.pview = null; - } - } - } - else { - console.log("preview3D jsonValues no outputs", jsonValues.pview); - jsonValues.pview = null; - } - } - - // controls.rotateSpeed = 0.4; - //moving heads rotation - scene.rotation.x = buffer[1] / 255 * Math.PI * 2; - scene.rotation.y = buffer[2] / 255 * Math.PI * 2; - scene.rotation.z = buffer[3] / 255 * Math.PI * 2; - - controls.update(); // apply orbit controls - - if (mousePointer) { - raycaster.setFromCamera( mousePointer, camera ); +// } //new + +// //init fixture - anytime a new fixture +// if (jsonValues.pview && jsonValues.pview.new) { //set the new coordinates +// var offset_x = -d*(jsonValues.pview.width-1)/2; +// var offset_y = -d*(jsonValues.pview.height-1)/2; +// var offset_z = -d*(jsonValues.pview.depth-1)/2; + +// console.log("preview3D new jsonValues", jsonValues.pview); + +// if (jsonValues.pview.outputs) { +// // console.log("preview3D jsonValues", jsonValues.pview); +// let outputsIndex = 0; +// for (var output of jsonValues.pview.outputs) { +// if (output.leds) { +// let ledsIndex = 0; +// for (var led of output.leds) { +// if (led.length == 1) //1D: make 2D +// led.push(0); +// if (led.length <= 2) //1D and 2D: maak 3D +// led.push(0); +// const geometry = new THREE.SphereGeometry( 0.2); //was 1/factor +// const material = new THREE.MeshBasicMaterial({transparent: true, opacity: 0.7}); +// // material.color = new THREE.Color(`${x/mW}`, `${y/mH}`, `${z/mD}`); +// const sphere = new THREE.Mesh( geometry, material ); +// sphere.position.set(offset_x + d*led[0]/factor, -offset_y - d*led[1]/factor, - offset_z - d*led[2]/factor); +// sphere.name = outputsIndex + " - " + ledsIndex++; +// scene.add( sphere ); +// } +// } +// else { +// console.log("preview3D jsonValues no leds", jsonValues.pview); +// jsonValues.pview = null; +// } +// outputsIndex++; +// } //outputs +// } +// else { +// console.log("preview3D jsonValues no outputs", jsonValues.pview); +// jsonValues.pview = null; +// } +// jsonValues.pview.new = null; +// } + +// //animate / render +// if (jsonValues.pview) { +// //https://stackoverflow.com/questions/29884485/threejs-canvas-size-based-on-container +// if (canvasNode.width != canvasNode.clientWidth) { //} || canvasNode.height != canvasNode.clientHeight) { +// console.log("3D pview update size", canvasNode.width, canvasNode.clientWidth, canvasNode.height, canvasNode.clientHeight); +// renderer.setSize(canvasNode.clientWidth, canvasNode.clientWidth, false); //Setting updateStyle to false prevents any style changes to the output canvas. +// } + +// //light up the cube +// let firstLed = 5; +// var i = 1; +// if (jsonValues.pview.outputs) { +// // console.log("preview3D jsonValues", jsonValues.pview); +// for (var output of jsonValues.pview.outputs) { +// if (output.leds) { +// for (var led of output.leds) { +// if (i < scene.children.length) { +// scene.children[i].visible = buffer[i*3 + firstLed] + buffer[i*3 + firstLed + 1] + buffer[i*3 + firstLed+2] > 10; //do not show blacks +// if (scene.children[i].visible) +// scene.children[i].material.color = new THREE.Color(`${buffer[i*3 + firstLed]/255}`, `${buffer[i*3 + firstLed + 1]/255}`, `${buffer[i*3 + firstLed + 2]/255}`); +// } +// i++; +// } +// } +// else { +// console.log("preview3D jsonValues no leds", jsonValues.pview); +// jsonValues.pview = null; +// } +// } +// } +// else { +// console.log("preview3D jsonValues no outputs", jsonValues.pview); +// jsonValues.pview = null; +// } +// } + +// // controls.rotateSpeed = 0.4; +// //moving heads rotation +// scene.rotation.x = buffer[1] / 255 * Math.PI * 2; +// scene.rotation.y = buffer[2] / 255 * Math.PI * 2; +// scene.rotation.z = buffer[3] / 255 * Math.PI * 2; + +// controls.update(); // apply orbit controls + +// if (mousePointer) { +// raycaster.setFromCamera( mousePointer, camera ); - const intersects = raycaster.intersectObjects( scene.children, true ); //recursive +// const intersects = raycaster.intersectObjects( scene.children, true ); //recursive - if ( intersects.length > 0 ) { - // console.log(raycaster, intersects, mousePointer, scene.children); +// if ( intersects.length > 0 ) { +// // console.log(raycaster, intersects, mousePointer, scene.children); - if ( intersect != intersects[ 0 ].object ) { +// if ( intersect != intersects[ 0 ].object ) { - if ( intersect ) intersect.material.color.setHex( intersect.currentHex ); +// if ( intersect ) intersect.material.color.setHex( intersect.currentHex ); - intersect = intersects[ 0 ].object; - intersect.currentHex = intersect.material.color.getHex(); - intersect.material.color.setHex( 0xff0000 ); //red +// intersect = intersects[ 0 ].object; +// intersect.currentHex = intersect.material.color.getHex(); +// intersect.material.color.setHex( 0xff0000 ); //red - } +// } - } else { +// } else { - if ( intersect ) intersect.material.color.setHex( intersect.currentHex ); +// if ( intersect ) intersect.material.color.setHex( intersect.currentHex ); - intersect = null; +// intersect = null; - } - } //if mousePointer +// } +// } //if mousePointer - renderer.render( scene, camera); - }); //import OrbitControl - }); //import Three -} //preview3D \ No newline at end of file +// renderer.render( scene, camera); +// }); //import OrbitControl +// }); //import Three +} //userFun \ No newline at end of file diff --git a/data/index.htm b/data/index.htm index bf19aef0..2a5003ab 100644 --- a/data/index.htm +++ b/data/index.htm @@ -14,7 +14,7 @@ - StarMod💫 LEDs 🎨 by MoonModules 🌔 + StarMod💫 by MoonModules 🌔 @@ -35,7 +35,7 @@
-

StarMod💫 LEDs 🎨 by MoonModules 🌔

+

StarMod💫 by MoonModules 🌔

ⓘ

diff --git a/platformio.ini b/platformio.ini index 8c3fc4c4..d66d737c 100644 --- a/platformio.ini +++ b/platformio.ini @@ -40,13 +40,13 @@ lib_deps = -[STARMOD_APPMOD_LEDS] -build_flags = - -D STARMOD_APPMOD_LEDS - -D STARMOD_USERMOD_ARTNET - -D STARMOD_USERMOD_DDP -lib_deps = - https://github.com/FastLED/FastLED.git@3.6.0 +; [STARMOD_APPMOD_LEDS] +; build_flags = +; -D STARMOD_APPMOD_LEDS +; -D STARMOD_USERMOD_ARTNET +; -D STARMOD_USERMOD_DDP +; lib_deps = +; https://github.com/FastLED/FastLED.git@3.6.0 @@ -65,11 +65,11 @@ lib_deps = -[STARMOD_USERMOD_WLEDAUDIO] -build_flags = - -D STARMOD_USERMOD_WLEDAUDIO -lib_deps = - https://github.com/netmindz/WLED-sync#48cb28f11632b217f9ccd9f72149373919c28af5 ; sourceIP +; [STARMOD_USERMOD_WLEDAUDIO] +; build_flags = +; -D STARMOD_USERMOD_WLEDAUDIO +; lib_deps = +; https://github.com/netmindz/WLED-sync#48cb28f11632b217f9ccd9f72149373919c28af5 ; sourceIP [Speed_Flags] @@ -97,16 +97,16 @@ build_flags = ${Speed_Flags.build_flags} -DCONFIG_ASYNC_TCP_USE_WDT=0 -DLFS_THREADSAFE ;; enables use of semaphores in LittleFS driver - ${STARMOD_APPMOD_LEDS.build_flags} + ; ${STARMOD_APPMOD_LEDS.build_flags} ${STARMOD_USERMOD_E131.build_flags} ; ${STARMOD_USERMOD_HA.build_flags} - ${STARMOD_USERMOD_WLEDAUDIO.build_flags} + ; ${STARMOD_USERMOD_WLEDAUDIO.build_flags} lib_deps = ${starmod.lib_deps} - ${STARMOD_APPMOD_LEDS.lib_deps} + ; ${STARMOD_APPMOD_LEDS.lib_deps} ${STARMOD_USERMOD_E131.lib_deps} ; ${STARMOD_USERMOD_HA.lib_deps} - ${STARMOD_USERMOD_WLEDAUDIO.lib_deps} + ; ${STARMOD_USERMOD_WLEDAUDIO.lib_deps} [env:esp32dev] diff --git a/src/App/AppModDemo.h b/src/App/AppModDemo.h new file mode 100644 index 00000000..554831e0 --- /dev/null +++ b/src/App/AppModDemo.h @@ -0,0 +1,41 @@ +/* + @title StarMod + @file AppModDemo.h + @date 20240114 + @repo https://github.com/ewowi/StarMod + @Authors https://github.com/ewowi/StarMod/commits/main + @Copyright © 2024 Github StarMod Commit Authors + @license GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 + @license For non GPL-v3 usage, commercial licenses must be purchased. Contact moonmodules@icloud.com +*/ + +class AppModDemo: public SysModule { + +public: + + AppModDemo() :SysModule("AppMod Demo") { + }; + + //setup filesystem + void setup() { + SysModule::setup(); + + parentVar = ui->initAppMod(parentVar, name, 1100); + + ui->initText(parentVar, "textField"); + + } + + void loop() { + // SysModule::loop(); + } + + void onOffChanged() { + if (mdls->isConnected && isEnabled) { + } else { + } + } + +}; + +extern AppModDemo *appModDemo; \ No newline at end of file diff --git a/src/App/LedEffects.h b/src/App/LedEffects.h deleted file mode 100644 index 3278e639..00000000 --- a/src/App/LedEffects.h +++ /dev/null @@ -1,1640 +0,0 @@ -/* - @title StarMod - @file LedEffects.h - @date 20240228 - @repo https://github.com/ewowi/StarMod - @Authors https://github.com/ewowi/StarMod/commits/main - @Copyright © 2024 Github StarMod Commit Authors - @license GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - @license For non GPL-v3 usage, commercial licenses must be purchased. Contact moonmodules@icloud.com -*/ - -#ifdef STARMOD_USERMOD_WLEDAUDIO - #include "../User/UserModWLEDAudio.h" -#endif -#ifdef STARMOD_USERMOD_E131 - #include "../User/UserModE131.h" -#endif - -unsigned8 gHue = 0; // rotating "base color" used by many of the patterns -unsigned long call = 0; //not used at the moment (don't use in effect calculations) -unsigned long now = millis(); - -//utility function -float distance(float x1, float y1, float z1, float x2, float y2, float z2) { - return sqrtf((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) + (z1-z2)*(z1-z2)); -} - -//should not contain variables/bytes to keep mem as small as possible!! -class Effect { -public: - virtual const char * name() {return "noname";} - virtual const char * tags() {return "";} - virtual unsigned8 dim() {return _1D;}; - - virtual void setup(Leds &leds) {} - - virtual void loop(Leds &leds) {} - - virtual void controls(JsonObject parentVar) {} - - void addPalette(JsonObject parentVar, unsigned8 value) { - JsonObject currentVar = ui->initSelect(parentVar, "pal", value, false, [](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_UIFun: { - ui->setLabel(var, "Palette"); - JsonArray options = ui->setOptions(var); - options.add("CloudColors"); - options.add("LavaColors"); - options.add("OceanColors"); - options.add("ForestColors"); - options.add("RainbowColors"); - options.add("RainbowStripeColors"); - options.add("PartyColors"); - options.add("HeatColors"); - return true; } - default: return false; - }}); - //tbd: check if memory is freed! - // currentVar["dash"] = true; - } - - CRGBPalette16 getPalette() { - switch (mdl->getValue("pal").as()) { - case 0: return CloudColors_p; break; - case 1: return LavaColors_p; break; - case 2: return OceanColors_p; break; - case 3: return ForestColors_p; break; - case 4: return RainbowColors_p; break; - case 5: return RainbowStripeColors_p; break; - case 6: return PartyColors_p; break; - case 7: return HeatColors_p; break; - default: return PartyColors_p; break; - } - } -}; - -class SolidEffect: public Effect { - const char * name() {return "Solid";} - unsigned8 dim() {return _1D;} - const char * tags() {return "💡";} - - void loop(Leds &leds) { - stackUnsigned8 red = mdl->getValue("Red"); - stackUnsigned8 green = mdl->getValue("Green"); - stackUnsigned8 blue = mdl->getValue("Blue"); - - CRGB color = CRGB(red, green, blue); - leds.fill_solid(color); - } - - void controls(JsonObject parentVar) { - ui->initSlider(parentVar, "Red", 182); - ui->initSlider(parentVar, "Green", 15); - ui->initSlider(parentVar, "Blue", 98); - } -}; - -class RainbowEffect: public Effect { -public: - const char * name() {return "Rainbow";} - unsigned8 dim() {return _1D;} - const char * tags() {return "⚡";} - - void loop(Leds &leds) { - // FastLED's built-in rainbow generator - leds.fill_rainbow(gHue, 7); - } -}; - -class RainbowWithGlitterEffect: public RainbowEffect { - const char * name() {return "Rainbow with glitter";} - unsigned8 dim() {return _1D;} - const char * tags() {return "⚡";} - - void loop(Leds &leds) { - // built-in FastLED rainbow, plus some random sparkly glitter - RainbowEffect::loop(leds); - addGlitter(leds, 80); - } - void addGlitter(Leds &leds, fract8 chanceOfGlitter) - { - if( random8() < chanceOfGlitter) { - leds[ random16(leds.nrOfLeds) ] += CRGB::White; - } - } -}; - -class SinelonEffect: public Effect { - const char * name() {return "Sinelon";} - unsigned8 dim() {return _1D;} - const char * tags() {return "⚡";} - - void loop(Leds &leds) { - // a colored dot sweeping back and forth, with fading trails - leds.fadeToBlackBy(20); - int pos = beatsin16( mdl->getValue("BPM").as(), 0, leds.nrOfLeds-1 ); - leds[pos] = leds.getPixelColor(pos) + CHSV( gHue, 255, 192); - } - - void controls(JsonObject parentVar) { - ui->initSlider(parentVar, "BPM", 60); - } -}; //Sinelon - -class ConfettiEffect: public Effect { - const char * name() {return "Confetti";} - unsigned8 dim() {return _1D;} - const char * tags() {return "⚡";} - - void loop(Leds &leds) { - // random colored speckles that blink in and fade smoothly - leds.fadeToBlackBy(10); - int pos = random16(leds.nrOfLeds); - leds[pos] += CHSV( gHue + random8(64), 200, 255); - } -}; - -class BPMEffect: public Effect { - const char * name() {return "Beats per minute";} - unsigned8 dim() {return _1D;} - const char * tags() {return "⚡";} - - void loop(Leds &leds) { - CRGBPalette16 pal = getPalette(); - - // colored stripes pulsing at a defined Beats-Per-Minute (BPM) - stackUnsigned8 BeatsPerMinute = 62; - stackUnsigned8 beat = beatsin8( BeatsPerMinute, 64, 255); - for (forUnsigned16 i = 0; i < leds.nrOfLeds; i++) { //9948 - leds[i] = ColorFromPalette(pal, gHue+(i*2), beat-gHue+(i*10)); - } - } - - void controls(JsonObject parentVar) { - addPalette(parentVar, 4); - } -}; - -class JuggleEffect: public Effect { - const char * name() {return "Juggle";} - unsigned8 dim() {return _1D;} - const char * tags() {return "⚡";} - - void loop(Leds &leds) { - // eight colored dots, weaving in and out of sync with each other - leds.fadeToBlackBy(20); - stackUnsigned8 dothue = 0; - for (forUnsigned8 i = 0; i < 8; i++) { - leds[beatsin16( i+7, 0, leds.nrOfLeds-1 )] |= CHSV(dothue, 200, 255); - dothue += 32; - } - } -}; - -//https://www.perfectcircuit.com/signal/difference-between-waveforms -class RunningEffect: public Effect { - const char * name() {return "Running";} - unsigned8 dim() {return _1D;} - const char * tags() {return "💫";} - - void loop(Leds &leds) { - // a colored dot sweeping back and forth, with fading trails - leds.fadeToBlackBy(mdl->getValue("fade").as()); //physical leds - int pos = map(beat16( mdl->getValue("BPM").as()), 0, UINT16_MAX, 0, leds.nrOfLeds-1 ); //instead of call%leds.nrOfLeds - // int pos2 = map(beat16( mdl->getValue("BPM").as(), 1000), 0, UINT16_MAX, 0, leds.nrOfLeds-1 ); //one second later - leds[pos] = CHSV( gHue, 255, 192); //make sure the right physical leds get their value - // leds[leds.nrOfLeds -1 - pos2] = CHSV( gHue, 255, 192); //make sure the right physical leds get their value - } - - void controls(JsonObject parentVar) { - ui->initSlider(parentVar, "BPM", 60, 0, 255, false, [](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_UIFun: - ui->setComment(var, "in BPM!"); - return true; - default: return false; - }}); - //tbd: check if memory is freed! - ui->initSlider(parentVar, "fade", 128); - } -}; - -class RingEffect: public Effect { - protected: - - void setRing(Leds &leds, int ring, CRGB colour) { //so britisch ;-) - leds[ring] = colour; - } - -}; - -class RingRandomFlow: public RingEffect { - const char * name() {return "RingRandomFlow";} - unsigned8 dim() {return _1D;} - const char * tags() {return "💫";} - - void loop(Leds &leds) { - stackUnsigned8 *hue = leds.sharedData.bind(hue, leds.nrOfLeds); //array - - hue[0] = random(0, 255); - for (int r = 0; r < leds.nrOfLeds; r++) { - setRing(leds, r, CHSV(hue[r], 255, 255)); - } - for (int r = (leds.nrOfLeds - 1); r >= 1; r--) { - hue[r] = hue[(r - 1)]; // set this ruing based on the inner - } - // FastLED.delay(SPEED); - } -}; - -//BouncingBalls inspired by WLED -#define maxNumBalls 16 -//each needs 12 bytes -struct Ball { - unsigned long lastBounceTime; - float impactVelocity; - float height; -}; - -class BouncingBalls: public Effect { - const char * name() {return "Bouncing Balls";} - unsigned8 dim() {return _1D;} - const char * tags() {return "💡";} - - void loop(Leds &leds) { - stackUnsigned8 grav = mdl->getValue("gravity"); - stackUnsigned8 numBalls = mdl->getValue("balls"); - CRGBPalette16 pal = getPalette(); - - Ball *balls = leds.sharedData.bind(balls, maxNumBalls); //array - - leds.fill_solid(CRGB::Black); - - // non-chosen color is a random color - const float gravity = -9.81f; // standard value of gravity - // const bool hasCol2 = SEGCOLOR(2); - const unsigned long time = now; - - //not necessary as sharedData is cleared at setup(Leds &leds) - // if (call == 0) { - // for (size_t i = 0; i < maxNumBalls; i++) balls[i].lastBounceTime = time; - // } - - for (size_t i = 0; i < numBalls; i++) { - float timeSinceLastBounce = (time - balls[i].lastBounceTime)/((255-grav)/64 + 1); - float timeSec = timeSinceLastBounce/1000.0f; - balls[i].height = (0.5f * gravity * timeSec + balls[i].impactVelocity) * timeSec; // avoid use pow(x, 2) - its extremely slow ! - - if (balls[i].height <= 0.0f) { - balls[i].height = 0.0f; - //damping for better effect using multiple balls - float dampening = 0.9f - float(i)/float(numBalls * numBalls); // avoid use pow(x, 2) - its extremely slow ! - balls[i].impactVelocity = dampening * balls[i].impactVelocity; - balls[i].lastBounceTime = time; - - if (balls[i].impactVelocity < 0.015f) { - float impactVelocityStart = sqrtf(-2.0f * gravity) * random8(5,11)/10.0f; // randomize impact velocity - balls[i].impactVelocity = impactVelocityStart; - } - } else if (balls[i].height > 1.0f) { - continue; // do not draw OOB ball - } - - // stackUnsigned32 color = SEGCOLOR(0); - // if (SEGMENT.palette) { - // color = SEGMENT.color_wheel(i*(256/MAX(numBalls, 8))); - // } - // else if (hasCol2) { - // color = SEGCOLOR(i % NUM_COLORS); - // } - - int pos = roundf(balls[i].height * (leds.nrOfLeds - 1)); - - CRGB color = ColorFromPalette(pal, i*(256/max(numBalls, (stackUnsigned8)8)), 255); - - leds[pos] = color; - // if (leds.nrOfLeds<32) leds.setPixelColor(indexToVStrip(pos, stripNr), color); // encode virtual strip into index - // else leds.setPixelColor(balls[i].height + (stripNr+1)*10.0f, color); - } //balls - } - - void controls(JsonObject parentVar) { - addPalette(parentVar, 4); - ui->initSlider(parentVar, "gravity", 128); - ui->initSlider(parentVar, "balls", 8, 1, 16); - } -}; // BouncingBalls - -void mode_fireworks(Leds &leds, stackUnsigned16 *aux0, stackUnsigned16 *aux1, uint8_t speed, uint8_t intensity, CRGBPalette16 pal, bool useAudio = false) { - // fade_out(0); - leds.fadeToBlackBy(10); - // if (SEGENV.call == 0) { - // *aux0 = UINT16_MAX; - // *aux1 = UINT16_MAX; - // } - bool valid1 = (*aux0 < leds.nrOfLeds); - bool valid2 = (*aux1 < leds.nrOfLeds); - CRGB sv1 = 0, sv2 = 0; - if (valid1) sv1 = leds.getPixelColor(*aux0); - if (valid2) sv2 = leds.getPixelColor(*aux1); - - // WLEDSR - uint8_t blurAmount = 255 - speed; - uint8_t my_intensity = 129 - intensity; - bool addPixels = true; // false -> inhibit new pixels in silence - int soundColor = -1; // -1 = random color; 0..255 = use as palette index - - // if (useAudio) { - // if (FFT_MajorPeak < 100) { blurAmount = 254;} // big blobs - // else { - // if (FFT_MajorPeak > 3200) { blurAmount = 1;} // small blobs - // else { // blur + color depends on major frequency - // float musicIndex = logf(FFT_MajorPeak); // log scaling of peak freq - // blurAmount = mapff(musicIndex, 4.60, 8.08, 253, 1);// map to blur range (low freq = more blur) - // blurAmount = constrain(blurAmount, 1, 253); // remove possible "overshot" results - // soundColor = mapff(musicIndex, 4.6, 8.08, 0, 255); // pick color from frequency - // } } - // if (sampleAgc <= 1.0) { // silence -> no new pixels, just blur - // valid1 = valid2 = false; // do not copy last pixels - // addPixels = false; - // blurAmount = 128; - // } - // my_intensity = 129 - (speed >> 1); // dirty hack: use "speed" slider value intensity (no idea how to _disable_ the first slider, but show the second one) - // if (samplePeak == 1) my_intensity -= my_intensity / 4; // inclease intensity at peaks - // if (samplePeak > 1) my_intensity = my_intensity / 2; // double intensity at main peaks - // } - // // WLEDSR end - - leds.blur1d(blurAmount); - if (valid1) leds.setPixelColor(*aux0, sv1); - if (valid2) leds.setPixelColor(*aux1, sv2); - - if (addPixels) { // WLEDSR - for(uint16_t i=0; igetValue("speed"); - uint8_t intensity = mdl->getValue("intensity"); - - stackUnsigned16 *aux0 = leds.sharedData.bind(aux0); - stackUnsigned16 *aux1 = leds.sharedData.bind(aux1); - stackUnsigned16 *step = leds.sharedData.bind(step); - - // if(SEGENV.call == 0) { - // SEGMENT.fill(BLACK); - // } - *step += 1000 / 40;// FRAMETIME; - if (*step > (5U + (50U*(255U - speed))/leds.nrOfLeds)) { //SPEED_FORMULA_L) { - *step = 1; - // if (strip.isMatrix) { - // //uint32_t ctemp[leds.size.x]; - // //for (int i = 0; i= leds.size.x*leds.size.y) *aux0 = 0; // ignore - if (*aux1 >= leds.size.x*leds.size.y) *aux1 = 0; - } - mode_fireworks(leds, aux0, aux1, speed, intensity, pal); - } - - void controls(JsonObject parentVar) { - addPalette(parentVar, 4); - ui->initSlider(parentVar, "speed", 128, 1, 255); - ui->initSlider(parentVar, "intensity", 64, 1, 128); - } -}; // RainEffect - -//each needs 19 bytes -//Spark type is used for popcorn, 1D fireworks, and drip -struct Spark { - float pos, posX; - float vel, velX; - unsigned16 col; - unsigned8 colIndex; -}; - -#define maxNumDrops 6 -class DripEffect: public Effect { - const char * name() {return "Drip";} - unsigned8 dim() {return _1D;} - const char * tags() {return "💡💫";} - - void loop(Leds &leds) { - - CRGBPalette16 pal = getPalette(); - uint8_t grav = mdl->getValue("gravity"); - uint8_t drips = mdl->getValue("drips"); - uint8_t swell = mdl->getValue("swell"); - bool invert = mdl->getValue("invert"); - - Spark* drops = leds.sharedData.bind(drops, maxNumDrops); - - // leds.fadeToBlackBy(90); - leds.fill_solid(CRGB::Black); - - float gravity = -0.0005f - (grav/25000.0f); //increased gravity (50000 to 25000) - gravity *= max(1, leds.nrOfLeds-1); - int sourcedrop = 12; - - for (int j=0;j255) drops[j].col=255; - leds.setPixelColor(invert?leds.nrOfLeds-1-drops[j].pos:drops[j].pos, blend(CRGB::Black, dropColor, drops[j].col)); - - drops[j].col += swell; // swelling - - if (random16() <= drops[j].col * swell * swell / 10) { // random drop - drops[j].colIndex=2; //fall - drops[j].col=255; - } - } - if (drops[j].colIndex > 1) { // falling - if (drops[j].pos > 0) { // fall until end of segment - drops[j].pos += drops[j].vel; - if (drops[j].pos < 0) drops[j].pos = 0; - drops[j].vel += gravity; // gravity is negative - - for (int i=1;i<7-drops[j].colIndex;i++) { // some minor math so we don't expand bouncing droplets - uint16_t pos = constrain(uint16_t(drops[j].pos) +i, 0, leds.nrOfLeds-1); //this is BAD, returns a pos >= leds.nrOfLeds occasionally - leds.setPixelColor(invert?leds.nrOfLeds-1-pos:pos, blend(CRGB::Black, dropColor, drops[j].col/i)); //spread pixel with fade while falling - } - - if (drops[j].colIndex > 2) { // during bounce, some water is on the floor - leds.setPixelColor(invert?leds.nrOfLeds-1:0, blend(dropColor, CRGB::Black, drops[j].col)); - } - } else { // we hit bottom - if (drops[j].colIndex > 2) { // already hit once, so back to forming - drops[j].colIndex = 0; - // drops[j].col = sourcedrop; - - } else { - - if (drops[j].colIndex==2) { // init bounce - drops[j].vel = -drops[j].vel/4;// reverse velocity with damping - drops[j].pos += drops[j].vel; - } - drops[j].col = sourcedrop*2; - drops[j].colIndex = 5; // bouncing - } - } - } - } - } - - void controls(JsonObject parentVar) { - addPalette(parentVar, 4); - ui->initSlider(parentVar, "gravity", 128, 1, 255); - ui->initSlider(parentVar, "drips", 4, 1, 6); - ui->initSlider(parentVar, "swell", 4, 1, 6); - ui->initCheckBox(parentVar, "invert"); - } -}; // DripEffect - -class HeartBeatEffect: public Effect { - const char * name() {return "HeartBeat";} - unsigned8 dim() {return _1D;} - const char * tags() {return "💡💫♥";} - - void loop(Leds &leds) { - - CRGBPalette16 pal = getPalette(); - uint8_t speed = mdl->getValue("speed"); - uint8_t intensity = mdl->getValue("intensity"); - - bool *isSecond = leds.sharedData.bind(isSecond); - uint16_t *bri_lower = leds.sharedData.bind(bri_lower); - unsigned long *step = leds.sharedData.bind(step); - - uint8_t bpm = 40 + (speed); - uint32_t msPerBeat = (60000L / bpm); - uint32_t secondBeat = (msPerBeat / 3); - unsigned long beatTimer = now - *step; - - *bri_lower = *bri_lower * 2042 / (2048 + intensity); - - if ((beatTimer > secondBeat) && !*isSecond) { // time for the second beat? - *bri_lower = UINT16_MAX; //3/4 bri - *isSecond = true; - } - - if (beatTimer > msPerBeat) { // time to reset the beat timer? - *bri_lower = UINT16_MAX; //full bri - *isSecond = false; - *step = now; - } - - for (int i = 0; i < leds.nrOfLeds; i++) { - leds.setPixelColor(i, ColorFromPalette(pal, map(i, 0, leds.nrOfLeds, 0, 255), 255 - (*bri_lower >> 8))); - } - } - - void controls(JsonObject parentVar) { - addPalette(parentVar, 4); - ui->initSlider(parentVar, "speed", 15, 0, 31); - ui->initSlider(parentVar, "intensity", 128); - } -}; // HeartBeatEffect - -class FreqMatrix: public Effect { - const char * name() {return "FreqMatrix";} - unsigned8 dim() {return _1D;} - const char * tags() {return "♪💡";} - - void setup(Leds &leds) { - leds.fadeToBlackBy(16); - } - - void loop(Leds &leds) { - - stackUnsigned8 *aux0 = leds.sharedData.bind(aux0); - - stackUnsigned8 speed = mdl->getValue("speed"); - stackUnsigned8 fx = mdl->getValue("Sound effect"); - stackUnsigned8 lowBin = mdl->getValue("Low bin"); - stackUnsigned8 highBin = mdl->getValue("High bin"); - stackUnsigned8 sensitivity10 = mdl->getValue("Sensivity"); - - stackUnsigned8 secondHand = (speed < 255) ? (micros()/(256-speed)/500 % 16) : 0; - if((speed > 254) || (*aux0 != secondHand)) { // WLEDMM allow run run at full speed - *aux0 = secondHand; - - // Pixel brightness (value) based on volume * sensitivity * intensity - // uint_fast8_t sensitivity10 = map(sensitivity, 0, 31, 10, 100); // reduced resolution slider // WLEDMM sensitivity * 10, to avoid losing precision - int pixVal = wledAudioMod->sync.volumeSmth * (float)fx * (float)sensitivity10 / 2560.0f; // WLEDMM 2560 due to sensitivity * 10 - if (pixVal > 255) pixVal = 255; // make a brightness from the last avg - - CRGB color = CRGB::Black; - - if (wledAudioMod->sync.FFT_MajorPeak > MAX_FREQUENCY) wledAudioMod->sync.FFT_MajorPeak = 1; - // MajorPeak holds the freq. value which is most abundant in the last sample. - // With our sampling rate of 10240Hz we have a usable freq range from roughtly 80Hz to 10240/2 Hz - // we will treat everything with less than 65Hz as 0 - - if ((wledAudioMod->sync.FFT_MajorPeak > 80.0f) && (wledAudioMod->sync.volumeSmth > 0.25f)) { // WLEDMM - // Pixel color (hue) based on major frequency - int upperLimit = 80 + 42 * highBin; - int lowerLimit = 80 + 3 * lowBin; - //stackUnsigned8 i = lowerLimit!=upperLimit ? map(FFT_MajorPeak, lowerLimit, upperLimit, 0, 255) : FFT_MajorPeak; // (original formula) may under/overflow - so we enforce unsigned8 - int freqMapped = lowerLimit!=upperLimit ? map(wledAudioMod->sync.FFT_MajorPeak, lowerLimit, upperLimit, 0, 255) : wledAudioMod->sync.FFT_MajorPeak; // WLEDMM preserve overflows - stackUnsigned8 i = abs(freqMapped) & 0xFF; // WLEDMM we embrace overflow ;-) by "modulo 256" - - color = CHSV(i, 240, (unsigned8)pixVal); // implicit conversion to RGB supplied by FastLED - } - - // shift the pixels one pixel up - leds.setPixelColor(0, color); - for (int i = leds.nrOfLeds - 1; i > 0; i--) leds.setPixelColor(i, leds.getPixelColor(i-1)); - } - } - - void controls(JsonObject parentVar) { - ui->initSlider(parentVar, "speed", 255); - ui->initSlider(parentVar, "Sound effect", 128); - ui->initSlider(parentVar, "Low bin", 18); - ui->initSlider(parentVar, "High bin", 48); - ui->initSlider(parentVar, "Sensivity", 30, 10, 100); - } -}; - -#define maxNumPopcorn 21 // max 21 on 16 segment ESP8266 -#define NUM_COLORS 3 /* number of colors per segment */ - -class PopCorn: public Effect { - const char * name() {return "PopCorn";} - unsigned8 dim() {return _1D;} - const char * tags() {return "♪💡";} - - void loop(Leds &leds) { - CRGBPalette16 pal = getPalette(); - stackUnsigned8 speed = mdl->getValue("speed"); - stackUnsigned8 numPopcorn = mdl->getValue("corns"); - bool useaudio = mdl->getValue("useaudio"); - - Spark *popcorn = leds.sharedData.bind(popcorn, maxNumPopcorn); //array - - leds.fill_solid(CRGB::Black); - - float gravity = -0.0001f - (speed/200000.0f); // m/s/s - gravity *= leds.nrOfLeds; - - if (numPopcorn == 0) numPopcorn = 1; - - for (int i = 0; i < numPopcorn; i++) { - if (popcorn[i].pos >= 0.0f) { // if kernel is active, update its position - popcorn[i].pos += popcorn[i].vel; - popcorn[i].vel += gravity; - } else { // if kernel is inactive, randomly pop it - bool doPopCorn = false; // WLEDMM allows to inhibit new pops - // WLEDMM begin - if (useaudio) { - if ( (wledAudioMod->sync.volumeSmth > 1.0f) // no pops in silence - // &&((wledAudioMod->sync.samplePeak > 0) || (wledAudioMod->sync.volumeRaw > 128)) // try to pop at onsets (our peek detector still sucks) - &&(random8() < 4) ) // stay somewhat random - doPopCorn = true; - } else { - if (random8() < 2) doPopCorn = true; // default POP!!! - } - // WLEDMM end - - if (doPopCorn) { // POP!!! - popcorn[i].pos = 0.01f; - - stackUnsigned16 peakHeight = 128 + random8(128); //0-255 - peakHeight = (peakHeight * (leds.nrOfLeds -1)) >> 8; - popcorn[i].vel = sqrtf(-2.0f * gravity * peakHeight); - - // if (SEGMENT.palette) - // { - popcorn[i].colIndex = random8(); - // } else { - // byte col = random8(0, NUM_COLORS); - // if (!SEGCOLOR(2) || !SEGCOLOR(col)) col = 0; - // popcorn[i].colIndex = col; - // } - } - } - if (popcorn[i].pos >= 0.0f) { // draw now active popcorn (either active before or just popped) - // stackUnsigned32 col = SEGMENT.color_wheel(popcorn[i].colIndex); - // if (!SEGMENT.palette && popcorn[i].colIndex < NUM_COLORS) col = SEGCOLOR(popcorn[i].colIndex); - stackUnsigned16 ledIndex = popcorn[i].pos; - CRGB col = ColorFromPalette(pal, popcorn[i].colIndex*(256/maxNumPopcorn), 255); - if (ledIndex < leds.nrOfLeds) leds.setPixelColor(ledIndex, col); - } - } - } - - void controls(JsonObject parentVar) { - addPalette(parentVar, 4); - ui->initSlider(parentVar, "speed", 128); - ui->initSlider(parentVar, "corns", 10, 1, maxNumPopcorn); - ui->initCheckBox(parentVar, "useaudio", false); - } -}; //PopCorn - -class AudioRings: public RingEffect { - const char * name() {return "AudioRings";} - unsigned8 dim() {return _1D;} - const char * tags() {return "♫💫";} - - void loop(Leds &leds) { - CRGBPalette16 pal = getPalette(); - for (int i = 0; i < 7; i++) { // 7 rings - - byte val; - if(mdl->getValue("inWards").as()) { - val = wledAudioMod->fftResults[(i*2)]; - } - else { - int b = 14 -(i*2); - val = wledAudioMod->fftResults[b]; - } - - // Visualize leds to the beat - CRGB color = ColorFromPalette(pal, val, val); -// CRGB color = ColorFromPalette(currentPalette, val, 255, currentBlending); -// color.nscale8_video(val); - setRing(leds, i, color); -// setRingFromFtt((i * 2), i); - } - - setRingFromFtt(leds, pal, 2, 7); // set outer ring to bass - setRingFromFtt(leds, pal, 0, 8); // set outer ring to bass - - } - void setRingFromFtt(Leds &leds, CRGBPalette16 pal, int index, int ring) { - byte val = wledAudioMod->fftResults[index]; - // Visualize leds to the beat - CRGB color = ColorFromPalette(pal, val, 255); - color.nscale8_video(val); - setRing(leds, ring, color); - } - - void controls(JsonObject parentVar) { - addPalette(parentVar, 4); - ui->initCheckBox(parentVar, "inWards", true); - } -}; - -class DJLight: public Effect { - const char * name() {return "DJLight";} - unsigned8 dim() {return _1D;} - const char * tags() {return "♫💡";} - - void setup(Leds &leds) { - leds.fill_solid(CRGB::Black, true); //no blend - } - - void loop(Leds &leds) { - - const int mid = leds.nrOfLeds / 2; - - unsigned8 *aux0 = leds.sharedData.bind(aux0); - - uint8_t *fftResult = wledAudioMod->fftResults; - float volumeSmth = wledAudioMod->volumeSmth; - - unsigned8 speed = mdl->getValue("speed"); - bool candyFactory = mdl->getValue("candyFactory").as(); - unsigned8 fade = mdl->getValue("fade"); - - - unsigned8 secondHand = (speed < 255) ? (micros()/(256-speed)/500 % 16) : 0; - if((speed > 254) || (*aux0 != secondHand)) { // WLEDMM allow run run at full speed - *aux0 = secondHand; - - CRGB color = CRGB(0,0,0); - // color = CRGB(fftResult[15]/2, fftResult[5]/2, fftResult[0]/2); // formula from 0.13.x (10Khz): R = 3880-5120, G=240-340, B=60-100 - if (!candyFactory) { - color = CRGB(fftResult[12]/2, fftResult[3]/2, fftResult[1]/2); // formula for 0.14.x (22Khz): R = 3015-3704, G=216-301, B=86-129 - } else { - // candy factory: an attempt to get more colors - color = CRGB(fftResult[11]/2 + fftResult[12]/4 + fftResult[14]/4, // red : 2412-3704 + 4479-7106 - fftResult[4]/2 + fftResult[3]/4, // green: 216-430 - fftResult[0]/4 + fftResult[1]/4 + fftResult[2]/4); // blue: 46-216 - if ((color.getLuma() < 96) && (volumeSmth >= 1.5f)) { // enhance "almost dark" pixels with yellow, based on not-yet-used channels - unsigned yello_g = (fftResult[5] + fftResult[6] + fftResult[7]) / 3; - unsigned yello_r = (fftResult[7] + fftResult[8] + fftResult[9] + fftResult[10]) / 4; - color.green += (uint8_t) yello_g / 2; - color.red += (uint8_t) yello_r / 2; - } - } - - if (volumeSmth < 1.0f) color = CRGB(0,0,0); // silence = black - - // make colors less "pastel", by turning up color saturation in HSV space - if (color.getLuma() > 32) { // don't change "dark" pixels - CHSV hsvColor = rgb2hsv_approximate(color); - hsvColor.v = min(max(hsvColor.v, (uint8_t)48), (uint8_t)204); // 48 < brightness < 204 - if (candyFactory) - hsvColor.s = max(hsvColor.s, (uint8_t)204); // candy factory mode: strongly turn up color saturation (> 192) - else - hsvColor.s = max(hsvColor.s, (uint8_t)108); // normal mode: turn up color saturation to avoid pastels - color = hsvColor; - } - //if (color.getLuma() > 12) color.maximizeBrightness(); // for testing - - //leds.setPixelColor(mid, color.fadeToBlackBy(map(fftResult[4], 0, 255, 255, 4))); // 0.13.x fade -> 180hz-260hz - uint8_t fadeVal = map(fftResult[3], 0, 255, 255, 4); // 0.14.x fade -> 216hz-301hz - if (candyFactory) fadeVal = constrain(fadeVal, 0, 176); // "candy factory" mode - avoid complete fade-out - leds.setPixelColor(mid, color.fadeToBlackBy(fadeVal)); - - for (int i = leds.nrOfLeds - 1; i > mid; i--) leds.setPixelColor(i, leds.getPixelColor(i-1)); // move to the left - for (int i = 0; i < mid; i++) leds.setPixelColor(i, leds.getPixelColor(i+1)); // move to the right - - leds.fadeToBlackBy(fade); - - } - } - - void controls(JsonObject parentVar) { - ui->initSlider(parentVar, "speed", 255); - ui->initCheckBox(parentVar, "candyFactory", true); - ui->initSlider(parentVar, "fade", 4, 0, 10); - } -}; //DJLight - - - - -//2D Effects -//========== - -class Lines: public Effect { - const char * name() {return "Lines";} - unsigned8 dim() {return _2D;} - const char * tags() {return "💫";} - - void loop(Leds &leds) { - leds.fadeToBlackBy(100); - - Coord3D pos = {0,0,0}; - if (mdl->getValue("Vertical").as()) { - pos.x = map(beat16( mdl->getValue("BPM").as()), 0, UINT16_MAX, 0, leds.size.x-1 ); //instead of call%width - - for (pos.y = 0; pos.y < leds.size.y; pos.y++) { - leds[pos] = CHSV( gHue, 255, 192); - } - } else { - pos.y = map(beat16( mdl->getValue("BPM").as()), 0, UINT16_MAX, 0, leds.size.y-1 ); //instead of call%height - for (pos.x = 0; pos.x < leds.size.x; pos.x++) { - leds[pos] = CHSV( gHue, 255, 192); - } - } - } - - void controls(JsonObject parentVar) { - ui->initSlider(parentVar, "BPM", 60); - ui->initCheckBox(parentVar, "Vertical", true); - } -}; // Lines - -// By: Stepko https://editor.soulmatelights.com/gallery/1012 , Modified by: Andrew Tuline -class BlackHole: public Effect { - const char * name() {return "BlackHole";} - unsigned8 dim() {return _2D;} - const char * tags() {return "💡";} - - void loop(Leds &leds) { - stackUnsigned8 fade = mdl->getValue("fade"); - stackUnsigned8 outX = mdl->getValue("outX"); - stackUnsigned8 outY = mdl->getValue("outY"); - stackUnsigned8 inX = mdl->getValue("inX"); - stackUnsigned8 inY = mdl->getValue("inY"); - - uint16_t x, y; - - leds.fadeToBlackBy(16 + (fade)); // create fading trails - unsigned long t = now/128; // timebase - // outer stars - for (size_t i = 0; i < 8; i++) { - x = beatsin8(outX, 0, leds.size.x - 1, 0, ((i % 2) ? 128 : 0) + t * i); - y = beatsin8(outY, 0, leds.size.y - 1, 0, ((i % 2) ? 192 : 64) + t * i); - leds.addPixelColor(leds.XY(x, y), CHSV(i*32, 255, 255)); - } - // inner stars - for (size_t i = 0; i < 4; i++) { - x = beatsin8(inX, leds.size.x/4, leds.size.x - 1 - leds.size.x/4, 0, ((i % 2) ? 128 : 0) + t * i); - y = beatsin8(inY, leds.size.y/4, leds.size.y - 1 - leds.size.y/4, 0, ((i % 2) ? 192 : 64) + t * i); - leds.addPixelColor(leds.XY(x, y), CHSV(i*32, 255, 255)); - } - // central white dot - leds.setPixelColor(leds.XY(leds.size.x/2, leds.size.y/2), CHSV(0, 0, 255)); - - // blur everything a bit - leds.blur2d(16); - - } - - void controls(JsonObject parentVar) { - ui->initSlider(parentVar, "fade", 16, 0, 32); - ui->initSlider(parentVar, "outX", 16, 0, 32); - ui->initSlider(parentVar, "outY", 16, 0, 32); - ui->initSlider(parentVar, "inX", 16, 0, 32); - ui->initSlider(parentVar, "inY", 16, 0, 32); - } -}; // BlackHole - -// dna originally by by ldirko at https://pastebin.com/pCkkkzcs. Updated by Preyy. WLED conversion by Andrew Tuline. -class DNA: public Effect { - const char * name() {return "DNA";} - unsigned8 dim() {return _2D;} - const char * tags() {return "💡💫";} - - void loop(Leds &leds) { - CRGBPalette16 pal = getPalette(); - stackUnsigned8 speed = mdl->getValue("speed"); - stackUnsigned8 blur = mdl->getValue("blur"); - stackUnsigned8 phases = mdl->getValue("phases"); - - leds.fadeToBlackBy(64); - - for (int i = 0; i < leds.size.x; i++) { - //256 is a complete phase - // half a phase is dna is 128 - uint8_t phase = leds.size.x * i / 8; - //32: 4 * i - //16: 8 * i - phase = i * 127 / (leds.size.x-1) * phases / 64; - leds.setPixelColor(leds.XY(i, beatsin8(speed, 0, leds.size.y-1, 0, phase )), ColorFromPalette(pal, i*5+now/17, beatsin8(5, 55, 255, 0, i*10), LINEARBLEND)); - leds.setPixelColor(leds.XY(i, beatsin8(speed, 0, leds.size.y-1, 0, phase+128)), ColorFromPalette(pal, i*5+128+now/17, beatsin8(5, 55, 255, 0, i*10+128), LINEARBLEND)); - } - leds.blur2d(blur); - } - - void controls(JsonObject parentVar) { - addPalette(parentVar, 4); - ui->initSlider(parentVar, "speed", 16, 0, 32); - ui->initSlider(parentVar, "blur", 128); - ui->initSlider(parentVar, "phases", 64); - } -}; // DNA - - -//DistortionWaves inspired by WLED, ldirko and blazoncek, https://editor.soulmatelights.com/gallery/1089-distorsion-waves -unsigned8 gamma8(unsigned8 b) { //we do nothing with gamma for now - return b; -} -class DistortionWaves: public Effect { - const char * name() {return "DistortionWaves";} - unsigned8 dim() {return _2D;} - const char * tags() {return "💡";} - - void loop(Leds &leds) { - - stackUnsigned8 speed = mdl->getValue("speed"); - stackUnsigned8 scale = mdl->getValue("scale"); - - stackUnsigned8 w = 2; - - stackUnsigned16 a = now/32; - stackUnsigned16 a2 = a/2; - stackUnsigned16 a3 = a/3; - - stackUnsigned16 cx = beatsin8(10-speed,0,leds.size.x-1)*scale; - stackUnsigned16 cy = beatsin8(12-speed,0,leds.size.y-1)*scale; - stackUnsigned16 cx1 = beatsin8(13-speed,0,leds.size.x-1)*scale; - stackUnsigned16 cy1 = beatsin8(15-speed,0,leds.size.y-1)*scale; - stackUnsigned16 cx2 = beatsin8(17-speed,0,leds.size.x-1)*scale; - stackUnsigned16 cy2 = beatsin8(14-speed,0,leds.size.y-1)*scale; - - stackUnsigned16 xoffs = 0; - Coord3D pos = {0,0,0}; - for (pos.x = 0; pos.x < leds.size.x; pos.x++) { - xoffs += scale; - stackUnsigned16 yoffs = 0; - - for (pos.y = 0; pos.y < leds.size.y; pos.y++) { - yoffs += scale; - - byte rdistort = cos8((cos8(((pos.x<<3)+a )&255)+cos8(((pos.y<<3)-a2)&255)+a3 )&255)>>1; - byte gdistort = cos8((cos8(((pos.x<<3)-a2)&255)+cos8(((pos.y<<3)+a3)&255)+a+32 )&255)>>1; - byte bdistort = cos8((cos8(((pos.x<<3)+a3)&255)+cos8(((pos.y<<3)-a) &255)+a2+64)&255)>>1; - - byte valueR = rdistort+ w* (a- ( ((xoffs - cx) * (xoffs - cx) + (yoffs - cy) * (yoffs - cy))>>7 )); - byte valueG = gdistort+ w* (a2-( ((xoffs - cx1) * (xoffs - cx1) + (yoffs - cy1) * (yoffs - cy1))>>7 )); - byte valueB = bdistort+ w* (a3-( ((xoffs - cx2) * (xoffs - cx2) + (yoffs - cy2) * (yoffs - cy2))>>7 )); - - valueR = gamma8(cos8(valueR)); - valueG = gamma8(cos8(valueG)); - valueB = gamma8(cos8(valueB)); - - leds[pos] = CRGB(valueR, valueG, valueB); - } - } - } - - void controls(JsonObject parentVar) { - ui->initSlider(parentVar, "speed", 4, 0, 8); - ui->initSlider(parentVar, "scale", 4, 0, 8); - } -}; // DistortionWaves - -//Octopus inspired by WLED, Stepko and Sutaburosu and blazoncek -//Idea from https://www.youtube.com/watch?v=HsA-6KIbgto&ab_channel=GreatScott%21 (https://editor.soulmatelights.com/gallery/671-octopus) -class Octopus: public Effect { - const char * name() {return "Octopus";} - unsigned8 dim() {return _2D;} - const char * tags() {return "💡";} - - struct Map_t { - unsigned8 angle; - unsigned8 radius; - }; - - void loop(Leds &leds) { - - const stackUnsigned8 mapp = 180 / max(leds.size.x,leds.size.y); - - // stackUnsigned8 *speed2 = leds.sharedData.bind(speed2); - // // USER_PRINTF(" %d:%d", speed2, *speed2); - - stackUnsigned8 speed = mdl->getValue("speed"); - stackUnsigned8 offsetX = mdl->getValue("Offset X"); - stackUnsigned8 offsetY = mdl->getValue("Offset Y"); - stackUnsigned8 legs = mdl->getValue("Legs"); - CRGBPalette16 pal = getPalette(); - - Map_t *rMap = leds.sharedData.bind(rMap, leds.size.x * leds.size.y); //array - uint8_t *offsX = leds.sharedData.bind(offsX); - uint8_t *offsY = leds.sharedData.bind(offsY); - uint16_t *aux0 = leds.sharedData.bind(aux0); - uint16_t *aux1 = leds.sharedData.bind(aux1); - stackUnsigned32 *step = leds.sharedData.bind(step); - - Coord3D pos = {0,0,0}; - - // re-init if SEGMENT dimensions or offset changed - if (*aux0 != leds.size.x || *aux1 != leds.size.y || offsetX != *offsX || offsetY != *offsY) { - // *step = 0; - *aux0 = leds.size.x; - *aux1 = leds.size.y; - *offsX = offsetX; - *offsY = offsetY; - const stackUnsigned8 C_X = leds.size.x / 2 + (offsetX - 128)*leds.size.x/255; - const stackUnsigned8 C_Y = leds.size.y / 2 + (offsetY - 128)*leds.size.y/255; - for (pos.x = 0; pos.x < leds.size.x; pos.x++) { - for (pos.y = 0; pos.y < leds.size.y; pos.y++) { - rMap[leds.XY(pos.x, pos.y)].angle = 40.7436f * atan2f(pos.y - C_Y, pos.x - C_X); // avoid 128*atan2()/PI - rMap[leds.XY(pos.x, pos.y)].radius = hypotf(pos.x - C_X, pos.y - C_Y) * mapp; //thanks Sutaburosu - } - } - } - - *step = now * speed / 32 / 10;//mdl->getValue("realFps").as(); // WLEDMM 40fps - - for (pos.x = 0; pos.x < leds.size.x; pos.x++) { - for (pos.y = 0; pos.y < leds.size.y; pos.y++) { - byte angle = rMap[leds.XY(pos.x,pos.y)].angle; - byte radius = rMap[leds.XY(pos.x,pos.y)].radius; - //CRGB c = CHSV(*step / 2 - radius, 255, sin8(sin8((angle * 4 - radius) / 4 + *step) + radius - *step * 2 + angle * (SEGMENT.custom3/3+1))); - uint16_t intensity = sin8(sin8((angle * 4 - radius) / 4 + *step/2) + radius - *step + angle * legs); - intensity = map(intensity*intensity, 0, UINT16_MAX, 0, 255); // add a bit of non-linearity for cleaner display - CRGB color = ColorFromPalette(pal, *step / 2 - radius, intensity); - leds[pos] = color; - } - } - } - - void controls(JsonObject parentVar) { - - //bind the variables to sharedData... - // stackUnsigned8 *speed2 = leds.sharedData.bind(speed2); - // USER_PRINTF("(bind %d) %d %d\n", speed2, leds.sharedData.index, leds.sharedData.bytesAllocated); - // USER_PRINTF("bind %d->%d %d\n", index, newIndex, bytesAllocated); - - //if changeValue then update the linked variable... - - addPalette(parentVar, 4); - - ui->initSlider(parentVar, "speed", 128, 1, 255); - // , false, [leds](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - // case f_ChangeFun: { - // unsigned8 *speed2 = leds.sharedData.data+0; - // USER_PRINTF("%s[%d] chFun = %s (bind %d)\n", mdl->varID(var), rowNr, var["value"].as().c_str(), speed2); - // *speed2 = var["value"][rowNr]; - // return true; } - // default: return false; - // }}); - ui->initSlider(parentVar, "Offset X", 128); - ui->initSlider(parentVar, "Offset Y", 128); - ui->initSlider(parentVar, "Legs", 4, 1, 8); - } -}; // Octopus - -//Lissajous inspired by WLED, Andrew Tuline -class Lissajous: public Effect { - const char * name() {return "Lissajous";} - unsigned8 dim() {return _2D;} - const char * tags() {return "💡";} - - void loop(Leds &leds) { - - stackUnsigned8 freqX = mdl->getValue("X frequency"); - stackUnsigned8 fadeRate = mdl->getValue("Fade rate"); - stackUnsigned8 speed = mdl->getValue("speed"); - bool smooth = mdl->getValue("Smooth"); - CRGBPalette16 pal = getPalette(); - - leds.fadeToBlackBy(fadeRate); - - uint_fast16_t phase = now * speed / 256; // allow user to control rotation speed, speed between 0 and 255! - - Coord3D locn = {0,0,0}; - if (smooth) { // WLEDMM: this is the original "float" code featuring anti-aliasing - int maxLoops = max(192U, 4U*(leds.size.x+leds.size.y)); - maxLoops = ((maxLoops / 128) +1) * 128; // make sure whe have half or full turns => multiples of 128 - for (int i=0; i < maxLoops; i++) { - locn.x = float(sin8(phase/2 + (i* freqX)/64)) / 255.0f; // WLEDMM align speed with original effect - locn.y = float(cos8(phase/2 + i*2)) / 255.0f; - //leds.setPixelColorXY(xlocn, ylocn, SEGMENT.color_from_palette(strip.now/100+i, false, PALETTE_SOLID_WRAP, 0)); // draw pixel with anti-aliasing - unsigned palIndex = (256*locn.y) + phase/2 + (i* freqX)/64; - // leds.setPixelColorXY(xlocn, ylocn, SEGMENT.color_from_palette(palIndex, false, PALETTE_SOLID_WRAP, 0)); // draw pixel with anti-aliasing - color follows rotation - leds[locn] = ColorFromPalette(pal, palIndex); - } - } else - for (int i=0; i < 256; i ++) { - //WLEDMM: stick to the original calculations of xlocn and ylocn - locn.x = sin8(phase/2 + (i*freqX)/64); - locn.y = cos8(phase/2 + i*2); - locn.x = (leds.size.x < 2) ? 1 : (map(2*locn.x, 0,511, 0,2*(leds.size.x-1)) +1) /2; // softhack007: "*2 +1" for proper rounding - locn.y = (leds.size.y < 2) ? 1 : (map(2*locn.y, 0,511, 0,2*(leds.size.y-1)) +1) /2; // "leds.size.y > 2" is needed to avoid div/0 in map() - // leds.setPixelColorXY((unsigned8)xlocn, (unsigned8)ylocn, SEGMENT.color_from_palette(strip.now/100+i, false, PALETTE_SOLID_WRAP, 0)); - leds[locn] = ColorFromPalette(pal, now/100+i); - } - } - - void controls(JsonObject parentVar) { - addPalette(parentVar, 4); - ui->initSlider(parentVar, "X frequency", 64); - ui->initSlider(parentVar, "Fade rate", 128); - ui->initSlider(parentVar, "speed", 128); - ui->initCheckBox(parentVar, "Smooth", false); - } -}; // Lissajous - -//Frizzles inspired by WLED, Stepko, Andrew Tuline, https://editor.soulmatelights.com/gallery/640-color-frizzles -class Frizzles: public Effect { - const char * name() {return "Frizzles";} - unsigned8 dim() {return _2D;} - const char * tags() {return "💡";} - - void loop(Leds &leds) { - leds.fadeToBlackBy(16); - - stackUnsigned8 bpm = mdl->getValue("BPM"); - stackUnsigned8 intensity = mdl->getValue("intensity"); - CRGBPalette16 pal = getPalette(); - - for (int i = 8; i > 0; i--) { - Coord3D pos = {0,0,0}; - pos.x = beatsin8(bpm/8 + i, 0, leds.size.x - 1); - pos.y = beatsin8(intensity/8 - i, 0, leds.size.y - 1); - CRGB color = ColorFromPalette(pal, beatsin8(12, 0, 255), 255); - leds[pos] = color; - } - leds.blur2d(mdl->getValue("blur")); - } - - void controls(JsonObject parentVar) { - addPalette(parentVar, 4); - ui->initSlider(parentVar, "BPM", 60); - ui->initSlider(parentVar, "intensity", 128); - ui->initSlider(parentVar, "blur", 128); - } -}; // Frizzles - -class ScrollingText: public Effect { - const char * name() {return "Scrolling Text";} - unsigned8 dim() {return _2D;} - const char * tags() {return "💫";} - - void loop(Leds &leds) { - stackUnsigned8 speed = mdl->getValue("speed"); - stackUnsigned8 font = mdl->getValue("font"); - const char * text = mdl->getValue("text"); - - // text might be nullified by selecting other effects and if effect is selected, controls are run afterwards - // tbd: this should be removed and setEffect must make sure this cannot happen!! - if (text && strlen(text)>0) { - leds.fadeToBlackBy(); - leds.drawText(text, 0, 0, font, CRGB::Red, - (call*speed/256)); - } - - } - - void controls(JsonObject parentVar) { - ui->initText(parentVar, "text", "StarMod"); - ui->initSlider(parentVar, "speed", 128); - ui->initSelect(parentVar, "font", 0, false, [](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_UIFun: { - JsonArray options = ui->setOptions(var); - options.add("4x6"); - options.add("5x8"); - options.add("5x12"); - options.add("6x8"); - options.add("7x9"); - return true; - } - default: return false; - }}); - } -}; - - -#ifdef STARMOD_USERMOD_WLEDAUDIO - -class Waverly: public Effect { - const char * name() {return "Waverly";} - unsigned8 dim() {return _2D;} - const char * tags() {return "♪💡";} - - void loop(Leds &leds) { - CRGBPalette16 pal = getPalette(); - stackUnsigned8 amplification = mdl->getValue("Amplification"); - stackUnsigned8 sensitivity = mdl->getValue("Sensitivity"); - bool noClouds = mdl->getValue("No Clouds"); - // bool soundPressure = mdl->getValue("Sound Pressure"); - // bool agcDebug = mdl->getValue("AGC debug"); - - leds.fadeToBlackBy(amplification); - // if (agcDebug && soundPressure) soundPressure = false; // only one of the two at any time - // if ((soundPressure) && (wledAudioMod->sync.volumeSmth > 0.5f)) wledAudioMod->sync.volumeSmth = wledAudioMod->sync.soundPressure; // show sound pressure instead of volume - // if (agcDebug) wledAudioMod->sync.volumeSmth = 255.0 - wledAudioMod->sync.agcSensitivity; // show AGC level instead of volume - - long t = now / 2; - Coord3D pos; - for (pos.x = 0; pos.x < leds.size.x; pos.x++) { - stackUnsigned16 thisVal = wledAudioMod->sync.volumeSmth*sensitivity/64 * inoise8(pos.x * 45 , t , t)/64; // WLEDMM back to SR code - stackUnsigned16 thisMax = min(map(thisVal, 0, 512, 0, leds.size.y), (long)leds.size.x); - - for (pos.y = 0; pos.y < thisMax; pos.y++) { - CRGB color = ColorFromPalette(pal, map(pos.y, 0, thisMax, 250, 0), 255, LINEARBLEND); - if (!noClouds) - leds.addPixelColor(pos, color); - leds.addPixelColor(leds.XY((leds.size.x - 1) - pos.x, (leds.size.y - 1) - pos.y), color); - } - } - leds.blur2d(16); - - } - - void controls(JsonObject parentVar) { - addPalette(parentVar, 4); - ui->initSlider(parentVar, "Amplification", 128); - ui->initSlider(parentVar, "Sensitivity", 128); - ui->initCheckBox(parentVar, "No Clouds"); - // ui->initCheckBox(parentVar, "Sound Pressure"); - // ui->initCheckBox(parentVar, "AGC debug"); - } -}; //Waverly - -class GEQEffect: public Effect { - const char * name() {return "GEQ";} - unsigned8 dim() {return _2D;} - const char * tags() {return "♫💡";} - - void setup(Leds &leds) { - leds.fadeToBlackBy(16); - } - - void loop(Leds &leds) { - - stackUnsigned16 *previousBarHeight = leds.sharedData.bind(previousBarHeight, leds.size.x); //array - unsigned long *step = leds.sharedData.bind(step); - - const int NUM_BANDS = NUM_GEQ_CHANNELS ; // map(SEGMENT.custom1, 0, 255, 1, 16); - - #ifdef SR_DEBUG - stackUnsigned8 samplePeak = *(unsigned8*)um_data->u_data[3]; - #endif - - stackUnsigned8 fadeOut = mdl->getValue("fadeOut"); - stackUnsigned8 ripple = mdl->getValue("ripple"); - bool colorBars = mdl->getValue("colorBars"); - bool smoothBars = mdl->getValue("smoothBars"); - CRGBPalette16 pal = getPalette(); - - bool rippleTime = false; - if (now - *step >= (256U - ripple)) { - *step = now; - rippleTime = true; - } - - int fadeoutDelay = (256 - fadeOut) / 64; //256..1 -> 4..0 - size_t beat = map(beat16( fadeOut), 0, UINT16_MAX, 0, fadeoutDelay-1 ); // instead of call%fadeOutDelay - - if ((fadeoutDelay <= 1 ) || (beat == 0)) leds.fadeToBlackBy(fadeOut); - - stackUnsigned16 lastBandHeight = 0; // WLEDMM: for smoothing out bars - - //evenly distribute see also Funky Plank/By ewowi/From AXI - float bandwidth = (float)leds.size.x / NUM_BANDS; - float remaining = bandwidth; - stackUnsigned8 band = 0; - Coord3D pos = {0,0,0}; - for (pos.x=0; pos.x < leds.size.x; pos.x++) { - //WLEDMM if not enough remaining - if (remaining < 1) {band++; remaining+= bandwidth;} //increase remaining but keep the current remaining - remaining--; //consume remaining - - // USER_PRINTF("x %d b %d n %d w %f %f\n", x, band, NUM_BANDS, bandwidth, remaining); - stackUnsigned8 frBand = ((NUM_BANDS < 16) && (NUM_BANDS > 1)) ? map(band, 0, NUM_BANDS - 1, 0, 15):band; // always use full range. comment out this line to get the previous behaviour. - // frBand = constrain(frBand, 0, 15); //WLEDMM can never be out of bounds (I think...) - stackUnsigned16 colorIndex = frBand * 17; //WLEDMM 0.255 - stackUnsigned16 bandHeight = wledAudioMod->fftResults[frBand]; // WLEDMM we use the original ffResult, to preserve accuracy - - // WLEDMM begin - smooth out bars - if ((pos.x > 0) && (pos.x < (leds.size.x-1)) && (smoothBars)) { - // get height of next (right side) bar - stackUnsigned8 nextband = (remaining < 1)? band +1: band; - nextband = constrain(nextband, 0, 15); // just to be sure - frBand = ((NUM_BANDS < 16) && (NUM_BANDS > 1)) ? map(nextband, 0, NUM_BANDS - 1, 0, 15):nextband; // always use full range. comment out this line to get the previous behaviour. - stackUnsigned16 nextBandHeight = wledAudioMod->fftResults[frBand]; - // smooth Band height - bandHeight = (7*bandHeight + 3*lastBandHeight + 3*nextBandHeight) / 12; // yeees, its 12 not 13 (10% amplification) - bandHeight = constrain(bandHeight, 0, 255); // remove potential over/underflows - colorIndex = map(pos.x, 0, leds.size.x-1, 0, 255); //WLEDMM - } - lastBandHeight = bandHeight; // remember BandHeight (left side) for next iteration - stackUnsigned16 barHeight = map(bandHeight, 0, 255, 0, leds.size.y); // Now we map bandHeight to barHeight. do not subtract -1 from leds.size.y here - // WLEDMM end - - if (barHeight > leds.size.y) barHeight = leds.size.y; // WLEDMM map() can "overshoot" due to rounding errors - if (barHeight > previousBarHeight[pos.x]) previousBarHeight[pos.x] = barHeight; //drive the peak up - - CRGB ledColor = CRGB::Black; - - for (pos.y=0; pos.y < barHeight; pos.y++) { - if (colorBars) //color_vertical / color bars toggle - colorIndex = map(pos.y, 0, leds.size.y-1, 0, 255); - - ledColor = ColorFromPalette(pal, (unsigned8)colorIndex); - - leds.setPixelColor(leds.XY(pos.x, leds.size.y - 1 - pos.y), ledColor); - } - - if ((ripple > 0) && (previousBarHeight[pos.x] > 0) && (previousBarHeight[pos.x] < leds.size.y)) // WLEDMM avoid "overshooting" into other segments - leds.setPixelColor(leds.XY(pos.x, leds.size.y - previousBarHeight[pos.x]), CHSV( gHue, 255, 192)); // take gHue color for the time being - - if (rippleTime && previousBarHeight[pos.x]>0) previousBarHeight[pos.x]--; //delay/ripple effect - - } - } - - void controls(JsonObject parentVar) { - addPalette(parentVar, 4); - ui->initSlider(parentVar, "fadeOut", 255); - ui->initSlider(parentVar, "ripple", 128); - ui->initCheckBox(parentVar, "colorBars", false); - ui->initCheckBox(parentVar, "smoothBars", true); - - // Nice an effect can register it's own DMX channel, but not a fan of repeating the range and type of the param - - // #ifdef STARMOD_USERMOD_E131 - - // if (e131mod->isEnabled) { - // e131mod->patchChannel(3, "fadeOut", 255); // TODO: add constant for name - // e131mod->patchChannel(4, "ripple", 255); - // for (JsonObject childVar: mdl->findVar("e131Tbl")["n"].as()) { - // ui->callVarFun(childVar, UINT8_MAX, f_UIFun); - // } - // } - - // #endif - } -}; //GEQ - -class FunkyPlank: public Effect { - const char * name() {return "Funky Plank";} - unsigned8 dim() {return _2D;} - const char * tags() {return "♫💡💫";} - - void setup(Leds &leds) { - leds.fill_solid(CRGB::Black, true); //no blend - } - - void loop(Leds &leds) { - - unsigned8 num_bands = mdl->getValue("bands"); - unsigned8 speed = mdl->getValue("speed"); - - unsigned8 *aux0 = leds.sharedData.bind(aux0); - - unsigned8 secondHand = (speed < 255) ? (micros()/(256-speed)/500 % 16) : 0; - if ((speed > 254) || (*aux0 != secondHand)) { // WLEDMM allow run run at full speed - *aux0 = secondHand; - - //evenly distribute see also GEQ/By ewowi/From AXI - float bandwidth = (float)leds.size.x / num_bands; - float remaining = bandwidth; - stackUnsigned8 band = 0; - for (int posx=0; posx < leds.size.x; posx++) { - if (remaining < 1) {band++; remaining += bandwidth;} //increase remaining but keep the current remaining - remaining--; //consume remaining - - int hue = wledAudioMod->fftResults[map(band, 0, num_bands-1, 0, 15)]; - int v = map(hue, 0, 255, 10, 255); - leds.setPixelColor(leds.XY(posx, 0), CHSV(hue, 255, v)); - } - - // drip down: - for (int i = (leds.size.y - 1); i > 0; i--) { - for (int j = (leds.size.x - 1); j >= 0; j--) { - leds.setPixelColor(leds.XY(j, i), leds.getPixelColor(leds.XY(j, i-1))); - } - } - } - } - - void controls(JsonObject parentVar) { - ui->initSlider(parentVar, "speed", 255); - ui->initSlider(parentVar, "bands", NUM_GEQ_CHANNELS, 1, NUM_GEQ_CHANNELS); - } -}; //FunkyPlank - - -#endif // End Audio Effects - - -//3D Effects -//========== - -class RipplesEffect: public Effect { - const char * name() {return "Ripples";} - unsigned8 dim() {return _3D;} - const char * tags() {return "💫";} - - void loop(Leds &leds) { - stackUnsigned8 interval = mdl->getValue("interval"); - stackUnsigned8 speed = mdl->getValue("speed"); - - float ripple_interval = 1.3f * (interval/128.0f); - - leds.fill_solid(CRGB::Black); - - Coord3D pos = {0,0,0}; - for (pos.z=0; pos.zinitSlider(parentVar, "speed", 50, 0, 99); - ui->initSlider(parentVar, "interval", 128); - } -}; - -class SphereMoveEffect: public Effect { - const char * name() {return "SphereMove";} - unsigned8 dim() {return _3D;} - const char * tags() {return "💫";} - - void loop(Leds &leds) { - stackUnsigned8 speed = mdl->getValue("speed"); - - leds.fill_solid(CRGB::Black); - - stackUnsigned32 time_interval = now/(100 - speed)/((256.0f-128.0f)/20.0f); - - Coord3D origin; - origin.x = 3.5f+sinf(time_interval)*2.5f; - origin.y = 3.5f+cosf(time_interval)*2.5f; - origin.z = 3.5f+cosf(time_interval)*2.0f; - - float diameter = 2.0f+sinf(time_interval/3.0f); - - // CRGBPalette256 pal; - Coord3D pos; - for (pos.x=0; pos.xdiameter && dinitSlider(parentVar, "speed", 50, 0, 99); - } -}; // SphereMove3DEffect - -class Effects { -public: - std::vector effects; - - Effects() { - //create effects before fx.chFun is called - - //1D Basis - effects.push_back(new SolidEffect); - // 1D FastLed - effects.push_back(new RainbowEffect); - effects.push_back(new RainbowWithGlitterEffect); - effects.push_back(new SinelonEffect); - effects.push_back(new ConfettiEffect); - effects.push_back(new BPMEffect); - effects.push_back(new JuggleEffect); - //1D StarMod - effects.push_back(new RunningEffect); - effects.push_back(new RingRandomFlow); - // 1D WLED - effects.push_back(new BouncingBalls); - effects.push_back(new RainEffect); - effects.push_back(new DripEffect); - effects.push_back(new HeartBeatEffect); - - #ifdef STARMOD_USERMOD_WLEDAUDIO - //1D Volume - effects.push_back(new FreqMatrix); - effects.push_back(new PopCorn); - //1D frequency - effects.push_back(new AudioRings); - effects.push_back(new DJLight); - #endif - - //2D StarMod - effects.push_back(new Lines); - //2D WLED - effects.push_back(new BlackHole); - effects.push_back(new DNA); - effects.push_back(new DistortionWaves); - effects.push_back(new Octopus); - effects.push_back(new Lissajous); - effects.push_back(new Frizzles); - effects.push_back(new ScrollingText); - #ifdef STARMOD_USERMOD_WLEDAUDIO - //2D WLED - effects.push_back(new Waverly); - effects.push_back(new GEQEffect); - effects.push_back(new FunkyPlank); - #endif - //3D - effects.push_back(new RipplesEffect); - effects.push_back(new SphereMoveEffect); -} - - void setup() { - //check of no local variables (should be only 4 bytes): tbd: can we loop over effects (sizeof(effect does not work)) - // for (Effect *effect:effects) { - // USER_PRINTF("Size of %s is %d\n", effect->name(), sizeof(*effect)); - // } - // USER_PRINTF("Size of %s is %d\n", "RainbowEffect", sizeof(RainbowEffect)); - // USER_PRINTF("Size of %s is %d\n", "RainbowWithGlitterEffect", sizeof(RainbowWithGlitterEffect)); - // USER_PRINTF("Size of %s is %d\n", "SinelonEffect", sizeof(SinelonEffect)); - // USER_PRINTF("Size of %s is %d\n", "RunningEffect", sizeof(RunningEffect)); - // USER_PRINTF("Size of %s is %d\n", "ConfettiEffect", sizeof(ConfettiEffect)); - // USER_PRINTF("Size of %s is %d\n", "BPMEffect", sizeof(BPMEffect)); - // USER_PRINTF("Size of %s is %d\n", "JuggleEffect", sizeof(JuggleEffect)); - // USER_PRINTF("Size of %s is %d\n", "RipplesEffect", sizeof(RipplesEffect)); - // USER_PRINTF("Size of %s is %d\n", "SphereMoveEffect", sizeof(SphereMoveEffect)); - // USER_PRINTF("Size of %s is %d\n", "Frizzles", sizeof(Frizzles)); - // USER_PRINTF("Size of %s is %d\n", "Lines", sizeof(Lines)); - // USER_PRINTF("Size of %s is %d\n", "DistortionWaves", sizeof(DistortionWaves)); - // USER_PRINTF("Size of %s is %d\n", "Octopus", sizeof(Octopus)); - // USER_PRINTF("Size of %s is %d\n", "Lissajous", sizeof(Lissajous)); - // USER_PRINTF("Size of %s is %d\n", "BouncingBalls", sizeof(BouncingBalls)); - // USER_PRINTF("Size of %s is %d\n", "RingRandomFlow", sizeof(RingRandomFlow)); - // #ifdef STARMOD_USERMOD_WLEDAUDIO - // USER_PRINTF("Size of %s is %d\n", "GEQEffect", sizeof(GEQEffect)); - // USER_PRINTF("Size of %s is %d\n", "AudioRings", sizeof(AudioRings)); - // #endif - } - - void loop(Leds &leds) { - now = millis(); //tbd timebase - - leds.sharedData.loop(); //sets the sharedData pointer back to 0 so loop effect can go through it - effects[leds.fx%effects.size()]->loop(leds); - - call++; - - EVERY_N_MILLISECONDS( 20 ) { gHue++; } // slowly cycle the "base color" through the rainbow - } - - void setEffect(Leds &leds, JsonObject var, unsigned8 rowNr) { - - leds.fx = mdl->getValue(var, rowNr); - - USER_PRINTF("setEffect fx[%d]: %d\n", rowNr, leds.fx); - - if (leds.fx < effects.size()) { - - leds.sharedData.clear(); //make sure all values are 0 - - Effect* effect = effects[leds.fx]; - - // effect->loop(leds); //do a loop to set sharedData right - // leds.sharedData.loop(); - mdl->varPreDetails(var, rowNr); - effect->controls(var); - mdl->varPostDetails(var, rowNr); - - effect->setup(leds); //if changed then run setup once (like call==0 in WLED) - - print->printJson("control", var); - - if (effects[leds.fx]->dim() != leds.effectDimension) { - leds.effectDimension = effects[leds.fx]->dim(); - leds.doMap = true; - leds.fixture->doMap = true; - } - } // fx < size - - } - -}; \ No newline at end of file diff --git a/src/App/LedFixture.cpp b/src/App/LedFixture.cpp deleted file mode 100644 index 9741f941..00000000 --- a/src/App/LedFixture.cpp +++ /dev/null @@ -1,456 +0,0 @@ -/* - @title StarMod - @file LedFixture.cpp - @date 20240228 - @repo https://github.com/ewowi/StarMod - @Authors https://github.com/ewowi/StarMod/commits/main - @Copyright © 2024 Github StarMod Commit Authors - @license GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - @license For non GPL-v3 usage, commercial licenses must be purchased. Contact moonmodules@icloud.com -*/ - -#include "LedFixture.h" - -#include "../Sys/SysModFiles.h" -#include "../Sys/SysStarModJson.h" -#include "../Sys/SysModPins.h" - - -//load fixture json file, parse it and depending on the projection, create a mapping for it -void Fixture::projectAndMap() { - char fileName[32] = ""; - - if (files->seqNrToName(fileName, fixtureNr)) { // get the fixture.json - StarModJson starModJson(fileName); //open fileName for deserialize - - // reset leds - stackUnsigned8 rowNr = 0; - for (Leds *leds: projections) { - if (leds->doMap) { - leds->fill_solid(CRGB::Black, true); //no blend - - USER_PRINTF("Leds pre [%d] f:%d p:%d s:%d\n", rowNr, leds->fx, leds->projectionNr, projections.size()); - leds->size = Coord3D{0,0,0}; - //vectors really gone now? - for (PhysMap &map:leds->mappingTable) { - if (map.indexes) { - map.indexes->clear(); - delete map.indexes; - } - } - leds->mappingTable.clear(); - leds->sharedData.clear(); - } - rowNr++; - } - - //deallocate all led pins - if (doAllocPins) { - stackUnsigned8 pinNr = 0; - for (PinObject pinObject: pins->pinObjects) { - if (strcmp(pinObject.owner, "Leds") == 0) - pins->deallocatePin(pinNr, "Leds"); - pinNr++; - } - } - - stackUnsigned16 indexP = 0; - stackUnsigned16 prevIndexP = 0; - unsigned16 currPin; //lookFor needs u16 - - //what to deserialize - starModJson.lookFor("width", (unsigned16 *)&size.x); - starModJson.lookFor("height", (unsigned16 *)&size.y); - starModJson.lookFor("depth", (unsigned16 *)&size.z); - starModJson.lookFor("nrOfLeds", &nrOfLeds); - starModJson.lookFor("pin", &currPin); - - //lookFor leds array and for each item in array call lambdo to make a projection - starModJson.lookFor("leds", [this, &prevIndexP, &indexP, &currPin](std::vector uint16CollectList) { //this will be called for each tuple of coordinates! - - if (uint16CollectList.size()>=1) { // process one pixel - - Coord3D pixel; //in mm ! - pixel.x = uint16CollectList[0]; - pixel.y = (uint16CollectList.size()>=2)?uint16CollectList[1]: 0; - pixel.z = (uint16CollectList.size()>=3)?uint16CollectList[2]: 0; - - // USER_PRINTF("led %d,%d,%d start %d,%d,%d end %d,%d,%d\n",x,y,z, startPos.x, startPos.y, startPos.z, endPos.x, endPos.y, endPos.z); - - stackUnsigned8 rowNr = 0; - for (Leds *leds: projections) { - if (leds->doMap) { //add pixel in leds mappingtable - - //set start and endPos between bounderies of fixture - Coord3D startPosAdjusted = (leds->startPos).minimum(size - Coord3D{1,1,1}) * 10; - Coord3D endPosAdjusted = (leds->endPos).minimum(size - Coord3D{1,1,1}) * 10; - - // mdl->setValue("fxStart", startPosAdjusted/10, rowNr); //rowNr - // mdl->setValue("fxEnd", endPosAdjusted/10, rowNr); //rowNr - - if (pixel >= startPosAdjusted && pixel <= endPosAdjusted ) { //if pixel between start and end pos - - Coord3D pixelAdjusted = (pixel - startPosAdjusted)/10; - - Coord3D sizeAdjusted = (endPosAdjusted - startPosAdjusted)/10 + Coord3D{1,1,1}; - - // 0 to 3D depending on start and endpos (e.g. to display ScrollingText on one side of a cube) - stackUnsigned8 projectionDimension = 0; - if (sizeAdjusted.x > 1) projectionDimension++; - if (sizeAdjusted.y > 1) projectionDimension++; - if (sizeAdjusted.z > 1) projectionDimension++; - - Coord3D proCenter; - if (leds->projectionNr == p_DistanceFromPoint || leds->projectionNr == p_Preset1) { - proCenter = mdl->getValue("proCenter", rowNr); - } - else - proCenter = Coord3D{0,0,0}; - - Coord3D mirrors = Coord3D{0,0,0}; // no mirrors - if (leds->projectionNr == p_Multiply || leds->projectionNr == p_Preset1) { - Coord3D proMulti; - proMulti = mdl->getValue("proMulti", rowNr); - //promultu can be 0,0,0 but /= protects from /div0 - sizeAdjusted /= proMulti; sizeAdjusted = sizeAdjusted.maximum(Coord3D{1,1,1}); //size min 1,1,1 - proCenter /= proMulti; - mirrors = pixelAdjusted / sizeAdjusted; //place the pixel in the right quadrant - pixelAdjusted = pixelAdjusted%sizeAdjusted; // pixel % size - // USER_PRINTF("Multiply %d,%d,%d\n", leds->size.x, leds->size.y, leds->size.z); - } - bool mirror = mdl->getValue("mirror", rowNr); - - // USER_PRINTF("projectionNr p:%d f:%d s:%d, %d-%d-%d %d-%d-%d %d-%d-%d\n", projectionNr, effectDimension, projectionDimension, x, y, z, uint16CollectList[0], uint16CollectList[1], uint16CollectList[2], size.x, size.y, size.z); - - if (leds->size == Coord3D{0,0,0}) { // first - USER_PRINTF("leds[%d] first s:%d,%d,%d s:%d,%d,%d e:%d,%d,%d\n", rowNr, sizeAdjusted.x, sizeAdjusted.y, sizeAdjusted.z, startPosAdjusted.x, startPosAdjusted.y, startPosAdjusted.z, endPosAdjusted.x, endPosAdjusted.y, endPosAdjusted.z); - } - - //calculate the indexV to add to current physical led to - stackUnsigned16 indexV = UINT16_MAX; - - Coord3D mapped; - switch (leds->effectDimension) { - case _1D: //effectDimension 1DxD - if (leds->size == Coord3D{0,0,0}) { // first - leds->size.x = sizeAdjusted.distance(proCenter); - leds->size.y = 1; - leds->size.z = 1; - } - - mapped = pixelAdjusted; - - // if mirrored find the indexV of the mirrored pixel - if (mirror) { - if (mirrors.x %2 != 0) mapped.x = sizeAdjusted.x - 1 - mapped.x; - if (mirrors.y %2 != 0) mapped.y = sizeAdjusted.y - 1 - mapped.y; - if (mirrors.z %2 != 0) mapped.z = sizeAdjusted.z - 1 - mapped.z; - } - - mapped.x = mapped.distance(proCenter); - mapped.y = 0; - mapped.z = 0; - - indexV = leds->XYZNoSpin(mapped); - break; - case _2D: //effectDimension - switch(projectionDimension) { - case _1D: //2D1D - if (leds->size == Coord3D{0,0,0}) { // first - leds->size.x = sqrt(sizeAdjusted.x * sizeAdjusted.y * sizeAdjusted.z); //only one is > 1, square root - leds->size.y = sizeAdjusted.x * sizeAdjusted.y * sizeAdjusted.z / leds->size.x; - leds->size.z = 1; - } - mapped.x = (pixelAdjusted.x + pixelAdjusted.y + pixelAdjusted.z) % leds->size.x; // only one > 0 - mapped.y = (pixelAdjusted.x + pixelAdjusted.y + pixelAdjusted.z) / leds->size.x; // all rows next to each other - mapped.z = 0; - break; - case _2D: //2D2D - //find the 2 axis - if (leds->size == Coord3D{0,0,0}) { // first - if (sizeAdjusted.x > 1) { - leds->size.x = sizeAdjusted.x; - if (sizeAdjusted.y > 1) leds->size.y = sizeAdjusted.y; else leds->size.y = sizeAdjusted.z; - } else { - leds->size.x = sizeAdjusted.y; - leds->size.y = sizeAdjusted.z; - } - leds->size.z = 1; - } - - if (sizeAdjusted.x > 1) { - mapped.x = pixelAdjusted.x; - if (sizeAdjusted.y > 1) mapped.y = pixelAdjusted.y; else mapped.y = pixelAdjusted.z; - } else { - mapped.x = pixelAdjusted.y; - mapped.y = pixelAdjusted.z; - } - mapped.z = 0; - - // USER_PRINTF("2Dto2D %d-%d p:%d,%d,%d m:%d,%d,%d\n", indexV, indexP, pixelAdjusted.x, pixelAdjusted.y, pixelAdjusted.z, mapped.x, mapped.y, mapped.z - break; - case _3D: //2D3D - if (leds->size == Coord3D{0,0,0}) { // first - leds->size.x = sizeAdjusted.x + sizeAdjusted.y / 2; - leds->size.y = sizeAdjusted.y / 2 + sizeAdjusted.z; - leds->size.z = 1; - } - mapped.x = pixelAdjusted.x + pixelAdjusted.y / 2; - mapped.y = pixelAdjusted.y / 2 + pixelAdjusted.z; - mapped.z = 0; - - // USER_PRINTF("2D to 3D indexV %d %d\n", indexV, size.x); - break; - } - - if (mirror) { - if (mirrors.x %2 != 0) mapped.x = sizeAdjusted.x - 1 - mapped.x; - if (mirrors.y %2 != 0) mapped.y = sizeAdjusted.y - 1 - mapped.y; - if (mirrors.z %2 != 0) mapped.z = sizeAdjusted.z - 1 - mapped.z; - } - indexV = leds->XYZNoSpin(mapped); - break; - case _3D: //effectDimension - mapped = pixelAdjusted; - - switch(projectionDimension) { - case _1D: - if (leds->size == Coord3D{0,0,0}) { // first - leds->size.x = std::pow(sizeAdjusted.x * sizeAdjusted.y * sizeAdjusted.z, 1/3.); //only one is > 1, cube root - leds->size.y = leds->size.x; - leds->size.z = leds->size.x; - } - break; - case _2D: - if (leds->size == Coord3D{0,0,0}) { // first - leds->size.x = sizeAdjusted.x; //2 of the 3 sizes are > 1, so one dimension of the effect is 1 - leds->size.y = sizeAdjusted.y; - leds->size.z = sizeAdjusted.z; - } - break; - case _3D: - if (leds->size == Coord3D{0,0,0}) { // first - leds->size.x = sizeAdjusted.x; - leds->size.y = sizeAdjusted.y; - leds->size.z = sizeAdjusted.z; - } - break; - } - if (mirror) { - if (mirrors.x %2 != 0) mapped.x = sizeAdjusted.x - 1 - mapped.x; - if (mirrors.y %2 != 0) mapped.y = sizeAdjusted.y - 1 - mapped.y; - if (mirrors.z %2 != 0) mapped.z = sizeAdjusted.z - 1 - mapped.z; - } - indexV = leds->XYZNoSpin(mapped); - - break; //effectDimension _3D - } //effectDimension - leds->nrOfLeds = leds->size.x * leds->size.y * leds->size.z; - - if (indexV != UINT16_MAX) { - if (indexV >= leds->nrOfLeds || indexV >= NUM_LEDS_Max) { - USER_PRINTF("dev pre [%d] indexV too high %d>=%d or %d (m:%d p:%d) p:%d,%d,%d s:%d,%d,%d\n", rowNr, indexV, leds->nrOfLeds, NUM_LEDS_Max, leds->mappingTable.size(), indexP, pixel.x, pixel.y, pixel.z, leds->size.x, leds->size.y, leds->size.z); - } - else { - Trigo trigo(leds->size.x-1); // 8 bits trigo with period leds->size.x-1 (currentl Float trigo as same performance) - //post processing: - switch(leds->projectionNr) { - case p_DistanceFromPoint: - switch (leds->effectDimension) { - case _2D: - switch (projectionDimension) { - case _2D: //2D2D: inverse mapping - float minDistance = 10; - // USER_PRINTF("checking indexV %d\n", indexV); - for (forUnsigned16 x=0; xsize.x && minDistance > 0.5f; x++) { - // float xFactor = x * TWO_PI / (float)(leds->size.x-1); //between 0 .. 2PI - - float xNew = trigo.sin(leds->size.x, x); - float yNew = trigo.cos(leds->size.y, x); - - for (forUnsigned16 y=0; ysize.y && minDistance > 0.5f; y++) { - - // float yFactor = (leds->size.y-1.0f-y) / (leds->size.y-1.0f); // between 1 .. 0 - float yFactor = 1 - y / (leds->size.y-1.0f); // between 1 .. 0 - - float x2New = round((yFactor * xNew + leds->size.x) / 2.0f); // 0 .. size.x - float y2New = round((yFactor * yNew + leds->size.y) / 2.0f); // 0 .. size.y - - // USER_PRINTF(" %d,%d->%f,%f->%f,%f", x, y, sinf(x * TWO_PI / (float)(size.x-1)), cosf(x * TWO_PI / (float)(size.x-1)), xNew, yNew); - - //this should work (better) but needs more testing - // float distance = abs(indexV - xNew - yNew * size.x); - // if (distance < minDistance) { - // minDistance = distance; - // indexV = x+y*size.x; - // } - - // if the new XY i - if (indexV == leds->XY(x2New, y2New)) { //(unsigned8)xNew + (unsigned8)yNew * size.x) { - // USER_PRINTF(" found one %d => %d=%d+%d*%d (%f+%f*%d) [%f]\n", indexV, x+y*size.x, x,y, size.x, xNew, yNew, size.x, distance); - indexV = leds->XY(x, y); - - if (indexV%10 == 0) USER_PRINTF("."); //show some progress as this projection is slow (Need S007 to optimize ;-) - - minDistance = 0.0f; // stop looking further - } - } - } - if (minDistance > 0.5f) indexV = UINT16_MAX; - break; - } - break; - } - break; - } - - if (indexV != UINT16_MAX) { //can be nulled by inverse mapping - //add physical tables if not present - if (indexV >= leds->nrOfLeds || indexV >= NUM_LEDS_Max) { - USER_PRINTF("dev post [%d] indexV too high %d>=%d or %d (p:%d m:%d) p:%d,%d,%d\n", rowNr, indexV, leds->nrOfLeds, NUM_LEDS_Max, leds->mappingTable.size(), indexP, pixel.x, pixel.y, pixel.z); - } - else if (indexP < NUM_LEDS_Max) { - //create new physMaps if needed - if (indexV >= leds->mappingTable.size()) { - for (size_t i = leds->mappingTable.size(); i <= indexV; i++) { - // USER_PRINTF("mapping %d,%d,%d add physMap before %d %d\n", pixel.y, pixel.y, pixel.z, indexV, leds->mappingTable.size()); - leds->mappingTable.push_back(PhysMap()); //abort() was called at PC 0x40191473 on core 1 std::allocator >&&) - } - } - //indexV is within the square - if (!leds->mappingTable[indexV].indexes) { - leds->mappingTable[indexV].indexes = new std::vector; - } - leds->mappingTable[indexV].indexes->push_back(indexP); //add the current led to indexes - } - else - USER_PRINTF("dev post [%d] indexP too high %d>=%d or %d (p:%d m:%d) p:%d,%d,%d\n", rowNr, indexP, nrOfLeds, NUM_LEDS_Max, leds->mappingTable.size(), indexP, pixel.x, pixel.y, pixel.z); - } - // USER_PRINTF("mapping b:%d t:%d V:%d\n", indexV, indexP, leds->mappingTable.size()); - } //indexV not too high - } //indexV - - } //if x,y,z between start and endpos - } //leds->doMap - rowNr++; - } //projections - indexP++; //also increase if no buffer created - } //if 1D-3D pixel - else { // end of leds array - - if (doAllocPins) { - //check if pin already allocated, if so, extend range in details - PinObject pinObject = pins->pinObjects[currPin]; - char details[32] = ""; - if (pins->isOwner(currPin, "Leds")) { //if owner - - char * after = strtok((char *)pinObject.details, "-"); - if (after != NULL ) { - char * before; - before = after; - after = strtok(NULL, " "); - stackUnsigned16 startLed = atoi(before); - stackUnsigned16 nrOfLeds = atoi(after) - atoi(before) + 1; - print->fFormat(details, sizeof(details)-1, "%d-%d", min(prevIndexP, startLed), max((stackUnsigned16)(indexP - 1), nrOfLeds)); //careful: LedModEffects:loop uses this to assign to FastLed - USER_PRINTF("pins extend leds %d: %s\n", currPin, details); - //tbd: more check - - strncpy(pins->pinObjects[currPin].details, details, sizeof(PinObject::details)-1); - pins->pinsChanged = true; - } - } - else {//allocate new pin - //tbd: check if free - print->fFormat(details, sizeof(details)-1, "%d-%d", prevIndexP, indexP - 1); //careful: LedModEffects:loop uses this to assign to FastLed - USER_PRINTF("pins %d: %s\n", currPin, details); - pins->allocatePin(currPin, "Leds", details); - } - - prevIndexP = indexP; - } - } - }); //starModJson.lookFor("leds" (create the right type, otherwise crash) - - if (starModJson.deserialize(false)) { //this will call above function parameter for each led - - //after processing each led - stackUnsigned8 rowNr = 0; - - for (Leds *leds: projections) { - if (leds->doMap) { - USER_PRINTF("Leds pre [%d] f:%d p:%d s:%d\n", rowNr, leds->fx, leds->projectionNr, projections.size()); - - stackUnsigned16 nrOfMappings = 0; - stackUnsigned16 nrOfPixels = 0; - - if (leds->projectionNr == p_Random || leds->projectionNr == p_None) { - - //defaults - leds->size = size; - leds->nrOfLeds = nrOfLeds; - - } else { - - // if (leds->mappingTable.size() < leds->size.x * leds->size.y * leds->size.z) - // USER_PRINTF("mapping add extra physMap %d to %d size: %d,%d,%d\n", leds->mappingTable.size(), leds->size.x * leds->size.y * leds->size.z, leds->size.x, leds->size.y, leds->size.z); - // for (size_t i = leds->mappingTable.size(); i < leds->size.x * leds->size.y * leds->size.z; i++) { - // std::vector physMap; - // // physMap.push_back(0); - // leds->mappingTable.push_back(physMap); - // } - - leds->nrOfLeds = leds->mappingTable.size(); - - //debug info + summary values - stackUnsigned16 indexV = 0; - for (PhysMap &map:leds->mappingTable) { - if (map.indexes && map.indexes->size()) { - // if (nrOfMappings < 10 || map.indexes->size() - indexV < 10) //first 10 and last 10 - // if (nrOfMappings%(leds->nrOfLeds/10+1) == 0) - // USER_PRINTF("ledV %d mapping: #ledsP (%d):", indexV, nrOfMappings, map.indexes->size()); - - for (forUnsigned16 indexP:*map.indexes) { - // if (nrOfPixels < 10 || map.indexes->size() - indexV < 10) - // if (nrOfMappings%(leds->nrOfLeds/10+1) == 0) - // USER_PRINTF(" %d", indexP); - nrOfPixels++; - } - - // if (nrOfPixels < 10 || map.indexes->size() - indexV < 10) - // if (nrOfMappings%(leds->nrOfLeds/10+1) == 0) - // USER_PRINTF("\n"); - } - nrOfMappings++; - // else - // USER_PRINTF("ledV %d no mapping\n", x); - indexV++; - } - } - - USER_PRINTF("projectAndMap [%d] V:%d x %d x %d -> %d (v:%d - p:%d)\n", rowNr, leds->size.x, leds->size.y, leds->size.z, leds->nrOfLeds, nrOfMappings, nrOfPixels); - - // mdl->setValueV("fxSize", rowNr, "%d x %d x %d = %d", leds->size.x, leds->size.y, leds->size.z, leds->nrOfLeds); - char buf[32]; - print->fFormat(buf, sizeof(buf)-1,"%d x %d x %d -> %d", leds->size.x, leds->size.y, leds->size.z, leds->nrOfLeds); - mdl->setValue("fxSize", JsonString(buf, JsonString::Copied), rowNr); - // web->sendResponseObject(); - - USER_PRINTF("leds[%d].size = %d + %d\n", rowNr, sizeof(Leds), leds->mappingTable.size()); //44 - - leds->doMap = false; - } //leds->doMap - rowNr++; - } // leds - - USER_PRINTF("projectAndMap P:%dx%dx%d -> %d\n", size.x, size.y, size.z, nrOfLeds); - - mdl->setValue("fixSize", size); - mdl->setValue("fixCount", nrOfLeds); - - } // if deserialize - } //if fileName - else - USER_PRINTF("projectAndMap: Filename for fixture %d not found\n", fixtureNr); - - doMap = false; -} \ No newline at end of file diff --git a/src/App/LedFixture.h b/src/App/LedFixture.h deleted file mode 100644 index d5648147..00000000 --- a/src/App/LedFixture.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - @title StarMod - @file LedFixture.h - @date 20240228 - @repo https://github.com/ewowi/StarMod - @Authors https://github.com/ewowi/StarMod/commits/main - @Copyright © 2024 Github StarMod Commit Authors - @license GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - @license For non GPL-v3 usage, commercial licenses must be purchased. Contact moonmodules@icloud.com -*/ - -#pragma once - -#include "../Sys/SysModModel.h" //for Coord3D - -#include "LedLeds.h" - -#define NUM_LEDS_Max 4096 - -#define _1D 1 -#define _2D 2 -#define _3D 3 - - -class Leds; //forward - -class Fixture { - -public: - - CRGB ledsP[NUM_LEDS_Max]; - - // CRGB *leds = nullptr; - // if (!leds) - // leds = (CRGB*)calloc(nrOfLeds, sizeof(CRGB)); - // else - // leds = (CRGB*)reallocarray(leds, nrOfLeds, sizeof(CRGB)); - // if (leds) free(leds); - // leds = (CRGB*)malloc(nrOfLeds * sizeof(CRGB)); - // leds = (CRGB*)reallocarray - - unsigned16 nrOfLeds = 64; //amount of physical leds - unsigned8 fixtureNr = -1; - Coord3D size = {8,8,1}; - - std::vector projections; //virtual leds - - Coord3D head = {0,0,0}; - - bool doMap = false; - bool doAllocPins = false; - - unsigned8 globalBlend = 128; - - //load fixture json file, parse it and depending on the projection, create a mapping for it - void projectAndMap(); - -}; diff --git a/src/App/LedLeds.cpp b/src/App/LedLeds.cpp deleted file mode 100644 index 32390c3f..00000000 --- a/src/App/LedLeds.cpp +++ /dev/null @@ -1,119 +0,0 @@ -/* - @title StarMod - @file LedLeds.cpp - @date 20240226 - @repo https://github.com/ewowi/StarMod - @Authors https://github.com/ewowi/StarMod/commits/main - @Copyright © 2024 Github StarMod Commit Authors - @license GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - @license For non GPL-v3 usage, commercial licenses must be purchased. Contact moonmodules@icloud.com -*/ - -#include "LedLeds.h" - -//convenience functions to call fastled functions out of the Leds namespace (there naming conflict) -void fastled_fadeToBlackBy(CRGB* leds, unsigned16 num_leds, unsigned8 fadeBy) { - fadeToBlackBy(leds, num_leds, fadeBy); -} -void fastled_fill_solid( struct CRGB * targetArray, int numToFill, const struct CRGB& color) { - fill_solid(targetArray, numToFill, color); -} -void fastled_fill_rainbow(struct CRGB * targetArray, int numToFill, unsigned8 initialhue, unsigned8 deltahue) { - fill_rainbow(targetArray, numToFill, initialhue, deltahue); -} - -unsigned16 Leds::XYZ(unsigned16 x, unsigned16 y, unsigned16 z) { - if (projectionNr == p_PanTiltRoll || projectionNr == p_Preset1) { - Coord3D result = Coord3D{x, y, z}; - if (proPanSpeed) result = trigoPanTiltRoll.pan(result, size/2, millis() * 5 / (255 - proPanSpeed)); - if (proTiltSpeed) result = trigoPanTiltRoll.tilt(result, size/2, millis() * 5 / (255 - proTiltSpeed)); - if (proRollSpeed) result = trigoPanTiltRoll.roll(result, size/2, millis() * 5 / (255 - proRollSpeed)); - if (fixture->size.z == 1) result.z = 0; // 3d effects will be flattened on 2D fixtures - if (result >= 0 && result < size) - return result.x + result.y * size.x + result.z * size.x * size.y; - else - return UINT16_MAX; - } - else - return x + y * size.x + z * size.x * size.y; -} - -// maps the virtual led to the physical led(s) and assign a color to it -void Leds::setPixelColor(unsigned16 indexV, CRGB color, unsigned8 blendAmount) { - if (indexV < mappingTable.size()) { - if (mappingTable[indexV].indexes) { - for (forUnsigned16 indexP:*mappingTable[indexV].indexes) { - fixture->ledsP[indexP] = blend(color, fixture->ledsP[indexP], blendAmount==UINT8_MAX?fixture->globalBlend:blendAmount); - } - } - else { - mappingTable[indexV].color = color; - } - } - else if (indexV < NUM_LEDS_Max) //no projection - fixture->ledsP[projectionNr==p_Random?random(fixture->nrOfLeds):indexV] = color; - else if (indexV != UINT16_MAX) //assuming UINT16_MAX is set explicitly (e.g. in XYZ) - USER_PRINTF(" dev sPC V:%d >= %d", indexV, NUM_LEDS_Max); -} - -CRGB Leds::getPixelColor(unsigned16 indexV) { - if (indexV < mappingTable.size()) { - if (mappingTable[indexV].indexes && mappingTable[indexV].indexes->size()) - return fixture->ledsP[*mappingTable[indexV].indexes->begin()]; //any would do as they are all the same - else - return mappingTable[indexV].color; - } - else if (indexV < NUM_LEDS_Max) //no mapping - return fixture->ledsP[indexV]; - else { - USER_PRINTF(" dev gPC N: %d >= %d", indexV, NUM_LEDS_Max); - return CRGB::Black; - } -} - -void Leds::fadeToBlackBy(unsigned8 fadeBy) { - if (projectionNr == p_None || projectionNr == p_Random) { - fastled_fadeToBlackBy(fixture->ledsP, fixture->nrOfLeds, fadeBy); - } else { - for (PhysMap &map:mappingTable) { - if (map.indexes) - for (forUnsigned16 indexP:*map.indexes) { - CRGB oldValue = fixture->ledsP[indexP]; - fixture->ledsP[indexP].nscale8(255-fadeBy); //this overrides the old value - fixture->ledsP[indexP] = blend(fixture->ledsP[indexP], oldValue, fixture->globalBlend); // we want to blend in the old value - } - } - } -} - -void Leds::fill_solid(const struct CRGB& color, bool noBlend) { - if (projectionNr == p_None || projectionNr == p_Random) { - fastled_fill_solid(fixture->ledsP, fixture->nrOfLeds, color); - } else { - for (PhysMap &map:mappingTable) { - if (map.indexes) - for (forUnsigned16 indexP:*map.indexes) { - fixture->ledsP[indexP] = noBlend?color:blend(color, fixture->ledsP[indexP], fixture->globalBlend); - } - } - } -} - -void Leds::fill_rainbow(unsigned8 initialhue, unsigned8 deltahue) { - if (projectionNr == p_None || projectionNr == p_Random) { - fastled_fill_rainbow(fixture->ledsP, fixture->nrOfLeds, initialhue, deltahue); - } else { - CHSV hsv; - hsv.hue = initialhue; - hsv.val = 255; - hsv.sat = 240; - - for (PhysMap &map:mappingTable) { - if (map.indexes) - for (forUnsigned16 indexP:*map.indexes) { - fixture->ledsP[indexP] = blend(hsv, fixture->ledsP[indexP], fixture->globalBlend); - } - hsv.hue += deltahue; - } - } -} diff --git a/src/App/LedLeds.h b/src/App/LedLeds.h deleted file mode 100644 index 577e204e..00000000 --- a/src/App/LedLeds.h +++ /dev/null @@ -1,401 +0,0 @@ -/* - @title StarMod - @file LedLeds.h - @date 20240227 - @repo https://github.com/ewowi/StarMod - @Authors https://github.com/ewowi/StarMod/commits/main - @Copyright © 2024 Github StarMod Commit Authors - @license GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - @license For non GPL-v3 usage, commercial licenses must be purchased. Contact moonmodules@icloud.com -*/ - -#pragma once -// FastLED optional flags to configure drivers, see https://github.com/FastLED/FastLED/blob/master/src/platforms/esp/32 -// RMT driver (default) -// #define FASTLED_ESP32_FLASH_LOCK 1 // temporarily disabled FLASH file access while driving LEDs (may prevent random flicker) -// #define FASTLED_RMT_BUILTIN_DRIVER 1 // in case your app needs to use RMT units, too (slower) -// I2S parallel driver -// #define FASTLED_ESP32_I2S true // to use I2S parallel driver (instead of RMT) -// #define I2S_DEVICE 1 // I2S driver: allows to still use I2S#0 for audio (only on esp32 and esp32-s3) -// #define FASTLED_I2S_MAX_CONTROLLERS 8 // 8 LED pins should be enough (default = 24) -#include "FastLED.h" - -#include "LedFixture.h" - -#include "../data/font/console_font_4x6.h" -#include "../data/font/console_font_5x8.h" -#include "../data/font/console_font_5x12.h" -#include "../data/font/console_font_6x8.h" -#include "../data/font/console_font_7x9.h" - -enum Projections -{ - p_Default, - p_Multiply, - p_PanTiltRoll, - p_DistanceFromPoint, - p_Preset1, - p_None, - p_Random, - p_Reverse, - p_Mirror, - p_Kaleidoscope, - p_count -}; - -// sin8/cos8 sin16/cos16 -//0: 128, 255 0 32645 -//64: 255, 128 32645 0 -//128: 128, 1 0 -32645 -//192: 1, 127 -32645 0 - -static unsigned trigoCached = 1; -static unsigned trigoUnCached = 1; - -struct Trigo { - uint16_t period = 360; //default period 360 - Trigo(uint16_t period = 360) {this->period = period;} - float sinValue[3]; uint16_t sinAngle[3] = {UINT16_MAX,UINT16_MAX,UINT16_MAX}; //caching of sinValue=sin(sinAngle) for pan, tilt and roll - float cosValue[3]; uint16_t cosAngle[3] = {UINT16_MAX,UINT16_MAX,UINT16_MAX}; //caching of cosValue=cos(cosAngle) for pan, tilt and roll - virtual float sinBase(uint16_t angle) {return sinf(M_TWOPI * angle / period);} - virtual float cosBase(uint16_t angle) {return cosf(M_TWOPI * angle / period);} - int16_t sin(int16_t factor, uint16_t angle, uint8_t index = 0) { - if (sinAngle[index] != angle) {sinAngle[index] = angle; sinValue[index] = sinBase(angle);trigoUnCached++;} else trigoCached++; - return factor * sinValue[index]; - }; - int16_t cos(int16_t factor, uint16_t angle, uint8_t index = 0) { - if (cosAngle[index] != angle) {cosAngle[index] = angle; cosValue[index] = cosBase(angle);trigoUnCached++;} else trigoCached++; - return factor * cosValue[index]; - }; - // https://msl.cs.uiuc.edu/planning/node102.html - Coord3D pan(Coord3D in, Coord3D middle, uint16_t angle) { - Coord3D inM = in - middle; - Coord3D out; - out.x = cos(inM.x, angle, 0) + sin(inM.z, angle, 0); - out.y = inM.y; - out.z = - sin(inM.x, angle, 0) + cos(inM.z, angle, 0); - return out + middle; - } - Coord3D tilt(Coord3D in, Coord3D middle, uint16_t angle) { - Coord3D inM = in - middle; - Coord3D out; - out.x = inM.x; - out.y = cos(inM.y, angle, 1) - sin(inM.z, angle, 1); - out.z = sin(inM.y, angle, 1) + cos(inM.z, angle, 1); - return out + middle; - } - Coord3D roll(Coord3D in, Coord3D middle, uint16_t angle) { - Coord3D inM = in - middle; - Coord3D out; - out.x = cos(inM.x, angle, 2) - sin(inM.y, angle, 2); - out.y = sin(inM.x, angle, 2) + cos(inM.y, angle, 2); - out.z = inM.z; - return out + middle; - } - Coord3D rotate(Coord3D in, Coord3D middle, uint16_t panAngle, uint16_t tiltAngle, uint16_t rollAngle, uint16_t period = 360) { - this->period = period; - return roll(tilt(pan(in, middle, panAngle), middle, tiltAngle), middle, rollAngle); - } -}; - -struct Trigo8: Trigo { //FastLed sin8 and cos8 - using Trigo::Trigo; - float sinBase(uint16_t angle) {return (sin8(256.0f * angle / period) - 128) / 127.0f;} - float cosBase(uint16_t angle) {return (cos8(256.0f * angle / period) - 128) / 127.0f;} -}; -struct Trigo16: Trigo { //FastLed sin16 and cos16 - using Trigo::Trigo; - float sinBase(uint16_t angle) {return sin16(65536.0f * angle / period) / 32645.0f;} - float cosBase(uint16_t angle) {return cos16(65536.0f * angle / period) / 32645.0f;} -}; - -static Trigo trigoPanTiltRoll(255); // Trigo8 is hardly any faster (27 vs 28 fps) (spanXY=28) - -class Fixture; //forward - - - -//StarMod implementation of segment.data -class SharedData { - - private: - byte *data; - unsigned16 index = 0; - unsigned16 bytesAllocated = 0; - - public: - - SharedData() { - USER_PRINTF("SharedData constructor %d %d\n", index, bytesAllocated); - } - ~SharedData() { - USER_PRINTF("SharedData destructor WIP %d %d\n", index, bytesAllocated); - // free(data); - } - - void clear() { - memset(data, 0, bytesAllocated); - index = 0; - } - - void loop() { - index = 0; - } - - template - Type * bind(Type * returnValue, int length = 1) { - size_t newIndex = index + length * sizeof(Type); - if (newIndex > bytesAllocated) { - size_t newSize = bytesAllocated + (1 + ( newIndex - bytesAllocated)/1024) * 1024; // add a multitude of 1024 bytes - USER_PRINTF("bind add more %d->%d %d->%d\n", index, newIndex, bytesAllocated, newSize); - if (bytesAllocated == 0) - data = (byte*) malloc(newSize); - else - data = (byte*)realloc(data, newSize); - bytesAllocated = newSize; - } - // USER_PRINTF("bind %d->%d %d\n", index, newIndex, bytesAllocated); - returnValue = reinterpret_cast(data + index); - index = newIndex; //add consumed amount of bytes, index is next byte which will be pointed to - return returnValue; - } - -}; - -struct PhysMap { - // bool isPhys = false; // 1 byte - // union { - std::vector * indexes; - CRGB color; - // }; // 4 bytes -}; // expected to be 5 bytes but is 8 bytes!!! - -class Leds { - -public: - - Fixture *fixture; - - unsigned16 nrOfLeds = 64; //amount of virtual leds (calculated by projection) - - Coord3D size = {8,8,1}; //not 0,0,0 to prevent div0 eg in Octopus2D - - unsigned8 fx = -1; - unsigned8 projectionNr = -1; - unsigned8 effectDimension = -1; - - Coord3D startPos = {0,0,0}, endPos = {UINT16_MAX,UINT16_MAX,UINT16_MAX}; //default - unsigned8 proPanSpeed = 128; - unsigned8 proTiltSpeed = 128; - unsigned8 proRollSpeed = 128; - - SharedData sharedData; - - std::vector mappingTable; - - unsigned16 indexVLocal = 0; //set in operator[], used by operator= - - bool doMap = false; - - unsigned16 XY(unsigned16 x, unsigned16 y) { - return XYZ(x, y, 0); - } - - unsigned16 XYZNoSpin(Coord3D coord) { - return coord.x + coord.y * size.x + coord.z * size.x * size.y; - } - - unsigned16 XYZ(Coord3D coord) { - return XYZ(coord.x, coord.y, coord.z); - } - - unsigned16 XYZ(unsigned16 x, unsigned16 y, unsigned16 z); - - Leds(Fixture &fixture) { - USER_PRINTF("Leds[%d] constructor %d\n", UINT8_MAX, sizeof(PhysMap)); - this->fixture = &fixture; - } - - ~Leds() { - USER_PRINTF("Leds[%d] destructor\n", UINT8_MAX); - fadeToBlackBy(100); - doMap = true; // so loop is not running while deleting - for (PhysMap &map:mappingTable) { - if (map.indexes) { - map.indexes->clear(); - delete map.indexes; - } - } - mappingTable.clear(); - } - - // indexVLocal stored to be used by other operators - Leds& operator[](unsigned16 indexV) { - indexVLocal = indexV; - return *this; - } - - Leds& operator[](Coord3D pos) { - indexVLocal = XYZ(pos.x, pos.y, pos.z); - return *this; - } - - // CRGB& operator[](unsigned16 indexV) { - // // indexVLocal = indexV; - // CRGB x = getPixelColor(indexV); - // return x; - // } - - // uses indexVLocal and color to call setPixelColor - Leds& operator=(const CRGB color) { - setPixelColor(indexVLocal, color); - return *this; - } - - Leds& operator+=(const CRGB color) { - setPixelColor(indexVLocal, getPixelColor(indexVLocal) + color); - return *this; - } - Leds& operator|=(const CRGB color) { - // setPixelColor(indexVLocal, color); - setPixelColor(indexVLocal, getPixelColor(indexVLocal) | color); - return *this; - } - - // Leds& operator+(const CRGB color) { - // setPixelColor(indexVLocal, getPixelColor(indexVLocal) + color); - // return *this; - // } - - - // maps the virtual led to the physical led(s) and assign a color to it - void setPixelColor(unsigned16 indexV, CRGB color, unsigned8 blendAmount = UINT8_MAX); - void setPixelColor(Coord3D pixel, CRGB color, unsigned8 blendAmount = UINT8_MAX) {setPixelColor(XYZ(pixel), color, blendAmount);} - - CRGB getPixelColor(unsigned16 indexV); - CRGB getPixelColor(Coord3D pixel) {return getPixelColor(XYZ(pixel));} - - void addPixelColor(unsigned16 indexV, CRGB color) {setPixelColor(indexV, getPixelColor(indexV) + color);} - void addPixelColor(Coord3D pixel, CRGB color) {setPixelColor(pixel, getPixelColor(pixel) + color);} - - void fadeToBlackBy(unsigned8 fadeBy = 255); - void fill_solid(const struct CRGB& color, bool noBlend = false); - void fill_rainbow(unsigned8 initialhue, unsigned8 deltahue); - - void blur1d(fract8 blur_amount) - { - uint8_t keep = 255 - blur_amount; - uint8_t seep = blur_amount >> 1; - CRGB carryover = CRGB::Black; - for( uint16_t i = 0; i < nrOfLeds; ++i) { - CRGB cur = getPixelColor(i); - CRGB part = cur; - part.nscale8( seep); - cur.nscale8( keep); - cur += carryover; - if( i) addPixelColor(i-1, part); - setPixelColor(i, cur); - carryover = part; - } - } - - void blur2d(fract8 blur_amount) - { - blurRows(size.x, size.y, blur_amount); - blurColumns(size.x, size.y, blur_amount); - } - - void blurRows(unsigned8 width, unsigned8 height, fract8 blur_amount) - { - /* for (forUnsigned8 row = 0; row < height; row++) { - CRGB* rowbase = leds + (row * width); - blur1d( rowbase, width, blur_amount); - } - */ - // blur rows same as columns, for irregular matrix - stackUnsigned8 keep = 255 - blur_amount; - stackUnsigned8 seep = blur_amount >> 1; - for (forUnsigned8 row = 0; row < height; row++) { - CRGB carryover = CRGB::Black; - for (forUnsigned8 i = 0; i < width; i++) { - CRGB cur = getPixelColor(XY(i,row)); - CRGB part = cur; - part.nscale8( seep); - cur.nscale8( keep); - cur += carryover; - if( i) addPixelColor(XY(i-1,row), part); - setPixelColor(XY(i,row), cur); - carryover = part; - } - } - } - - // blurColumns: perform a blur1d on each column of a rectangular matrix - void blurColumns(unsigned8 width, unsigned8 height, fract8 blur_amount) - { - // blur columns - stackUnsigned8 keep = 255 - blur_amount; - stackUnsigned8 seep = blur_amount >> 1; - for (forUnsigned8 col = 0; col < width; ++col) { - CRGB carryover = CRGB::Black; - for (forUnsigned8 i = 0; i < height; ++i) { - CRGB cur = getPixelColor(XY(col,i)); - CRGB part = cur; - part.nscale8( seep); - cur.nscale8( keep); - cur += carryover; - if( i) addPixelColor(XY(col,i-1), part); - setPixelColor(XY(col,i), cur); - carryover = part; - } - } - } - - //shift is used by drawText indicating which letter it is drawing - void drawCharacter(unsigned char chr, int x = 0, int16_t y = 0, unsigned8 font = 0, CRGB col = CRGB::Red, unsigned16 shiftPixel = 0, unsigned16 shiftChr = 0) { - if (chr < 32 || chr > 126) return; // only ASCII 32-126 supported - chr -= 32; // align with font table entries - - Coord3D fontSize; - switch (font%5) { - case 0: fontSize.x = 4; fontSize.y = 6; break; - case 1: fontSize.x = 5; fontSize.y = 8; break; - case 2: fontSize.x = 5; fontSize.y = 12; break; - case 3: fontSize.x = 6; fontSize.y = 8; break; - case 4: fontSize.x = 7; fontSize.y = 9; break; - } - - Coord3D chrPixel; - for (chrPixel.y = 0; chrPixel.y= 0 && pixel.y < size.y) { - byte bits = 0; - switch (font%5) { - case 0: bits = pgm_read_byte_near(&console_font_4x6[(chr * fontSize.y) + chrPixel.y]); break; - case 1: bits = pgm_read_byte_near(&console_font_5x8[(chr * fontSize.y) + chrPixel.y]); break; - case 2: bits = pgm_read_byte_near(&console_font_5x12[(chr * fontSize.y) + chrPixel.y]); break; - case 3: bits = pgm_read_byte_near(&console_font_6x8[(chr * fontSize.y) + chrPixel.y]); break; - case 4: bits = pgm_read_byte_near(&console_font_7x9[(chr * fontSize.y) + chrPixel.y]); break; - } - - for (chrPixel.x = 0; chrPixel.x= 0 && pixel.x < size.x) && ((bits>>(chrPixel.x+(8-fontSize.x))) & 0x01)) { // bit set & drawing on-screen - setPixelColor(pixel, col); - } - } - } - } - } - - void drawText(const char * text, int x = 0, int16_t y = 0, unsigned8 font = 0, CRGB col = CRGB::Red, unsigned16 shiftPixel = 0) { - const int numberOfChr = strlen(text); //Core 1 panic'ed (LoadProhibited). Exception was unhandled. - /builds/idf/crosstool-NG/.build/HOST-x86_64-apple-darwin12/xtensa-esp32-elf/src/newlib/newlib/libc/machine/xtensa/strlen.S:82 - for (int shiftChr = 0; shiftChr < numberOfChr; shiftChr++) { - drawCharacter(text[shiftChr], x, y, font, col, shiftPixel, shiftChr); - } - } - -}; \ No newline at end of file diff --git a/src/App/LedModEffects.h b/src/App/LedModEffects.h deleted file mode 100644 index 3ca13146..00000000 --- a/src/App/LedModEffects.h +++ /dev/null @@ -1,672 +0,0 @@ -/* - @title StarMod - @file LedModEffects.h - @date 20240228 - @repo https://github.com/ewowi/StarMod - @Authors https://github.com/ewowi/StarMod/commits/main - @Copyright © 2024 Github StarMod Commit Authors - @license GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - @license For non GPL-v3 usage, commercial licenses must be purchased. Contact moonmodules@icloud.com -*/ - -#include "SysModule.h" - -#include "LedFixture.h" -#include "LedEffects.h" - -// #define FASTLED_RGBW - -//https://www.partsnotincluded.com/fastled-rgbw-neopixels-sk6812/ -inline unsigned16 getRGBWsize(unsigned16 nleds){ - unsigned16 nbytes = nleds * 4; - if(nbytes % 3 > 0) return nbytes / 3 + 1; - else return nbytes / 3; -} - -//https://github.com/FastLED/FastLED/blob/master/examples/DemoReel100/DemoReel100.ino -//https://blog.ja-ke.tech/2019/06/02/neopixel-performance.html - -class LedModEffects:public SysModule { - -public: - bool newFrame = false; //for other modules (DDP) - - unsigned16 fps = 60; - unsigned long lastMappingMillis = 0; - Effects effects; - - Fixture fixture = Fixture(); - - bool fShow = true; - - LedModEffects() :SysModule("Effects") { - }; - - void setup() { - SysModule::setup(); - - parentVar = ui->initAppMod(parentVar, name, 1201); - - JsonObject currentVar; - - JsonObject tableVar = ui->initTable(parentVar, "fxTbl", nullptr, false, [this](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_UIFun: - ui->setLabel(var, "Effects"); - ui->setComment(var, "List of effects"); - return true; - case f_AddRow: { - rowNr = fixture.projections.size(); - USER_PRINTF("chFun addRow %s[%d]\n", mdl->varID(var), rowNr); - - web->getResponseObject()["addRow"]["rowNr"] = rowNr; - - if (rowNr >= fixture.projections.size()) - fixture.projections.push_back(new Leds(fixture)); - return true; - } - case f_DelRow: { - USER_PRINTF("chFun delrow %s[%d]\n", mdl->varID(var), rowNr); - //tbd: fade to black - if (rowNr initSelect(tableVar, "fx", 0, false, [this](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_ValueFun: - for (forUnsigned8 rowNr = 0; rowNr < fixture.projections.size(); rowNr++) - mdl->setValue(var, fixture.projections[rowNr]->fx, rowNr); - return true; - case f_UIFun: { - ui->setLabel(var, "Effect"); - ui->setComment(var, "Effect to show"); - JsonArray options = ui->setOptions(var); - for (Effect *effect:effects.effects) { - char buf[32] = ""; - strcat(buf, effect->name()); - strcat(buf, effect->dim()==_1D?" ┊":effect->dim()==_2D?" ▦":" 🧊"); - strcat(buf, " "); - strcat(buf, effect->tags()); - options.add(JsonString(buf, JsonString::Copied)); //copy! - } - return true; } - case f_ChangeFun: - - if (rowNr == UINT8_MAX) rowNr = 0; // in case fx without a rowNr - - //create a new leds instance if a new row is created - if (rowNr >= fixture.projections.size()) { - USER_PRINTF("projections fx[%d] changeFun %d %s\n", rowNr, fixture.projections.size(), mdl->findVar("fx")["value"].as().c_str()); - fixture.projections.push_back(new Leds(fixture)); - } - if (rowNr < fixture.projections.size()) - effects.setEffect(*fixture.projections[rowNr], var, rowNr); - return true; - default: return false; - }}); - currentVar["dash"] = true; - - currentVar = ui->initSelect(tableVar, "pro", 2, false, [this](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_ValueFun: - for (forUnsigned8 rowNr = 0; rowNr < fixture.projections.size(); rowNr++) - mdl->setValue(var, fixture.projections[rowNr]->projectionNr, rowNr); - return true; - case f_UIFun: { - ui->setLabel(var, "Projection"); - ui->setComment(var, "How to project fx"); - JsonArray options = ui->setOptions(var); // see enum Projections in LedFixture.h and keep the same order ! - options.add("Default"); - options.add("Multiply"); - options.add("PanTiltRoll"); - options.add("Distance ⌛"); - options.add("Preset 1"); - options.add("None"); - options.add("Random"); - options.add("Mirror WIP"); - options.add("Reverse WIP"); - // options.add("Kaleidoscope WIP"); - return true; - } - case f_ChangeFun: - - if (rowNr == UINT8_MAX) rowNr = 0; // in case fx without a rowNr - - if (rowNr < fixture.projections.size()) { - fixture.projections[rowNr]->doMap = true; - - stackUnsigned8 proValue = mdl->getValue(var, rowNr); - fixture.projections[rowNr]->projectionNr = proValue; - - mdl->varPreDetails(var, rowNr); //set all positive var N orders to negative - if (proValue == p_DistanceFromPoint || proValue == p_Preset1) { - ui->initCoord3D(var, "proCenter", Coord3D{8,8,8}, 0, NUM_LEDS_Max, false, [this](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_UIFun: - ui->setLabel(var, "Center"); - return true; - case f_ChangeFun: - //initiate projectAndMap - USER_PRINTF("proCenter %d %d\n", rowNr, fixture.projections.size()); - if (rowNr < fixture.projections.size()) { - fixture.projections[rowNr]->doMap = true; //Guru Meditation Error: Core 1 panic'ed (StoreProhibited). Exception was unhandled. - fixture.doMap = true; - } - // ui->setLabel(var, "Size"); - return true; - default: return false; - }}); - } - if (proValue == p_Multiply || proValue == p_Preset1) { - ui->initCoord3D(var, "proMulti", Coord3D{2,2,1}, 0, 10, false, [this](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_UIFun: - ui->setLabel(var, "Multiply"); - return true; - case f_ChangeFun: - ui->initCheckBox(var, "mirror", false, false, [this](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_ChangeFun: - if (rowNr < fixture.projections.size()) { - fixture.projections[rowNr]->doMap = true; - fixture.doMap = true; - } - return true; - default: return false; - }}); - if (rowNr < fixture.projections.size()) { - fixture.projections[rowNr]->doMap = true; - fixture.doMap = true; - } - return true; - default: return false; - }}); - } - if (proValue == p_PanTiltRoll || proValue == p_Preset1) { - ui->initSlider(var, "proPan", 128, 0, 254, false, [this](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_ChangeFun: - if (rowNr < fixture.projections.size()) - fixture.projections[rowNr]->proPanSpeed = mdl->getValue(var, rowNr); - return true; - default: return false; - }}); - ui->initSlider(var, "proTilt", 128, 0, 254, false, [this](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_ChangeFun: - if (rowNr < fixture.projections.size()) - fixture.projections[rowNr]->proTiltSpeed = mdl->getValue(var, rowNr); - return true; - default: return false; - }}); - } - if (proValue == p_Preset1 || proValue == p_PanTiltRoll) { - ui->initSlider(var, "proRoll", 128, 0, 254, false, [this](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_UIFun: - ui->setLabel(var, "Roll speed"); - return true; - case f_ChangeFun: - if (rowNr < fixture.projections.size()) - fixture.projections[rowNr]->proRollSpeed = mdl->getValue(var, rowNr); - return true; - default: return false; - }}); - } - mdl->varPostDetails(var, rowNr); - - USER_PRINTF("chFun pro[%d] <- %d (%d)\n", rowNr, proValue, fixture.projections.size()); - - fixture.doMap = true; - } - return true; - default: return false; - }}); - currentVar["dash"] = true; - - ui->initCoord3D(tableVar, "fxStart", {0,0,0}, 0, NUM_LEDS_Max, false, [this](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_ValueFun: - for (forUnsigned8 rowNr = 0; rowNr < fixture.projections.size(); rowNr++) { - USER_PRINTF("fxStart[%d] valueFun %d,%d,%d\n", rowNr, fixture.projections[rowNr]->startPos.x, fixture.projections[rowNr]->startPos.y, fixture.projections[rowNr]->startPos.z); - mdl->setValue(var, fixture.projections[rowNr]->startPos, rowNr); - } - return true; - case f_UIFun: - ui->setLabel(var, "Start"); - ui->setComment(var, "In pixels"); - return true; - case f_ChangeFun: - if (rowNr < fixture.projections.size()) { - fixture.projections[rowNr]->startPos = mdl->getValue(var, rowNr).as(); - - USER_PRINTF("fxStart[%d] chFun %d,%d,%d\n", rowNr, fixture.projections[rowNr]->startPos.x, fixture.projections[rowNr]->startPos.y, fixture.projections[rowNr]->startPos.z); - - fixture.projections[rowNr]->fadeToBlackBy(); - fixture.projections[rowNr]->doMap = true; - fixture.doMap = true; - } - else { - USER_PRINTF("fxStart[%d] chfun rownr not in range > %d\n", rowNr, fixture.projections.size()); - } - return true; - default: return false; - }}); - - ui->initCoord3D(tableVar, "fxEnd", {8,8,0}, 0, NUM_LEDS_Max, false, [this](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_ValueFun: - for (forUnsigned8 rowNr = 0; rowNr < fixture.projections.size(); rowNr++) { - USER_PRINTF("fxEnd[%d] valueFun %d,%d,%d\n", rowNr, fixture.projections[rowNr]->endPos.x, fixture.projections[rowNr]->endPos.y, fixture.projections[rowNr]->endPos.z); - mdl->setValue(var, fixture.projections[rowNr]->endPos, rowNr); - } - return true; - case f_UIFun: - ui->setLabel(var, "End"); - ui->setComment(var, "In pixels"); - return true; - case f_ChangeFun: - if (rowNr < fixture.projections.size()) { - fixture.projections[rowNr]->endPos = mdl->getValue(var, rowNr).as(); - - USER_PRINTF("fxEnd[%d] chFun %d,%d,%d\n", rowNr, fixture.projections[rowNr]->endPos.x, fixture.projections[rowNr]->endPos.y, fixture.projections[rowNr]->endPos.z); - - fixture.projections[rowNr]->fadeToBlackBy(); - fixture.projections[rowNr]->doMap = true; - fixture.doMap = true; - } - else { - USER_PRINTF("fxEnd[%d] chfun rownr not in range > %d\n", rowNr, fixture.projections.size()); - } - return true; - default: return false; - }}); - - ui->initText(tableVar, "fxSize", nullptr, 32, true, [this](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_ValueFun: { - // for (std::vector::iterator leds=fixture.projections.begin(); leds!=fixture.projections.end(); ++leds) { - stackUnsigned8 rowNr = 0; - for (Leds *leds: fixture.projections) { - char message[32]; - print->fFormat(message, sizeof(message)-1, "%d x %d x %d -> %d", leds->size.x, leds->size.y, leds->size.z, leds->nrOfLeds); - USER_PRINTF("valueFun fxSize[%d](of %d) = %s\n", rowNr, fixture.projections.size(), message); - mdl->setValue(var, JsonString(message, JsonString::Copied), rowNr); //rowNr - rowNr++; - } - return true; } - case f_UIFun: - ui->setLabel(var, "Size"); - return true; - default: return false; - }}); - - // ui->initSelect(parentVar, "fxLayout", 0, false, [](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - // case f_UIFun: { - // ui->setLabel(var, "Layout"); - // ui->setComment(var, "WIP"); - // JsonArray options = ui->setOptions(var); - // options.add("□"); //0 - // options.add("="); //1 - // options.add("||"); //2 - // options.add("+"); //3 - // return true; - // } - // default: return false; - // }}); //fxLayout - - ui->initSlider(parentVar, "Blending", fixture.globalBlend, 0, 255, false, [this](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_ChangeFun: - fixture.globalBlend = var["value"]; - return true; - default: return false; - }}); - - #ifdef STARMOD_USERMOD_E131 - // if (e131mod->isEnabled) { - e131mod->patchChannel(0, "bri", 255); //should be 256?? - e131mod->patchChannel(1, "fx", effects.effects.size()); - e131mod->patchChannel(2, "pal", 8); //tbd: calculate nr of palettes (from select) - // //add these temporary to test remote changing of this values do not crash the system - // e131mod->patchChannel(3, "pro", Projections::count); - // e131mod->patchChannel(4, "fixture", 5); //assuming 5!!! - - // ui->dashVarChanged = true; - // //rebuild the table - for (JsonObject childVar: mdl->varChildren("e131Tbl")) - ui->callVarFun(childVar, UINT8_MAX, f_ValueFun); - - // } - // else - // USER_PRINTF("Leds e131 not enabled\n"); - #endif - - effects.setup(); - - FastLED.setMaxPowerInVoltsAndMilliamps(5,2000); // 5v, 2000mA - } - - void loop() { - // SysModule::loop(); - - //set new frame - if (millis() - frameMillis >= 1000.0/fps) { - frameMillis = millis(); - - newFrame = true; - - //for each programmed effect - // run the next frame of the effect - stackUnsigned8 rowNr = 0; - for (Leds *leds: fixture.projections) { - if (!leds->doMap) { // don't run effect while remapping - // USER_PRINTF(" %d %d,%d,%d - %d,%d,%d (%d,%d,%d)", leds->fx, leds->startPos.x, leds->startPos.y, leds->startPos.z, leds->endPos.x, leds->endPos.y, leds->endPos.z, leds->size.x, leds->size.y, leds->size.z ); - mdl->getValueRowNr = rowNr++; - effects.loop(*leds); - mdl->getValueRowNr = UINT8_MAX; - if (leds->projectionNr == p_PanTiltRoll || leds->projectionNr == p_Preset1) - leds->fadeToBlackBy(50); - } - } - - #ifdef STARMOD_USERMOD_WLEDAUDIO - - if (mdl->getValue("viewRot") == 2) { - fixture.head.x = wledAudioMod->fftResults[3]; - fixture.head.y = wledAudioMod->fftResults[8]; - fixture.head.z = wledAudioMod->fftResults[13]; - } - - #endif - - if (fShow) - FastLED.show(); - - frameCounter++; - } - else { - newFrame = false; - } - - JsonObject var = mdl->findVar("System"); - if (!var["canvasData"].isNull()) { - const char * canvasData = var["canvasData"]; //0 - 494 - 140,150,0 - USER_PRINTF("LedModEffects loop canvasData %s\n", canvasData); - - uint8_t rowNr = 0; //currently only leds[0] supported - if (fixture.projections.size()) { - fixture.projections[rowNr]->fadeToBlackBy(); - - char * token = strtok((char *)canvasData, ":"); - bool isStart = strcmp(token, "start") == 0; - bool isEnd = strcmp(token, "end") == 0; - - Coord3D midCoord; //placeHolder for mid - - Coord3D *newCoord = isStart? &fixture.projections[rowNr]->startPos: isEnd? &fixture.projections[rowNr]->endPos : &midCoord; - - if (newCoord) { - token = strtok(NULL, ","); - if (token != NULL) newCoord->x = atoi(token) / 10; else newCoord->x = 0; //should never happen - token = strtok(NULL, ","); - if (token != NULL) newCoord->y = atoi(token) / 10; else newCoord->y = 0; - token = strtok(NULL, ","); - if (token != NULL) newCoord->z = atoi(token) / 10; else newCoord->z = 0; - - mdl->setValue(isStart?"fxStart":isEnd?"fxEnd":"proCenter", *newCoord, 0); //assuming row 0 for the moment - - fixture.projections[rowNr]->doMap = true; //recalc projection - fixture.doMap = true; - } - - var.remove("canvasData"); //convasdata has been processed - } - } - - //update projection - if (millis() - lastMappingMillis >= 1000 && fixture.doMap) { //not more then once per second (for E131) - lastMappingMillis = millis(); - fixture.projectAndMap(); - - //https://github.com/FastLED/FastLED/wiki/Multiple-Controller-Examples - - //connect allocated Pins to gpio - - if (fixture.doAllocPins) { - unsigned pinNr = 0; - - for (PinObject &pinObject:pins->pinObjects) { - - if (pins->isOwner(pinNr, "Leds")) { //if pin owned by leds, (assigned in projectAndMap) - //dirty trick to decode nrOfLedsPerPin - char * after = strtok((char *)pinObject.details, "-"); - if (after != NULL ) { - char * before; - before = after; - after = strtok(NULL, " "); - - stackUnsigned16 startLed = atoi(before); - stackUnsigned16 nrOfLeds = atoi(after) - atoi(before) + 1; - USER_PRINTF("FastLED.addLeds new %d: %d-%d\n", pinNr, startLed, nrOfLeds); - - //commented pins: error: static assertion failed: Invalid pin specified - switch (pinNr) { - #if CONFIG_IDF_TARGET_ESP32 - case 0: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 1: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 2: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 3: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 4: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 5: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 6: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 7: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 8: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 9: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 10: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 11: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 12: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 13: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 14: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 15: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - #if !defined(BOARD_HAS_PSRAM) && !defined(ARDUINO_ESP32_PICO) - // 16+17 = reserved for PSRAM, or reserved for FLASH on pico-D4 - case 16: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 17: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - #endif - case 18: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 19: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 20: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 21: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 22: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 23: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 24: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 25: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 26: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 27: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 28: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 29: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 30: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 31: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 32: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 33: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // 34-39 input-only - // case 34: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 35: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 36: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 37: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 38: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 39: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - #endif //CONFIG_IDF_TARGET_ESP32 - - #if CONFIG_IDF_TARGET_ESP32S2 - case 0: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 1: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 2: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 3: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 4: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 5: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 6: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 7: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 8: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 9: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 10: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 11: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 12: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 13: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 14: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 15: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 16: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 17: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 18: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - #if !ARDUINO_USB_CDC_ON_BOOT - // 19 + 20 = USB HWCDC. reserved for USB port when ARDUINO_USB_CDC_ON_BOOT=1 - case 19: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 20: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - #endif - case 21: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // 22 to 32: not connected, or reserved for SPI FLASH - // case 22: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 23: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 24: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 25: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - #if !defined(BOARD_HAS_PSRAM) - // 26-32 = reserved for PSRAM - case 26: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 27: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 28: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 29: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 30: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 31: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 32: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - #endif - case 33: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 34: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 35: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 36: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 37: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 38: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 39: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 40: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 41: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 42: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 43: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 44: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 45: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // 46 input-only - // case 46: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - #endif //CONFIG_IDF_TARGET_ESP32S2 - - #if CONFIG_IDF_TARGET_ESP32C3 - case 0: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 1: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 2: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 3: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 4: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 5: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 6: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 7: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 8: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 9: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 10: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // 11-17 reserved for SPI FLASH - //case 11: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - //case 12: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - //case 13: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - //case 14: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - //case 15: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - //case 16: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - //case 17: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - #if !ARDUINO_USB_CDC_ON_BOOT - // 18 + 19 = USB HWCDC. reserved for USB port when ARDUINO_USB_CDC_ON_BOOT=1 - case 18: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 19: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - #endif - // 20+21 = Serial RX+TX --> don't use for LEDS when serial-to-USB is needed - case 20: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 21: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - #endif //CONFIG_IDF_TARGET_ESP32S2 - - #if CONFIG_IDF_TARGET_ESP32S3 - case 0: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 1: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 2: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 3: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 4: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 5: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 6: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 7: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 8: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 9: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 10: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 11: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 12: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 13: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 14: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 15: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 16: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 17: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 18: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - #if !ARDUINO_USB_CDC_ON_BOOT - // 19 + 20 = USB-JTAG. Not recommended for other uses. - case 19: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 20: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - #endif - case 21: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // // 22 to 32: not connected, or SPI FLASH - // case 22: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 23: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 24: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 25: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 26: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 27: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 28: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 29: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 30: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 31: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // case 32: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - #if !defined(BOARD_HAS_PSRAM) - // 33 to 37: reserved if using _octal_ SPI Flash or _octal_ PSRAM - case 33: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 34: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 35: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 36: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 37: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - #endif - case 38: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 39: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 40: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 41: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 42: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - // 43+44 = Serial RX+TX --> don't use for LEDS when serial-to-USB is needed - case 43: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 44: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 45: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 46: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 47: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - case 48: FastLED.addLeds(fixture.ledsP, startLed, nrOfLeds).setCorrection(TypicalLEDStrip); break; - #endif //CONFIG_IDF_TARGET_ESP32S3 - - default: USER_PRINTF("FastLedPin assignment: pin not supported %d\n", pinNr); - } //switch pinNr - } //if led range in details (- in details e.g. 0-1023) - } //if pin owned by leds - pinNr++; - } // for pins - fixture.doAllocPins = false; - } - } - } //loop - - void loop1s() { - mdl->setUIValueV("realFps", "%lu /s", frameCounter); - frameCounter = 0; - } - - void loop10s() { - // USER_PRINTF("caching %u %u\n", trigoCached, trigoUnCached); //not working for some reason!! - // trigoCached = 0; - // trigoUnCached = 0; - } - -private: - unsigned long frameMillis = 0; - unsigned long frameCounter = 0; - -}; - -extern LedModEffects *eff; \ No newline at end of file diff --git a/src/App/LedModFixture.h b/src/App/LedModFixture.h deleted file mode 100644 index 66461a17..00000000 --- a/src/App/LedModFixture.h +++ /dev/null @@ -1,206 +0,0 @@ -/* - @title StarMod - @file LedModFixture.h - @date 20240228 - @repo https://github.com/ewowi/StarMod - @Authors https://github.com/ewowi/StarMod/commits/main - @Copyright © 2024 Github StarMod Commit Authors - @license GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - @license For non GPL-v3 usage, commercial licenses must be purchased. Contact moonmodules@icloud.com -*/ - -class LedModFixture:public SysModule { - -public: - - uint8_t viewRotation = 0; - - LedModFixture() :SysModule("Fixture") {}; - - void setup() { - SysModule::setup(); - - parentVar = ui->initAppMod(parentVar, name, 1100); - - JsonObject currentVar = ui->initCheckBox(parentVar, "on", true, false, [](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_UIFun: - ui->setLabel(var, "On"); - return true; - case f_ChangeFun: - ui->callVarFun("bri", UINT8_MAX, f_ChangeFun); //set FastLed brightness - return true; - default: return false; - }}); - currentVar["dash"] = true; - - //logarithmic slider (10) - currentVar = ui->initSlider(parentVar, "bri", 10, 0, 255, false, [](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_UIFun: - ui->setLabel(var, "Brightness"); - return true; - case f_ChangeFun: { - stackUnsigned8 bri = var["value"]; - - stackUnsigned8 result = mdl->getValue("on").as()?mdl->varLinearToLogarithm(var, bri):0; - - FastLED.setBrightness(result); - - USER_PRINTF("Set Brightness to %d -> b:%d r:%d\n", var["value"].as(), bri, result); - return true; } - default: return false; - }}); - currentVar["log"] = true; //logarithmic - currentVar["dash"] = true; //these values override model.json??? - - currentVar = ui->initCanvas(parentVar, "pview", UINT16_MAX, false, [this](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_UIFun: - ui->setLabel(var, "Preview"); - // ui->setComment(var, "Shows the fixture"); - // ui->setComment(var, "Click to enlarge"); - return true; - case f_LoopFun: { - var["interval"] = max(eff->fixture.nrOfLeds * web->ws.count()/200, 16U)*10; //interval in ms * 10, not too fast //from cs to ms - - web->sendDataWs([this](AsyncWebSocketMessageBuffer * wsBuf) { - byte* buffer; - - buffer = wsBuf->get(); - - // send leds preview to clients - for (size_t i = 0; i < eff->fixture.nrOfLeds; i++) - { - buffer[i*3+5] = eff->fixture.ledsP[i].red; - buffer[i*3+5+1] = eff->fixture.ledsP[i].green; - buffer[i*3+5+2] = eff->fixture.ledsP[i].blue; - } - //new values - buffer[0] = 1; //userFun id - //rotations - if (viewRotation == 0) { - buffer[1] = 0; - buffer[2] = 0; - buffer[3] = 0; - } else if (viewRotation == 1) { - buffer[1] = 0;//beatsin8(4, 250, 5); //tilt - buffer[2] = beat8(1);//, 0, 255); //pan - buffer[3] = 0;//beatsin8(6, 255, 5); //roll - } else if (viewRotation == 2) { - buffer[1] = eff->fixture.head.x; - buffer[2] = eff->fixture.head.y; - buffer[3] = eff->fixture.head.y; - } - - }, eff->fixture.nrOfLeds * 3 + 5, true); - return true; - } - default: return false; - }}); - - ui->initSelect(currentVar, "viewRot", viewRotation, false, [this](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_UIFun: { - ui->setLabel(var, "Rotation"); - // ui->setComment(var, "View rotation"); - JsonArray options = ui->setOptions(var); - options.add("None"); - options.add("Pan"); - #ifdef STARMOD_USERMOD_WLEDAUDIO - options.add("Moving heads GEQ"); - #endif - return true; } - case f_ChangeFun: - this->viewRotation = var["value"]; - // if (!var["value"]) - // eff->fixture.head = {0,0,0}; - return true; - default: return false; - }}); - - currentVar = ui->initSelect(parentVar, "fixture", eff->fixture.fixtureNr, false ,[](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_UIFun: - { - // ui->setComment(var, "Fixture to display effect on"); - JsonArray options = ui->setOptions(var); - files->dirToJson(options, true, "F_"); //only files containing F(ixture), alphabetically - - // ui needs to load the file also initially - char fileName[32] = ""; - if (files->seqNrToName(fileName, var["value"])) { - web->addResponse("pview", "file", JsonString(fileName, JsonString::Copied)); - } - return true; - } - case f_ChangeFun: - { - eff->fixture.fixtureNr = var["value"]; - eff->fixture.doMap = true; - eff->fixture.doAllocPins = true; - - //remap all leds - // for (std::vector::iterator leds=eff->fixture.projections.begin(); leds!=eff->fixture.projections.end(); ++leds) { - for (Leds *leds: eff->fixture.projections) { - leds->doMap = true; - } - - char fileName[32] = ""; - if (files->seqNrToName(fileName, eff->fixture.fixtureNr)) { - //send to pview a message to get file filename - web->addResponse("pview", "file", JsonString(fileName, JsonString::Copied)); - } - return true; - } - default: return false; - }}); //fixture - - ui->initCoord3D(currentVar, "fixSize", eff->fixture.size, 0, NUM_LEDS_Max, true, [](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_ValueFun: - mdl->setValue(var, eff->fixture.size); - return true; - case f_UIFun: - ui->setLabel(var, "Size"); - return true; - default: return false; - }}); - - ui->initNumber(currentVar, "fixCount", eff->fixture.nrOfLeds, 0, UINT16_MAX, true, [](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_ValueFun: - mdl->setValue(var, eff->fixture.nrOfLeds); - return true; - case f_UIFun: - ui->setLabel(var, "Count"); - web->addResponseV(var["id"], "comment", "Max %d", NUM_LEDS_Max); - return true; - default: return false; - }}); - - ui->initNumber(parentVar, "fps", eff->fps, 1, 999, false , [](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_UIFun: - ui->setComment(var, "Frames per second"); - return true; - case f_ChangeFun: - eff->fps = var["value"]; - return true; - default: return false; - }}); - - ui->initText(parentVar, "realFps", nullptr, 10, true, [](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_UIFun: - web->addResponseV(var["id"], "comment", "f(%d leds)", eff->fixture.nrOfLeds); - return true; - default: return false; - }}); - - ui->initCheckBox(parentVar, "fShow", eff->fShow, false, [this](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_UIFun: - ui->setLabel(var, "FastLed show"); - ui->setComment(var, "dev performance tuning"); - return true; - case f_ChangeFun: - eff->fShow = var["value"]; - return true; - default: return false; - }}); - - } -}; - -extern LedModFixture *fix; \ No newline at end of file diff --git a/src/App/LedModFixtureGen.h b/src/App/LedModFixtureGen.h deleted file mode 100644 index c21367a0..00000000 --- a/src/App/LedModFixtureGen.h +++ /dev/null @@ -1,1081 +0,0 @@ -/* - @title StarMod - @file LedModFixtureGen.h - @date 20240228 - @repo https://github.com/ewowi/StarMod - @Authors https://github.com/ewowi/StarMod/commits/main - @Copyright © 2024 Github StarMod Commit Authors - @license GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - @license For non GPL-v3 usage, commercial licenses must be purchased. Contact moonmodules@icloud.com -*/ - -#include "SysModule.h" - -//GenFix: class to provide fixture write functions and save to json file -// { -// "name": "F_Hexagon", -// "nrOfLeds": 216, -// "width": 6554, -// "height": 6554, -// "depth": 1, -// "outputs": [{"pin": 2,"leds": [[720,360,0],[1073,1066,0]]}], {"pin": 3,"leds": [[720,360,0],[1073,1066,0]]}] -// } -class GenFix { - -public: - char name[32] = ""; - - // unsigned16 distance = 1; //cm, not used yet (to display multiple fixture, also from other devices) - - char pinSep[2]=""; - char pixelSep[2]=""; - - Coord3D fixSize = {0,0,0}; - unsigned16 nrOfLeds=0; - - File f; - - GenFix() { - USER_PRINTF("GenFix constructor\n"); - } - - ~GenFix() { - USER_PRINTF("GenFix destructor\n"); - } - - void openHeader(const char * format, ...) { - va_list args; - va_start(args, format); - - vsnprintf(name, sizeof(name)-1, format, args); - - va_end(args); - - f = files->open("/temp.json", "w"); - if (!f) - USER_PRINTF("GenFix could not open temp file for writing\n"); - - f.print(",\"outputs\":["); - strcpy(pinSep, ""); - } - - void closeHeader() { - f.print("]"); //outputs - - USER_PRINTF("closeHeader %d-%d-%d %d\n", fixSize.x, fixSize.y, fixSize.z, nrOfLeds); - f.close(); - f = files->open("/temp.json", "r"); - - File g; - - char fileName[32] = "/"; - strncat(fileName, name, sizeof(fileName)-1); - strncat(fileName, ".json", sizeof(fileName)-1); - - - //create g by merging in f (better solution?) - g = files->open(fileName, "w"); - - g.print("{"); - g.printf("\"name\":\"%s\"", name); - g.printf(",\"nrOfLeds\":%d", nrOfLeds); - g.printf(",\"width\":%d", (fixSize.x+9)/10+1); //effects run on 1 led is 1 cm mode. - g.printf(",\"height\":%d", (fixSize.y+9)/10+1); //e.g. (110+9)/10 +1 = 11+1 = 12, (111+9)/10 +1 = 12+1 = 13 - g.printf(",\"depth\":%d", (fixSize.z+9)/10+1); - - byte character; - f.read(&character, sizeof(byte)); - while (f.available()) { - g.write(character); - f.read(&character, sizeof(byte)); - } - g.write(character); - - g.print("}"); - g.close(); - f.close(); - - files->remove("/temp.json"); - } - - void openPin(unsigned8 pin) { - f.printf("%s{\"pin\":%d,\"leds\":[", pinSep, pin); - strcpy(pinSep, ","); - strcpy(pixelSep, ""); - } - void closePin() { - f.printf("]}"); - } - - void write3D(Coord3D pixel) { - write3D(pixel.x, pixel.y, pixel.z); - } - - void write3D(unsigned16 x, unsigned16 y, unsigned16 z) { - // if (x>UINT16_MAX/2 || y>UINT16_MAX/2 || z>UINT16_MAX/2) - if (x>1000 || y>1000 || z>1000) - USER_PRINTF("write3D coord too high %d,%d,%d\n", x, y, z); - else - { - f.printf("%s[%d,%d,%d]", pixelSep, x, y, z); - strcpy(pixelSep, ","); - fixSize.x = max((unsigned16)fixSize.x, x); - fixSize.y = max((unsigned16)fixSize.y, y); - fixSize.z = max((unsigned16)fixSize.z, z); - nrOfLeds++; - } - - } - - //utility - unsigned u_abs(int x) { - if (x <0) return -x; - else return x; - } - - void matrix(Coord3D first, Coord3D rowEnd, Coord3D colEnd, unsigned8 ip, unsigned8 pin) { - - openPin(pin); - - //advance from pixel to rowEnd - //if rowEnd: is it serpentine or not? - // no: set advancing dimension back to first - // yes: set non advancing dimension 1 step closer to colEnd - //determine new rowEnd - //if rowEnd > colEnd - // yes: done - // no: go back to first step - - // Coord3D pixel = first; - - stackUnsigned8 rowDimension; //in what dimension the row will advance (x=0, y=1, z=2), now only one should differ - if (first.x != rowEnd.x) rowDimension = 0; - if (first.y != rowEnd.y) rowDimension = 1; // - if (first.z != rowEnd.z) rowDimension = 2; - - stackUnsigned8 colDimension; //in what dimension the col will advance, not the rowDimension - if (first.x != colEnd.x && rowDimension != 0) colDimension = 0; // - if (first.y != colEnd.y && rowDimension != 1) colDimension = 1; - if (first.z != colEnd.z && rowDimension != 2) colDimension = 2; - - bool rowValueSame = (rowDimension == 0)? first.x == colEnd.x : (rowDimension == 1)? first.y == colEnd.y : first.z == colEnd.z; - bool serpentine = rowValueSame; - - unsigned16 nrOfColumns = (colDimension == 0)? u_abs(colEnd.x - first.x) + 1 : (colDimension == 1)? u_abs(colEnd.y - first.y) + 1 : u_abs(colEnd.z - first.z) + 1; - if (nrOfColumns % 2 == 1 && rowValueSame) //if odd nrOfCols and rowValueSame then adjust the endpoint col value to the rowEnd col value - { - if (rowDimension == 0) - colEnd.x = rowEnd.x; - else if (rowDimension == 1) - colEnd.y = rowEnd.y; - else if (rowDimension == 2) - colEnd.z = rowEnd.z; - } - - Coord3D colPixel = Coord3D{(rowDimension==0)?colEnd.x:first.x, (rowDimension==1)?colEnd.y:first.y, (rowDimension==2)?colEnd.z:first.z}; - stackUnsigned8 colNr = 0; - while (true) { - // colPixel is not advancing over the dimension of the row but advances over it's own dimension towards the colEnd - - Coord3D cRowStart = Coord3D{(colDimension==0)?colPixel.x:first.x, (colDimension==1)?colPixel.y:first.y, (colDimension==2)?colPixel.z:first.z}; - Coord3D cRowEnd = Coord3D{(colDimension==0)?colPixel.x:rowEnd.x, (colDimension==1)?colPixel.y:rowEnd.y, (colDimension==2)?colPixel.z:rowEnd.z}; - - if (serpentine && colNr%2 != 0) { - Coord3D temp = cRowStart; - cRowStart = cRowEnd; - cRowEnd = temp; - } - - Coord3D rowPixel = cRowStart; - while (true) { - USER_PRINTF(" %d,%d,%d", rowPixel.x, rowPixel.y, rowPixel.z); - write3D(rowPixel.x*10, rowPixel.y*10, rowPixel.z*10); - - if (rowPixel == cRowEnd) break; //end condition row - rowPixel.advance(cRowEnd); - } - - USER_PRINTF("\n"); - - if (colPixel == colEnd) break; //end condition columns - colPixel.advance(colEnd); - colNr++; - } - - closePin(); - } - - void ring(Coord3D middle, unsigned16 ledCount, unsigned8 ip, unsigned8 pin, uint16_t pan = 0, uint16_t tilt = 0, uint16_t roll = 0, bool preDiam = false) { - - openPin(pin); - - uint8_t ringDiam = 10 * ledCount / 2 / M_PI; //in mm; - if (preDiam) { - //check for rings241 rings which have a specific diameter - switch (ledCount) { - case 1: ringDiam = 0; break; - case 8: ringDiam = 13; break; - case 12: ringDiam = 23; break; - case 16: ringDiam = 33; break; - case 24: ringDiam = 43; break; - case 32: ringDiam = 53; break; - case 40: ringDiam = 63; break; - case 48: ringDiam = 73; break; - case 60: ringDiam = 83; break; - default: ringDiam = 10 * ledCount / 2 / M_PI; //in mm - } - } - - Trigo trigo; - - for (int i=0; i 1 - // {1, 8}, //1 -> 8 - // {9, 20}, //2 -> 12 - // {21, 36}, //3 -> 16 - // {37, 60}, //4 -> 24 - // {61, 92}, //5 -> 32 - // {93, 132}, //6 -> 40 - // {133, 180}, //7 -> 48 - // {181, 240}, //8 Outer Ring -> 60 -> 241 - - // stackUnsigned16 size = ringDiams[nrOfRings-1]; //size if the biggest ring - for (int j=0; j= 0; x-=10) write3D(x+first.x*10, y+first.y*10, first.z*10); - y = 110; for (int x = 90; x <= 510; x+=10) write3D(x+first.x*10, y+first.y*10, first.z*10); - y = 70; for (int x = 400; x >= 110; x-=10) write3D(x+first.x*10, y+first.y*10, first.z*10); - closePin(); - //second pin (green) - openPin(pin); - y = 140; for (int x = 530; x >= 0; x-=10) write3D(x+first.x*10, y+first.y*10, first.z*10); - y = 100; for (int x = 90; x <= 510; x+=10) write3D(x+first.x*10, y+first.y*10, first.z*10); - y = 60; for (int x = 390; x >= 120; x-=10) write3D(x+first.x*10, y+first.y*10, first.z*10); - closePin(); - //third pin (blue) - openPin(pin); - y = 130; for (int x = 520; x >= 10; x-=10) write3D(x+first.x*10, y+first.y*10, first.z*10); - y = 90; for (int x = 100; x <= 500; x+=10) write3D(x+first.x*10, y+first.y*10, first.z*10); - y = 50; for (int x = 390; x >= 140; x-=10) write3D(x+first.x*10, y+first.y*10, first.z*10); - closePin(); - //fourth pin (yellow) - openPin(pin); - y = 120; for (int x = 520; x >= 30; x-=10) write3D(x+first.x*10, y+first.y*10, first.z*10); - y = 80; for (int x = 100; x <= 480; x+=10) write3D(x+first.x*10, y+first.y*10, first.z*10); - y = 40; for (int x = 380; x >= 240; x-=10) write3D(x+first.x*10, y+first.y*10, first.z*10); - y = 30; for (int x = 250; x <= 370; x+=10) write3D(x+first.x*10, y+first.y*10, first.z*10); - y = 20; for (int x = 360; x >= 260; x-=10) write3D(x+first.x*10, y+first.y*10, first.z*10); - y = 10; for (int x = 270; x <= 350; x+=10) write3D(x+first.x*10, y+first.y*10, first.z*10); - y = 00; for (int x = 330; x >= 290; x-=10) write3D(x+first.x*10, y+first.y*10, first.z*10); - closePin(); - } - - void globe(Coord3D first, unsigned8 width, unsigned8 ip, unsigned8 pin) { - - Coord3D middle; - middle.x = first.x*10 + width*10 / 2; - middle.z = first.z*10 + width*10 / 2; - - // loop over latitudes -> sin 0 to pi - for (uint8_t lat = 0; lat <= width; lat++) { - float factor = 128.0f / width; //16 => 8 - float ringDiam = (sin8(lat * factor)-128) / factor / 2.0f; // 0 .. 128 => 0 .. 128 .. 0 => 0 .. 16 .. 0 in cm - - uint8_t ledCount = ringDiam * 2 * M_PI; - - middle.y = first.y*10 + lat*10; - - // Coord3D start = first; - // start.y = first.y + lat; - USER_PRINTF("Globe %d %f %d %d,%d,%d\n", lat, ringDiam, ledCount, middle.x, middle.y, middle.z); - ring(middle, ledCount, ip, pin, 0, 90, 0); //tilt 90 - } - } - - // https://stackoverflow.com/questions/17705621/algorithm-for-a-geodesic-sphere - //https://opengl.org.ru/docs/pg/0208.html - void geodesicDome(Coord3D first, unsigned8 width, unsigned8 ip, unsigned8 pin) { - - stackUnsigned8 tindices[20][3] = { {0,4,1}, {0,9,4}, {9,5,4}, {4,5,8}, {4,8,1}, {8,10,1}, {8,3,10}, {5,3,8}, {5,2,3}, {2,7,3}, {7,10,3}, {7,6,10}, {7,11,6}, {11,0,6}, {0,1,6}, {6,1,10}, {9,0,11}, {9,11,2}, {9,2,5}, {7,2,11} }; - - openPin(pin); - - for (int i=0; i<20; i++) { - write3D(tindices[i][0]*10 + first.x*10, tindices[i][1]*10 + first.y*10, tindices[i][2]*10 + first.z*10); - } - - closePin(); - } - -}; - -enum Fixtures -{ - f_Matrix, - f_Ring, - f_Rings241, - f_Spiral, - f_Wheel, - f_Hexagon, - f_Cone, - f_Cloud, - f_Wall, - f_6Rings, - f_SpaceStation, - f_Human, - f_Globe, - f_GeodesicDome, - fixtureCount -}; - -class LedModFixtureGen:public SysModule { - -public: - - LedModFixtureGen() :SysModule("Fixture Generator") {}; - - void setup() { - SysModule::setup(); - - parentVar = ui->initAppMod(parentVar, name, 6302); //created as a usermod, not an appmod to have it in the usermods tab - parentVar["s"] = true; //setup - - ui->initSelect(parentVar, "fixtureGen", 0, false, [this](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_UIFun: { - ui->setLabel(var, "Fixture"); - ui->setComment(var, "Type of fixture"); - JsonArray options = ui->setOptions(var); //See enum Fixtures for order of options - options.add("Matrix"); - options.add("Ring"); - options.add("Rings241"); - options.add("Spiral"); - options.add("Wheel"); - options.add("Hexagon"); - options.add("Cone"); - options.add("Cloud"); - options.add("Wall"); - options.add("6Rings"); - options.add("SpaceStation"); - options.add("Human"); - options.add("Globe"); - options.add("GeodesicDome WIP"); - return true; - } - case f_ChangeFun: - this->fixtureGenChFun(); - return true; - default: return false; - }}); //fixtureGen - - ui->initCheckBox(parentVar, "panels", false, false, [this](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_UIFun: - ui->setComment(var, "Show panels"); - return true; - case f_ChangeFun: { - this->fixtureGenChFun(); - return true; } - default: return false; - }}); - - // gpio2 seems to be a safe choice on all esp32 variants -// ui->initText(parentVar, "pinList", "2", 32, false, [](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun -// case f_UIFun: -// ui->setComment(var, "One or more e.g. 12,13,14"); -// return true; -// #if 0 // @ewowi did not get this to work -// case f_ValueFun: -// #if CONFIG_IDF_TARGET_ESP32 && (defined(BOARD_HAS_PSRAM) || defined(ARDUINO_ESP32_PICO)) // -// ui->setValue(var, "2"); // gpio16 is reserved on pico and on esp32 with PSRAM -// #elif CONFIG_IDF_TARGET_ESP32S3 -// ui->setValue(var, "21"); // gpio21 = builtin neopixel on some -S3 boards -// #elif CONFIG_IDF_TARGET_ESP32C3 -// ui->setValue(var, "10"); // gpio10 = builtin neopixel on some -C3 boards -// #else -// ui->setValue(var, "16"); // default on universal shield (classic esp32, or esp32-S2) -// #endif -// return true; -// #endif -// default: return false; -// }}); - - ui->initButton(parentVar, "generate", false, [this](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_ChangeFun: { - - char fileName[32]; - generateChFun(var, fileName); - ui->callVarFun("fixture", UINT8_MAX, f_UIFun); //reload fixture select - - uint8_t value = ui->selectOptionToValue("fixture", fileName); - if (value != UINT8_MAX) - mdl->setValue("fixture", value); - - return true; } - default: return false; - }}); - - } //setup - - void loop() { - // SysModule::loop(); - } - - //generate dynamic html for fixture controls - void fixtureGenChFun() { - - JsonObject fixtureGenVar = mdl->findVar("fixtureGen"); - JsonObject panelVar = mdl->findVar("panels"); - - // JsonObject parentVar = mdl->findVar(var["id"]); //local parentVar - stackUnsigned8 fgValue = fixtureGenVar["value"]; - - fixtureGenVar.remove("n"); //tbd: we should also remove the varFun !! - - // mdl->varPreDetails(fixtureGenVar); - - JsonObject parentVar = fixtureGenVar; - if (panelVar["value"].as()) { - - parentVar = ui->initTable(fixtureGenVar, "pnlTbl", nullptr, false, [](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_UIFun: - ui->setLabel(var, "Panels"); - ui->setComment(var, "List of fixtures"); - return true; - case f_AddRow: - web->getResponseObject()["addRow"]["rowNr"] = rowNr; - return true; - case f_DelRow: - // web->getResponseObject()["addRow"]["rowNr"] = rowNr; - return true; - default: return false; - }}); - - ui->initCoord3D(parentVar, "pnlFirst", {0,0,0}, 0, NUM_LEDS_Max, false, [fgValue](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_UIFun: - //show Top Left for all fixture except Matrix as it has its own - if (fgValue == f_Matrix) - ui->setLabel(var, "First LED"); - else - ui->setLabel(var, "Top left"); - return true; - default: return false; - }}); - - } //if panels - - - if (fgValue == f_Matrix) { - - ui->initCoord3D(parentVar, "mrxRowEnd", {7,0,0}, 0, NUM_LEDS_Max, false, [](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_UIFun: - ui->setLabel(var, "Row end"); - ui->setComment(var, "-> Orientation"); - return true; - default: return false; - }}); - - ui->initCoord3D(parentVar, "mrxColEnd", {7,7,0}, 0, NUM_LEDS_Max, false, [](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_UIFun: - ui->setLabel(var, "Column end"); - ui->setComment(var, "Last LED -> nrOfLeds, Serpentine"); - return true; - default: return false; - }}); - - if (panelVar["value"].as()) { - - ui->initSelect(fixtureGenVar, "fixPreset", 0, false, [this](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_UIFun: { - ui->setLabel(var, "Preset"); - JsonArray options = ui->setOptions(var); - options.add("None"); - options.add("16x16"); - options.add("4x16x16"); - options.add("4x32x8"); - options.add("Human Sized Cube"); - options.add("CubeBox"); - options.add("Cube3D"); - options.add("Sticks"); - return true; } - case f_ChangeFun: { - stackUnsigned8 optionNr = 1; // 0 is none, maintain the same order here as the options - stackUnsigned8 panel = 0; - if (var["value"] == optionNr++) { //16x16 - stackUnsigned8 lengthMinOne = 15; - panel = 0; mdl->setValue("pnlFirst", Coord3D{0,0,0}, panel++); - panel = 0; mdl->setValue("mrxRowEnd", Coord3D{0,lengthMinOne,0}, panel++); - panel = 0; mdl->setValue("mrxColEnd", Coord3D{lengthMinOne,lengthMinOne,0}, panel++); - panel = 0; mdl->setValue("fixPin", 2, panel++); // default per board... - } - if (var["value"] == optionNr++) { //4x16x16 - stackUnsigned8 lengthMinOne = 15; stackUnsigned8 size = lengthMinOne + 1; - panel = 0; mdl->setValue("pnlFirst", Coord3D{0,0,0}, panel++); mdl->setValue("pnlFirst", Coord3D{16,0,0}, panel++); mdl->setValue("pnlFirst", Coord3D{0,16,0}, panel++); mdl->setValue("pnlFirst", Coord3D{16,16,0}, panel++); - panel = 0; mdl->setValue("mrxRowEnd", Coord3D{0,lengthMinOne,0}, panel++); mdl->setValue("mrxRowEnd", Coord3D{16,lengthMinOne,0}, panel++); mdl->setValue("mrxRowEnd", Coord3D{0,31,0}, panel++); mdl->setValue("mrxRowEnd", Coord3D{16,31,0}, panel++); - panel = 0; mdl->setValue("mrxColEnd", Coord3D{lengthMinOne,lengthMinOne,0}, panel++); mdl->setValue("mrxColEnd", Coord3D{31,lengthMinOne,0}, panel++); mdl->setValue("mrxColEnd", Coord3D{lengthMinOne,31,0}, panel++); mdl->setValue("mrxColEnd", Coord3D{31,31,0}, panel++); - panel = 0; mdl->setValue("fixPin", 2, panel++); mdl->setValue("fixPin", 2, panel++); mdl->setValue("fixPin", 2, panel++); mdl->setValue("fixPin", 2, panel++); - } - if (var["value"] == optionNr++) { //4x32x8 - stackUnsigned8 lengthMinOne = 31; - panel = 0; mdl->setValue("pnlFirst", Coord3D{lengthMinOne,lengthMinOne,0}, panel++); mdl->setValue("pnlFirst", Coord3D{lengthMinOne,23,0}, panel++); mdl->setValue("pnlFirst", Coord3D{lengthMinOne,15,0}, panel++); mdl->setValue("pnlFirst", Coord3D{lengthMinOne,7,0}, panel++); - panel = 0; mdl->setValue("mrxRowEnd", Coord3D{lengthMinOne,24,0}, panel++); mdl->setValue("mrxRowEnd", Coord3D{lengthMinOne,16,0}, panel++); mdl->setValue("mrxRowEnd", Coord3D{lengthMinOne,8,0}, panel++); mdl->setValue("mrxRowEnd", Coord3D{lengthMinOne,0,0}, panel++); - panel = 0; mdl->setValue("mrxColEnd", Coord3D{0,lengthMinOne,0}, panel++); mdl->setValue("mrxColEnd", Coord3D{0,23,0}, panel++); mdl->setValue("mrxColEnd", Coord3D{0,15,0}, panel++); mdl->setValue("mrxColEnd", Coord3D{0,7,0}, panel++); - panel = 0; mdl->setValue("fixPin", 2, panel++); mdl->setValue("fixPin", 2, panel++); mdl->setValue("fixPin", 2, panel++); mdl->setValue("fixPin", 2, panel++); - } - else if (var["value"] == optionNr++) { //Human Sized Cube - stackUnsigned8 length = 20; stackUnsigned8 size = length + 1; - panel = 0; mdl->setValue("pnlFirst", Coord3D{1,1,size}, panel++); mdl->setValue("pnlFirst", Coord3D{0,1,1}, panel++); mdl->setValue("pnlFirst", Coord3D{1,1,0}, panel++); mdl->setValue("pnlFirst", Coord3D{size,1,1}, panel++); mdl->setValue("pnlFirst", Coord3D{1,0,1}, panel++); - panel = 0; mdl->setValue("mrxRowEnd", Coord3D{1,length,size}, panel++); mdl->setValue("mrxRowEnd", Coord3D{0,length,1}, panel++); mdl->setValue("mrxRowEnd", Coord3D{1,length,0}, panel++); mdl->setValue("mrxRowEnd", Coord3D{size,length,1}, panel++); mdl->setValue("mrxRowEnd", Coord3D{1,0,length}, panel++); - panel = 0; mdl->setValue("mrxColEnd", Coord3D{length,length,size}, panel++); mdl->setValue("mrxColEnd", Coord3D{0,length,length}, panel++); mdl->setValue("mrxColEnd", Coord3D{length,length,0}, panel++); mdl->setValue("mrxColEnd", Coord3D{size,length,length}, panel++); mdl->setValue("mrxColEnd", Coord3D{length,0,length}, panel++); - panel = 0; mdl->setValue("fixPin", 16, panel++); mdl->setValue("fixPin", 14, panel++); mdl->setValue("fixPin", 32, panel++); mdl->setValue("fixPin", 3, panel++); mdl->setValue("fixPin", 15, panel++); - } - else if (var["value"] == optionNr++) { //Cube 6 x 8 x 8 - stackUnsigned8 length = 8; stackUnsigned8 size = length + 1; - panel = 0; mdl->setValue("pnlFirst", Coord3D{1,1,0}, panel++); mdl->setValue("pnlFirst", Coord3D{length, size, length}, panel++); mdl->setValue("pnlFirst", Coord3D{size, 1, 1}, panel++); mdl->setValue("pnlFirst", Coord3D{0, length, length}, panel++); mdl->setValue("pnlFirst", Coord3D{length, 1, size}, panel++); mdl->setValue("pnlFirst", Coord3D{1, 0, length}, panel++); - panel = 0; mdl->setValue("mrxRowEnd", Coord3D{1,length,0}, panel++); mdl->setValue("mrxRowEnd", Coord3D{1, size, length}, panel++); mdl->setValue("mrxRowEnd", Coord3D{size, 1, length}, panel++); mdl->setValue("mrxRowEnd", Coord3D{0, 1, length}, panel++); mdl->setValue("mrxRowEnd", Coord3D{1, 1, size}, panel++); mdl->setValue("mrxRowEnd", Coord3D{length, 0, length}, panel++); - panel = 0; mdl->setValue("mrxColEnd", Coord3D{length,length,0}, panel++); mdl->setValue("mrxColEnd", Coord3D{1, size, 1}, panel++); mdl->setValue("mrxColEnd", Coord3D{size, length, length}, panel++); mdl->setValue("mrxColEnd", Coord3D{0, 1, 1}, panel++); mdl->setValue("mrxColEnd", Coord3D{1, length, size}, panel++); mdl->setValue("mrxColEnd", Coord3D{length, 0, 1}, panel++); - panel = 0; mdl->setValue("fixPin", 12, panel++); mdl->setValue("fixPin", 12, panel++); mdl->setValue("fixPin", 13, panel++); mdl->setValue("fixPin", 13, panel++); mdl->setValue("fixPin", 14, panel++); mdl->setValue("fixPin", 14, panel++); - } - else if (var["value"] == optionNr++) { //Cube 3D - stackUnsigned8 length = 8; stackUnsigned8 size = length -1; - for (forUnsigned8 panel=0; panel < length; panel++) { - mdl->setValue("pnlFirst", Coord3D{0,0,(unsigned16)panel}, panel); - mdl->setValue("mrxRowEnd", Coord3D{0,size,(unsigned16)panel}, panel); - mdl->setValue("mrxColEnd", Coord3D{size,size,(unsigned16)panel}, panel); - mdl->setValue("fixPin", 12, panel); - } - } - else if (var["value"] == optionNr++) { //Sticks - stackUnsigned8 length = 16; - stackUnsigned8 height = 54; - for (forUnsigned8 panel=0; panel < length; panel++) { - mdl->setValue("pnlFirst", Coord3D{(unsigned16)(panel*5), height, 0}, panel); - mdl->setValue("mrxRowEnd", Coord3D{(unsigned16)(panel*5), height, 0}, panel); - mdl->setValue("mrxColEnd", Coord3D{(unsigned16)(panel*5), 0, 0}, panel); - mdl->setValue("fixPin", 12, panel); - } - } - return true; } - default: return false; - }}); - } - } - else if (fgValue == f_Ring) { - ui->initNumber(parentVar, "fixLeds", 24, 1, NUM_LEDS_Max, false, [](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_UIFun: - ui->setLabel(var, "Leds"); - return true; - default: return false; - }}); - - if (panelVar["value"].as()) { - - ui->initSelect(fixtureGenVar, "fixPreset", 0, false, [this](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_UIFun: { - ui->setLabel(var, "Preset"); - JsonArray options = ui->setOptions(var); - options.add("None"); - options.add("Olympic"); - options.add("Audi"); - return true; } - case f_ChangeFun: { - stackUnsigned8 optionNr = 1; // 0 is none, maintain the same order here as the options - stackUnsigned8 panel = 0; - if (var["value"] == optionNr++) { //Olympic - panel = 0; mdl->setValue("pnlFirst", Coord3D{0,0,0}, panel++); mdl->setValue("pnlFirst", Coord3D{10,0,0}, panel++); mdl->setValue("pnlFirst", Coord3D{20,0,0}, panel++); mdl->setValue("pnlFirst", Coord3D{5,3,0}, panel++); mdl->setValue("pnlFirst", Coord3D{15,3,0}, panel++); - panel = 0; mdl->setValue("fixLeds", 24, panel++); mdl->setValue("fixLeds", 24, panel++); mdl->setValue("fixLeds", 24, panel++); mdl->setValue("fixLeds", 24, panel++); mdl->setValue("fixLeds", 24, panel++); - panel = 0; mdl->setValue("fixPin", 2, panel++); mdl->setValue("fixPin", 2, panel++); mdl->setValue("fixPin", 2, panel++); mdl->setValue("fixPin", 2, panel++); mdl->setValue("fixPin", 2, panel++); // default per board... - } - if (var["value"] == optionNr++) { //Audi - panel = 0; mdl->setValue("pnlFirst", Coord3D{0,0,0}, panel++); mdl->setValue("pnlFirst", Coord3D{6,0,0}, panel++); mdl->setValue("pnlFirst", Coord3D{12,0,0}, panel++); mdl->setValue("pnlFirst", Coord3D{18 ,0,0}, panel++); - panel = 0; mdl->setValue("fixLeds", 24, panel++); mdl->setValue("fixLeds", 24, panel++); mdl->setValue("fixLeds", 24, panel++); mdl->setValue("fixLeds", 24, panel++); - panel = 0; mdl->setValue("fixPin", 2, panel++); mdl->setValue("fixPin", 2, panel++); mdl->setValue("fixPin", 2, panel++); mdl->setValue("fixPin", 2, panel++); // default per board... - } - return true; } - default: return false; - }}); - } - } - else if (fgValue == f_Rings241) { - ui->initNumber(parentVar, "nrOfRings", 9, 1, 9); - ui->initCheckBox(parentVar, "in2out", true); - } - else if (fgValue == f_Spiral) { - ui->initNumber(parentVar, "fixLeds", 64, 1, NUM_LEDS_Max, false, [](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_UIFun: - ui->setLabel(var, "Leds"); - return true; - default: return false; - }}); - } - else if (fgValue == f_Wheel) { - ui->initNumber(parentVar, "nrOfSpokes", 36, 1, 360); - ui->initNumber(parentVar, "ledsPerSpoke", 24, 1, 360); - } - else if (fgValue == f_Hexagon) { - ui->initNumber(parentVar, "ledsPerSide", 12, 1, 255); - - if (panelVar["value"].as()) { - - ui->initSelect(fixtureGenVar, "fixPreset", 0, false, [this](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_UIFun: { - ui->setLabel(var, "Preset"); - JsonArray options = ui->setOptions(var); - options.add("None"); - options.add("HexaWall"); - return true; } - case f_ChangeFun: { - stackUnsigned8 optionNr = 1; // 0 is none, maintain the same order here as the options - stackUnsigned8 panel = 0; - if (var["value"] == optionNr++) { //HexaWall - panel = 0; - mdl->setValue("pnlFirst", Coord3D{0,0,0}, panel++); - mdl->setValue("pnlFirst", Coord3D{10,6,0}, panel++); - mdl->setValue("pnlFirst", Coord3D{10,18,0}, panel++); - mdl->setValue("pnlFirst", Coord3D{20,0,0}, panel++); - mdl->setValue("pnlFirst", Coord3D{30,6,0}, panel++); - mdl->setValue("pnlFirst", Coord3D{40,12,0}, panel++); - mdl->setValue("pnlFirst", Coord3D{40,24,0}, panel++); - mdl->setValue("pnlFirst", Coord3D{50,6,0}, panel++); - mdl->setValue("pnlFirst", Coord3D{60,0,0}, panel++); - - for (forUnsigned8 panel = 0; panel < 9; panel++) { - mdl->setValue("ledsPerSide", 6, panel); - mdl->setValue("fixPin", 2, panel); - } - } - return true; } - default: return false; - }}); - } - } - else if (fgValue == f_Human) { - - if (panelVar["value"].as()) { - - ui->initSelect(fixtureGenVar, "fixPreset", 0, false, [this](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_UIFun: { - ui->setLabel(var, "Preset"); - JsonArray options = ui->setOptions(var); - options.add("Body1"); - options.add("Body2"); - return true; } - default: return false; - }}); - } - - } - else if (fgValue == f_Cone) { - ui->initNumber(parentVar, "nrOfRings", 24, 1, 360); - } - else if (fgValue == f_Globe) { - ui->initNumber(parentVar, "width", 24, 1, 48); - } - - - - ui->initNumber(parentVar, "fixIP", WiFi.localIP()[3], 1, 256, false, [](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_UIFun: - ui->setLabel(var, "IP"); - ui->setComment(var, "Super-Sync WIP"); - return true; - default: return false; - }}); - - ui->initPin(parentVar, "fixPin", 2, false, [](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - case f_UIFun: { - ui->setLabel(var, "Pin"); - - //tbd: move logic to pinMgr and create initPin - JsonArray options = ui->setOptions(var); - - for (forUnsigned8 pinNr = 0; pinNr < NUM_DIGITAL_PINS; pinNr++) { - char text[32]; - itoa(pinNr, text, 10); - if (digitalPinIsValid(pinNr)) { - - #if defined(CONFIG_IDF_TARGET_ESP32S2) - if ((pinNr > 18 && pinNr < 21) || (pinNr > 21 && pinNr < 33)) strcat(text, " 🟣"); else - #elif defined(CONFIG_IDF_TARGET_ESP32S3) - if ((pinNr > 18 && pinNr < 21) || (pinNr > 21 && pinNr < 33)) strcat(text, " 🟣"); else - #elif defined(CONFIG_IDF_TARGET_ESP32C3) - if ((pinNr > 11 && pinNr < 18) || (pinNr > 17 && pinNr < 20)) strcat(text, " 🟣"); else - #elif defined(ESP32) - if (pinNr > 5 && pinNr < 12) strcat(text, " 🟣"); else - #else //??? - #endif - - if (!digitalPinCanOutput(pinNr)) - strcat(text, " 🟠"); //read only - else - strcat(text, " 🟢"); //io - - //results in crashes - // if (digitalPinToRtcPin(pinNr)) strcat(text, " 🟢"); else strcat(text, " 🔴"); //error: 'RTC_GPIO_IS_VALID_GPIO' was not declared in this scope - // if (digitalPinToDacChannel(pinNr)) strcat(text, " 🟢"); else strcat(text, " 🔴"); //error: 'DAC_CHANNEL_1_GPIO_NUM' was not declared in this scope - - //not so relevant - // if (digitalPinToAnalogChannel(pinNr)) strcat(text, " 🟣"); - // if (digitalPinToTouchChannel(pinNr)) strcat(text, " 🟤"); - } - else - strcat(text, " 🔴"); //not valid - options.add(JsonString(text, JsonString::Copied)); - } - return true; } - case f_ChangeFun: { - //set remaining rows to same pin - JsonArray valArray = mdl->varValArray(var); - - stackUnsigned8 thisVal = var["value"]; - stackUnsigned8 rowNrL = 0; - for (JsonVariant val: valArray) { - if (rowNrL > rowNr) - mdl->setValue(var, valArray[rowNr].as(), rowNrL); - rowNrL++; - } - return true; } - default: return false; - }}); - - mdl->varPostDetails(fixtureGenVar, UINT8_MAX); - - } - - //tbd: move to utility functions - char *removeSpaces(char *str) - { - int i = 0, j = 0; - while (str[i]) - { - if (str[i] != ' ') - str[j++] = str[i]; - i++; - } - str[j] = '\0'; - return str; - } - - void getPanels(const char * fileName, std::function genFun) { - GenFix genFix; - - JsonObject presetsVar = mdl->findVar("fixPreset"); - stackUnsigned8 presets = mdl->getValue(presetsVar); - - //set header and file name - if (presets != 0) { - JsonArray options = ui->getOptions(presetsVar); - - char text[32] = "F_"; - strncat(text, options[presets], 31); - removeSpaces(text); - - genFix.openHeader(text); - - ui->clearOptions(presetsVar); - } - else { - // stackUnsigned16 ledCount = mdl->getValue("fixLeds"); - genFix.openHeader(fileName); - } - - JsonVariant pnlFirstValue = mdl->findVar("pnlFirst")["value"]; - - if (pnlFirstValue.is()) { - stackUnsigned8 rowNr = 0; - for (JsonVariant firstValueRow: pnlFirstValue.as()) { - genFun(&genFix, rowNr); - rowNr++; - } - } else { - genFun(&genFix, UINT8_MAX); - } - - genFix.closeHeader(); - } - - void generateChFun(JsonObject var, char * fileName) { - - stackUnsigned8 fgValue = mdl->getValue("fixtureGen"); - - if (fgValue == f_Matrix) { - - Coord3D size = (mdl->getValue("mrxColEnd").as() - mdl->getValue("pnlFirst").as()) + Coord3D{1,1,1}; - print->fFormat(fileName, 31, "F_Matrix%d%d%d", size.x, size.y, size.z); - - getPanels(fileName, [](GenFix * genFix, unsigned8 rowNr) { - genFix->matrix(mdl->getValue("pnlFirst", rowNr), mdl->getValue("mrxRowEnd", rowNr), mdl->getValue("mrxColEnd", rowNr), mdl->getValue("fixIP", rowNr), mdl->getValue("fixPin", rowNr)); - }); - - } else if (fgValue == f_Ring) { - - print->fFormat(fileName, 31, "F_Ring%d", mdl->getValue("fixLeds").as()); - - getPanels(fileName, [](GenFix * genFix, unsigned8 rowNr) { - Coord3D middle = mdl->getValue("pnlFirst", rowNr); - uint16_t ledCount = mdl->getValue("fixLeds", rowNr); - uint8_t ringDiam = 10 * ledCount / 2 / M_PI + 10; //in mm - middle.x = middle.x*10 + ringDiam; - middle.y = middle.y*10 + ringDiam; - - genFix->ring(middle, ledCount, mdl->getValue("fixIP", rowNr), mdl->getValue("fixPin", rowNr)); - }); - - } else if (fgValue == f_Rings241) { - - print->fFormat(fileName, 31, "F_Rings241-%d", mdl->getValue("nrOfRings").as()); - - getPanels(fileName, [](GenFix * genFix, unsigned8 rowNr) { - Coord3D middle = mdl->getValue("pnlFirst", rowNr); - uint16_t nrOfLeds = mdl->getValue("fixLeds", rowNr); - uint8_t ringDiam = 10 * 60 / 2 / M_PI; //in mm - middle.x = middle.x*10 + ringDiam; - middle.y = middle.y*10 + ringDiam; - genFix->rings241(middle, mdl->getValue("nrOfRings", rowNr), mdl->getValue("in2out", rowNr), mdl->getValue("fixIP", rowNr), mdl->getValue("fixPin", rowNr)); - }); - - } else if (fgValue == f_Spiral) { - - print->fFormat(fileName, 31, "F_Spiral%d", mdl->getValue("fixLeds").as()); - - getPanels(fileName, [](GenFix * genFix, unsigned8 rowNr) { - genFix->spiral(mdl->getValue("pnlFirst", rowNr), mdl->getValue("fixLeds", rowNr), mdl->getValue("fixIP", rowNr), mdl->getValue("fixPin", rowNr)); - }); - - } else if (fgValue == f_Wheel) { - - print->fFormat(fileName, 31, "F_Wheel%d%d", mdl->getValue("nrOfSpokes").as(), mdl->getValue("ledsPerSpoke").as()); - - getPanels(fileName, [](GenFix * genFix, unsigned8 rowNr) { - genFix->wheel(mdl->getValue("pnlFirst", rowNr), mdl->getValue("nrOfSpokes", rowNr), mdl->getValue("ledsPerSpoke", rowNr), mdl->getValue("fixIP", rowNr), mdl->getValue("fixPin", rowNr)); - }); - - } else if (fgValue == f_Hexagon) { - - strcpy(fileName, "F_Hexagon"); - getPanels(fileName, [](GenFix * genFix, unsigned8 rowNr) { - genFix->hexagon(mdl->getValue("pnlFirst", rowNr), mdl->getValue("ledsPerSide", rowNr), mdl->getValue("fixIP", rowNr), mdl->getValue("fixPin", rowNr)); - }); - - } else if (fgValue == f_Cone) { - - print->fFormat(fileName, 31, "F_Cone%d", mdl->getValue("nrOfRings").as()); - - getPanels(fileName, [](GenFix * genFix, unsigned8 rowNr) { - genFix->cone(mdl->getValue("pnlFirst", rowNr), mdl->getValue("nrOfRings", rowNr), mdl->getValue("fixIP", rowNr), mdl->getValue("fixPin", rowNr)); - }); - - } else if (fgValue == f_Cloud) { - - strcpy(fileName, "F_Cloud5416"); - getPanels(fileName, [](GenFix * genFix, unsigned8 rowNr) { - genFix->cloud(mdl->getValue("pnlFirst", rowNr), mdl->getValue("fixIP", rowNr), mdl->getValue("fixPin", rowNr)); - }); - - } else if (fgValue == f_Wall) { - - strcpy(fileName, "F_Wall"); - getPanels(fileName, [](GenFix * genFix, unsigned8 rowNr) { - genFix->rings241(Coord3D{110,110,0}, 9, true, mdl->getValue("fixIP", rowNr), mdl->getValue("fixPin", rowNr)); - - genFix->matrix(Coord3D{19,0,0}, Coord3D{19,8,0}, Coord3D{27,0,0}, mdl->getValue("fixIP", rowNr), mdl->getValue("fixPin", rowNr)); - genFix->matrix(Coord3D{0,19,0}, Coord3D{0,25,0}, Coord3D{50,19,0}, mdl->getValue("fixIP", rowNr), mdl->getValue("fixPin", rowNr)); - - genFix->ring(Coord3D{190+80,80+80,0}, 48, mdl->getValue("fixIP", rowNr), mdl->getValue("fixPin", rowNr)); - - // genFix.spiral(240, 0, 0, 48); - }); - - } else if (fgValue == f_6Rings) { - - strcpy(fileName, "F_6Rings"); - getPanels(fileName, [](GenFix * genFix, unsigned8 rowNr) { - genFix->rings241(Coord3D{110,110,0}, 9, true, mdl->getValue("fixIP", rowNr), mdl->getValue("fixPin", rowNr)); - genFix->rings241(Coord3D{0,110,110}, 9, true, mdl->getValue("fixIP", rowNr), mdl->getValue("fixPin", rowNr), 90); //pan 90 - genFix->rings241(Coord3D{110,110,220}, 9, true, mdl->getValue("fixIP", rowNr), mdl->getValue("fixPin", rowNr)); - genFix->rings241(Coord3D{220,110,110}, 9, true, mdl->getValue("fixIP", rowNr), mdl->getValue("fixPin", rowNr), 90); // pan 90 - genFix->rings241(Coord3D{110,0,110}, 9, true, mdl->getValue("fixIP", rowNr), mdl->getValue("fixPin", rowNr), 0, 90); // tilt 90 - genFix->rings241(Coord3D{110,220,110}, 9, true, mdl->getValue("fixIP", rowNr), mdl->getValue("fixPin", rowNr), 0, 90); // tilt 90 - }); - - } else if (fgValue == f_SpaceStation) { - - strcpy(fileName, "F_SpaceStation"); - getPanels(fileName, [](GenFix * genFix, unsigned8 rowNr) { - Trigo trigo; - for (int i=0; i<360; i+=20) { - uint8_t ringDiam = 50; - uint8_t issDiam = 150; - Coord3D middle = Coord3D{ringDiam + issDiam + trigo.sin(issDiam, i), ringDiam + issDiam + trigo.cos(issDiam, i), ringDiam}; - genFix->ring(middle, 12, mdl->getValue("fixIP", rowNr), mdl->getValue("fixPin", rowNr), 0, 90, 360-i); // tilt 90 then roll a bit - } - }); - - } else if (fgValue == f_Human) { - - strcpy(fileName, "F_Human"); - getPanels(fileName, [](GenFix * genFix, unsigned8 rowNr) { - - //total dimensions width: 10 + 18 + 10 - // height 18 + 5 + - Coord3D headSize = {18, 18, 1}; - Coord3D armSize = {12, 5, 1}; - Coord3D legSize = {5, 20, 1}; - - // head - genFix->rings241({190,110,0}, 9, true, mdl->getValue("fixIP", rowNr), mdl->getValue("fixPin", rowNr)); - - //arms - genFix->matrix(Coord3D{0,headSize.y + 2,0}, Coord3D{0,headSize.y + 2 + armSize.y,0}, Coord3D{armSize.x,headSize.y + 2,0}, mdl->getValue("fixIP", rowNr), mdl->getValue("fixPin", rowNr)); - genFix->matrix(Coord3D{armSize.x + 14,headSize.y + 2,0}, Coord3D{armSize.x + 14,headSize.y + 2 + armSize.y,0}, Coord3D{38,headSize.y + 2,0}, mdl->getValue("fixIP", rowNr), mdl->getValue("fixPin", rowNr)); - - //legs - genFix->matrix(Coord3D{10, 28, 0}, Coord3D{10, 50, 0}, Coord3D{15,28,0}, mdl->getValue("fixIP", rowNr), mdl->getValue("fixPin", rowNr)); - genFix->matrix(Coord3D{23, 28, 0}, Coord3D{23, 50, 0}, Coord3D{28,28,0}, mdl->getValue("fixIP", rowNr), mdl->getValue("fixPin", rowNr)); - - - }); - - } else if (fgValue == f_Globe) { - - print->fFormat(fileName, 31, "F_Globe%d", mdl->getValue("width").as()); - - getPanels(fileName, [](GenFix * genFix, unsigned8 rowNr) { - genFix->globe(mdl->getValue("pnlFirst", rowNr), mdl->getValue("width", rowNr), mdl->getValue("fixIP", rowNr), mdl->getValue("fixPin", rowNr)); - }); - - } else if (fgValue == f_GeodesicDome) { - - strcpy(fileName, "F_GeodesicDome"); - getPanels(fileName, [](GenFix * genFix, unsigned8 rowNr) { - genFix->geodesicDome(mdl->getValue("pnlFirst", rowNr), mdl->getValue("width", rowNr), mdl->getValue("fixIP", rowNr), mdl->getValue("fixPin", rowNr)); - }); - - } - - files->filesChanged = true; - } - - // File openFile(const char * name) { - // char fileName[30] = "/"; - // strncat(fileName, name, sizeof(fileName)-1); - // strncat(fileName, ".json", sizeof(fileName)-1); - - // File f = files->open(fileName, "w"); - // if (!f) - // USER_PRINTF("fixtureGen Could not open file %s for writing\n", fileName); - - // return f; - // } - -}; - -extern LedModFixtureGen *lfg; \ No newline at end of file diff --git a/src/Sys/SysModPins.cpp b/src/Sys/SysModPins.cpp index f998e223..54eb313a 100644 --- a/src/Sys/SysModPins.cpp +++ b/src/Sys/SysModPins.cpp @@ -90,7 +90,7 @@ void SysModPins::setup() { buffer = wsBuf->get(); - // send leds preview to clients + // send pins to clients for (size_t i = 0; i < 20; i++) { buffer[i*3+5] = random(256);// (digitalRead(i)+1) * 50; diff --git a/src/User/UserModArtNet.h b/src/User/UserModArtNet.h deleted file mode 100644 index 3e026a95..00000000 --- a/src/User/UserModArtNet.h +++ /dev/null @@ -1,142 +0,0 @@ -/* - @title StarMod - @file UserModArtNet.h - @date 20240114 - @repo https://github.com/ewowi/StarMod - @Authors https://github.com/ewowi/StarMod/commits/main - @Copyright © 2024 Github StarMod Commit Authors - @license GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - @license For non GPL-v3 usage, commercial licenses must be purchased. Contact moonmodules@icloud.com -*/ - -#define ARTNET_DEFAULT_PORT 6454 - -const size_t ART_NET_HEADER_SIZE = 12; -const byte ART_NET_HEADER[] PROGMEM = {0x41,0x72,0x74,0x2d,0x4e,0x65,0x74,0x00,0x00,0x50,0x00,0x0e}; - -class UserModArtNet:public SysModule { - -public: - - IPAddress targetIp; //tbd: targetip also configurable from fixtures and artnet instead of pin output - - UserModArtNet() :SysModule("ArtNet") { - isEnabled = false; //default off - }; - - //setup filesystem - void setup() { - SysModule::setup(); - - parentVar = ui->initUserMod(parentVar, name, 6100); - - ui->initIP(parentVar, "artInst", UINT16_MAX, false, [this](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - - case f_UIFun: { - ui->setLabel(var, "Instance"); - ui->setComment(var, "Instance to send data"); - JsonArray options = ui->setOptions(var); - JsonArray instanceObject = options.add(); - instanceObject.add(0); - instanceObject.add("no sync"); - for (InstanceInfo &instance : instances->instances) { - if (instance.ip != WiFi.localIP()) { - char option[64] = { 0 }; - strncpy(option, instance.name, sizeof(option)-1); - strncat(option, " ", sizeof(option)-1); - strncat(option, instance.ip.toString().c_str(), sizeof(option)-1); - instanceObject = options.add(); - instanceObject.add(instance.ip[3]); - instanceObject.add(option); - } - } - return true; - } - case f_ChangeFun: { - size_t ddpInst = var["value"]; - if (ddpInst >=0 && ddpInst < instances->instances.size()) { - targetIp = instances->instances[ddpInst].ip; - USER_PRINTF("Start ArtNet to %s\n", targetIp.toString().c_str()); - } - return true; - } - default: return false; - }}); //ddpInst - } - - void loop() { - // SysModule::loop(); - - if(!mdls->isConnected) return; - - if(!targetIp) return; - - if(!eff->newFrame) return; - - // calculate the number of UDP packets we need to send - bool isRGBW = false; - - const size_t channelCount = eff->fixture.nrOfLeds * (isRGBW?4:3); // 1 channel for every R,G,B,(W?) value - const size_t ARTNET_CHANNELS_PER_PACKET = isRGBW?512:510; // 512/4=128 RGBW LEDs, 510/3=170 RGB LEDs - const size_t packetCount = ((channelCount-1)/ARTNET_CHANNELS_PER_PACKET)+1; - - stackUnsigned32 channel = 0; - size_t bufferOffset = 0; - - sequenceNumber++; - - WiFiUDP ddpUdp; - - int bri = mdl->getValue("bri"); - - for (size_t currentPacket = 0; currentPacket < packetCount; currentPacket++) { - - if (sequenceNumber > 255) sequenceNumber = 0; - - if (!ddpUdp.beginPacket(targetIp, ARTNET_DEFAULT_PORT)) { - USER_PRINTF("Art-Net WiFiUDP.beginPacket returned an error\n"); - return; // borked - } - - size_t packetSize = ARTNET_CHANNELS_PER_PACKET; - - if (currentPacket == (packetCount - 1U)) { - // last packet - if (channelCount % ARTNET_CHANNELS_PER_PACKET) { - packetSize = channelCount % ARTNET_CHANNELS_PER_PACKET; - } - } - - byte header_buffer[ART_NET_HEADER_SIZE]; - memcpy_P(header_buffer, ART_NET_HEADER, ART_NET_HEADER_SIZE); - ddpUdp.write(header_buffer, ART_NET_HEADER_SIZE); // This doesn't change. Hard coded ID, OpCode, and protocol version. - ddpUdp.write(sequenceNumber & 0xFF); // sequence number. 1..255 - ddpUdp.write(0x00); // physical - more an FYI, not really used for anything. 0..3 - ddpUdp.write((currentPacket) & 0xFF); // Universe LSB. 1 full packet == 1 full universe, so just use current packet number. - ddpUdp.write(0x00); // Universe MSB, unused. - ddpUdp.write(0xFF & (packetSize >> 8)); // 16-bit length of channel data, MSB - ddpUdp.write(0xFF & (packetSize )); // 16-bit length of channel data, LSB - - for (size_t i = 0; i < eff->fixture.nrOfLeds; i++) { - CRGB pixel = eff->fixture.ledsP[i]; - ddpUdp.write(scale8(pixel.r, bri)); // R - ddpUdp.write(scale8(pixel.g, bri)); // G - ddpUdp.write(scale8(pixel.b, bri)); // B - // if (isRGBW) ddpUdp.write(scale8(buffer[bufferOffset++], bri)); // W - } - - if (!ddpUdp.endPacket()) { - USER_PRINTF("Art-Net WiFiUDP.endPacket returned an error\n"); - return; // borked - } - channel += packetSize; - } - - } - - private: - size_t sequenceNumber = 0; - -}; - -extern UserModArtNet *artnetmod; \ No newline at end of file diff --git a/src/User/UserModDDP.h b/src/User/UserModDDP.h deleted file mode 100644 index ef8d6cab..00000000 --- a/src/User/UserModDDP.h +++ /dev/null @@ -1,165 +0,0 @@ -/* - @title StarMod - @file UserModDDP.h - @date 20240114 - @repo https://github.com/ewowi/StarMod - @Authors https://github.com/ewowi/StarMod/commits/main - @Copyright © 2024 Github StarMod Commit Authors - @license GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - @license For non GPL-v3 usage, commercial licenses must be purchased. Contact moonmodules@icloud.com -*/ - -#define DDP_DEFAULT_PORT 4048 -#define DDP_HEADER_LEN 10 -#define DDP_SYNCPACKET_LEN 10 - -#define DDP_FLAGS1_VER 0xc0 // version mask -#define DDP_FLAGS1_VER1 0x40 // version=1 -#define DDP_FLAGS1_PUSH 0x01 -#define DDP_FLAGS1_QUERY 0x02 -#define DDP_FLAGS1_REPLY 0x04 -#define DDP_FLAGS1_STORAGE 0x08 -#define DDP_FLAGS1_TIME 0x10 - -#define DDP_ID_DISPLAY 1 -#define DDP_ID_CONFIG 250 -#define DDP_ID_STATUS 251 - -// 1440 channels per packet -#define DDP_CHANNELS_PER_PACKET 1440 // 480 leds - -#define DDP_TYPE_RGB24 0x0B // 00 001 011 (RGB , 8 bits per channel, 3 channels) -#define DDP_TYPE_RGBW32 0x1B // 00 011 011 (RGBW, 8 bits per channel, 4 channels) - -class UserModDDP:public SysModule { - -public: - - IPAddress targetIp; //tbd: targetip also configurable from fixtures, and ddp instead of pin output - - UserModDDP() :SysModule("DDP") { - isEnabled = false; //default off - }; - - //setup filesystem - void setup() { - SysModule::setup(); - - parentVar = ui->initUserMod(parentVar, name, 6000); - - ui->initIP(parentVar, "ddpInst", UINT16_MAX, false, [this](JsonObject var, unsigned8 rowNr, unsigned8 funType) { switch (funType) { //varFun - - case f_UIFun: { - ui->setLabel(var, "Instance"); - ui->setComment(var, "Instance to send data"); - JsonArray options = ui->setOptions(var); - JsonArray instanceObject = options.add(); - instanceObject.add(0); - instanceObject.add("no sync"); - for (InstanceInfo &instance : instances->instances) { - if (instance.ip != WiFi.localIP()) { - char option[64] = { 0 }; - strncpy(option, instance.name, sizeof(option)-1); - strncat(option, " ", sizeof(option)-1); - strncat(option, instance.ip.toString().c_str(), sizeof(option)-1); - instanceObject = options.add(); - instanceObject.add(instance.ip[3]); - instanceObject.add(option); - } - } - return true; - } - case f_ChangeFun: { - size_t ddpInst = var["value"]; - if (ddpInst >=0 && ddpInst < instances->instances.size()) { - targetIp = instances->instances[ddpInst].ip; - USER_PRINTF("Start DDP to %s\n", targetIp.toString().c_str()); - } - return true; - } - default: return false; - }}); //ddpInst - } - - void loop() { - // SysModule::loop(); - - if(!mdls->isConnected) return; - - if(!targetIp) return; - - if(!eff->newFrame) return; - - // calculate the number of UDP packets we need to send - bool isRGBW = false; - - const size_t channelCount = eff->fixture.nrOfLeds * (isRGBW? 4:3); // 1 channel for every R,G,B,(W?) value - const size_t packetCount = ((channelCount-1) / DDP_CHANNELS_PER_PACKET) +1; - - stackUnsigned32 channel = 0; - size_t bufferOffset = 0; - - sequenceNumber++; - - WiFiUDP ddpUdp; - - int bri = mdl->getValue("bri"); - - for (size_t currentPacket = 0; currentPacket < packetCount; currentPacket++) { - - if (sequenceNumber > 15) sequenceNumber = 0; - - if (!ddpUdp.beginPacket(targetIp, DDP_DEFAULT_PORT)) { // port defined in ESPAsyncE131.h - USER_PRINTF("DDP WiFiUDP.beginPacket returned an error\n"); - return; // borked - } - - // the amount of data is AFTER the header in the current packet - size_t packetSize = DDP_CHANNELS_PER_PACKET; - - byte flags = DDP_FLAGS1_VER1; - if (currentPacket == (packetCount - 1U)) { - // last packet, set the push flag - // TODO: determine if we want to send an empty push packet to each destination after sending the pixel data - flags = DDP_FLAGS1_VER1 | DDP_FLAGS1_PUSH; - if (channelCount % DDP_CHANNELS_PER_PACKET) { - packetSize = channelCount % DDP_CHANNELS_PER_PACKET; - } - } - - // write the header - /*0*/ddpUdp.write(flags); - /*1*/ddpUdp.write(sequenceNumber++ & 0x0F); // sequence may be unnecessary unless we are sending twice (as requested in Sync settings) - /*2*/ddpUdp.write(isRGBW ? DDP_TYPE_RGBW32 : DDP_TYPE_RGB24); - /*3*/ddpUdp.write(DDP_ID_DISPLAY); - // data offset in bytes, 32-bit number, MSB first - /*4*/ddpUdp.write(0xFF & (channel >> 24)); - /*5*/ddpUdp.write(0xFF & (channel >> 16)); - /*6*/ddpUdp.write(0xFF & (channel >> 8)); - /*7*/ddpUdp.write(0xFF & (channel )); - // data length in bytes, 16-bit number, MSB first - /*8*/ddpUdp.write(0xFF & (packetSize >> 8)); - /*9*/ddpUdp.write(0xFF & (packetSize )); - - for (size_t i = 0; i < eff->fixture.nrOfLeds; i++) { - CRGB pixel = eff->fixture.ledsP[i]; - ddpUdp.write(scale8(pixel.r, bri)); // R - ddpUdp.write(scale8(pixel.g, bri)); // G - ddpUdp.write(scale8(pixel.b, bri)); // B - // if (isRGBW) ddpUdp.write(scale8(buffer[bufferOffset++], bri)); // W - } - - if (!ddpUdp.endPacket()) { - USER_PRINTF("DDP WiFiUDP.endPacket returned an error\n"); - return; // problem - } - channel += packetSize; - } - } - - private: - size_t sequenceNumber = 0; - -}; - -extern UserModDDP *ddpmod; \ No newline at end of file diff --git a/src/User/UserModExample.h b/src/User/UserModExample.h index 68db486d..d3ac4369 100644 --- a/src/User/UserModExample.h +++ b/src/User/UserModExample.h @@ -9,11 +9,11 @@ @license For non GPL-v3 usage, commercial licenses must be purchased. Contact moonmodules@icloud.com */ -class UserModExample:public SysModuleule { +class UserModExample: public SysModule { public: - UserModExample() :SysModule(le("Usermod example") { + UserModExample() :SysModule("Usermod example") { }; //setup filesystem diff --git a/src/User/UserModWLEDAudio.h b/src/User/UserModWLEDAudio.h deleted file mode 100644 index 2b436947..00000000 --- a/src/User/UserModWLEDAudio.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - @title StarMod - @file UserModWLEDAudio.h - @date 20240114 - @repo https://github.com/ewowi/StarMod - @Authors https://github.com/ewowi/StarMod/commits/main - @Copyright © 2024 Github StarMod Commit Authors - @license GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - @license For non GPL-v3 usage, commercial licenses must be purchased. Contact moonmodules@icloud.com -*/ - -#pragma once - -#include // https://github.com/netmindz/WLED-sync - -#define MAX_FREQUENCY 11025 // sample frequency / 2 (as per Nyquist criterion) - -enum UM_SoundSimulations { - UMS_BeatSin = 0, - UMS_WeWillRockYou -}; - - -class UserModWLEDAudio:public SysModule { - -public: - - WLEDSync sync; - byte fftResults[NUM_GEQ_CHANNELS]= {0}; - float volumeSmth; - - UserModWLEDAudio() :SysModule("WLED Audio Sync Receiver") { - }; - - //setup filesystem - void setup() { - SysModule::setup(); - parentVar = ui->initUserMod(parentVar, name, 6300); - - ui->initText(parentVar, "wledAudioStatus", nullptr, 16, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun - case f_UIFun: - ui->setLabel(var, "Status:"); - return true; - default: return false; - }}); - - } - - void onOffChanged() { - if (mdls->isConnected && isEnabled) { - sync.begin(); - } else { - // sync.end();??? - } - } - - bool isTimeout() { - return ((millis() - lastData) > 10000); - } - - void loop() { - // SysModule::loop(); - if (mdls->isConnected && sync.read()) { - lastData = millis(); - if(debug) USER_PRINTF("WLED-Sync: "); - for (int b = 0; b < NUM_GEQ_CHANNELS; b++) { - byte val = sync.fftResult[b]; - fftResults[b] = val; - if(debug) USER_PRINTF("%u ", val); - } - volumeSmth = sync.volumeSmth; - if(debug) USER_PRINTF("\n"); - } - else if((lastData == 0) || isTimeout()) { // Could also check for non-silent - simulateSound(UMS_BeatSin); - } - } - - void loop10s() { - // USER_PRINTF("%d, %s, %d\n", sync.receivedFormat, sync.sourceIP.toString().c_str(), sync.lastPacketTime); - String msg = ""; - if((lastData != 0) && isTimeout()) { - msg = sync.sourceIP.toString() + " Timeout " + ((millis() - lastData) / 1000) +"s"; - } - else { - switch(sync.receivedFormat) { - case -1: msg = "Not connected"; - break; - case 1: msg = "V1 from " + sync.sourceIP.toString(); - break; - case 2: msg = "V2 from " + sync.sourceIP.toString(); - break; - default: msg = "Unknown"; - break; - } - } - mdl->setUIValueV("wledAudioStatus", "%s", msg.c_str()); - } - - private: - boolean debug = false; - unsigned long lastData = 0; - - void simulateSound(uint8_t simulationId) - { - uint8_t samplePeak; - float FFT_MajorPeak; - uint8_t maxVol; - uint8_t binNum; - - uint16_t volumeRaw; - float my_magnitude; - - uint32_t ms = millis(); - - switch (simulationId) { - default: - case UMS_BeatSin: - for (int i = 0; i<16; i++) - fftResults[i] = beatsin8(120 / (i+1), 0, 255); - // fftResults[i] = (beatsin8(120, 0, 255) + (256/16 * i)) % 256; - volumeSmth = fftResults[8]; - break; - case UMS_WeWillRockYou: - if (ms%2000 < 200) { - volumeSmth = random8(255); - for (int i = 0; i<5; i++) - fftResults[i] = random8(255); - } - else if (ms%2000 < 400) { - volumeSmth = 0; - for (int i = 0; i<16; i++) - fftResults[i] = 0; - } - else if (ms%2000 < 600) { - volumeSmth = random8(255); - for (int i = 5; i<11; i++) - fftResults[i] = random8(255); - } - else if (ms%2000 < 800) { - volumeSmth = 0; - for (int i = 0; i<16; i++) - fftResults[i] = 0; - } - else if (ms%2000 < 1000) { - volumeSmth = random8(255); - for (int i = 11; i<16; i++) - fftResults[i] = random8(255); - } - else { - volumeSmth = 0; - for (int i = 0; i<16; i++) - fftResults[i] = 0; - } - break; - } - - // samplePeak = random8() > 250; - // FFT_MajorPeak = 21 + (volumeSmth*volumeSmth) / 8.0f; // WLEDMM 21hz...8200hz - // maxVol = 31; // this gets feedback fro UI - // binNum = 8; // this gets feedback fro UI - // volumeRaw = volumeSmth; - // my_magnitude = 10000.0f / 8.0f; //no idea if 10000 is a good value for FFT_Magnitude ??? - // if (volumeSmth < 1 ) my_magnitude = 0.001f; // noise gate closed - mute - - } - - -}; - -extern UserModWLEDAudio *wledAudioMod; \ No newline at end of file diff --git a/src/html_ui.h b/src/html_ui.h index b3a9868b..9e0bed45 100644 --- a/src/html_ui.h +++ b/src/html_ui.h @@ -7,1385 +7,1297 @@ */ // Autogenerated from data/index.htm, do not edit!! -const uint16_t PAGE_index_L = 22049; +const uint16_t PAGE_index_L = 20651; const uint8_t PAGE_index[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xd5, 0xbd, 0xcb, 0x76, 0xe3, 0x48, - 0xb2, 0x20, 0xb8, 0x8f, 0xaf, 0x00, 0x91, 0x51, 0x0c, 0x20, 0x08, 0x52, 0x7c, 0x89, 0x92, 0x40, - 0x41, 0xbc, 0xf1, 0xca, 0xcc, 0xc8, 0x8a, 0x57, 0xa5, 0x22, 0x32, 0x2b, 0x53, 0xa1, 0x4a, 0x81, - 0xa4, 0x53, 0x42, 0x06, 0x04, 0x30, 0x01, 0x50, 0x8f, 0x24, 0xf9, 0x07, 0xdd, 0xbd, 0xe8, 0xbe, - 0x8b, 0xbb, 0xab, 0xd3, 0xb3, 0xea, 0x39, 0xbd, 0x9d, 0xf5, 0x2c, 0xe6, 0x53, 0xee, 0x17, 0xd4, - 0x27, 0x8c, 0x99, 0xf9, 0x03, 0x0e, 0x10, 0x94, 0x22, 0xaa, 0xea, 0xf6, 0xf4, 0x54, 0x56, 0x88, - 0x80, 0xc3, 0x1f, 0xe6, 0xe6, 0x66, 0xe6, 0x66, 0xe6, 0xee, 0xe6, 0xc6, 0x61, 0xed, 0xf9, 0xdb, - 0x67, 0xef, 0x7f, 0x7a, 0xf7, 0xc2, 0xb8, 0xc8, 0x2e, 0xc3, 0x23, 0xe3, 0x50, 0xfe, 0x30, 0x7f, - 0x0a, 0x3f, 0x97, 0x2c, 0xf3, 0x8d, 0xc9, 0x85, 0x9f, 0xa4, 0x2c, 0xf3, 0xcc, 0x45, 0x36, 0x6b, - 0xee, 0x9b, 0x90, 0x9c, 0x05, 0x59, 0xc8, 0x8e, 0x1e, 0x1c, 0x67, 0x7e, 0xf2, 0x3a, 0x9e, 0xfe, - 0xed, 0xaf, 0xff, 0xf5, 0x7f, 0x1a, 0xaf, 0x5e, 0x3c, 0x4f, 0x8d, 0xbf, 0xfd, 0xf5, 0xbf, 0xfc, - 0x0f, 0x63, 0x7c, 0x6b, 0xbc, 0x8e, 0xe3, 0x08, 0x3e, 0x2c, 0x42, 0x86, 0x69, 0xff, 0xe9, 0x5f, - 0x0f, 0x77, 0x78, 0x09, 0xe3, 0x30, 0xcd, 0x6e, 0xb1, 0xa4, 0x9b, 0xc4, 0x71, 0xe6, 0xd0, 0xdf, - 0x56, 0x0a, 0xb5, 0x5c, 0xc6, 0xd3, 0x65, 0xb3, 0x39, 0x3e, 0x6f, 0x4e, 0xe2, 0x30, 0x4e, 0xdc, - 0x30, 0x88, 0x98, 0x9f, 0x34, 0xcf, 0x13, 0x7f, 0x1a, 0xb0, 0x28, 0xb3, 0xb2, 0xd8, 0x18, 0xc7, - 0x59, 0x16, 0x5f, 0x3a, 0xc6, 0x57, 0xb3, 0xd9, 0x98, 0xf5, 0x7a, 0x46, 0xfb, 0x0f, 0xf0, 0x3c, - 0x1e, 0xb4, 0x67, 0x83, 0xae, 0xd1, 0x69, 0xb7, 0xff, 0x60, 0x0f, 0x9b, 0xcd, 0x8c, 0xdd, 0x64, - 0xa2, 0x86, 0xaf, 0xda, 0x3d, 0xfc, 0x0f, 0x13, 0x2f, 0x64, 0x12, 0xcf, 0xbd, 0xdf, 0x81, 0xc4, - 0x52, 0x1a, 0xa4, 0x8c, 0xe3, 0x64, 0xca, 0x12, 0x99, 0x3c, 0x18, 0x0c, 0x20, 0x2d, 0x65, 0x21, - 0x9b, 0xa8, 0x1a, 0xbf, 0xa6, 0xff, 0x41, 0xf2, 0x2c, 0x8e, 0xb2, 0x66, 0x1a, 0xfc, 0xce, 0xdc, - 0x4e, 0x7b, 0x7e, 0xb3, 0xe6, 0xbd, 0xb8, 0x0e, 0x59, 0xa1, 0x0b, 0x5f, 0x75, 0xba, 0xf8, 0x5f, - 0x09, 0xaa, 0xd9, 0x6c, 0xa6, 0x83, 0x94, 0x9c, 0x8f, 0xad, 0xee, 0xee, 0xae, 0x63, 0x74, 0x06, - 0x6d, 0xc7, 0x68, 0xdb, 0x1a, 0x64, 0x15, 0x9f, 0x0a, 0x20, 0x56, 0x7c, 0x2f, 0x80, 0x5b, 0xf1, - 0xbd, 0x12, 0x6e, 0xc0, 0xf1, 0x2d, 0x63, 0xd1, 0xe7, 0x62, 0xff, 0x60, 0xef, 0xa0, 0x7b, 0xd0, - 0xe7, 0xd8, 0xef, 0xef, 0xf5, 0x77, 0xfb, 0xd5, 0xd8, 0x9f, 0x8d, 0x67, 0xfd, 0x59, 0xbf, 0x80, - 0xfd, 0x6e, 0xa7, 0xbf, 0xdf, 0x1d, 0xeb, 0xb8, 0x57, 0x29, 0x45, 0xdc, 0xab, 0xe4, 0x22, 0xfa, - 0x55, 0x72, 0xb1, 0x1b, 0x7a, 0x42, 0x33, 0x75, 0xf7, 0x55, 0xc7, 0xa6, 0xec, 0xea, 0xfe, 0xf1, - 0x98, 0xcc, 0xa6, 0xed, 0x83, 0x41, 0x01, 0xce, 0x49, 0x77, 0x8f, 0xd1, 0xe8, 0x6f, 0xa6, 0x14, - 0xe1, 0x9c, 0x4c, 0xfd, 0xe9, 0xc0, 0xdf, 0x80, 0xb3, 0xe3, 0xef, 0xfb, 0x34, 0xca, 0xa1, 0x3f, - 0x66, 0xa1, 0x4c, 0xdd, 0xef, 0x4d, 0x76, 0x19, 0x42, 0x3f, 0x89, 0x2f, 0x2f, 0x01, 0xa9, 0x32, - 0x7d, 0xf7, 0x60, 0xdf, 0xef, 0xf7, 0xb6, 0x0d, 0x4e, 0x18, 0x9c, 0x5f, 0x64, 0x85, 0x5e, 0x08, - 0x02, 0xd2, 0xba, 0xd0, 0xe9, 0xf6, 0x74, 0x60, 0xdb, 0xf4, 0xbf, 0x42, 0x8f, 0x06, 0xd3, 0xc1, - 0xfe, 0xc0, 0x27, 0xba, 0x2f, 0x82, 0x2a, 0x3f, 0x48, 0x8c, 0xf9, 0xc9, 0xa7, 0xfb, 0x51, 0x36, - 0x38, 0x18, 0x4c, 0xf7, 0xa6, 0xa2, 0xc8, 0x38, 0x5c, 0xb0, 0x42, 0x91, 0xf6, 0x6e, 0xef, 0x60, - 0xf0, 0xb4, 0x54, 0xe4, 0xc5, 0xde, 0xd7, 0x9d, 0xaf, 0x5f, 0x7c, 0x3e, 0x2f, 0x16, 0xa1, 0x94, - 0x59, 0x45, 0x93, 0xf3, 0x20, 0xfa, 0x54, 0x42, 0xc9, 0xc4, 0x9f, 0xf6, 0x4b, 0x4d, 0xb2, 0xbd, - 0xdd, 0xfe, 0x7e, 0x7b, 0xa3, 0x2e, 0x9e, 0x2c, 0x6a, 0x4a, 0xe7, 0xfe, 0xa4, 0x04, 0x3d, 0xc7, - 0x9c, 0x4e, 0xc8, 0xdd, 0xf1, 0xb4, 0x43, 0x63, 0x7f, 0xde, 0x5c, 0x24, 0xa1, 0x0b, 0xff, 0xac, - 0x47, 0x53, 0x3f, 0xf3, 0x5d, 0x7f, 0x3e, 0x0f, 0x83, 0x89, 0x9f, 0x05, 0x71, 0xb4, 0x13, 0x4f, - 0x32, 0x06, 0xa3, 0x97, 0x25, 0xcc, 0xbf, 0x1c, 0x8e, 0xfd, 0x94, 0x0d, 0xfa, 0xce, 0x23, 0xc5, - 0x72, 0x33, 0xff, 0x32, 0x08, 0x6f, 0xdd, 0x47, 0xef, 0x12, 0x96, 0xa6, 0x06, 0x0a, 0xcd, 0xcc, - 0xe8, 0xbe, 0x7b, 0xe4, 0x4c, 0x16, 0x49, 0x1a, 0x5c, 0x31, 0x01, 0x4d, 0x74, 0xeb, 0x47, 0x45, - 0x60, 0x3a, 0xbd, 0xde, 0x60, 0xaf, 0x52, 0x80, 0xfc, 0x13, 0x80, 0x79, 0x16, 0x5f, 0x06, 0x13, - 0xe3, 0x0d, 0x5b, 0xb0, 0x12, 0x20, 0x00, 0xc3, 0xa4, 0xd9, 0x81, 0xc1, 0xef, 0xe0, 0xe0, 0x4c, - 0x9a, 0x33, 0xd9, 0xe8, 0xa4, 0xd9, 0x05, 0x2e, 0xec, 0x76, 0xe9, 0xb1, 0xe7, 0x7e, 0xd5, 0xeb, - 0xf5, 0xe8, 0xb1, 0xef, 0x7e, 0xd5, 0xef, 0xf7, 0xe9, 0x71, 0x17, 0x08, 0x7a, 0x77, 0x97, 0x1e, - 0x07, 0x52, 0x88, 0x4e, 0x9a, 0xfb, 0x40, 0xfe, 0xfb, 0xfb, 0xf4, 0x38, 0x86, 0xe1, 0x1c, 0x13, - 0x1b, 0x34, 0x27, 0xc0, 0x41, 0x93, 0x09, 0x3d, 0x32, 0x18, 0x18, 0xc6, 0xe8, 0x71, 0xea, 0x7e, - 0x35, 0x9d, 0x4e, 0xe9, 0x11, 0x59, 0xac, 0xc7, 0x5b, 0x3b, 0x87, 0x86, 0x27, 0x1c, 0x9c, 0x10, - 0x5a, 0xdb, 0xf7, 0xe9, 0xf1, 0xd6, 0xfd, 0xca, 0x3f, 0xa0, 0x01, 0x83, 0x7a, 0xdb, 0x2d, 0xde, - 0x6e, 0x8c, 0x92, 0xcf, 0xb7, 0x7a, 0x7d, 0xc7, 0x90, 0xff, 0xda, 0xad, 0x03, 0x9b, 0xbe, 0x65, - 0xe3, 0xcd, 0x8f, 0x57, 0x7e, 0x62, 0x51, 0x0d, 0xb6, 0xcc, 0xe3, 0xf3, 0x4c, 0x9d, 0x76, 0x17, - 0x84, 0xa7, 0xfa, 0xb3, 0x99, 0xef, 0x82, 0xe7, 0xdb, 0xed, 0x38, 0x86, 0xfc, 0x57, 0xcc, 0x94, - 0x5d, 0xb8, 0x7b, 0x5c, 0x42, 0x65, 0x73, 0xf9, 0x04, 0xa5, 0x06, 0x3d, 0x9e, 0x36, 0x9e, 0xbb, - 0x9d, 0xfe, 0xfc, 0xc6, 0xe0, 0x7f, 0xda, 0xe2, 0x09, 0xf3, 0xc0, 0x97, 0x03, 0x78, 0x6d, 0x1b, - 0x7b, 0xf8, 0x97, 0x4a, 0x4d, 0xdd, 0x28, 0x8e, 0x10, 0x45, 0xe9, 0xf9, 0xdc, 0x35, 0xc7, 0x61, - 0x3c, 0xf9, 0x64, 0xe2, 0x87, 0xcb, 0xcc, 0x45, 0x71, 0x31, 0x8e, 0xa7, 0xb7, 0x4b, 0x7d, 0x7c, - 0x9f, 0x24, 0x81, 0x1f, 0x3a, 0xdf, 0xb2, 0xf0, 0x8a, 0x65, 0x40, 0x18, 0x4e, 0xea, 0x47, 0x29, - 0xf0, 0x42, 0x12, 0xcc, 0x80, 0x24, 0x26, 0x9f, 0xce, 0x93, 0x78, 0x11, 0x4d, 0x39, 0xc1, 0x73, - 0xca, 0x12, 0xa0, 0x2b, 0x52, 0xb3, 0x87, 0xb9, 0x44, 0xe2, 0xdf, 0xd4, 0xbb, 0xbd, 0xbe, 0xe8, - 0x38, 0x17, 0xdd, 0xa5, 0x5e, 0xf0, 0x42, 0x96, 0xc2, 0xc9, 0xa3, 0x79, 0xc1, 0x50, 0x70, 0xb9, - 0xbb, 0x00, 0xd9, 0x34, 0xb8, 0x5a, 0xea, 0x69, 0xdd, 0x35, 0xc9, 0xc5, 0xe5, 0xa5, 0x9f, 0x9c, - 0x07, 0x51, 0x33, 0xa1, 0xc4, 0x01, 0xf4, 0x5b, 0xaf, 0x4d, 0x13, 0x9d, 0xf6, 0x5a, 0x48, 0x4c, - 0xde, 0x3d, 0xd2, 0x1f, 0xdc, 0x20, 0xf3, 0x81, 0xdc, 0x87, 0xa2, 0x8e, 0x90, 0xcd, 0x36, 0xab, - 0x28, 0xc8, 0x59, 0x7b, 0x1d, 0x44, 0xf3, 0x45, 0xb6, 0xd4, 0xba, 0xde, 0x36, 0x3e, 0xa7, 0xe7, - 0x38, 0x9d, 0x70, 0x09, 0xf2, 0xf7, 0x95, 0x8d, 0xe7, 0xc8, 0x92, 0xcb, 0x6d, 0x99, 0xb5, 0x3a, - 0xf9, 0x47, 0xc9, 0xfd, 0xf6, 0xda, 0xaf, 0x46, 0x2f, 0x95, 0x9e, 0xb2, 0x49, 0x9c, 0x10, 0xb3, - 0x13, 0x55, 0xac, 0x31, 0xd1, 0x07, 0x76, 0x5f, 0x5e, 0x07, 0x53, 0x20, 0x3a, 0x9c, 0x90, 0x87, - 0x02, 0xdd, 0xf4, 0x2c, 0xe6, 0x2d, 0x9c, 0xcf, 0x17, 0xa9, 0xdb, 0xe9, 0x02, 0xaa, 0x3e, 0xaf, - 0x37, 0xeb, 0x89, 0x1f, 0x5d, 0xf9, 0xe9, 0x97, 0xd4, 0x4b, 0x49, 0x6e, 0x07, 0x08, 0x37, 0x8d, - 0xc3, 0x60, 0x6a, 0x10, 0x89, 0x95, 0x5b, 0x03, 0x79, 0x03, 0xcd, 0x4d, 0xd9, 0xcc, 0x5f, 0x84, - 0xd9, 0xba, 0x05, 0xda, 0x9f, 0x1f, 0x2e, 0xe7, 0x71, 0x1a, 0x50, 0x9f, 0x66, 0xc1, 0x0d, 0x9b, - 0x0e, 0x69, 0x54, 0xa1, 0x28, 0x69, 0x1e, 0xf0, 0xc0, 0x29, 0xa5, 0x3d, 0xcc, 0xe2, 0xb9, 0xab, - 0xd7, 0xd8, 0x2c, 0x8c, 0x7a, 0x33, 0x06, 0x1c, 0x25, 0x40, 0xec, 0xb3, 0x38, 0xb9, 0x74, 0xe9, - 0x29, 0xf4, 0x33, 0xf6, 0x93, 0xc5, 0xb5, 0x14, 0x4a, 0xe0, 0xad, 0xa8, 0x5c, 0x46, 0xab, 0x9f, - 0x0e, 0xe7, 0xfe, 0x74, 0x1a, 0x44, 0xe7, 0x38, 0x68, 0xc3, 0xf8, 0x8a, 0x25, 0xb3, 0x30, 0xbe, - 0x76, 0xfd, 0x45, 0x16, 0x97, 0x3a, 0xd9, 0x87, 0x4e, 0xae, 0x5b, 0x11, 0x52, 0xb5, 0x4e, 0x7d, - 0x34, 0x67, 0xb7, 0x32, 0x7f, 0x1c, 0xb2, 0xcf, 0x66, 0x43, 0xa5, 0x4c, 0x84, 0xfe, 0x3c, 0x65, - 0xae, 0x7c, 0x18, 0x6a, 0xc8, 0x2e, 0x21, 0xb8, 0xad, 0x10, 0x2c, 0xf8, 0xe0, 0x22, 0x98, 0x4e, - 0x59, 0x04, 0x69, 0x37, 0xcd, 0xf4, 0xc2, 0x9f, 0x02, 0xc8, 0x80, 0x5e, 0xf8, 0x0f, 0xd1, 0x8f, - 0xe2, 0x57, 0x80, 0x64, 0x64, 0x53, 0x47, 0x3e, 0x5d, 0x2c, 0xab, 0x87, 0x48, 0x22, 0x00, 0xf9, - 0x08, 0xfa, 0x8f, 0xd0, 0x86, 0x4d, 0xe0, 0xb2, 0x73, 0xc0, 0x54, 0x3c, 0x5f, 0xe7, 0xc5, 0x89, - 0x3c, 0xf8, 0x07, 0xec, 0xfa, 0xb6, 0x91, 0xc8, 0x14, 0xc9, 0x6e, 0x65, 0xec, 0xd6, 0xe5, 0x34, - 0x7c, 0x06, 0xc8, 0xf2, 0x41, 0x3c, 0x24, 0xdd, 0xe5, 0x34, 0x48, 0xe7, 0xa1, 0x7f, 0xeb, 0x9e, - 0x27, 0xc1, 0x74, 0x88, 0x7f, 0x80, 0x12, 0x2f, 0xe7, 0x38, 0x7a, 0x58, 0x60, 0x71, 0x19, 0xa5, - 0x6e, 0xc2, 0xe6, 0xcc, 0xcf, 0xac, 0xae, 0xd3, 0x99, 0x95, 0xcb, 0xf7, 0xbe, 0xa0, 0x7c, 0xaf, - 0xa2, 0x7c, 0xff, 0x0b, 0xca, 0xf7, 0x45, 0x79, 0x98, 0x75, 0x81, 0x74, 0x1d, 0xa4, 0x5f, 0x30, - 0x75, 0x9c, 0x56, 0x7a, 0x9b, 0xd2, 0xfb, 0x02, 0x46, 0x18, 0x2d, 0x1a, 0x81, 0xe9, 0xae, 0xc2, - 0xb4, 0x60, 0x72, 0x4d, 0x8d, 0xbc, 0x4b, 0x06, 0x54, 0x0d, 0xbf, 0x1c, 0x26, 0x10, 0xad, 0x42, - 0xfc, 0xd1, 0xa3, 0xe0, 0xa8, 0x4b, 0x20, 0x5d, 0x09, 0x56, 0x0b, 0xc9, 0xd8, 0xe1, 0x7d, 0x44, - 0xe8, 0xe5, 0x3b, 0xc1, 0x2a, 0x5e, 0x38, 0xc0, 0xe2, 0x45, 0x40, 0x4d, 0x6f, 0x3a, 0xe8, 0x53, - 0xe0, 0x40, 0x56, 0x09, 0xfb, 0xfa, 0xab, 0x49, 0x1c, 0x45, 0x41, 0x34, 0x2d, 0xf3, 0xae, 0x60, - 0x5a, 0x20, 0xa1, 0x89, 0x25, 0xca, 0x5d, 0xd8, 0x46, 0xc3, 0x00, 0x50, 0x6d, 0xce, 0xd8, 0xfd, - 0x52, 0x5f, 0x8a, 0x5d, 0xdd, 0x2d, 0x48, 0x28, 0xa9, 0xfb, 0xe0, 0x64, 0xff, 0x7b, 0x13, 0x9a, - 0x63, 0x37, 0x6e, 0xb3, 0x0b, 0x24, 0x19, 0xc7, 0x61, 0x16, 0xcc, 0xf3, 0xc6, 0x13, 0x06, 0xa3, - 0x05, 0x8a, 0xcc, 0x50, 0x0e, 0x65, 0x10, 0xd1, 0xd4, 0x43, 0xd3, 0xa5, 0x6c, 0x42, 0xc0, 0xd6, - 0xc9, 0x7b, 0x86, 0xf4, 0xaf, 0x6a, 0x33, 0xe4, 0x03, 0xd2, 0xf9, 0xf2, 0x2a, 0x48, 0x83, 0x71, - 0x10, 0x06, 0xd9, 0xad, 0xe4, 0x35, 0xc1, 0x9d, 0xdd, 0x76, 0x15, 0x88, 0xe5, 0x01, 0xdc, 0x9c, - 0xb2, 0xb6, 0x4f, 0x51, 0x43, 0x8d, 0xb1, 0x26, 0x90, 0xcc, 0x12, 0x1d, 0x41, 0x46, 0xbb, 0x84, - 0x22, 0xe4, 0x53, 0xd5, 0x71, 0x7f, 0x0c, 0xf4, 0xb5, 0xc8, 0x98, 0x42, 0x4f, 0x47, 0x0e, 0x41, - 0xa7, 0xbb, 0xfb, 0x07, 0x8e, 0xf1, 0x5d, 0x90, 0x27, 0xba, 0xc8, 0x6a, 0x0e, 0xb0, 0x0b, 0x31, - 0xe8, 0xc0, 0xd8, 0xbb, 0xb6, 0x2e, 0x1a, 0x45, 0xa2, 0xd1, 0xea, 0xa5, 0xd5, 0x78, 0x71, 0x5d, - 0x7f, 0x06, 0x00, 0xc2, 0x14, 0x05, 0x70, 0x46, 0x99, 0x6b, 0x9a, 0x15, 0xb0, 0xa0, 0xa0, 0x26, - 0x29, 0x56, 0xdd, 0xbc, 0x36, 0xea, 0x1c, 0xa7, 0xbb, 0x65, 0xe9, 0x46, 0x3c, 0x33, 0x2c, 0x1a, - 0x5d, 0xa0, 0x5e, 0x1a, 0x04, 0xe9, 0x1c, 0x26, 0xbc, 0x28, 0xdb, 0xf6, 0xac, 0xc0, 0x76, 0x2f, - 0x90, 0x9c, 0xb7, 0x0e, 0x2a, 0x3d, 0x86, 0x4c, 0xa1, 0xa1, 0xb3, 0x6e, 0xf1, 0xe9, 0x1e, 0x8c, - 0xf9, 0x0d, 0xc6, 0xd4, 0x4d, 0x09, 0x7b, 0xfd, 0xe0, 0x70, 0x87, 0x3b, 0x33, 0x8c, 0xc3, 0x74, - 0x92, 0x40, 0xd5, 0x47, 0x0f, 0x76, 0x76, 0x8c, 0x7f, 0x81, 0x41, 0x66, 0x51, 0xca, 0x0c, 0xc3, - 0xf8, 0xe6, 0xcd, 0x07, 0xe3, 0x9b, 0x17, 0x6f, 0x5e, 0x7c, 0xff, 0xe4, 0x95, 0xf1, 0xee, 0xc3, - 0xd3, 0x57, 0x2f, 0x9f, 0x19, 0xf0, 0xef, 0xc5, 0x9b, 0xe3, 0x17, 0xc6, 0x0f, 0x0c, 0x14, 0xee, - 0x38, 0x32, 0x7a, 0x8e, 0xd1, 0x3d, 0x30, 0xbe, 0x5b, 0x44, 0xcc, 0xe8, 0xb6, 0xdb, 0x7b, 0xa5, - 0x0a, 0xbe, 0x8e, 0x13, 0x03, 0xe6, 0x77, 0xe3, 0x9b, 0x77, 0xaf, 0x9a, 0x57, 0x3d, 0x63, 0x91, - 0xfa, 0xe7, 0xcc, 0x31, 0x88, 0x6a, 0x92, 0x09, 0xcc, 0x2b, 0x86, 0xc8, 0x9a, 0x1a, 0x97, 0x8b, - 0x34, 0x33, 0xc6, 0xcc, 0x98, 0x2f, 0x92, 0xc9, 0x05, 0x68, 0xfc, 0xd3, 0x96, 0x41, 0x82, 0x6d, - 0x92, 0x19, 0x97, 0x71, 0x1c, 0x71, 0x9e, 0x4f, 0xff, 0x25, 0x98, 0x84, 0xf1, 0x62, 0xda, 0x82, - 0x1a, 0x1e, 0xcc, 0x16, 0xd1, 0x04, 0x87, 0xcb, 0x00, 0x61, 0xf1, 0xc6, 0xbf, 0x64, 0x96, 0xbd, - 0x4c, 0x58, 0xb6, 0x48, 0x22, 0xf3, 0x15, 0x9b, 0x9a, 0x6b, 0xf5, 0x19, 0x85, 0xc2, 0xd7, 0x8b, - 0xc8, 0x62, 0xf6, 0x32, 0x98, 0x59, 0x1d, 0xcf, 0x63, 0x27, 0xed, 0xd3, 0x7a, 0xfd, 0xd7, 0x34, - 0x8e, 0x7e, 0xf0, 0xc1, 0xf8, 0x4b, 0x5b, 0xf3, 0xab, 0x80, 0x5d, 0xcb, 0xd2, 0xc6, 0x3c, 0x61, - 0xf8, 0xde, 0x7b, 0x6e, 0x9d, 0xbf, 0x9c, 0x5a, 0x26, 0x7d, 0x34, 0x6d, 0x87, 0xd9, 0x4e, 0xad, - 0xbd, 0xe6, 0x79, 0x6a, 0x9d, 0xbc, 0x7a, 0x91, 0xbd, 0xfb, 0xdc, 0x62, 0x4e, 0x64, 0x2f, 0x43, - 0x06, 0xa3, 0xe8, 0xb1, 0xd6, 0x39, 0xcb, 0x10, 0x7e, 0x18, 0x2c, 0xcb, 0xec, 0x4e, 0xa1, 0x7c, - 0xea, 0xed, 0x0e, 0xa1, 0xfd, 0xac, 0x35, 0x09, 0x99, 0x9f, 0x7c, 0x0f, 0xc3, 0x60, 0xb5, 0x9d, - 0xb6, 0xc3, 0x5a, 0x44, 0x3a, 0xf0, 0xcb, 0xd5, 0x12, 0xdb, 0xd9, 0x04, 0x0c, 0xeb, 0x0c, 0xbd, - 0xd7, 0x7e, 0x76, 0xd1, 0xba, 0x0c, 0xa0, 0x23, 0xbc, 0xc8, 0x4e, 0x39, 0x63, 0xa9, 0xa6, 0xcd, - 0xef, 0xb2, 0x85, 0x80, 0xd7, 0x05, 0x0a, 0x42, 0x9c, 0x58, 0xb2, 0xba, 0x66, 0xf8, 0xb8, 0xba, - 0x42, 0x7b, 0xa7, 0x6b, 0x23, 0xe4, 0x1b, 0x5f, 0xe3, 0x45, 0x06, 0x1a, 0x69, 0x6a, 0x83, 0x06, - 0x82, 0x22, 0xd2, 0x88, 0x8d, 0x78, 0x66, 0x6c, 0xcd, 0x05, 0x35, 0xc4, 0xad, 0xf1, 0x62, 0x36, - 0x63, 0x89, 0x2a, 0xe1, 0x63, 0x09, 0x95, 0x1a, 0x9d, 0xa4, 0xa7, 0x0d, 0xf8, 0xd3, 0xe8, 0xf0, - 0x9f, 0xee, 0xe9, 0x51, 0xb7, 0x5d, 0xaf, 0x03, 0xca, 0x66, 0x41, 0x18, 0x1e, 0x23, 0xa5, 0x7a, - 0x67, 0xe8, 0x14, 0x7a, 0xb8, 0xc4, 0xac, 0x6b, 0x87, 0x7e, 0x21, 0xb7, 0x7c, 0xea, 0x9e, 0xae, - 0xed, 0x33, 0x07, 0x4c, 0x7a, 0x06, 0x3c, 0xfa, 0x0e, 0xba, 0x68, 0xd9, 0xf0, 0xe6, 0x27, 0x13, - 0xcb, 0x87, 0x21, 0x7f, 0x1c, 0xee, 0x74, 0xda, 0x8d, 0xc0, 0xf1, 0x4f, 0x3a, 0xfc, 0xd9, 0x69, - 0xf5, 0x1f, 0x87, 0x30, 0x04, 0xdd, 0xc7, 0x84, 0x8e, 0x77, 0x2f, 0x31, 0x37, 0x36, 0x65, 0xd9, - 0x30, 0x5c, 0x0d, 0xaf, 0x37, 0x64, 0x21, 0x50, 0x31, 0x48, 0x08, 0x60, 0x63, 0xd6, 0x0a, 0xe3, - 0x73, 0xa0, 0x06, 0x39, 0xda, 0x5a, 0x47, 0x81, 0xc2, 0x8d, 0x90, 0x4d, 0x53, 0x73, 0x73, 0xe8, - 0x36, 0x52, 0xbc, 0x68, 0x11, 0x86, 0x5f, 0x50, 0xaf, 0xc0, 0xde, 0xe7, 0x57, 0xbd, 0x81, 0xff, - 0x48, 0x7c, 0x59, 0xaf, 0x91, 0x8c, 0x40, 0xb2, 0x80, 0x28, 0x62, 0x09, 0x25, 0x39, 0x29, 0x30, - 0x1f, 0xe3, 0x8f, 0x13, 0xe0, 0xa0, 0xc4, 0xe7, 0x75, 0xe0, 0xd0, 0xa0, 0x5c, 0x4c, 0xe2, 0x30, - 0xe5, 0x29, 0x54, 0xd4, 0xbf, 0x9d, 0xf8, 0x69, 0x26, 0xcb, 0x06, 0x28, 0xdf, 0x53, 0x20, 0x63, - 0xfe, 0x7a, 0x19, 0x03, 0x9f, 0xbd, 0x8b, 0x29, 0x95, 0x97, 0x29, 0x73, 0x48, 0x4f, 0x70, 0x48, - 0x70, 0x39, 0x8f, 0x13, 0xe0, 0x8a, 0xec, 0x22, 0x61, 0xcc, 0xb4, 0x5b, 0xd9, 0x05, 0x8b, 0xac, - 0xcc, 0x3b, 0x5a, 0xaa, 0x02, 0xa9, 0x25, 0x18, 0x29, 0xe5, 0x8c, 0xf4, 0x14, 0x25, 0x18, 0xcc, - 0x22, 0xcf, 0x42, 0x74, 0xe6, 0x11, 0xeb, 0xd8, 0x43, 0xbd, 0xc1, 0xd5, 0xca, 0x2a, 0xb6, 0xcf, - 0xae, 0x8d, 0xac, 0xf5, 0x03, 0x64, 0x8c, 0x93, 0xae, 0x5d, 0x80, 0xad, 0x75, 0xe3, 0x59, 0x11, - 0xf0, 0x20, 0xd6, 0xf4, 0xe7, 0x66, 0xda, 0x42, 0x49, 0x6e, 0xef, 0xa4, 0x9c, 0xd4, 0x1f, 0x77, - 0x9b, 0x9d, 0x62, 0xee, 0x5b, 0xaf, 0xa9, 0xb2, 0xff, 0x04, 0xd9, 0x61, 0x46, 0xc0, 0xdc, 0x9c, - 0x93, 0x1e, 0x77, 0x1b, 0x1d, 0x42, 0x4d, 0xec, 0x91, 0xa8, 0xe0, 0xa6, 0xc6, 0x6b, 0x16, 0x2d, - 0xa0, 0x5b, 0xdb, 0xe0, 0xce, 0x5b, 0x3f, 0x8c, 0xa9, 0xf5, 0xd5, 0x4a, 0xa5, 0x1c, 0xc5, 0x2d, - 0xb2, 0x11, 0xf2, 0xa4, 0x9f, 0x20, 0x13, 0xb4, 0xa9, 0x25, 0x40, 0x1e, 0x3e, 0x31, 0xda, 0xc0, - 0x1a, 0x9b, 0xcd, 0x92, 0x40, 0x6f, 0x09, 0xed, 0xc1, 0x33, 0xd1, 0xb8, 0x32, 0xed, 0x5c, 0x5a, - 0xc5, 0x42, 0x0c, 0xb2, 0x16, 0x8e, 0x0a, 0xd4, 0xf7, 0x9c, 0x5b, 0x30, 0xc0, 0x29, 0x05, 0x7a, - 0x44, 0xe7, 0x37, 0xa0, 0xe1, 0x79, 0x7c, 0x1d, 0x99, 0x0e, 0xcb, 0x07, 0xdb, 0xd6, 0x1e, 0x97, - 0xdb, 0x5a, 0xc7, 0x5e, 0xc1, 0xc8, 0x89, 0x4e, 0x35, 0xcc, 0xf9, 0x8d, 0xe9, 0x6c, 0xcb, 0x0b, - 0x9d, 0x53, 0x59, 0x7f, 0xba, 0x3b, 0xab, 0xea, 0x94, 0x49, 0x48, 0x8f, 0x3c, 0x05, 0x4a, 0x2b, - 0x02, 0xea, 0x6d, 0xc1, 0xd7, 0x00, 0xe8, 0xca, 0x68, 0x1a, 0xa6, 0x3d, 0xd4, 0x2a, 0x79, 0xee, - 0x67, 0x3e, 0x54, 0x12, 0x44, 0xa0, 0x23, 0xbf, 0x07, 0x81, 0xec, 0x6d, 0x93, 0x51, 0x27, 0x11, - 0x88, 0x89, 0xd3, 0x16, 0xf2, 0x32, 0x3c, 0x76, 0x4e, 0x4f, 0xd7, 0xeb, 0x02, 0xb1, 0xee, 0x80, - 0x32, 0x03, 0x48, 0xda, 0x91, 0xbc, 0xb1, 0xf3, 0x36, 0x19, 0x07, 0x24, 0xe6, 0xf1, 0xad, 0xf5, - 0x6b, 0x2a, 0xa9, 0xd9, 0x07, 0x6a, 0xe6, 0x42, 0xbb, 0x45, 0x42, 0xdf, 0xaa, 0x49, 0xbe, 0x5b, - 0xad, 0xca, 0x8d, 0x6f, 0xce, 0x44, 0xc8, 0xb2, 0x38, 0xb8, 0x55, 0x02, 0xa2, 0xf7, 0xdc, 0x98, - 0x80, 0x99, 0x9c, 0x31, 0x03, 0x69, 0x5c, 0xd6, 0x0a, 0xd3, 0x4b, 0xce, 0xd8, 0x44, 0xfb, 0x3f, - 0xb2, 0xf1, 0x37, 0xaf, 0xbe, 0x17, 0x69, 0xd6, 0x92, 0x23, 0xc2, 0x65, 0x8e, 0x1f, 0x65, 0x30, - 0xed, 0x06, 0xf0, 0x5c, 0x6b, 0x3b, 0x7e, 0x38, 0xbf, 0xf0, 0xe1, 0x61, 0x9d, 0x17, 0x07, 0xdd, - 0x21, 0x7b, 0x86, 0x13, 0xd4, 0x13, 0xfc, 0x66, 0xb5, 0x2b, 0xbe, 0x3c, 0x43, 0xe5, 0x01, 0xe7, - 0x2e, 0x5b, 0x09, 0x0d, 0x6a, 0xf2, 0x1d, 0x8c, 0xc5, 0x1c, 0x06, 0x03, 0xb4, 0xd7, 0x67, 0x94, - 0x6e, 0xf5, 0x77, 0xe5, 0xf4, 0xb6, 0x23, 0xa7, 0xb9, 0x8e, 0xb3, 0xdb, 0x56, 0x05, 0x5b, 0x52, - 0xe3, 0xc2, 0xba, 0x69, 0x36, 0x0c, 0xb9, 0x28, 0x4e, 0x7f, 0x03, 0x9c, 0x57, 0xcf, 0x46, 0x5b, - 0x26, 0xa9, 0xc6, 0x96, 0xc9, 0xee, 0xf1, 0x96, 0xf4, 0xcd, 0xfc, 0x53, 0x36, 0xaf, 0xaa, 0x9d, - 0x92, 0x6d, 0x05, 0x31, 0x4c, 0x99, 0x9f, 0x9e, 0x70, 0x58, 0xa1, 0x1b, 0x42, 0x7e, 0x52, 0xf7, - 0x8f, 0xf1, 0x99, 0xa7, 0xb4, 0x72, 0xbd, 0x8b, 0x0b, 0x47, 0x2b, 0x97, 0xa6, 0x90, 0xd7, 0x6f, - 0x15, 0xe8, 0xc6, 0xe2, 0x55, 0xe7, 0x88, 0x9e, 0xc6, 0x97, 0x2f, 0x42, 0x86, 0x7a, 0xb5, 0x0d, - 0xf4, 0x04, 0x0a, 0x27, 0xcb, 0x04, 0x82, 0x5a, 0xbb, 0x84, 0x75, 0x49, 0x70, 0x8b, 0xf9, 0x14, - 0x28, 0xc1, 0xd2, 0x52, 0x58, 0x84, 0x36, 0xee, 0x3b, 0x3f, 0xf2, 0x6a, 0x9d, 0x72, 0xea, 0x73, - 0xff, 0x72, 0x0e, 0xc2, 0xc8, 0x83, 0x81, 0xd7, 0x44, 0x39, 0xc1, 0xfe, 0xbd, 0x7c, 0x87, 0xf1, - 0x02, 0x1a, 0x7f, 0x81, 0x82, 0xe1, 0x55, 0x00, 0x09, 0xc0, 0x31, 0x96, 0x49, 0x02, 0x11, 0xed, - 0x32, 0xd3, 0x49, 0xed, 0xed, 0x39, 0xa6, 0x24, 0x2b, 0x62, 0xa7, 0xd6, 0xb1, 0x75, 0x16, 0x7e, - 0xba, 0x00, 0x61, 0x15, 0x75, 0x0a, 0x0c, 0x68, 0x1e, 0x03, 0x73, 0x70, 0x2f, 0xb2, 0x24, 0x01, - 0x73, 0xb3, 0x4c, 0x77, 0xb3, 0xcc, 0x8b, 0x68, 0x7a, 0x57, 0x89, 0xde, 0x66, 0x89, 0xd7, 0xc1, - 0x9d, 0x25, 0x10, 0xae, 0xcd, 0xfe, 0x80, 0x38, 0x9a, 0x7c, 0x32, 0x1d, 0x4b, 0x8a, 0x4d, 0x50, - 0x2d, 0x71, 0x4e, 0x64, 0xde, 0x72, 0x3d, 0x04, 0x61, 0xa5, 0xa4, 0x8a, 0x67, 0xe2, 0xca, 0x1f, - 0x18, 0x0f, 0x8d, 0x3b, 0xc4, 0x0d, 0x0c, 0xec, 0x6f, 0x40, 0x4f, 0xd9, 0x77, 0x40, 0x5a, 0x20, - 0x7d, 0x9d, 0xcf, 0x93, 0xd9, 0xc0, 0x93, 0x95, 0x88, 0xec, 0xfe, 0x83, 0x00, 0x03, 0x91, 0xfd, - 0xaf, 0x04, 0xb7, 0xf7, 0x0f, 0x82, 0x7b, 0x19, 0xfc, 0x07, 0x82, 0xbb, 0xa9, 0x43, 0x6d, 0x11, - 0xc6, 0x04, 0x5d, 0xe0, 0x81, 0x8a, 0xbc, 0x45, 0x2a, 0x35, 0x3b, 0xa0, 0x25, 0x3b, 0x49, 0x75, - 0x0e, 0x2e, 0x71, 0x78, 0x96, 0x45, 0x75, 0x16, 0x92, 0x32, 0x94, 0x03, 0xa7, 0x8b, 0x2d, 0x82, - 0x1f, 0x79, 0x35, 0x2f, 0xf9, 0x39, 0x2a, 0xa1, 0x52, 0xbe, 0x69, 0x36, 0x62, 0x5e, 0x7b, 0x28, - 0x35, 0xef, 0xc9, 0x9d, 0xba, 0x3a, 0x6a, 0x08, 0x13, 0x9a, 0x07, 0x79, 0xc9, 0x48, 0x2b, 0x39, - 0xc7, 0x92, 0xf2, 0x23, 0x58, 0x53, 0x73, 0x78, 0x8c, 0xce, 0xb3, 0x8b, 0x7a, 0x7d, 0xde, 0x9a, - 0x2f, 0xd2, 0x0b, 0x9c, 0x33, 0x64, 0xda, 0xa1, 0xd7, 0xd5, 0x92, 0x87, 0xd8, 0x2f, 0x54, 0xea, - 0x84, 0xc0, 0x9c, 0x5f, 0x80, 0xb8, 0xfb, 0x86, 0xc5, 0x97, 0x2c, 0x4b, 0x6e, 0xad, 0x16, 0x28, - 0x6a, 0xb1, 0xf8, 0xf4, 0x9a, 0xa5, 0x17, 0x4f, 0xfd, 0x34, 0x98, 0xc0, 0x6c, 0xc0, 0xd0, 0xff, - 0x68, 0x2d, 0x35, 0xcb, 0x18, 0xa7, 0x2e, 0x69, 0xed, 0xb6, 0xf6, 0x60, 0x28, 0x7d, 0xad, 0x98, - 0x95, 0x3a, 0xb1, 0x3d, 0x2c, 0x4d, 0x2d, 0x41, 0x23, 0x7c, 0x3c, 0x87, 0xb9, 0x1d, 0x95, 0xfe, - 0x66, 0xd2, 0xc4, 0x97, 0x0e, 0x7f, 0x59, 0xd0, 0x4b, 0x17, 0x5f, 0xa0, 0x1e, 0xd2, 0x23, 0x3c, - 0xd6, 0x20, 0x1d, 0xa2, 0x11, 0x35, 0x1a, 0x42, 0x9e, 0x03, 0x05, 0x5b, 0xbe, 0xbd, 0x5e, 0x6f, - 0xd5, 0xdb, 0x7b, 0xff, 0xa0, 0x3d, 0xd0, 0x68, 0x7c, 0x49, 0xe5, 0xff, 0x44, 0xa3, 0xa0, 0xc2, - 0xae, 0xb3, 0x97, 0x62, 0xb2, 0xae, 0x29, 0xc5, 0xec, 0x47, 0x7c, 0x2d, 0x6b, 0x24, 0x00, 0x16, - 0xe5, 0x37, 0xf8, 0x34, 0x64, 0xe0, 0x8a, 0x81, 0xa9, 0xd9, 0xb3, 0x5a, 0x51, 0x65, 0x93, 0xaa, - 0xe4, 0x6f, 0x85, 0x29, 0xaa, 0x6b, 0x17, 0xc7, 0x50, 0x81, 0x55, 0x2e, 0xa7, 0xbf, 0x21, 0xcb, - 0x0e, 0xb9, 0x5d, 0xb0, 0x4b, 0x46, 0xca, 0x95, 0xd7, 0xf9, 0x2c, 0xcb, 0x74, 0x72, 0x9f, 0x65, - 0x2a, 0xe8, 0xb9, 0x8a, 0xc6, 0xaf, 0x0e, 0x39, 0x0d, 0x4c, 0x2e, 0x82, 0x70, 0x0a, 0xe0, 0x2a, - 0x72, 0xb7, 0x8a, 0xe9, 0x27, 0x57, 0xa7, 0x2d, 0xe1, 0x8b, 0xf1, 0xa2, 0x93, 0xde, 0xe3, 0xab, - 0x06, 0x59, 0xb3, 0xf4, 0xc0, 0x2d, 0x5a, 0xfe, 0x08, 0x56, 0x2d, 0x10, 0xde, 0xd6, 0xb2, 0x95, - 0xf5, 0x5e, 0x0a, 0x36, 0x68, 0x91, 0xe3, 0x46, 0x50, 0x3b, 0xd7, 0xc3, 0x4c, 0x53, 0xd6, 0x7c, - 0xba, 0x83, 0x9b, 0x25, 0xf2, 0x77, 0x68, 0xb4, 0x9c, 0xd2, 0xa5, 0x14, 0x1b, 0x04, 0xdf, 0x55, - 0xa3, 0x31, 0xfc, 0x0f, 0xa3, 0xe6, 0xff, 0x30, 0x42, 0x46, 0x72, 0xe5, 0xd8, 0x49, 0xe2, 0x8c, - 0x56, 0x8f, 0xc0, 0x9c, 0x43, 0x4d, 0x1d, 0xbb, 0x25, 0xad, 0xf8, 0xc7, 0x5d, 0xa7, 0x94, 0xe7, - 0x16, 0xf2, 0x74, 0xef, 0xc9, 0xf3, 0x3b, 0x0e, 0x5a, 0x39, 0xcf, 0xa6, 0xa6, 0xa5, 0x1b, 0x87, - 0xf6, 0x52, 0xe9, 0x51, 0x48, 0xbe, 0x5f, 0x27, 0xf1, 0xa5, 0x50, 0x7c, 0xf5, 0x5c, 0x42, 0x73, - 0x94, 0xd2, 0x8f, 0x79, 0x79, 0x21, 0x65, 0xbf, 0xbc, 0x1d, 0xff, 0x0a, 0x7f, 0xd3, 0xd2, 0xc8, - 0x3b, 0x35, 0x90, 0x99, 0x4c, 0xd0, 0xdb, 0x51, 0x7b, 0xa4, 0xb2, 0xd7, 0xc8, 0x85, 0xd5, 0x8a, - 0xa9, 0x14, 0x10, 0x8c, 0xfa, 0x50, 0xaf, 0xe7, 0x26, 0x51, 0x91, 0x66, 0x10, 0xc0, 0x6f, 0xd9, - 0x4d, 0x9e, 0xb5, 0x35, 0x59, 0x24, 0x09, 0x31, 0xe2, 0x8d, 0x66, 0xd3, 0xe9, 0x15, 0x3b, 0x55, - 0x79, 0xbd, 0xad, 0x0d, 0x9c, 0xf3, 0x06, 0xb4, 0xca, 0xb6, 0x80, 0xd0, 0x19, 0xec, 0x75, 0x3a, - 0x83, 0xfd, 0xb6, 0x6d, 0xbb, 0xff, 0x4c, 0xc8, 0x91, 0x3e, 0xec, 0xb5, 0x92, 0x27, 0xfc, 0x81, - 0x63, 0x54, 0x0e, 0xc1, 0x1a, 0xff, 0x43, 0xa7, 0x27, 0x77, 0x76, 0xfe, 0xff, 0xd2, 0xeb, 0x89, - 0xe2, 0x6f, 0xea, 0x4d, 0xe3, 0xc9, 0x02, 0x0d, 0x04, 0xe7, 0x9a, 0x3b, 0x68, 0x9c, 0x28, 0x79, - 0x3b, 0x7b, 0x2d, 0xd7, 0x49, 0x52, 0xaf, 0xaf, 0xf1, 0x0f, 0x28, 0x55, 0xce, 0x22, 0xf8, 0x7a, - 0x11, 0x3d, 0x03, 0x00, 0xfc, 0x68, 0x9a, 0x7a, 0x27, 0xa7, 0x40, 0xc7, 0x53, 0x16, 0xe2, 0x43, - 0xea, 0x5f, 0xb1, 0xe9, 0x0f, 0x8a, 0x77, 0x39, 0x91, 0x7e, 0x78, 0xf9, 0xe6, 0xfd, 0xfe, 0x2f, - 0xaf, 0x9f, 0xfc, 0xd9, 0x43, 0x01, 0x82, 0x6f, 0x9d, 0x01, 0xbd, 0x0e, 0x76, 0x77, 0x7b, 0xbb, - 0xb9, 0x67, 0x07, 0x95, 0x2d, 0xa6, 0x1c, 0xa7, 0x53, 0xa4, 0x01, 0x61, 0xb9, 0x3c, 0xbd, 0xa5, - 0x4f, 0xb9, 0xe3, 0x61, 0xf2, 0xa2, 0x90, 0x93, 0x1b, 0xb1, 0x22, 0x73, 0x21, 0xe3, 0x05, 0x80, - 0x18, 0xb2, 0x1f, 0x94, 0x83, 0xfb, 0x19, 0x24, 0x9c, 0xa3, 0x73, 0xb7, 0x20, 0x51, 0xaa, 0x73, - 0x15, 0x3c, 0x1d, 0xd1, 0xab, 0xd8, 0x9f, 0x42, 0x39, 0x00, 0xea, 0xfd, 0x05, 0xbb, 0x24, 0xee, - 0xf5, 0x3f, 0xb1, 0x1f, 0x8f, 0x89, 0x46, 0x83, 0x2c, 0x47, 0x17, 0x24, 0x4c, 0x2b, 0xb4, 0xd4, - 0xdc, 0xc9, 0x3e, 0xe1, 0xb5, 0x3b, 0xd5, 0xad, 0xe2, 0xbc, 0x94, 0xb7, 0x2b, 0xdb, 0x40, 0x1d, - 0xea, 0x3a, 0xb5, 0x79, 0x8f, 0x87, 0x5c, 0xff, 0x02, 0xb8, 0xb3, 0x6c, 0x9e, 0xba, 0xa6, 0xe7, - 0x5d, 0x07, 0x11, 0x18, 0x4c, 0xd0, 0x19, 0xbe, 0xe5, 0xa5, 0x35, 0x07, 0x49, 0x14, 0x03, 0xc1, - 0x8f, 0xcc, 0xeb, 0x34, 0x35, 0x5d, 0xf8, 0x6b, 0xda, 0x0d, 0xd3, 0xdd, 0xd9, 0x31, 0x1b, 0xe5, - 0xac, 0x17, 0x71, 0x9a, 0xa1, 0xa2, 0xd2, 0x30, 0x77, 0x20, 0xd7, 0xb0, 0x80, 0x17, 0xde, 0xba, - 0xb1, 0x48, 0x42, 0x13, 0x3d, 0xd6, 0xd7, 0x5c, 0xd9, 0xfa, 0x91, 0x8d, 0x8f, 0xe3, 0xc9, 0x27, - 0x86, 0x98, 0x86, 0xb4, 0xd6, 0x38, 0x88, 0xfc, 0xe4, 0xf6, 0xfd, 0xed, 0x9c, 0x79, 0xa6, 0x9f, - 0x80, 0x40, 0xe2, 0x1e, 0x58, 0x13, 0xbf, 0x01, 0xd5, 0xb1, 0x14, 0x29, 0xd6, 0x63, 0xde, 0x11, - 0x77, 0x15, 0xe1, 0xfe, 0x1c, 0x23, 0x00, 0xc2, 0xf0, 0xa3, 0x09, 0x83, 0x99, 0xf1, 0x09, 0x16, - 0x79, 0xca, 0x9d, 0xb6, 0xc2, 0xcf, 0x81, 0xad, 0x7c, 0x00, 0x66, 0xdc, 0xa7, 0x6f, 0xa2, 0x0c, - 0xb9, 0x8d, 0xdb, 0x9e, 0x17, 0x82, 0x50, 0xb1, 0x97, 0x62, 0x12, 0x78, 0x1a, 0xfb, 0xc9, 0x94, - 0x3b, 0xae, 0xc6, 0xf8, 0x68, 0xda, 0x0e, 0xf0, 0x2d, 0xcd, 0x19, 0xd2, 0x53, 0x2f, 0xde, 0x97, - 0xe4, 0x29, 0x7f, 0x1f, 0x5c, 0x32, 0x98, 0x27, 0x68, 0x92, 0x17, 0xcf, 0x7c, 0x76, 0x10, 0x2f, - 0x9c, 0xfe, 0xb9, 0xda, 0xcf, 0x97, 0xf2, 0x94, 0xce, 0x9f, 0x9b, 0xe1, 0x34, 0x57, 0x7a, 0xa6, - 0x5c, 0x61, 0x0f, 0x6d, 0xee, 0x42, 0x0a, 0x39, 0xd1, 0x83, 0xfa, 0xb9, 0x0c, 0xbd, 0xef, 0x8e, - 0xdf, 0xbe, 0x69, 0xcd, 0x71, 0x9f, 0xa8, 0x04, 0x7f, 0x0d, 0x08, 0x9f, 0x5c, 0x80, 0xe6, 0xb7, - 0x0c, 0x85, 0x93, 0x54, 0xa0, 0x9a, 0x25, 0x09, 0x4e, 0xbd, 0x02, 0xd9, 0x08, 0x8c, 0x41, 0x49, - 0xa6, 0xe3, 0x3b, 0xb2, 0x2c, 0x74, 0x3d, 0x44, 0xd5, 0x22, 0x6c, 0x65, 0x80, 0xe7, 0x7a, 0xfd, - 0xc4, 0xe4, 0x8b, 0x9a, 0xa6, 0x63, 0x8a, 0x65, 0x4a, 0x78, 0xe2, 0xab, 0x97, 0xe6, 0x29, 0x4c, - 0x05, 0x93, 0x70, 0x31, 0x65, 0xa9, 0xc8, 0x6e, 0x4b, 0x8d, 0xbd, 0xd6, 0x21, 0xc5, 0x1b, 0x5f, - 0xc8, 0x59, 0x4e, 0x7c, 0x6b, 0xfb, 0xad, 0x60, 0x0a, 0x68, 0x85, 0xbf, 0x20, 0xfd, 0x21, 0x53, - 0x9b, 0x30, 0xcd, 0xec, 0x22, 0x8b, 0x64, 0x97, 0xa1, 0x28, 0x02, 0x42, 0xc4, 0xf0, 0x43, 0x60, - 0xb9, 0xe9, 0xad, 0x71, 0x8e, 0xc4, 0x0d, 0xbc, 0x07, 0xcd, 0x87, 0x36, 0xcd, 0xd5, 0xa2, 0xa9, - 0x70, 0x48, 0x95, 0x73, 0x6d, 0x9d, 0x95, 0xfc, 0x81, 0xd0, 0xcd, 0x84, 0x4d, 0x58, 0x70, 0xc5, - 0x84, 0xff, 0xe9, 0xdb, 0xf7, 0xaf, 0x5f, 0x11, 0x89, 0xe5, 0xaf, 0x58, 0xc8, 0x3c, 0xbe, 0x05, - 0xf6, 0xb9, 0x04, 0x02, 0x67, 0x1c, 0xba, 0x42, 0x2d, 0x29, 0x7d, 0x34, 0x38, 0x3b, 0xa5, 0x54, - 0x9c, 0xb5, 0xb8, 0xdd, 0x65, 0xe5, 0x82, 0x88, 0x27, 0xe1, 0xa7, 0x0c, 0xf9, 0xb6, 0x5e, 0xe7, - 0xf9, 0xb1, 0x09, 0xce, 0xc8, 0xe2, 0x03, 0xa8, 0x31, 0x1b, 0xac, 0x91, 0xb0, 0x59, 0x8e, 0x4b, - 0xb3, 0xdf, 0xea, 0xb5, 0xba, 0x2d, 0xb0, 0xf1, 0x47, 0x79, 0x15, 0xd8, 0x04, 0xf0, 0xf6, 0x31, - 0xf0, 0xe5, 0xdc, 0xb4, 0xdd, 0xd2, 0x07, 0x05, 0xc5, 0x6a, 0x65, 0x5e, 0x3d, 0x99, 0x43, 0x0e, - 0x4e, 0x5a, 0xfc, 0xb9, 0x75, 0x85, 0x12, 0xd5, 0x53, 0x0b, 0x4e, 0xce, 0x2c, 0x04, 0x64, 0x7d, - 0x78, 0xa9, 0x09, 0x57, 0x4b, 0x9a, 0x09, 0xc4, 0x08, 0xad, 0x20, 0xe5, 0x0c, 0x11, 0x02, 0x08, - 0x3a, 0x26, 0xa6, 0xec, 0xca, 0x20, 0xce, 0x83, 0x89, 0x02, 0x90, 0x7f, 0x33, 0xa7, 0x05, 0x3b, - 0x1c, 0x12, 0x57, 0xe0, 0x19, 0x0d, 0x5d, 0xe4, 0x84, 0x35, 0x67, 0x4a, 0x98, 0x01, 0x52, 0xce, - 0x92, 0xe5, 0x71, 0xa1, 0x2f, 0x06, 0xb4, 0x0d, 0x23, 0x04, 0x94, 0x4c, 0x58, 0xfd, 0x32, 0x76, - 0x48, 0x6c, 0xd3, 0x81, 0x59, 0x56, 0x72, 0x1a, 0x27, 0x6b, 0xa7, 0x43, 0x9e, 0x3a, 0x31, 0xc1, - 0x08, 0x28, 0xe2, 0x39, 0x8b, 0x2a, 0x81, 0xc0, 0x0f, 0xd4, 0x32, 0x98, 0xe3, 0xe9, 0x2b, 0x76, - 0xee, 0x87, 0x40, 0x95, 0xa2, 0x10, 0xb1, 0x46, 0x65, 0x29, 0xc1, 0x34, 0x20, 0xfe, 0x73, 0xf9, - 0xc9, 0xb7, 0xee, 0xbe, 0x8f, 0x5f, 0xc5, 0xe7, 0x7e, 0x12, 0x64, 0x17, 0x97, 0x16, 0x03, 0xac, - 0x2c, 0x85, 0x24, 0x11, 0xf2, 0xd4, 0x68, 0x93, 0xfe, 0xef, 0x03, 0xad, 0x5c, 0x06, 0xd1, 0x88, - 0xfe, 0xba, 0x6d, 0x07, 0xbd, 0xce, 0x97, 0xfe, 0xcd, 0x88, 0xfe, 0xba, 0x38, 0x77, 0x45, 0x9e, - 0x3f, 0x22, 0x7d, 0x0e, 0x9b, 0xf4, 0x6d, 0xc8, 0x13, 0x7b, 0x96, 0x4a, 0xc8, 0xec, 0x66, 0x64, - 0xef, 0x58, 0x59, 0xd3, 0xe7, 0x76, 0x45, 0xc2, 0x17, 0xc6, 0x60, 0x38, 0xac, 0xa8, 0x11, 0x3f, - 0xb6, 0x42, 0xf8, 0x60, 0x0f, 0x45, 0x93, 0xf4, 0x89, 0xd0, 0x67, 0x25, 0xfa, 0xc4, 0xa6, 0xd1, - 0xbf, 0x23, 0xe4, 0x84, 0x8f, 0xf3, 0x26, 0xc1, 0x5c, 0x2b, 0x92, 0x81, 0x64, 0x6c, 0x00, 0x14, - 0x39, 0xb6, 0xf8, 0x31, 0xe3, 0xe4, 0x65, 0xd7, 0xeb, 0x50, 0xba, 0xe6, 0xf9, 0x54, 0x81, 0x7f, - 0x28, 0x92, 0x95, 0xdd, 0x81, 0x2d, 0x78, 0x9e, 0x48, 0x3d, 0xf1, 0x4f, 0xe5, 0x14, 0x03, 0x99, - 0x4d, 0xdc, 0xd5, 0x63, 0xa2, 0x64, 0x98, 0x84, 0x7e, 0x9a, 0x22, 0x91, 0xd6, 0xeb, 0xfe, 0x91, - 0x57, 0xac, 0x42, 0xe2, 0xf0, 0x2a, 0x0e, 0xa6, 0x45, 0x3d, 0x3d, 0xef, 0x8b, 0x81, 0x35, 0x19, - 0x62, 0x55, 0x1a, 0x34, 0x75, 0xfe, 0x05, 0xe8, 0xd3, 0xc9, 0x40, 0xc6, 0x95, 0xea, 0x5b, 0x73, - 0x90, 0x42, 0xe0, 0xe2, 0x90, 0xaf, 0x84, 0xa8, 0x2d, 0x1b, 0x66, 0x23, 0x6b, 0xc5, 0x7f, 0x28, - 0x6a, 0x27, 0xc2, 0x88, 0x8b, 0x00, 0xcc, 0x08, 0x24, 0x0e, 0x42, 0xd9, 0xca, 0x60, 0xbc, 0x27, - 0x7e, 0xc8, 0x5e, 0xc5, 0xd7, 0x2c, 0x79, 0x06, 0x9a, 0x90, 0x45, 0xde, 0x00, 0x44, 0xa6, 0x5c, - 0x6f, 0xe2, 0x3f, 0x53, 0xf4, 0x5f, 0xa6, 0x1e, 0xa8, 0x13, 0x26, 0xed, 0xc4, 0x01, 0x06, 0x9d, - 0x78, 0x33, 0x20, 0xf3, 0x77, 0x04, 0xeb, 0x0f, 0x40, 0xd2, 0x19, 0x48, 0x1e, 0x12, 0x88, 0x93, - 0x7a, 0x1d, 0x9f, 0x6b, 0xde, 0x84, 0x64, 0x11, 0xff, 0x8b, 0x29, 0xad, 0x74, 0x31, 0x4e, 0xb3, - 0x24, 0x88, 0xce, 0xad, 0xb6, 0x83, 0xc9, 0xb2, 0x27, 0x1e, 0x65, 0x1d, 0xa5, 0x9a, 0x17, 0x11, - 0x55, 0x85, 0x67, 0xfe, 0xdc, 0x2a, 0x95, 0xd3, 0x4b, 0xd9, 0xee, 0xb6, 0x02, 0xd8, 0x09, 0x04, - 0x15, 0x87, 0x05, 0x9e, 0x51, 0x6c, 0x63, 0x72, 0xc3, 0xe2, 0x23, 0x3c, 0x32, 0xbf, 0x32, 0x1b, - 0xbe, 0x6b, 0xe2, 0x54, 0xff, 0x0b, 0xce, 0x07, 0xd9, 0xd4, 0xac, 0x79, 0x51, 0xbd, 0x6e, 0x4e, - 0x2e, 0xd8, 0xe4, 0xd3, 0x38, 0xbe, 0x81, 0xd7, 0x4c, 0x4c, 0x20, 0x30, 0x5f, 0x92, 0x4b, 0xcd, - 0xf4, 0x44, 0xd2, 0x6a, 0xf5, 0x99, 0x73, 0x0a, 0xcf, 0x6e, 0xaf, 0x56, 0x31, 0x6e, 0xac, 0x01, - 0xc5, 0xf8, 0x19, 0x5a, 0x18, 0x16, 0x0c, 0x84, 0xf3, 0x65, 0x35, 0xd8, 0xcb, 0x29, 0x3a, 0x96, - 0x93, 0xbc, 0x4f, 0x42, 0xb1, 0xc1, 0xf7, 0x0b, 0x94, 0x2d, 0x28, 0x30, 0x43, 0xfe, 0xda, 0xc5, - 0xaf, 0x5c, 0xf4, 0x78, 0xe6, 0x2c, 0x8c, 0xfd, 0xcc, 0x35, 0x68, 0xbb, 0x15, 0x50, 0xd1, 0x56, - 0x74, 0xb1, 0x02, 0x84, 0x21, 0xaf, 0xdf, 0xa7, 0x0a, 0xd3, 0xb9, 0x1f, 0x99, 0xe8, 0xda, 0xd1, - 0x3c, 0xbc, 0x7f, 0xfb, 0xeb, 0x5f, 0xff, 0x3b, 0x4c, 0xba, 0xa5, 0x56, 0x68, 0x0d, 0x6d, 0x88, - 0xe9, 0x5b, 0x5d, 0x8f, 0x1b, 0xd2, 0x08, 0x04, 0xc8, 0x22, 0x35, 0xe4, 0x57, 0xe1, 0x76, 0xb7, - 0xd5, 0x53, 0x8b, 0xb3, 0xc2, 0x1b, 0xa0, 0xd7, 0x2d, 0x8f, 0x7c, 0x73, 0x8d, 0x47, 0xab, 0x29, - 0xc5, 0x5e, 0xf8, 0x92, 0xde, 0xb1, 0x17, 0x3e, 0x74, 0x21, 0xd2, 0xbb, 0xf0, 0xef, 0xff, 0xed, - 0xdf, 0x4c, 0x27, 0xaa, 0xee, 0x81, 0x58, 0x5c, 0x34, 0x7f, 0x8c, 0x93, 0x4f, 0xb8, 0x9d, 0x8f, - 0x86, 0x1e, 0xe8, 0x13, 0x67, 0xd9, 0xd7, 0x30, 0x42, 0xae, 0x1c, 0x3d, 0x49, 0x12, 0x23, 0x35, - 0x35, 0x35, 0x4c, 0x9e, 0x41, 0x8e, 0xaa, 0xca, 0x61, 0x7e, 0x80, 0x14, 0xfe, 0x4d, 0xd4, 0x32, - 0x24, 0x27, 0xd9, 0x93, 0x0c, 0x08, 0x1b, 0x28, 0x8c, 0xc1, 0xd0, 0xc1, 0x2c, 0x0a, 0x64, 0xc0, - 0x75, 0xd5, 0x9d, 0x1d, 0x76, 0x1d, 0x5f, 0x07, 0xad, 0x73, 0x90, 0xc5, 0x8b, 0x71, 0x2b, 0x88, - 0x77, 0xd0, 0x71, 0xff, 0x3c, 0x9e, 0xa4, 0xa0, 0x9a, 0xc6, 0xa0, 0x83, 0xe2, 0xdf, 0xc2, 0x20, - 0x96, 0xfb, 0x1f, 0xc1, 0xac, 0x50, 0x48, 0x60, 0xe5, 0x04, 0x44, 0xcc, 0x38, 0x31, 0xed, 0xad, - 0xe9, 0x7c, 0x4a, 0x45, 0x09, 0x47, 0x9b, 0xf8, 0x54, 0x6f, 0x0a, 0x04, 0xc9, 0x3f, 0xe9, 0x24, - 0x99, 0xe1, 0x19, 0x20, 0x13, 0x8d, 0xe8, 0x72, 0xad, 0x59, 0x45, 0x6b, 0xcc, 0x16, 0x4a, 0x21, - 0x65, 0xc0, 0xfd, 0xc8, 0x26, 0x89, 0x91, 0xa4, 0x44, 0x93, 0x4e, 0x2d, 0x83, 0x79, 0x00, 0x98, - 0x74, 0x16, 0x84, 0xec, 0xfd, 0x38, 0x24, 0x1e, 0x85, 0x7e, 0x2f, 0xf3, 0x86, 0x69, 0xaf, 0x2e, - 0x35, 0x9c, 0x91, 0x92, 0x2d, 0x38, 0x17, 0xb5, 0x1d, 0xd2, 0x20, 0xcc, 0x86, 0x59, 0xb9, 0x90, - 0xb2, 0x8d, 0x3a, 0xdf, 0xd3, 0xd6, 0xc5, 0x86, 0x46, 0x99, 0x34, 0xff, 0x85, 0xde, 0x12, 0xea, - 0xf8, 0x3e, 0xbe, 0x76, 0x97, 0xeb, 0x35, 0x30, 0x1b, 0x7f, 0x91, 0x52, 0xa6, 0xe0, 0x1a, 0x07, - 0x4d, 0x02, 0x05, 0x50, 0xb1, 0xbf, 0xeb, 0x4d, 0xbc, 0x46, 0xb6, 0x40, 0xe6, 0x05, 0x2e, 0x2a, - 0x6e, 0xe3, 0xd3, 0xa1, 0x2a, 0xc7, 0x77, 0x14, 0x69, 0x32, 0xc9, 0x9c, 0x07, 0xba, 0x88, 0x32, - 0x83, 0x79, 0x3e, 0x5a, 0x88, 0xb7, 0x51, 0xa2, 0x71, 0xb3, 0x6b, 0x89, 0x37, 0x5e, 0x0b, 0x8d, - 0xc8, 0x26, 0x52, 0x84, 0xf5, 0xb5, 0x81, 0x15, 0x5e, 0xca, 0x50, 0xdf, 0x6d, 0xd0, 0x62, 0xa2, - 0x29, 0x59, 0xbd, 0x96, 0x42, 0xd4, 0xda, 0xd6, 0xa0, 0xe5, 0x0b, 0x03, 0x1a, 0xf9, 0xe4, 0x43, - 0x26, 0xc4, 0x0b, 0x2b, 0x8a, 0x97, 0x7f, 0xfd, 0xcf, 0xe6, 0x06, 0xd6, 0x4a, 0x09, 0x1a, 0xf1, - 0x52, 0x45, 0xa2, 0x8d, 0xea, 0xbe, 0x4c, 0xc7, 0xa1, 0x36, 0xc6, 0x59, 0x7c, 0x7e, 0x1e, 0xb2, - 0xd7, 0xb8, 0x77, 0x58, 0x07, 0x58, 0x1b, 0x15, 0xb1, 0x2d, 0xfa, 0x3f, 0x16, 0x62, 0xd5, 0x0a, - 0xc2, 0x8c, 0x56, 0xc2, 0xdb, 0x28, 0xbc, 0xf5, 0x70, 0xb0, 0xfe, 0x19, 0x7d, 0x40, 0x5b, 0x54, - 0x81, 0x9f, 0x28, 0x21, 0x98, 0x8f, 0x89, 0x9c, 0xea, 0xf2, 0x3e, 0x22, 0xd3, 0x15, 0xa6, 0x78, - 0x31, 0x31, 0xde, 0xd3, 0xfb, 0x02, 0x89, 0x36, 0x4c, 0xc3, 0xdc, 0x60, 0xf0, 0xf5, 0x56, 0x16, - 0xe5, 0x4d, 0x3b, 0xb4, 0x50, 0x84, 0xac, 0x30, 0xe5, 0xfd, 0xc7, 0xea, 0xa7, 0x2c, 0x03, 0x19, - 0x0a, 0x26, 0x73, 0x86, 0xa6, 0x56, 0x35, 0xdf, 0x6e, 0x21, 0x51, 0x5e, 0x2b, 0x80, 0xa2, 0x32, - 0x6c, 0xce, 0x27, 0x55, 0x54, 0xab, 0x7f, 0x5e, 0xdf, 0x29, 0xa7, 0x04, 0x1a, 0x34, 0x8d, 0xcf, - 0xe3, 0x18, 0xbd, 0xf4, 0x93, 0x4f, 0x65, 0x04, 0x84, 0xda, 0xb0, 0x94, 0x94, 0x09, 0x31, 0x32, - 0x02, 0x2b, 0x50, 0x4e, 0xc7, 0x4a, 0x52, 0xc2, 0x4a, 0x22, 0xc4, 0x58, 0x71, 0xee, 0x4e, 0x3e, - 0x5f, 0xa0, 0xe5, 0x78, 0x29, 0x4f, 0xb8, 0x95, 0x1c, 0x9c, 0x13, 0x4b, 0x42, 0x68, 0xcc, 0x29, - 0xe5, 0x6e, 0xa8, 0x61, 0xd0, 0xe0, 0x05, 0x2d, 0x84, 0x4c, 0x58, 0x08, 0x09, 0x5a, 0x06, 0x98, - 0x06, 0x56, 0x42, 0xa6, 0xac, 0x84, 0x52, 0xff, 0xc4, 0x0c, 0xb2, 0x55, 0x53, 0x4b, 0xae, 0xcc, - 0x61, 0x55, 0x67, 0x39, 0x18, 0xa0, 0xff, 0x1c, 0x2d, 0xb9, 0x67, 0x4c, 0xec, 0xd0, 0x61, 0xfa, - 0xaa, 0x74, 0x86, 0x08, 0x18, 0x6d, 0x5a, 0x39, 0x19, 0x68, 0x45, 0x62, 0xf0, 0xb9, 0x19, 0xe0, - 0x96, 0xde, 0xd7, 0xf7, 0x4b, 0xc7, 0x4a, 0xe4, 0x81, 0xe6, 0x9c, 0x13, 0x8a, 0x13, 0xe0, 0xec, - 0xc0, 0x72, 0x32, 0x98, 0xc4, 0x71, 0x32, 0xed, 0x3d, 0xaf, 0x62, 0x3e, 0x51, 0x82, 0x66, 0xbb, - 0xbb, 0x26, 0xb7, 0x68, 0x71, 0x39, 0x46, 0xe7, 0x11, 0xab, 0xc0, 0x37, 0xe1, 0x18, 0x9d, 0x14, - 0x39, 0xde, 0x51, 0x3d, 0x98, 0x87, 0xfe, 0x84, 0x5d, 0xc4, 0xe1, 0x94, 0x81, 0x19, 0x7a, 0xf3, - 0x45, 0x45, 0xff, 0x77, 0x61, 0x3e, 0x5c, 0x9a, 0x02, 0xdb, 0x16, 0x73, 0x59, 0xc8, 0x7f, 0x85, - 0x2e, 0xdd, 0xa2, 0x8e, 0xfb, 0xff, 0x31, 0xa4, 0x4a, 0x79, 0x2e, 0x42, 0xea, 0x17, 0x21, 0xfd, - 0x7d, 0x8b, 0x9a, 0xfc, 0xbf, 0x12, 0x52, 0x5f, 0x57, 0x44, 0xe6, 0x49, 0x7c, 0x8e, 0xa7, 0x0c, - 0xcb, 0x92, 0x49, 0xa5, 0xdb, 0x95, 0x8c, 0x2d, 0xa9, 0x45, 0x63, 0x70, 0x4d, 0x6c, 0xa0, 0xa6, - 0xb6, 0x21, 0x35, 0x24, 0x47, 0x20, 0x39, 0x23, 0x60, 0x05, 0x51, 0xa2, 0x52, 0x0b, 0x22, 0x25, - 0x4f, 0xbd, 0x1b, 0x65, 0x92, 0x44, 0x78, 0xe7, 0x1d, 0x1f, 0x4c, 0x5d, 0x04, 0x21, 0x3d, 0x69, - 0x9f, 0x3a, 0x11, 0x39, 0x4b, 0xbf, 0x8e, 0x93, 0x4b, 0x74, 0xf1, 0x14, 0xdd, 0xb7, 0x98, 0xc9, - 0x40, 0x9b, 0x19, 0xb4, 0x37, 0xdf, 0x89, 0xd0, 0xb2, 0xc1, 0xd3, 0x6a, 0x40, 0x4c, 0x9a, 0xa5, - 0x01, 0x4a, 0x5d, 0x72, 0x7b, 0x4c, 0xba, 0x0f, 0x7a, 0x21, 0x73, 0xc4, 0x50, 0xd7, 0x35, 0x37, - 0x05, 0x2f, 0xbd, 0xd3, 0x61, 0x7d, 0x1b, 0x2c, 0x0c, 0x8e, 0x71, 0x81, 0x0b, 0xc7, 0xb7, 0x9d, - 0x19, 0x43, 0xef, 0x26, 0x2a, 0xf0, 0xd4, 0xde, 0xf2, 0x92, 0x65, 0x17, 0xf1, 0xd4, 0x35, 0xdf, - 0xbd, 0x3d, 0x7e, 0x6f, 0x3a, 0xa8, 0xff, 0xba, 0xd1, 0x7a, 0x73, 0xb4, 0x14, 0x0e, 0x74, 0x4d, - 0x3b, 0x07, 0x62, 0xa8, 0x99, 0x42, 0x9f, 0x31, 0x71, 0x55, 0x4f, 0x50, 0x42, 0xc1, 0x16, 0x73, - 0x94, 0xb4, 0x81, 0x2b, 0x55, 0xc7, 0x6d, 0xb2, 0xff, 0x1f, 0xa1, 0xe9, 0x2d, 0xd3, 0x90, 0x23, - 0x45, 0x9d, 0x32, 0xa6, 0xac, 0xcf, 0x25, 0x45, 0xdb, 0x15, 0xa9, 0x49, 0xc9, 0xd6, 0x82, 0x44, - 0xee, 0x45, 0x30, 0x1d, 0x91, 0x73, 0x58, 0x50, 0xc7, 0x47, 0x61, 0x79, 0xbc, 0x85, 0x51, 0xb3, - 0x91, 0x9c, 0xe0, 0x56, 0x1b, 0x0d, 0x97, 0x09, 0xa0, 0x28, 0x2e, 0xa5, 0xa0, 0x54, 0xd2, 0x12, - 0x62, 0xb2, 0x81, 0xb6, 0x3a, 0x25, 0xe0, 0x5b, 0xae, 0x55, 0x48, 0x0e, 0xa8, 0xd7, 0x8b, 0x95, - 0x06, 0x5f, 0xea, 0x44, 0x40, 0x5f, 0x2f, 0x3a, 0x5f, 0x79, 0x74, 0x05, 0xc0, 0x92, 0x2e, 0x39, - 0xf4, 0xb7, 0xd6, 0x34, 0xf1, 0xcf, 0xcf, 0x11, 0x11, 0xe8, 0xe1, 0x06, 0xf4, 0xa0, 0x63, 0x84, - 0x23, 0x06, 0x75, 0x41, 0x40, 0x53, 0xc1, 0xe6, 0xe2, 0xfe, 0x08, 0x76, 0xa7, 0x8f, 0x85, 0x4c, - 0x30, 0x4d, 0x53, 0x22, 0x7f, 0xd9, 0xa6, 0xba, 0xac, 0xf9, 0xf4, 0xa0, 0x55, 0x87, 0x01, 0xb7, - 0x88, 0xed, 0x19, 0xc5, 0x0f, 0x09, 0x7c, 0x90, 0xee, 0x41, 0xe9, 0x96, 0x9b, 0x2d, 0xa2, 0xd5, - 0xaa, 0xd9, 0x15, 0x8f, 0x23, 0xdc, 0xf0, 0x7f, 0xf1, 0xc9, 0x33, 0xcf, 0x59, 0xd4, 0x35, 0x9d, - 0xdc, 0xdb, 0x0c, 0xf3, 0x3d, 0xc8, 0x05, 0x5c, 0x03, 0x15, 0xf3, 0xbb, 0xee, 0xe6, 0x86, 0x8f, - 0x4b, 0x4a, 0x74, 0xc5, 0x47, 0x28, 0xf8, 0xc9, 0xc5, 0x3a, 0x3a, 0xe6, 0x1a, 0x59, 0x97, 0xea, - 0x3e, 0xf2, 0x70, 0x77, 0x7c, 0x61, 0x69, 0x8f, 0x3b, 0xef, 0xb9, 0x3a, 0x56, 0xfc, 0x20, 0x56, - 0x91, 0xfb, 0xf5, 0x7a, 0x95, 0xcf, 0x9a, 0x57, 0xe8, 0x35, 0x71, 0x4f, 0x54, 0xb2, 0x66, 0xad, - 0x14, 0x37, 0xbd, 0xe6, 0xdb, 0xb3, 0xc8, 0x03, 0xab, 0xbb, 0x41, 0xfd, 0x71, 0x0a, 0x8c, 0x11, - 0xdb, 0x4d, 0xf5, 0x16, 0xc2, 0x1b, 0x9a, 0x5a, 0x72, 0xb5, 0x22, 0xc3, 0xa5, 0x07, 0x66, 0xeb, - 0x08, 0x73, 0x42, 0xc4, 0x63, 0xbe, 0x78, 0xc8, 0x22, 0x32, 0x6b, 0xc1, 0x62, 0xad, 0xf4, 0x9e, - 0x0a, 0x3f, 0xa9, 0x83, 0x7e, 0xc2, 0x32, 0xad, 0x73, 0xe3, 0x5c, 0x38, 0xd7, 0x90, 0xf2, 0x87, - 0x51, 0x89, 0xb0, 0x15, 0x20, 0x0c, 0x01, 0x81, 0xc1, 0x92, 0x2b, 0x55, 0x54, 0x02, 0x9d, 0x02, - 0x71, 0xd9, 0xac, 0x2f, 0x7a, 0x72, 0x1d, 0xbe, 0x86, 0xb3, 0xa1, 0xfd, 0x64, 0x53, 0xe5, 0xe2, - 0x92, 0x8a, 0x50, 0xa8, 0x68, 0x8e, 0x68, 0x0d, 0x7d, 0x79, 0x60, 0xb5, 0x38, 0x61, 0xc9, 0xf8, - 0x0f, 0xa5, 0xf1, 0xdf, 0xdc, 0xa2, 0x1d, 0xdc, 0x69, 0xfc, 0x37, 0x2b, 0x8c, 0x7f, 0x68, 0x26, - 0x37, 0xfe, 0xf9, 0x8b, 0x32, 0xfe, 0x55, 0x42, 0x12, 0x5f, 0xbf, 0x49, 0x3c, 0x7f, 0xd3, 0x1b, - 0x50, 0xf6, 0xb5, 0x6d, 0xba, 0x07, 0x2a, 0x49, 0x05, 0xba, 0x9d, 0xa2, 0xd7, 0x83, 0xfb, 0xa2, - 0xea, 0x75, 0x60, 0xe6, 0x97, 0x62, 0x6d, 0x90, 0x20, 0x55, 0x8b, 0xaa, 0xf9, 0x50, 0x5f, 0xe1, - 0x81, 0x17, 0xdc, 0x41, 0xca, 0x57, 0xa4, 0x61, 0xee, 0x03, 0xc0, 0x94, 0x5f, 0x9f, 0xc1, 0xe0, - 0x14, 0x16, 0xb9, 0x30, 0xa1, 0xe8, 0x1a, 0xf7, 0x95, 0x6b, 0x5c, 0x3c, 0xd1, 0x66, 0xef, 0x09, - 0x43, 0xa8, 0xab, 0x2b, 0xf7, 0x71, 0x55, 0x51, 0x01, 0xa0, 0xaf, 0xa9, 0x70, 0x15, 0x97, 0x6f, - 0xb9, 0x68, 0x7d, 0x62, 0xb7, 0x29, 0x7a, 0xe5, 0x65, 0xfb, 0xb4, 0x62, 0x56, 0xfa, 0xb6, 0x14, - 0x6a, 0xd4, 0x49, 0x78, 0x4a, 0xb2, 0x99, 0x18, 0x0b, 0xbd, 0xec, 0xc5, 0xf5, 0x36, 0xad, 0x0d, - 0xf4, 0x98, 0xfb, 0x13, 0xbe, 0xe5, 0x14, 0x09, 0x29, 0x57, 0x44, 0xfc, 0xe0, 0xa9, 0xb4, 0xbb, - 0xb6, 0x17, 0x2f, 0x17, 0xa2, 0x13, 0x48, 0xf7, 0x17, 0x70, 0x4a, 0x6b, 0x59, 0x7a, 0x15, 0xb4, - 0x60, 0xf6, 0x65, 0x75, 0xf0, 0xb5, 0x36, 0x7f, 0xc3, 0x7b, 0x42, 0x99, 0xff, 0xbe, 0xde, 0x83, - 0x25, 0xed, 0x07, 0x61, 0x4a, 0xa5, 0x05, 0x4b, 0xe1, 0x78, 0x26, 0x0e, 0x5f, 0xc5, 0xf5, 0xe0, - 0x8d, 0xa8, 0x75, 0x04, 0x02, 0xc0, 0x15, 0xcf, 0xc0, 0xff, 0x2c, 0x17, 0xe7, 0x19, 0x89, 0x73, - 0x3c, 0xae, 0x67, 0x0f, 0xb7, 0xb6, 0x2f, 0x9b, 0x81, 0xd6, 0x41, 0x7c, 0x38, 0x19, 0x5f, 0x0f, - 0x8b, 0x48, 0xfe, 0x03, 0x09, 0x69, 0x2f, 0xad, 0x84, 0x28, 0xc7, 0xb2, 0x85, 0xa7, 0x15, 0x17, - 0x12, 0x70, 0x09, 0x81, 0xc9, 0x25, 0x84, 0xb8, 0x85, 0xcd, 0x47, 0xc0, 0x1a, 0xd1, 0x96, 0xb9, - 0x26, 0xda, 0x3a, 0xad, 0x50, 0x3b, 0xb6, 0x3e, 0xa1, 0x6d, 0x9f, 0x66, 0x62, 0x9a, 0x66, 0xb2, - 0x6a, 0x96, 0xcb, 0x95, 0x63, 0xee, 0xe0, 0x23, 0xfc, 0x95, 0xf7, 0x89, 0x6e, 0x0e, 0xa5, 0x4f, - 0xec, 0x89, 0x88, 0xad, 0x49, 0xc4, 0xe6, 0x58, 0x47, 0x09, 0x21, 0x53, 0x01, 0xfd, 0xaa, 0xe3, - 0xa0, 0x29, 0x7a, 0xdc, 0x66, 0xc5, 0xf5, 0x97, 0x2d, 0x82, 0xb7, 0x88, 0x7a, 0x0e, 0x94, 0x01, - 0x0a, 0x0c, 0x20, 0x1b, 0x18, 0xb2, 0x2c, 0xd8, 0x31, 0x39, 0x2e, 0xd6, 0xf4, 0x24, 0x0c, 0x85, - 0xc6, 0x22, 0x97, 0x90, 0x36, 0x37, 0x8d, 0xe1, 0x12, 0xa9, 0x3e, 0xaa, 0xa2, 0x19, 0x20, 0xae, - 0x60, 0x8a, 0xcb, 0x9d, 0x3b, 0x71, 0x62, 0x10, 0xf8, 0x06, 0x1e, 0x3b, 0x08, 0x66, 0x01, 0xad, - 0x9f, 0x96, 0xe8, 0x2d, 0x94, 0xe8, 0x5a, 0xde, 0xc3, 0x6c, 0x1a, 0x5e, 0x4a, 0xd8, 0x90, 0x48, - 0x8a, 0x05, 0x5e, 0x60, 0xe2, 0x80, 0x7a, 0x59, 0x86, 0xfd, 0x03, 0x3a, 0xea, 0x6c, 0x93, 0x40, - 0xd0, 0xed, 0xd2, 0x22, 0x3a, 0x07, 0x87, 0x10, 0x15, 0xc3, 0x47, 0xcd, 0x45, 0x36, 0x57, 0xc3, - 0x2a, 0x06, 0x48, 0x42, 0xe0, 0xd3, 0x54, 0xae, 0x8f, 0x94, 0x10, 0x80, 0x8e, 0xdc, 0x93, 0x5b, - 0x90, 0x9a, 0x4b, 0x4d, 0x87, 0xf0, 0x95, 0x0e, 0x71, 0x12, 0x9d, 0x72, 0x05, 0x42, 0xb4, 0xb3, - 0xc6, 0x51, 0x8a, 0xe4, 0x9e, 0xd3, 0x52, 0x8b, 0xa1, 0xd8, 0x4b, 0xb0, 0xcc, 0x37, 0x48, 0x54, - 0xf2, 0x25, 0x50, 0x3f, 0xa9, 0x0c, 0x5d, 0xa0, 0x33, 0xd2, 0x70, 0xb8, 0x58, 0xd4, 0x55, 0x1c, - 0xd0, 0x9b, 0xd4, 0xde, 0x8e, 0xad, 0xcc, 0x0a, 0x52, 0xd6, 0x08, 0x68, 0x37, 0x20, 0xa0, 0x31, - 0x20, 0xed, 0x8e, 0x4f, 0xbe, 0xf7, 0x94, 0x83, 0x02, 0x5c, 0x4e, 0x83, 0xfe, 0x46, 0xbf, 0xfa, - 0x9a, 0xac, 0x0e, 0x43, 0x49, 0xa1, 0xa0, 0x1d, 0x1f, 0x78, 0x10, 0x93, 0x86, 0x53, 0xe8, 0x88, - 0x4c, 0x4d, 0xde, 0x2e, 0xb1, 0xbe, 0x53, 0xcb, 0xa4, 0xd8, 0x97, 0x5b, 0xad, 0x36, 0x09, 0xf8, - 0xec, 0xe1, 0x92, 0x5b, 0x87, 0xeb, 0x93, 0x60, 0xfa, 0x17, 0xcf, 0xc4, 0xd7, 0x60, 0xba, 0xfe, - 0xca, 0x3c, 0x3d, 0x2b, 0xe9, 0x41, 0x7e, 0x61, 0x60, 0x10, 0x24, 0xda, 0x67, 0xf2, 0x12, 0x23, - 0x53, 0x15, 0x97, 0x15, 0x59, 0xbe, 0xac, 0x08, 0x94, 0x65, 0xdb, 0xe2, 0xc0, 0xe9, 0x9a, 0x2f, - 0x20, 0x65, 0x77, 0x2e, 0x98, 0x0e, 0x69, 0xb7, 0xc9, 0x85, 0x9f, 0xbe, 0xbd, 0x8e, 0xde, 0x25, - 0xf1, 0x9c, 0x25, 0xd9, 0xad, 0x72, 0xa1, 0xd2, 0xa4, 0x87, 0x5e, 0x7d, 0x74, 0xf1, 0x67, 0x15, - 0x4e, 0xd3, 0xb0, 0x45, 0x39, 0x35, 0xee, 0xd1, 0x3c, 0x84, 0x4a, 0xb6, 0xd9, 0x59, 0xc9, 0xf5, - 0xb7, 0x59, 0xac, 0xe0, 0xcf, 0xd5, 0x0b, 0x96, 0x64, 0x09, 0x37, 0xe3, 0xee, 0x80, 0x04, 0x3d, - 0xb8, 0xfa, 0x06, 0x95, 0xec, 0x0e, 0x23, 0x58, 0xf4, 0x72, 0xc8, 0xc8, 0x61, 0xb4, 0xbd, 0x4e, - 0xa0, 0x46, 0xfe, 0xe4, 0x89, 0x94, 0x75, 0x25, 0xd2, 0xc4, 0xb9, 0x76, 0x0d, 0x6d, 0xe4, 0x7d, - 0xa6, 0xe7, 0x29, 0xd9, 0xa3, 0xd5, 0x8b, 0x80, 0x77, 0x0d, 0x8f, 0x60, 0xed, 0x61, 0x41, 0xd5, - 0x28, 0x54, 0x44, 0x1b, 0x3f, 0xf1, 0x89, 0xf6, 0x24, 0x2b, 0x20, 0xbc, 0x7b, 0x16, 0xca, 0xed, - 0x25, 0x6e, 0xde, 0x19, 0xc3, 0x64, 0xf2, 0x69, 0xcd, 0x56, 0x2b, 0x8b, 0x4f, 0x51, 0xaa, 0x0b, - 0x4e, 0xb6, 0x7d, 0x0a, 0xb2, 0x1d, 0x1d, 0x59, 0xb8, 0xe3, 0x92, 0x0a, 0x15, 0x04, 0x43, 0x61, - 0xbe, 0xd3, 0xdc, 0x98, 0xf9, 0x11, 0x0c, 0x9d, 0x9c, 0x4c, 0x35, 0x15, 0xa2, 0x62, 0x4b, 0x3b, - 0xe7, 0x4d, 0x71, 0x72, 0xdd, 0xdc, 0xbe, 0x9a, 0x8b, 0x7c, 0x91, 0x37, 0x8f, 0x12, 0xa5, 0xb2, - 0x06, 0x5c, 0xa8, 0x30, 0x37, 0x97, 0x57, 0xf1, 0x90, 0x6f, 0x51, 0x71, 0x65, 0xb2, 0x2a, 0xad, - 0x4f, 0x95, 0x03, 0xcd, 0xa3, 0xdb, 0xa4, 0xa6, 0x18, 0x9d, 0xc0, 0x3b, 0xe1, 0x3a, 0x9e, 0x60, - 0x94, 0x65, 0xe0, 0x7d, 0xc6, 0xd2, 0x6f, 0xf5, 0x24, 0x59, 0x21, 0x30, 0xf8, 0x82, 0x15, 0x48, - 0x8b, 0xc7, 0x4a, 0x5a, 0xa0, 0xb0, 0x20, 0x6c, 0xe7, 0x2b, 0x69, 0x60, 0xe6, 0x06, 0xc2, 0x90, - 0x2b, 0x99, 0x31, 0x81, 0xbd, 0x54, 0x87, 0xad, 0x41, 0xfc, 0x83, 0x05, 0xc6, 0xc1, 0xaf, 0xd7, - 0xd5, 0xa3, 0xda, 0x2e, 0x3c, 0xb4, 0x99, 0xd4, 0x6e, 0xda, 0xb6, 0x3a, 0xbd, 0x91, 0x60, 0x35, - 0xa1, 0xcc, 0xac, 0xdb, 0x44, 0x3c, 0x09, 0x86, 0xa4, 0xa8, 0x79, 0x27, 0xf6, 0xc8, 0x92, 0x86, - 0x4b, 0x82, 0xee, 0x2b, 0xb0, 0x6a, 0x70, 0x9c, 0x93, 0x93, 0xce, 0x29, 0x18, 0xaf, 0xf2, 0x53, - 0xac, 0xd2, 0xab, 0xec, 0x0a, 0x9a, 0x6a, 0x64, 0xa3, 0x9e, 0x6a, 0xde, 0x11, 0xfb, 0x46, 0x2a, - 0x0c, 0x60, 0x26, 0x27, 0x2f, 0xa6, 0x1b, 0xc0, 0x72, 0xb4, 0xd6, 0xc2, 0x38, 0xdb, 0x1c, 0x4f, - 0xca, 0xac, 0xd8, 0x56, 0xad, 0x69, 0x6e, 0xec, 0xb5, 0x11, 0x6d, 0xda, 0x25, 0xbd, 0x20, 0x87, - 0xc0, 0xa0, 0xef, 0x06, 0xaf, 0x02, 0x55, 0xb3, 0x5c, 0x4d, 0x88, 0x0a, 0x0b, 0xc4, 0x60, 0x1f, - 0x32, 0xf2, 0xa8, 0x8a, 0xc5, 0x6e, 0x27, 0xdb, 0x42, 0x0f, 0x52, 0xc7, 0xcc, 0x8f, 0xd2, 0x04, - 0x7c, 0x30, 0x38, 0x24, 0x08, 0x71, 0x80, 0xbb, 0x55, 0xcb, 0x56, 0x71, 0x86, 0x07, 0x5a, 0xf8, - 0x38, 0x55, 0xcc, 0xf8, 0x55, 0x13, 0x7e, 0x00, 0x96, 0x0a, 0x47, 0x18, 0x07, 0x7f, 0x0d, 0x35, - 0x38, 0x21, 0x0c, 0x02, 0x0e, 0xc4, 0x3d, 0x36, 0x1d, 0xbb, 0xc7, 0xa6, 0xdb, 0x9c, 0x94, 0xab, - 0x71, 0x46, 0x46, 0x00, 0xa2, 0x5a, 0x43, 0x9e, 0x66, 0x8d, 0x70, 0xee, 0xe2, 0xe2, 0xe0, 0x7e, - 0x0e, 0x23, 0x2d, 0xec, 0x73, 0xb9, 0x8c, 0xf4, 0x4a, 0x27, 0x2e, 0xa9, 0x50, 0x89, 0x57, 0x4d, - 0x00, 0xa3, 0xb0, 0xb0, 0x97, 0xc9, 0xed, 0xc8, 0xe8, 0x08, 0x97, 0xfe, 0x8d, 0x05, 0xc6, 0x87, - 0x54, 0x50, 0xf3, 0x09, 0x1d, 0x46, 0x21, 0x3b, 0x0c, 0x86, 0x59, 0xa3, 0x21, 0x64, 0xc6, 0xf0, - 0x0e, 0xea, 0xc2, 0x41, 0x95, 0x04, 0x7e, 0x92, 0x9d, 0x3a, 0xb8, 0x33, 0xea, 0x05, 0x1d, 0xc7, - 0x9c, 0x0a, 0x64, 0x4b, 0x8d, 0x0f, 0xb5, 0x11, 0x09, 0x32, 0xe6, 0x42, 0x69, 0x2f, 0x77, 0x1c, - 0x42, 0x49, 0x39, 0xb5, 0x71, 0xdf, 0x2a, 0x48, 0x08, 0xed, 0xcd, 0xc3, 0xa3, 0x77, 0xf2, 0x65, - 0xb5, 0x0a, 0x70, 0x0e, 0xc8, 0x9d, 0xb0, 0xb6, 0xf2, 0xae, 0x4b, 0x40, 0x86, 0xd9, 0x91, 0xec, - 0x57, 0xb3, 0x03, 0xf6, 0x50, 0x89, 0xe4, 0x62, 0xdc, 0xe1, 0x65, 0x17, 0x15, 0xb9, 0xec, 0x30, - 0x19, 0x49, 0xea, 0xe2, 0xa4, 0xc5, 0x03, 0x0a, 0x99, 0x6b, 0x57, 0x24, 0xf3, 0x0d, 0xb2, 0xfa, - 0x97, 0xfb, 0xcd, 0x99, 0x8c, 0xef, 0x4b, 0xf9, 0xf2, 0xb9, 0xb4, 0x5e, 0xdf, 0x82, 0x70, 0xa8, - 0x15, 0x54, 0x3a, 0x0f, 0x37, 0xcf, 0xdd, 0x4d, 0xa4, 0x7c, 0xf3, 0x65, 0x7a, 0x11, 0x2f, 0xc2, - 0x29, 0xed, 0xc1, 0xbc, 0x20, 0xa1, 0x65, 0x5c, 0x5f, 0xc0, 0x1f, 0xa0, 0x5d, 0xd2, 0x71, 0x37, - 0x18, 0xbf, 0xc4, 0x80, 0xb2, 0xd9, 0x2a, 0xc1, 0xe5, 0x73, 0x64, 0x10, 0x7c, 0xe8, 0xb5, 0x8b, - 0xb8, 0xca, 0xcd, 0xf9, 0xa7, 0x22, 0x7f, 0xa8, 0x36, 0xf4, 0x69, 0x05, 0xbb, 0x24, 0xea, 0x86, - 0x1b, 0x6b, 0xe9, 0xba, 0x5a, 0xb5, 0xb1, 0xfa, 0x9f, 0x55, 0x6e, 0xe7, 0x91, 0xb0, 0x56, 0x6e, - 0x86, 0xc8, 0xeb, 0x2b, 0x60, 0x0d, 0xf1, 0x02, 0x98, 0x07, 0x62, 0x05, 0x83, 0xeb, 0xf6, 0x32, - 0x4e, 0x98, 0x79, 0xbf, 0xa2, 0x27, 0xb7, 0x13, 0x0b, 0x5a, 0xab, 0x1e, 0x28, 0xb9, 0xc7, 0x91, - 0xf6, 0x2f, 0xe7, 0x5d, 0xb7, 0x37, 0xa5, 0xa7, 0x70, 0xb2, 0xb5, 0xa8, 0x35, 0x36, 0xf5, 0xd8, - 0xf6, 0x2c, 0xc5, 0xa5, 0x7a, 0x3e, 0xb9, 0xb0, 0xf5, 0xdd, 0xfa, 0xec, 0x3f, 0x06, 0x2d, 0xa3, - 0xf0, 0x24, 0x7c, 0x0a, 0x64, 0x76, 0xf5, 0xaa, 0xaa, 0xd6, 0x16, 0x4d, 0x59, 0x42, 0xdc, 0xcb, - 0x2d, 0x90, 0xbc, 0xdd, 0xad, 0x22, 0x44, 0x6b, 0x3a, 0x2a, 0x34, 0xad, 0x3b, 0xa9, 0x22, 0x22, - 0x7c, 0xa6, 0x79, 0x2a, 0x4d, 0x13, 0x26, 0x26, 0x9c, 0x90, 0x9f, 0xf1, 0xf8, 0x46, 0x98, 0xb0, - 0xd5, 0xc7, 0x05, 0xc5, 0x0b, 0x99, 0x1b, 0x1e, 0x6b, 0x44, 0x38, 0x87, 0x40, 0x3d, 0x8e, 0xa9, - 0xeb, 0x82, 0xed, 0x3b, 0x2b, 0x51, 0xf2, 0x3c, 0x57, 0x64, 0x4f, 0x58, 0xa3, 0x71, 0x3a, 0x14, - 0x36, 0xab, 0x47, 0x95, 0xfa, 0x74, 0x16, 0x17, 0x77, 0xd6, 0x93, 0xff, 0xd3, 0xc2, 0xd5, 0x30, - 0xfe, 0x24, 0x07, 0xb2, 0xd2, 0xf6, 0x33, 0x0c, 0x03, 0x3d, 0x02, 0x9c, 0x7b, 0x05, 0x7e, 0xc5, - 0x1b, 0x92, 0x29, 0xb7, 0x01, 0x4f, 0x6e, 0x9c, 0x5b, 0xe7, 0xf7, 0x53, 0xd4, 0x41, 0xd1, 0x90, - 0xe7, 0x7e, 0x50, 0xb1, 0x7c, 0xbe, 0xae, 0xda, 0xb3, 0xa4, 0x06, 0x47, 0xdb, 0xb8, 0xa4, 0xa7, - 0x89, 0xdd, 0x4b, 0xf9, 0x18, 0x2a, 0x3c, 0xe3, 0x44, 0x4e, 0x2f, 0x4a, 0x07, 0xe3, 0x9e, 0x16, - 0xd9, 0x5e, 0x41, 0xe3, 0x52, 0xb9, 0x6c, 0x65, 0xf8, 0xc9, 0x7c, 0x9e, 0x17, 0x13, 0x11, 0xe9, - 0x83, 0x95, 0x90, 0xce, 0x34, 0x14, 0x4b, 0x61, 0xfa, 0x17, 0x51, 0xaa, 0x72, 0x8b, 0x79, 0x89, - 0x62, 0x46, 0x92, 0x30, 0x73, 0xaa, 0x71, 0x4b, 0x49, 0x15, 0x0b, 0xa4, 0x9b, 0x3d, 0x2d, 0x9a, - 0x60, 0xd5, 0xac, 0xe7, 0xf8, 0x9b, 0x9f, 0xb4, 0x05, 0xdb, 0xc8, 0xdb, 0x62, 0xfd, 0x0d, 0x07, - 0xbb, 0xbb, 0xdd, 0x5d, 0xa5, 0x02, 0x8e, 0x60, 0xb2, 0xce, 0x17, 0x0f, 0xa3, 0xd2, 0x4e, 0xcf, - 0xff, 0x23, 0xdf, 0x3f, 0x57, 0x38, 0x8d, 0xc1, 0xf7, 0x82, 0x2d, 0x26, 0x13, 0x86, 0x7a, 0xbc, - 0x0b, 0x55, 0x76, 0x3e, 0xb3, 0xca, 0x7f, 0xfd, 0xbf, 0xee, 0xaa, 0x72, 0xe6, 0x07, 0x68, 0x38, - 0xbb, 0x56, 0x54, 0xb4, 0x6f, 0xf2, 0x0a, 0x3b, 0x8e, 0x5f, 0x44, 0xa8, 0x10, 0x01, 0x8c, 0x2f, - 0x5f, 0x52, 0x1f, 0x71, 0x0d, 0xaf, 0x72, 0x0c, 0x5d, 0xeb, 0x1f, 0x1e, 0x3f, 0xa0, 0xf0, 0x7b, - 0x79, 0x89, 0x2b, 0x77, 0xa4, 0xca, 0x91, 0x4a, 0xa1, 0x4e, 0x66, 0xd0, 0x46, 0xed, 0x94, 0x25, - 0x57, 0x2c, 0x11, 0xba, 0x86, 0x6e, 0x09, 0xf2, 0xfa, 0x95, 0xf3, 0x83, 0x82, 0x9f, 0xab, 0x5e, - 0x0e, 0x39, 0xa9, 0x33, 0xa9, 0xb8, 0x97, 0x36, 0xb9, 0x8b, 0x5c, 0xab, 0x55, 0x75, 0x07, 0x57, - 0x2b, 0xd1, 0x41, 0x4b, 0x88, 0x68, 0x9e, 0x5e, 0xce, 0x2e, 0xab, 0xd9, 0x3a, 0xd9, 0x8f, 0x48, - 0x28, 0xea, 0x55, 0x90, 0x4e, 0xc4, 0x31, 0x74, 0x72, 0x6a, 0xcb, 0xa1, 0x05, 0xc4, 0xd5, 0x34, - 0x24, 0x8e, 0xf2, 0x64, 0x1d, 0xb5, 0x22, 0xb5, 0x96, 0x9b, 0x23, 0xaa, 0x2e, 0xa5, 0x5d, 0xb8, - 0xa5, 0x7e, 0xd7, 0xbe, 0xac, 0xe3, 0xa3, 0xbf, 0x03, 0x4f, 0xa0, 0xca, 0x8c, 0xb6, 0x34, 0xb3, - 0x0d, 0x2f, 0x44, 0x40, 0x1e, 0x79, 0xb5, 0x0a, 0xf0, 0xbb, 0x25, 0x8d, 0x48, 0xd3, 0x86, 0x16, - 0xd1, 0xa7, 0x88, 0x87, 0xfa, 0x51, 0x72, 0x53, 0x1a, 0x5e, 0x92, 0x14, 0x7c, 0xbb, 0x0a, 0x45, - 0x55, 0x55, 0x72, 0xfd, 0xcf, 0xb8, 0x0e, 0xb2, 0x0b, 0x23, 0x8e, 0x98, 0x68, 0x02, 0xe4, 0xa1, - 0x01, 0xaa, 0x04, 0x2a, 0x56, 0xe9, 0xdd, 0xed, 0x38, 0x65, 0xbc, 0xbb, 0x77, 0x8e, 0x72, 0xb1, - 0xb3, 0x77, 0x8d, 0x9f, 0x5b, 0x41, 0x10, 0x79, 0x36, 0x8d, 0x1e, 0x6c, 0xfb, 0x73, 0xc8, 0xa1, - 0xda, 0x02, 0xc5, 0xd3, 0x60, 0xa6, 0xbd, 0x89, 0x1a, 0xa5, 0x7f, 0x52, 0x06, 0xa5, 0x58, 0x6a, - 0x07, 0x35, 0x4f, 0x10, 0x1f, 0x08, 0x03, 0x26, 0xe1, 0x52, 0x7d, 0xb9, 0x6a, 0x12, 0xd2, 0x77, - 0x98, 0xac, 0xb4, 0x7b, 0x44, 0x2c, 0xf3, 0xa1, 0x33, 0x9c, 0xf1, 0x6d, 0x24, 0xa1, 0xd8, 0xea, - 0xf1, 0x24, 0x9a, 0xbe, 0xb8, 0x61, 0x13, 0xd4, 0x09, 0xcf, 0x70, 0x6f, 0xb7, 0xbb, 0xb3, 0xf3, - 0x70, 0xb9, 0xed, 0x70, 0xe1, 0x7a, 0x07, 0x6b, 0x3b, 0x73, 0xf8, 0xc6, 0x15, 0x3e, 0x54, 0xa5, - 0x05, 0x61, 0x7e, 0x02, 0x47, 0x3b, 0x36, 0x17, 0xda, 0x5a, 0xa4, 0x81, 0x13, 0x76, 0xea, 0xf9, - 0x4e, 0xe1, 0x9d, 0xc2, 0x0e, 0x80, 0x14, 0xbe, 0x13, 0x7e, 0x02, 0x95, 0xa0, 0x47, 0x23, 0xdf, - 0xd6, 0x8f, 0x06, 0x55, 0x19, 0x13, 0xa8, 0x53, 0x55, 0xae, 0x74, 0xb7, 0x0b, 0x31, 0x45, 0x28, - 0x8b, 0x57, 0xc8, 0x58, 0x8e, 0x1c, 0x52, 0x3e, 0x23, 0xab, 0x37, 0x2c, 0xd7, 0x03, 0x9c, 0xd0, - 0xe3, 0x27, 0xf0, 0x84, 0xaa, 0xc3, 0x03, 0x9d, 0x89, 0x99, 0x9e, 0x5c, 0xbd, 0xa1, 0x2d, 0x3c, - 0xe6, 0x34, 0xa9, 0xe3, 0x31, 0x3d, 0x36, 0x82, 0xc9, 0xd1, 0xa5, 0xdd, 0x0b, 0x96, 0x9f, 0x2f, - 0x2d, 0xe0, 0x7e, 0x06, 0x3b, 0x3f, 0x5d, 0xe4, 0x17, 0x5b, 0xcb, 0x4f, 0xb3, 0x94, 0xdb, 0x1c, - 0x6e, 0x1c, 0x2c, 0xf3, 0xbd, 0x10, 0xac, 0x07, 0x5e, 0x3d, 0xfc, 0x72, 0x5b, 0x25, 0x77, 0x74, - 0xfb, 0x4a, 0x15, 0x89, 0xb8, 0x2f, 0x5a, 0xec, 0x54, 0x40, 0xe1, 0x29, 0x00, 0x04, 0x81, 0xef, - 0x46, 0x54, 0x43, 0xe6, 0x95, 0x5b, 0xd7, 0x81, 0xcc, 0xd6, 0x58, 0x8d, 0x76, 0xf8, 0x52, 0x3f, - 0xee, 0xd5, 0x19, 0x6a, 0xcb, 0xad, 0x3a, 0x66, 0x71, 0x88, 0xbe, 0xec, 0x40, 0xda, 0xad, 0x6d, - 0xa2, 0x6a, 0x5d, 0x53, 0xb5, 0xcb, 0x33, 0x4e, 0x5a, 0xd3, 0x60, 0xe4, 0xea, 0xa7, 0x40, 0xb5, - 0xf3, 0x6b, 0x96, 0xed, 0x1d, 0x2d, 0xaf, 0x41, 0x21, 0xbb, 0x4e, 0x5b, 0x74, 0x38, 0xce, 0x52, - 0xc7, 0xd8, 0x4a, 0xa4, 0x07, 0xf0, 0x30, 0x81, 0x73, 0x98, 0xeb, 0x81, 0xe8, 0xec, 0xb5, 0xd3, - 0x63, 0x3d, 0x5b, 0xfa, 0x5b, 0x88, 0xb6, 0xb9, 0x67, 0x3e, 0x98, 0xe1, 0xe9, 0xad, 0xf2, 0x9a, - 0xa3, 0xea, 0x26, 0x6d, 0x1a, 0x0a, 0x25, 0xed, 0x75, 0x7a, 0xfd, 0x76, 0xbd, 0x5e, 0xc8, 0x9b, - 0xc5, 0xb1, 0x31, 0x0e, 0xce, 0x47, 0xa3, 0x91, 0x49, 0x47, 0x70, 0x71, 0x83, 0x91, 0x15, 0xae, - 0x56, 0x8f, 0x96, 0xe6, 0x95, 0xe9, 0x66, 0x09, 0xe8, 0x74, 0x8f, 0xb4, 0x15, 0x0c, 0x6d, 0xff, - 0x91, 0x70, 0xd2, 0x0d, 0x4d, 0x3c, 0x9b, 0xf8, 0x1a, 0x29, 0x41, 0xcc, 0xe1, 0xa0, 0x9e, 0x8e, - 0x8f, 0x21, 0x4d, 0xbc, 0x8e, 0xac, 0xd0, 0xd3, 0xf2, 0xf0, 0x33, 0x80, 0x3c, 0x83, 0x3c, 0xb8, - 0x68, 0xd2, 0x5b, 0xf1, 0x8b, 0xda, 0xf9, 0x5a, 0x6b, 0xa3, 0x3f, 0x8f, 0xaa, 0xda, 0x5a, 0xf6, - 0xf1, 0xd6, 0xc2, 0x1d, 0x5b, 0x9c, 0xc8, 0x03, 0x76, 0x43, 0xa2, 0x03, 0x4d, 0x1f, 0x0f, 0x9e, - 0xeb, 0x46, 0xa2, 0xb6, 0x44, 0x6a, 0xe3, 0x77, 0x69, 0x37, 0xdd, 0x63, 0xf1, 0x55, 0x2c, 0x48, - 0xe8, 0x35, 0x0d, 0x2b, 0x8c, 0x2e, 0x56, 0x36, 0xf0, 0x32, 0x04, 0x2b, 0x6b, 0xdd, 0x78, 0x4a, - 0xfd, 0xd6, 0xbd, 0xed, 0x18, 0xf3, 0x80, 0x8b, 0x74, 0x60, 0xca, 0xdb, 0x2d, 0x79, 0x3a, 0x5a, - 0x9e, 0xdf, 0xb7, 0xe4, 0xe9, 0xaa, 0x3c, 0x25, 0x3a, 0x03, 0xc0, 0x4c, 0xf4, 0xa9, 0x68, 0xdd, - 0xce, 0x84, 0xd7, 0x97, 0xeb, 0x88, 0x77, 0xbb, 0x3b, 0x46, 0x05, 0x74, 0x29, 0x35, 0xcd, 0xd5, - 0x92, 0x03, 0xe8, 0xed, 0x1b, 0xa5, 0x1a, 0xc8, 0xd9, 0xd0, 0x25, 0x38, 0xbf, 0xc6, 0x43, 0x45, - 0xea, 0xdb, 0xb0, 0x74, 0x86, 0x42, 0x10, 0x1a, 0x6d, 0x09, 0xd4, 0x19, 0xd7, 0xe7, 0xbb, 0xe5, - 0x29, 0xb2, 0xf9, 0x3b, 0x74, 0x70, 0x7e, 0x4b, 0x5b, 0x46, 0x9d, 0x20, 0xa5, 0xcd, 0xfe, 0x05, - 0x86, 0x2f, 0x1c, 0x02, 0x00, 0x86, 0x97, 0x59, 0xc4, 0x83, 0x2c, 0x33, 0xb2, 0xca, 0xb5, 0xa1, - 0x2b, 0xf5, 0x9e, 0x65, 0x13, 0xa7, 0x5c, 0x86, 0x47, 0x98, 0xf1, 0x64, 0xa4, 0x99, 0x8d, 0xcf, - 0x3c, 0xd4, 0x8c, 0xa7, 0xc5, 0x9c, 0xd1, 0xbc, 0x4a, 0x05, 0x67, 0xed, 0x46, 0xdf, 0xe4, 0xd1, - 0x59, 0xfa, 0xf0, 0x03, 0x05, 0x7e, 0x2d, 0x2f, 0xda, 0x8b, 0x66, 0xe5, 0x01, 0x7e, 0x1a, 0x8c, - 0x62, 0x90, 0x9b, 0xc2, 0x27, 0x11, 0xe8, 0xc6, 0x95, 0x61, 0x56, 0xbd, 0x0d, 0x70, 0xb7, 0x04, - 0x8a, 0x2c, 0x45, 0x73, 0xfd, 0xfc, 0x72, 0xa2, 0xd7, 0x1b, 0xf9, 0xb7, 0x21, 0x81, 0x6d, 0x64, - 0xb5, 0x2b, 0xb0, 0x20, 0xa2, 0x35, 0xca, 0x88, 0xf3, 0x9e, 0x1c, 0x51, 0x53, 0x0b, 0x50, 0xdf, - 0x9e, 0xdf, 0xd8, 0xa6, 0x6b, 0x96, 0x43, 0xd6, 0x6b, 0xb1, 0x78, 0xe5, 0x72, 0x9c, 0x0a, 0x05, - 0x61, 0x72, 0xe9, 0x8a, 0x4b, 0x6a, 0xb7, 0x73, 0x8c, 0x2d, 0xc0, 0x46, 0xa6, 0xe9, 0x2a, 0x08, - 0xad, 0x9d, 0x93, 0x8f, 0x3f, 0xfe, 0x72, 0xba, 0x73, 0xee, 0x98, 0x06, 0xed, 0xd6, 0x10, 0xa9, - 0xd6, 0x5f, 0x3e, 0x5e, 0x2f, 0x3b, 0x6b, 0x7b, 0x65, 0x7d, 0x4c, 0x1b, 0xfc, 0x11, 0xf2, 0x30, - 0xef, 0x08, 0x49, 0xe8, 0x03, 0x0c, 0x98, 0x24, 0x1e, 0x9a, 0xb0, 0x70, 0x1f, 0xe1, 0x71, 0x32, - 0x79, 0xa1, 0xc5, 0x24, 0x2d, 0x07, 0x80, 0x58, 0xe6, 0xc7, 0x56, 0x45, 0x34, 0x75, 0x12, 0x40, - 0x92, 0xb3, 0x5b, 0xd0, 0xe7, 0x17, 0xfe, 0xe4, 0x42, 0xdf, 0x13, 0x87, 0x71, 0x92, 0x2a, 0x0e, - 0xc7, 0x40, 0x5b, 0x18, 0xaf, 0x59, 0x06, 0x8b, 0x78, 0x0e, 0xef, 0x6f, 0xe1, 0xbd, 0x7a, 0xeb, - 0x3a, 0xe6, 0xa6, 0x40, 0xd9, 0x7a, 0xf6, 0x17, 0x14, 0x5c, 0x66, 0x6b, 0xfe, 0x90, 0x91, 0x10, - 0xcf, 0xf3, 0xbf, 0xc2, 0x84, 0x6d, 0xf9, 0xe3, 0x79, 0x9e, 0x35, 0x9e, 0xa3, 0x42, 0xe5, 0x68, - 0xbb, 0x2f, 0x0b, 0xbb, 0xb4, 0x8a, 0xe9, 0x7f, 0x27, 0x46, 0xee, 0xcb, 0xa1, 0x6f, 0xfd, 0x64, - 0xa4, 0xdf, 0xd9, 0xd5, 0x20, 0xdc, 0x85, 0x60, 0x8a, 0xba, 0xa7, 0xa3, 0x80, 0x62, 0x09, 0x6e, - 0x47, 0xd9, 0xff, 0x4e, 0x03, 0x82, 0xf5, 0x4f, 0x8b, 0xb5, 0x4f, 0x3f, 0x77, 0xf0, 0x4a, 0x41, - 0x52, 0x54, 0xcf, 0x11, 0x57, 0xd9, 0x45, 0x90, 0x0a, 0x2e, 0x15, 0xc1, 0xd1, 0x3c, 0xb3, 0xdd, - 0xea, 0x9b, 0x8e, 0xa2, 0x7e, 0x0f, 0xb3, 0x88, 0xf8, 0x14, 0xef, 0x89, 0x91, 0x41, 0x2a, 0xb0, - 0xd9, 0x0c, 0xc4, 0xc6, 0x93, 0x30, 0x04, 0x89, 0x3b, 0xf5, 0x4c, 0x1e, 0xe6, 0xb1, 0x94, 0x07, - 0x46, 0x85, 0x76, 0xce, 0xd1, 0x41, 0xb1, 0x1d, 0x8c, 0x2b, 0x01, 0x93, 0x19, 0x36, 0xa7, 0x66, - 0xa2, 0xd2, 0x84, 0x57, 0x02, 0x8f, 0xe7, 0x76, 0x58, 0xa9, 0x5e, 0xfb, 0xee, 0x76, 0x80, 0xd5, - 0x83, 0x48, 0x36, 0x34, 0x2d, 0x6c, 0xe6, 0x43, 0x28, 0x79, 0xed, 0xb7, 0x92, 0x50, 0x4a, 0x3d, - 0xef, 0x08, 0x45, 0xe5, 0x9f, 0x4e, 0xbf, 0xda, 0xe2, 0x36, 0xae, 0xba, 0xe6, 0xeb, 0xd4, 0x62, - 0xad, 0xd5, 0x24, 0x5a, 0x23, 0x3e, 0xfb, 0xfc, 0xac, 0x55, 0x03, 0x0b, 0x64, 0x81, 0xed, 0x6d, - 0xc1, 0xeb, 0x0b, 0xa4, 0x21, 0x8e, 0x55, 0x9c, 0xb5, 0x8b, 0x08, 0xc1, 0xf4, 0xca, 0x3a, 0x91, - 0xee, 0xb5, 0x30, 0x3c, 0x15, 0x41, 0x80, 0xf5, 0xc8, 0xe6, 0x25, 0x06, 0x50, 0x44, 0x56, 0x5a, - 0x9b, 0x17, 0xbd, 0xa8, 0x28, 0x46, 0x7c, 0x50, 0x51, 0xac, 0xd4, 0xff, 0x8d, 0x92, 0xf1, 0x5c, - 0x45, 0x29, 0x4e, 0xb3, 0x78, 0x8e, 0x06, 0xb0, 0x7f, 0xee, 0xf3, 0x40, 0x91, 0x39, 0x39, 0xd7, - 0x3c, 0x22, 0xe8, 0x2d, 0x28, 0x42, 0xd6, 0x51, 0x59, 0xb7, 0xd0, 0x9f, 0x88, 0x76, 0x14, 0x7a, - 0x2a, 0xa3, 0x76, 0x52, 0x06, 0x83, 0xaa, 0xe8, 0xe2, 0x28, 0xdc, 0xc4, 0x33, 0x24, 0x09, 0xea, - 0xd4, 0x62, 0x8e, 0xe4, 0xa1, 0x0f, 0xec, 0x51, 0xc9, 0x07, 0x10, 0x87, 0x80, 0x30, 0x53, 0x14, - 0x2a, 0xae, 0x91, 0xdb, 0x2e, 0x25, 0x6a, 0x73, 0x74, 0x10, 0xa5, 0x60, 0xf5, 0x3f, 0x65, 0x40, - 0x85, 0xd0, 0x12, 0x2f, 0x13, 0x01, 0x5f, 0x1c, 0x07, 0xe3, 0x10, 0x66, 0x4c, 0x0d, 0x11, 0x6a, - 0x13, 0x63, 0x45, 0x74, 0xfa, 0xb2, 0xe1, 0x4f, 0xdb, 0xa1, 0x70, 0xa3, 0x1e, 0x8f, 0x97, 0xb5, - 0xe4, 0x67, 0x40, 0x58, 0x23, 0xcc, 0x8f, 0x7f, 0x80, 0x5e, 0x61, 0xae, 0x45, 0x20, 0x63, 0x9a, - 0x51, 0xe3, 0x4f, 0xa0, 0x4e, 0x52, 0x24, 0x7b, 0xf4, 0xc4, 0x58, 0xe6, 0xd7, 0xfc, 0x90, 0x4a, - 0xd8, 0x30, 0xc9, 0xf3, 0x3e, 0x43, 0x25, 0x04, 0xcf, 0x68, 0x9a, 0x76, 0x5e, 0x6a, 0x99, 0x59, - 0x3e, 0xc6, 0xf5, 0x00, 0x96, 0xa3, 0x18, 0x3a, 0x05, 0x1e, 0x02, 0x43, 0x13, 0xd4, 0x4b, 0xc7, - 0x7c, 0x81, 0xe1, 0x3f, 0x0c, 0x68, 0x2f, 0x83, 0x0e, 0x61, 0x8d, 0x45, 0x31, 0x42, 0xd3, 0x43, - 0x0b, 0xec, 0x51, 0x3f, 0x0c, 0x6f, 0xb9, 0x55, 0xb7, 0x2e, 0xce, 0x15, 0xd5, 0x6b, 0xd4, 0xda, - 0x82, 0xaa, 0x5c, 0xd7, 0xa6, 0xbd, 0x51, 0x35, 0xa6, 0x47, 0x63, 0x12, 0x91, 0x2a, 0xae, 0x9e, - 0xfb, 0xe9, 0x05, 0x4a, 0x06, 0x45, 0x9d, 0x13, 0x2e, 0x2f, 0x52, 0xb9, 0x4e, 0x80, 0x66, 0xa1, - 0xe3, 0x6f, 0x9a, 0x29, 0xe2, 0x1c, 0x06, 0x05, 0x1d, 0xd9, 0xb2, 0x4d, 0x52, 0xc1, 0x2a, 0x3c, - 0x26, 0xec, 0xd0, 0xaf, 0x3c, 0xb6, 0xa1, 0x09, 0x1d, 0x15, 0x5d, 0xf0, 0xbe, 0x9c, 0xe8, 0x4f, - 0x11, 0x7e, 0xe8, 0xd0, 0x2e, 0x2e, 0x4b, 0x66, 0x5b, 0x16, 0xc5, 0x6d, 0x6c, 0xbf, 0xba, 0xad, - 0x2d, 0xf5, 0xae, 0xb1, 0x5e, 0xee, 0xcf, 0x7b, 0x93, 0x78, 0xdd, 0xa1, 0x7c, 0x3c, 0x1c, 0xa8, - 0xc7, 0x46, 0xc3, 0x8e, 0x54, 0x16, 0x47, 0x80, 0x92, 0x67, 0xfc, 0xcc, 0x0e, 0x6f, 0xa9, 0xae, - 0x16, 0x8a, 0x48, 0xde, 0xe9, 0xa5, 0x6f, 0xaa, 0x80, 0xe7, 0xf4, 0x52, 0x11, 0x7b, 0x21, 0xac, - 0xdc, 0x02, 0x48, 0x7b, 0xa1, 0x99, 0xd0, 0x67, 0x64, 0xdc, 0x9f, 0x0a, 0x69, 0xa4, 0x8d, 0xb6, - 0x1e, 0xf2, 0xe7, 0x33, 0x32, 0x6e, 0x90, 0xd0, 0xd6, 0x9c, 0x18, 0x7b, 0xe1, 0xf3, 0x72, 0x1e, - 0xdf, 0xa6, 0x9f, 0x09, 0x65, 0x18, 0x7e, 0x4e, 0x46, 0x66, 0x97, 0xe5, 0x76, 0x9e, 0x41, 0xe7, - 0x87, 0xe2, 0x84, 0x09, 0x74, 0xdf, 0x2e, 0x6e, 0x65, 0x0c, 0xf5, 0x5d, 0x6a, 0x62, 0xfb, 0x50, - 0x39, 0x48, 0x55, 0xb6, 0x91, 0x27, 0xc3, 0x3c, 0xb4, 0x95, 0x1d, 0xc1, 0x05, 0x73, 0xd7, 0x86, - 0x94, 0x36, 0x37, 0xdd, 0x0b, 0x2b, 0x8a, 0x3a, 0x25, 0xda, 0x85, 0x30, 0x36, 0x6a, 0xec, 0xa0, - 0x74, 0xbd, 0xae, 0x76, 0xab, 0xa2, 0x6a, 0xd0, 0x4a, 0xc9, 0x73, 0x85, 0x87, 0x84, 0xf8, 0xa8, - 0x51, 0x96, 0x3c, 0x36, 0x46, 0xb1, 0x1e, 0x99, 0x11, 0x31, 0xcc, 0x33, 0x8a, 0xa3, 0x4a, 0xdb, - 0x32, 0xd2, 0xa0, 0xf1, 0x9c, 0x79, 0x34, 0x8d, 0xea, 0xac, 0x44, 0x09, 0x3c, 0xab, 0x94, 0x4d, - 0xb4, 0xdb, 0x9d, 0xaf, 0xb8, 0x50, 0x2e, 0xdc, 0xf3, 0x26, 0xd7, 0x8f, 0x32, 0x27, 0xa3, 0x98, - 0x39, 0x90, 0xbc, 0xce, 0x54, 0x6a, 0xe8, 0x84, 0xf5, 0xba, 0xdf, 0x68, 0xac, 0x0b, 0x87, 0xba, - 0x0b, 0x03, 0xd3, 0xf0, 0x9d, 0xcf, 0x38, 0x76, 0xb1, 0x11, 0x37, 0x0b, 0x06, 0x03, 0xcd, 0xeb, - 0x63, 0x60, 0x44, 0x50, 0x43, 0x51, 0xdf, 0x7a, 0x99, 0xb1, 0x4b, 0x79, 0x3a, 0x00, 0x55, 0x09, - 0xb5, 0xe0, 0x23, 0x1f, 0x44, 0x88, 0x3e, 0x0d, 0x12, 0xc6, 0x09, 0x8f, 0xca, 0x34, 0x65, 0xe0, - 0x06, 0xe9, 0x2d, 0x67, 0x92, 0x47, 0xab, 0x3e, 0x7b, 0x7a, 0x9c, 0x3f, 0xe5, 0xa9, 0xda, 0xd0, - 0x72, 0x34, 0x1f, 0x56, 0xf1, 0x24, 0x5e, 0x51, 0xf8, 0x4b, 0xbe, 0x16, 0x67, 0x61, 0xf0, 0x08, - 0xcc, 0x15, 0x0f, 0x1f, 0xb6, 0x19, 0xfa, 0x42, 0x2f, 0xa7, 0x70, 0xa1, 0x15, 0x24, 0x68, 0xe5, - 0xfa, 0xc2, 0xd6, 0xc2, 0x79, 0x24, 0x41, 0xb9, 0x6b, 0x40, 0xc7, 0xe6, 0x79, 0x11, 0x9b, 0xb4, - 0x61, 0xc7, 0xc4, 0x59, 0xd6, 0x24, 0xb4, 0x6c, 0x0e, 0xc6, 0xc6, 0x1d, 0x32, 0x3c, 0x34, 0x1e, - 0xcd, 0x14, 0xf2, 0xe4, 0xee, 0xc6, 0x35, 0x32, 0xd9, 0xe6, 0x3d, 0x30, 0x9d, 0x76, 0x7e, 0xe7, - 0x4b, 0x17, 0x17, 0x5b, 0xab, 0x6e, 0x77, 0xe9, 0xb4, 0x1f, 0x67, 0x78, 0x93, 0x8b, 0x13, 0x7b, - 0xbb, 0x43, 0xff, 0xbe, 0x4b, 0x68, 0xf2, 0x6d, 0x87, 0x78, 0x83, 0x01, 0x3b, 0xec, 0x62, 0x88, - 0x62, 0x75, 0x48, 0x26, 0xc1, 0xc4, 0xe4, 0xb0, 0xd3, 0x1e, 0xa2, 0xb8, 0x0e, 0x4f, 0xe2, 0xd3, - 0x06, 0xfc, 0xc1, 0x20, 0xb7, 0xf8, 0x23, 0xaf, 0x6d, 0xf1, 0x37, 0xaf, 0x6d, 0xc1, 0xac, 0x78, - 0x59, 0x0b, 0xcf, 0x2d, 0x9f, 0xf8, 0xb5, 0x2d, 0x7e, 0xe1, 0xda, 0x16, 0x9f, 0xae, 0x6d, 0x49, - 0x1e, 0x67, 0x8d, 0xc8, 0x61, 0x8f, 0x33, 0xbc, 0xaa, 0x25, 0x2b, 0x5e, 0xd5, 0xe2, 0xab, 0xab, - 0x5a, 0xe2, 0x86, 0xd7, 0xab, 0x08, 0xeb, 0x69, 0xf8, 0xe9, 0x6d, 0x34, 0x39, 0x7a, 0x50, 0xd3, - 0xa2, 0x8c, 0xcb, 0x18, 0xac, 0x26, 0xa8, 0x2c, 0x0c, 0x64, 0x08, 0x9b, 0xe6, 0x9e, 0x07, 0xee, - 0xb5, 0x71, 0xb2, 0xca, 0x8f, 0x2a, 0xe0, 0x66, 0xe2, 0x71, 0x45, 0x04, 0xd7, 0xb4, 0x47, 0xd5, - 0x7b, 0xc3, 0x81, 0x82, 0x09, 0x80, 0x13, 0x3a, 0xfe, 0xc5, 0xd2, 0xcb, 0xb4, 0x29, 0x56, 0xff, - 0x4f, 0x4d, 0xdb, 0xa5, 0xa8, 0x5b, 0x18, 0xc2, 0x2a, 0x1a, 0x69, 0x4b, 0x27, 0x51, 0xbe, 0x0f, - 0xd6, 0x76, 0x81, 0x24, 0xc5, 0xce, 0x0a, 0xe0, 0xb9, 0xe0, 0x3c, 0xb2, 0x52, 0xe0, 0x82, 0x70, - 0xd6, 0xc2, 0xaa, 0x5e, 0x46, 0x41, 0xf6, 0x96, 0xd7, 0xb6, 0x5a, 0x81, 0x3e, 0x34, 0xe4, 0xdb, - 0x56, 0x6b, 0xd9, 0x6a, 0x55, 0xab, 0x81, 0x01, 0x78, 0x11, 0x5c, 0x22, 0xef, 0x08, 0xd5, 0xd6, - 0xf7, 0x3e, 0x59, 0x41, 0xbd, 0x8e, 0x51, 0xd8, 0xf8, 0x4d, 0x16, 0x18, 0x2d, 0x4b, 0x24, 0x25, - 0x0c, 0x58, 0xee, 0x8a, 0xc9, 0x6d, 0x89, 0x60, 0xef, 0xa0, 0x2e, 0x38, 0xfa, 0x64, 0x89, 0x27, - 0xdb, 0xa5, 0x1f, 0xa5, 0x24, 0xa7, 0x2d, 0xbc, 0x4a, 0x7b, 0x24, 0x4a, 0xe3, 0xb3, 0xed, 0x26, - 0xce, 0x0c, 0xd3, 0xfd, 0x39, 0x5a, 0x16, 0x49, 0x00, 0x42, 0x9b, 0x6a, 0x5b, 0x40, 0x62, 0x14, - 0x83, 0x64, 0x22, 0xb5, 0x6b, 0x51, 0xaf, 0x67, 0x39, 0xea, 0xef, 0xc1, 0x19, 0x15, 0x3b, 0x15, - 0x3b, 0xb9, 0x17, 0xe4, 0x17, 0x85, 0x84, 0xd5, 0x8a, 0x58, 0x41, 0xdb, 0xd4, 0x44, 0xc9, 0xb8, - 0x55, 0x84, 0xd7, 0x3b, 0xf5, 0x10, 0x6e, 0x11, 0x6b, 0x6e, 0xb5, 0x02, 0xdb, 0x72, 0xec, 0xe1, - 0xfb, 0x3c, 0x0e, 0x6f, 0x91, 0x4e, 0x46, 0xfc, 0xb3, 0x7c, 0x05, 0x45, 0xd6, 0x2e, 0x1f, 0xb3, - 0xfb, 0xc3, 0xe4, 0x2f, 0x7f, 0x31, 0xb8, 0xb2, 0x6f, 0x60, 0x68, 0x4c, 0xae, 0x9d, 0xfa, 0x63, - 0x98, 0x4d, 0xf1, 0x80, 0x82, 0x2c, 0x4a, 0x7b, 0xa1, 0xa6, 0xc6, 0xc4, 0x8f, 0x30, 0x70, 0x2b, - 0x8c, 0x0e, 0xe8, 0xe7, 0x53, 0xe3, 0x2f, 0x7f, 0x31, 0x1d, 0x93, 0xee, 0x4a, 0xbb, 0xe6, 0xb7, - 0x4b, 0x1e, 0xa8, 0x6b, 0x49, 0xbf, 0xea, 0x1d, 0x74, 0x70, 0x61, 0x01, 0xac, 0xae, 0xab, 0xf8, - 0x13, 0x7b, 0x1a, 0xc6, 0xe3, 0x0f, 0xdf, 0xbf, 0x4a, 0xdd, 0xb9, 0x13, 0xc5, 0x18, 0xa2, 0x94, - 0xac, 0xfe, 0xef, 0x19, 0xf4, 0xec, 0xfc, 0x9c, 0x25, 0xa9, 0x0b, 0x6c, 0x18, 0x01, 0xa7, 0x4d, - 0xd0, 0xbd, 0xcc, 0xce, 0x13, 0x8c, 0x72, 0x7e, 0xb9, 0xf6, 0xd2, 0x5c, 0x99, 0xfc, 0xb4, 0xe9, - 0x3e, 0xf3, 0x72, 0xf7, 0x19, 0x52, 0x0a, 0xe8, 0x70, 0x2e, 0x13, 0x98, 0xb9, 0x2e, 0x6d, 0x7c, - 0x04, 0x23, 0x43, 0xf4, 0x84, 0xef, 0x43, 0xb4, 0x47, 0xe5, 0x14, 0xf7, 0xe4, 0xd4, 0xb9, 0xf5, - 0xae, 0x35, 0x9b, 0x66, 0x92, 0xa6, 0x4d, 0x11, 0x8b, 0x16, 0xd5, 0x89, 0xc2, 0x37, 0x5c, 0x84, - 0xd1, 0x3e, 0x5e, 0x79, 0xb5, 0xc8, 0xbf, 0x0a, 0xc0, 0x5c, 0x8b, 0x13, 0xba, 0x8f, 0xef, 0x09, - 0xfa, 0x53, 0xd0, 0xac, 0xaf, 0xd7, 0x6b, 0x55, 0x9f, 0x30, 0xdc, 0x2f, 0x18, 0x08, 0x3b, 0x2f, - 0xa6, 0xe7, 0xec, 0xe3, 0xce, 0xc7, 0x69, 0xe3, 0x63, 0x0b, 0xfe, 0xec, 0xd8, 0xce, 0x43, 0x9d, - 0xc1, 0xf0, 0x12, 0xe0, 0x0f, 0xdf, 0xbf, 0x74, 0xcf, 0x1e, 0x2e, 0x37, 0x42, 0xa6, 0xae, 0x71, - 0x1d, 0xb3, 0xb0, 0x80, 0xb9, 0xd6, 0x73, 0x81, 0xc0, 0xa0, 0xeb, 0x61, 0x72, 0x90, 0x77, 0xc0, - 0x34, 0xdb, 0xfc, 0x9e, 0xd2, 0x81, 0xc2, 0xb6, 0xb3, 0xf9, 0x05, 0xa6, 0x3e, 0x98, 0x6b, 0xa7, - 0xec, 0xe6, 0xed, 0x8c, 0x0a, 0x37, 0x3a, 0xb6, 0xbb, 0x91, 0x6b, 0x7d, 0xe6, 0xdc, 0x78, 0xb8, - 0xac, 0xe7, 0x71, 0xf7, 0xc5, 0xaf, 0xfe, 0x95, 0xcf, 0x69, 0xda, 0x04, 0x52, 0x83, 0x11, 0x17, - 0x31, 0x6f, 0x39, 0x67, 0xc3, 0x3b, 0x6d, 0xd6, 0x40, 0x6a, 0xb0, 0x60, 0xb8, 0x9c, 0x25, 0x0e, - 0xa0, 0x9b, 0xad, 0xf9, 0xda, 0xd3, 0x32, 0xfd, 0x14, 0xcc, 0xdd, 0x27, 0x38, 0xec, 0x1b, 0x3b, - 0xc3, 0x9e, 0xd8, 0x39, 0x33, 0x3d, 0x41, 0xde, 0x43, 0x7b, 0x8b, 0xe2, 0xaf, 0x7e, 0x8f, 0xdb, - 0x09, 0x1f, 0xda, 0x14, 0x05, 0xd3, 0x1e, 0x3e, 0xf1, 0x32, 0xb4, 0xde, 0xd2, 0x18, 0x27, 0x1b, - 0xef, 0x08, 0x00, 0xf7, 0xf0, 0xee, 0x33, 0xa6, 0x76, 0x7e, 0x9e, 0x62, 0x30, 0x3c, 0x72, 0xa5, - 0xa5, 0x3f, 0x06, 0x19, 0xc6, 0xfc, 0x5c, 0xad, 0x32, 0xcc, 0xa3, 0x6d, 0x64, 0x2b, 0xd3, 0xd7, - 0x93, 0xbc, 0x6d, 0x6c, 0xf2, 0x7b, 0x76, 0xfe, 0xe2, 0x66, 0x0e, 0x20, 0xc9, 0xd6, 0x32, 0x98, - 0x37, 0xad, 0x4c, 0x72, 0xe5, 0x0b, 0x8c, 0xfa, 0x58, 0x5e, 0x99, 0xcb, 0x2e, 0x92, 0xf8, 0xda, - 0x60, 0x6b, 0xdb, 0x39, 0xc6, 0x32, 0x4b, 0x8b, 0x64, 0x5b, 0xc2, 0x50, 0x3c, 0xbd, 0xe0, 0xec, - 0x0b, 0xbc, 0x2f, 0x7c, 0xe8, 0xa9, 0x3f, 0xf3, 0x93, 0x20, 0x5f, 0x4b, 0x13, 0xfc, 0xfd, 0xc2, - 0x86, 0x46, 0x9c, 0x29, 0xb6, 0x94, 0xf3, 0xc5, 0x5b, 0xdd, 0xb5, 0x31, 0x32, 0x0d, 0x2e, 0xf1, - 0x80, 0x39, 0x67, 0x49, 0x7c, 0x09, 0xe6, 0x25, 0x73, 0x4d, 0x93, 0x96, 0x34, 0x5e, 0x09, 0x6d, - 0xb4, 0x16, 0xd0, 0x21, 0xf2, 0xad, 0x07, 0x7c, 0x0a, 0x72, 0x9c, 0x93, 0x78, 0x13, 0x05, 0xec, - 0xa9, 0xa3, 0x7f, 0xe0, 0xcd, 0xc0, 0x38, 0x88, 0x6f, 0x60, 0x9d, 0x7f, 0x3a, 0x49, 0x58, 0x28, - 0x4a, 0xc0, 0xdc, 0x1e, 0x02, 0x97, 0xf3, 0x8f, 0xf9, 0x81, 0xb7, 0x40, 0xea, 0xbf, 0xc5, 0x40, - 0xaf, 0x1c, 0x6f, 0xa4, 0x69, 0x7f, 0x11, 0x5c, 0x5b, 0x40, 0x82, 0x06, 0x6d, 0x7e, 0x9a, 0x0b, - 0x07, 0x53, 0x25, 0x23, 0x25, 0xc8, 0xb0, 0x82, 0xf0, 0xed, 0x15, 0xc2, 0xc2, 0xcf, 0x8f, 0xf0, - 0x45, 0x29, 0x5e, 0xa7, 0x59, 0xcb, 0xc3, 0x78, 0x65, 0x2d, 0x36, 0xa7, 0xa3, 0x25, 0xa8, 0xaa, - 0x72, 0x20, 0x9f, 0x79, 0x3b, 0x1f, 0x3f, 0xee, 0x9c, 0xe7, 0xf8, 0xff, 0x55, 0xb4, 0xd3, 0xec, - 0x78, 0xb4, 0x22, 0x29, 0x39, 0xc6, 0x05, 0x20, 0xa4, 0x67, 0x82, 0x62, 0xed, 0xca, 0x13, 0xf3, - 0x92, 0x66, 0xe9, 0x66, 0x3d, 0xee, 0x27, 0x50, 0x23, 0x58, 0xeb, 0x68, 0xeb, 0xef, 0x1f, 0x90, - 0xaf, 0xf2, 0x13, 0xe8, 0xf4, 0x86, 0xeb, 0xbf, 0x16, 0xae, 0x74, 0xb9, 0xaf, 0x2d, 0xb3, 0xb5, - 0x03, 0xc3, 0x0b, 0x89, 0x9a, 0x4e, 0xc5, 0x73, 0x09, 0x6a, 0x4d, 0xe8, 0xbc, 0x8a, 0x80, 0xe7, - 0x2b, 0xb1, 0x23, 0x4d, 0x25, 0x8c, 0x44, 0x9c, 0xb7, 0x46, 0x74, 0xd4, 0xec, 0x92, 0x9e, 0x9e, - 0x29, 0x69, 0x40, 0x9d, 0x49, 0x46, 0x91, 0x4b, 0x0f, 0xd1, 0x6a, 0x15, 0x1d, 0x25, 0xa3, 0xc4, - 0x8d, 0x40, 0xef, 0x68, 0x76, 0x6a, 0x85, 0x7e, 0x7e, 0xfc, 0x48, 0x26, 0x2a, 0xea, 0x91, 0x72, - 0xa1, 0xe2, 0x99, 0x83, 0xf2, 0xc2, 0x76, 0x24, 0xf3, 0xe1, 0xc5, 0x83, 0xf2, 0xb9, 0x23, 0x23, - 0x77, 0x1a, 0x79, 0x6b, 0x59, 0x01, 0x6b, 0x20, 0x67, 0x1a, 0x34, 0x85, 0x9a, 0xad, 0xbc, 0xb8, - 0x95, 0x97, 0x5f, 0xad, 0xe4, 0x87, 0x8e, 0xfe, 0xa1, 0x0b, 0x1f, 0xba, 0x34, 0x04, 0xca, 0xc0, - 0x67, 0x0d, 0x8f, 0x00, 0x59, 0xad, 0x3a, 0xdb, 0x3e, 0xe4, 0x20, 0xea, 0x48, 0xdb, 0x0a, 0x18, - 0xdf, 0x10, 0x4d, 0xc0, 0x51, 0xc1, 0xec, 0x24, 0x51, 0xe7, 0xd6, 0x4e, 0x47, 0xb4, 0x55, 0xc5, - 0x45, 0x02, 0x4a, 0x46, 0x56, 0xa4, 0xea, 0x51, 0x59, 0x48, 0x4d, 0x8d, 0x44, 0x6a, 0x94, 0xd7, - 0xcd, 0x85, 0xab, 0xed, 0xe6, 0x45, 0xf6, 0xf5, 0x17, 0x55, 0x7e, 0xa3, 0xd1, 0xd3, 0x02, 0x92, - 0xab, 0x10, 0x2b, 0xa4, 0x5e, 0xbe, 0xf1, 0x1d, 0x71, 0xab, 0x6e, 0x24, 0x51, 0x19, 0xa3, 0x2a, - 0x69, 0x0f, 0xb4, 0x45, 0x27, 0x83, 0xb8, 0x56, 0xde, 0xec, 0x68, 0xea, 0x31, 0x30, 0xf1, 0xa1, - 0x72, 0x62, 0xa0, 0x92, 0x2c, 0x19, 0x80, 0x87, 0x6f, 0xe5, 0x03, 0x84, 0x4e, 0x95, 0xe2, 0x6b, - 0x43, 0x1b, 0x31, 0x7c, 0xc5, 0x31, 0x83, 0xbf, 0xf8, 0xa6, 0xa2, 0x8a, 0x2e, 0x03, 0x98, 0x98, - 0xe7, 0xa0, 0x0c, 0xc3, 0x20, 0xa1, 0xeb, 0x25, 0xca, 0x82, 0x68, 0xc1, 0xd6, 0x0a, 0xe5, 0xbc, - 0x1a, 0x2c, 0xd7, 0xd1, 0xcb, 0x2d, 0x21, 0x7b, 0x27, 0xcf, 0x4e, 0x2e, 0x9c, 0xa1, 0x2a, 0x71, - 0x3a, 0xb4, 0x01, 0xca, 0xa1, 0x2f, 0x36, 0x46, 0xe7, 0xe9, 0x78, 0x8f, 0x00, 0x3f, 0x75, 0x94, - 0x0a, 0x64, 0xf8, 0xd0, 0x30, 0x06, 0x84, 0xc0, 0x1e, 0xcb, 0x2d, 0x20, 0x44, 0xf3, 0xbe, 0x3a, - 0xa0, 0xa4, 0xb2, 0xda, 0xb8, 0x2c, 0xbe, 0x15, 0xd9, 0x76, 0x23, 0x68, 0xfd, 0x1a, 0x83, 0xc9, - 0x62, 0x9a, 0xfa, 0x7e, 0x9e, 0x5f, 0xe8, 0x74, 0x4b, 0x22, 0xe9, 0x2d, 0xf2, 0xc4, 0xdd, 0x80, - 0xa9, 0x5b, 0x54, 0x7f, 0x41, 0xdb, 0x4e, 0x5a, 0xe2, 0x13, 0x5e, 0xba, 0x15, 0xcf, 0x59, 0x65, - 0x16, 0xfe, 0xc5, 0x5e, 0xf3, 0x7d, 0xb9, 0xa2, 0x40, 0xbd, 0xfe, 0x3e, 0x7f, 0xc1, 0x0d, 0xa0, - 0xe2, 0x09, 0x1b, 0x06, 0x83, 0x47, 0x94, 0x91, 0x03, 0x9a, 0x1a, 0x01, 0xfa, 0xc5, 0x45, 0xaa, - 0x00, 0x2c, 0xf0, 0x3e, 0x80, 0x0a, 0x0e, 0x56, 0x11, 0xd6, 0xc4, 0x3f, 0x9d, 0xa4, 0xa7, 0x18, - 0xb4, 0x93, 0x3f, 0x07, 0x30, 0x08, 0x96, 0xf6, 0x06, 0x36, 0xa5, 0x4d, 0xf5, 0xaf, 0xa5, 0xa4, - 0xcb, 0xfb, 0xfc, 0x92, 0x8b, 0x25, 0x3c, 0x80, 0x8a, 0x44, 0x21, 0xa7, 0x2b, 0x11, 0x7e, 0x58, - 0x72, 0xe6, 0x70, 0x1a, 0x2b, 0xa4, 0xe4, 0x9a, 0x49, 0x82, 0x7c, 0x07, 0x25, 0x71, 0xf9, 0xd2, - 0xc8, 0x6c, 0x55, 0xf9, 0xf5, 0x05, 0x70, 0x9b, 0x45, 0x43, 0x63, 0x51, 0x1d, 0x45, 0x0a, 0x76, - 0x92, 0x26, 0x1d, 0x25, 0x55, 0x30, 0x7c, 0x5f, 0x14, 0x8d, 0x1c, 0x24, 0x92, 0x80, 0xf9, 0x50, - 0x00, 0x6b, 0xd1, 0x49, 0x38, 0xbe, 0x59, 0x08, 0xc3, 0x42, 0x72, 0xd7, 0xa9, 0x6c, 0xb4, 0xc1, - 0x4a, 0x3c, 0xa9, 0x0f, 0xec, 0x3b, 0x39, 0xb0, 0x7c, 0x93, 0x7b, 0x52, 0xaf, 0xbf, 0xb4, 0x92, - 0x1c, 0xd9, 0xdc, 0x45, 0x18, 0x0d, 0x73, 0x10, 0xbe, 0xb7, 0x32, 0xf5, 0xf9, 0x24, 0x3a, 0x15, - 0xc0, 0x88, 0xb6, 0x92, 0x61, 0x04, 0x30, 0xde, 0xc5, 0xa2, 0xda, 0x40, 0x4a, 0x94, 0xf3, 0x1a, - 0x25, 0xd1, 0xac, 0x56, 0x84, 0x9d, 0xa2, 0x14, 0x03, 0xf5, 0x27, 0x07, 0xf9, 0x3d, 0x07, 0x19, - 0x2f, 0xa8, 0x2c, 0xd2, 0x82, 0x04, 0xd2, 0xf7, 0x5e, 0x03, 0x11, 0x24, 0x50, 0x55, 0xca, 0xaf, - 0xf4, 0x0b, 0xc0, 0xe2, 0x9a, 0x61, 0x25, 0x27, 0xfe, 0x29, 0xff, 0x8b, 0xd3, 0x01, 0xee, 0xcd, - 0xe7, 0x1a, 0x0e, 0xe9, 0x32, 0xd6, 0xd9, 0xf7, 0xec, 0x57, 0x72, 0xb3, 0x19, 0x30, 0xef, 0x1a, - 0xb1, 0x30, 0x93, 0x0c, 0xf3, 0xe1, 0xd2, 0x5f, 0x9b, 0x5c, 0x33, 0x79, 0xb8, 0xc4, 0xc2, 0x6b, - 0x23, 0x8b, 0xe1, 0x11, 0x2b, 0x58, 0xb7, 0xce, 0xb8, 0x7c, 0x9d, 0x40, 0x7d, 0x29, 0x3f, 0x90, - 0x58, 0x5e, 0x27, 0x9f, 0xd8, 0x92, 0xc3, 0x85, 0x10, 0x8b, 0xbd, 0x77, 0x56, 0xe4, 0xbc, 0xb6, - 0x26, 0x04, 0x23, 0xfe, 0x1d, 0xc6, 0x23, 0xac, 0xd8, 0x8b, 0xd5, 0xc6, 0xcf, 0x6b, 0x3f, 0x89, - 0xac, 0xb3, 0xd7, 0xfe, 0x7c, 0x4e, 0x0e, 0xf7, 0x87, 0xcb, 0x14, 0x60, 0x68, 0x1e, 0xe1, 0x13, - 0x36, 0x04, 0x2f, 0xd3, 0x98, 0x6e, 0x66, 0xc1, 0x8b, 0x42, 0xc9, 0x3a, 0x3c, 0xb3, 0xf9, 0xbd, - 0xa1, 0x6f, 0x9c, 0xdf, 0xc0, 0xc6, 0x04, 0x19, 0xd1, 0x76, 0xd8, 0x95, 0x1f, 0xda, 0x96, 0xb9, - 0xf0, 0x8e, 0xc4, 0xe5, 0x88, 0x0b, 0xdb, 0x94, 0x4b, 0x29, 0xdf, 0xe2, 0xb6, 0x32, 0x9c, 0xd7, - 0xdf, 0x41, 0xc7, 0x82, 0x94, 0x14, 0x4f, 0x81, 0xbf, 0xcc, 0x2b, 0x72, 0xac, 0x52, 0x6f, 0x8a, - 0x57, 0x41, 0x98, 0x52, 0x67, 0x76, 0x96, 0x69, 0x32, 0x71, 0x6f, 0xc8, 0x4f, 0x39, 0x6b, 0xfd, - 0x32, 0xf5, 0x8a, 0x0d, 0x3a, 0x6c, 0x4e, 0x37, 0x17, 0x0e, 0xcb, 0xa7, 0x5d, 0xb8, 0x61, 0xe8, - 0x2c, 0xe8, 0x54, 0xe8, 0xc6, 0x9a, 0x2a, 0xaa, 0x62, 0xa6, 0x43, 0x7a, 0x28, 0x2a, 0x80, 0xd6, - 0x1b, 0xaf, 0x56, 0xb3, 0x7e, 0xf3, 0x44, 0x1b, 0xb6, 0x3a, 0xa4, 0x2b, 0xd4, 0xcf, 0xcd, 0x0a, - 0x44, 0xc8, 0x72, 0x54, 0x76, 0x3d, 0x50, 0x41, 0x7f, 0xf3, 0x2c, 0x24, 0x74, 0xae, 0x80, 0xcb, - 0x4e, 0xc3, 0x38, 0xa4, 0xb6, 0xea, 0x78, 0xf0, 0xc5, 0x1d, 0x27, 0x53, 0x40, 0x2a, 0x61, 0x0e, - 0x47, 0xc3, 0x19, 0xef, 0xfb, 0x63, 0x3f, 0x35, 0x2e, 0x89, 0x6c, 0x1e, 0x01, 0xd9, 0xac, 0x1f, - 0x0d, 0x39, 0xe4, 0xe8, 0x19, 0x08, 0xbc, 0xcb, 0x33, 0x8c, 0x95, 0x98, 0xdf, 0x8b, 0x8c, 0x37, - 0x17, 0xa8, 0xd6, 0x70, 0xb5, 0x42, 0x38, 0x87, 0x55, 0xe0, 0x26, 0xad, 0x30, 0x4c, 0xd3, 0x96, - 0xf6, 0x0a, 0x66, 0x84, 0xfe, 0xd5, 0xe3, 0x5e, 0x0b, 0x30, 0x9b, 0x53, 0x40, 0x5a, 0xe1, 0x32, - 0x08, 0xc2, 0x0f, 0x06, 0x66, 0x21, 0xb5, 0x5d, 0x69, 0xe8, 0xb4, 0x13, 0x9d, 0x73, 0x00, 0x37, - 0xa4, 0x11, 0xf3, 0x48, 0x75, 0x0f, 0x97, 0x09, 0x46, 0xc1, 0x82, 0x6c, 0x1f, 0x92, 0x10, 0x14, - 0xcb, 0xb5, 0x61, 0x3d, 0x84, 0x99, 0x0e, 0x7a, 0xb9, 0xb6, 0x81, 0xee, 0x61, 0x60, 0x65, 0x63, - 0x6b, 0xf9, 0xe4, 0x04, 0xa0, 0x7d, 0xe2, 0xc6, 0xd1, 0x05, 0x4e, 0x3c, 0xdb, 0x86, 0x3b, 0xd8, - 0x3e, 0x5a, 0x7e, 0xf5, 0x57, 0x4e, 0x0c, 0xbe, 0xe6, 0xf5, 0x24, 0x24, 0x15, 0xa3, 0x5b, 0xad, - 0xed, 0xf5, 0x76, 0x1c, 0xa2, 0x11, 0x42, 0xb1, 0x20, 0x0c, 0x41, 0x41, 0x0e, 0x2e, 0xc3, 0xdd, - 0x55, 0x21, 0x85, 0xb3, 0x44, 0x1a, 0x7b, 0x8e, 0xc7, 0x07, 0xbe, 0x43, 0xbd, 0x9f, 0x93, 0xc9, - 0x8f, 0xc8, 0x3a, 0xe8, 0xff, 0x39, 0x26, 0x3a, 0x90, 0x7e, 0xd7, 0x74, 0x31, 0x27, 0x11, 0x46, - 0x65, 0x9e, 0x7a, 0x3f, 0xa2, 0xbb, 0x5a, 0x24, 0xe1, 0xcc, 0xfd, 0x23, 0x5d, 0x59, 0x56, 0xaf, - 0xff, 0xa8, 0x6b, 0xf7, 0xb6, 0xf3, 0xb5, 0xf7, 0x46, 0x54, 0xfb, 0x47, 0xef, 0x11, 0xff, 0x60, - 0xde, 0x98, 0x40, 0x80, 0x2c, 0xc9, 0x04, 0x79, 0x81, 0x4d, 0x6f, 0x02, 0xfd, 0x60, 0xb5, 0xbf, - 0x3b, 0xdf, 0x38, 0x7f, 0x72, 0x7e, 0xf0, 0x04, 0xfd, 0x4a, 0xcf, 0x90, 0xf5, 0xad, 0x58, 0xcf, - 0x93, 0xec, 0xf2, 0x46, 0xe9, 0x55, 0xa3, 0x6d, 0x3c, 0xbe, 0x8d, 0xb8, 0x83, 0x59, 0x42, 0x67, - 0x0c, 0x90, 0x5d, 0x2b, 0xee, 0xe3, 0x73, 0xb6, 0x73, 0xf1, 0x56, 0x4e, 0x14, 0xd7, 0x94, 0x68, - 0xd7, 0x08, 0x1a, 0x89, 0xb5, 0xc4, 0x05, 0x5e, 0x0c, 0x5b, 0xb7, 0x2c, 0x1a, 0xcd, 0x11, 0x50, - 0xa8, 0x89, 0xa4, 0x8c, 0x48, 0x8b, 0xb8, 0x22, 0xfd, 0x94, 0xae, 0x8e, 0x02, 0x5c, 0xe1, 0xed, - 0x50, 0x30, 0x14, 0x78, 0x01, 0x94, 0xf3, 0x1c, 0x7e, 0xfa, 0xa7, 0x38, 0x8c, 0xce, 0x9d, 0xc3, - 0x2e, 0xc0, 0xe2, 0xa9, 0xdb, 0x20, 0x4b, 0xe8, 0xca, 0x32, 0x7e, 0xd9, 0xe0, 0x50, 0xce, 0x75, - 0x67, 0xd2, 0x3f, 0x49, 0x7d, 0xf4, 0x1e, 0x2e, 0x17, 0xa0, 0x7c, 0x9b, 0xeb, 0xa3, 0xb1, 0x87, - 0x4a, 0x06, 0x9a, 0x6f, 0x8f, 0x4a, 0x0e, 0x84, 0x47, 0xf7, 0x3a, 0x10, 0x52, 0xe1, 0x40, 0x40, - 0xf7, 0xc1, 0x76, 0xda, 0xfb, 0x2c, 0x39, 0xf4, 0x48, 0xb6, 0x29, 0xe4, 0xd0, 0x23, 0x45, 0x57, - 0x8f, 0x1c, 0x82, 0xd8, 0x85, 0xd9, 0x62, 0xb1, 0x36, 0x9d, 0x7c, 0x1b, 0xe2, 0xc7, 0xb3, 0xa5, - 0xa0, 0xbe, 0xd4, 0x74, 0x97, 0x40, 0x68, 0xae, 0xf9, 0xf1, 0xe1, 0x72, 0x6c, 0x3d, 0x7a, 0x64, - 0xaf, 0xcd, 0xf5, 0xfa, 0xe3, 0x19, 0x82, 0x25, 0x89, 0xcb, 0x07, 0x03, 0xf6, 0xe4, 0xe1, 0xf2, - 0x29, 0xee, 0x1c, 0xc3, 0x13, 0x2c, 0xf0, 0x07, 0xf2, 0x3f, 0xba, 0x79, 0xe4, 0x40, 0x01, 0x5e, - 0x0b, 0x39, 0x17, 0x1f, 0xd9, 0xe6, 0xda, 0x01, 0x69, 0x71, 0x3b, 0x3a, 0x83, 0x0f, 0x0f, 0x97, - 0x7f, 0x5c, 0x3f, 0x52, 0x66, 0x95, 0xc8, 0xfd, 0xc8, 0xe1, 0x98, 0x02, 0x52, 0x7e, 0x04, 0xa2, - 0xfb, 0xcc, 0x35, 0x67, 0x3e, 0xea, 0xb4, 0x54, 0xee, 0x7c, 0x64, 0xaa, 0x0a, 0x3f, 0x9a, 0x37, - 0x1f, 0x0b, 0xd4, 0xff, 0x91, 0xdc, 0x56, 0x1f, 0xcd, 0xcd, 0x3a, 0x97, 0x6b, 0x59, 0x2b, 0xe6, - 0xc0, 0x6a, 0x4d, 0x55, 0xed, 0x29, 0x79, 0x5b, 0x6e, 0x0c, 0xef, 0x48, 0x4c, 0xc2, 0x37, 0x40, - 0x4c, 0x8f, 0xf8, 0xcc, 0xfc, 0x68, 0x24, 0x26, 0xa7, 0x1b, 0xc1, 0x34, 0x98, 0xad, 0x56, 0xbb, - 0xa1, 0xb9, 0x86, 0xca, 0xdb, 0xee, 0x8d, 0x9d, 0xdf, 0x0f, 0xcc, 0x57, 0x2f, 0xf1, 0x9a, 0xc2, - 0xec, 0x35, 0x27, 0x17, 0xeb, 0xe4, 0x11, 0x12, 0xe8, 0xa3, 0x53, 0x5c, 0x81, 0x06, 0x6b, 0x18, - 0x03, 0x1b, 0x3c, 0x7a, 0x0c, 0x10, 0x1c, 0x7e, 0x94, 0xae, 0xed, 0x33, 0x71, 0x0c, 0x15, 0x24, - 0x47, 0x5a, 0xd8, 0x7f, 0x19, 0xf0, 0x8d, 0xf0, 0xb5, 0x48, 0xbf, 0xdb, 0xc1, 0x4a, 0xe9, 0x66, - 0x18, 0xe9, 0xaf, 0xe1, 0x2b, 0xdb, 0xe8, 0x8c, 0x13, 0x03, 0x4f, 0x6a, 0x72, 0xbd, 0xde, 0x26, - 0x8b, 0x90, 0x88, 0x65, 0x63, 0x59, 0xd6, 0x56, 0x8c, 0xcd, 0xb6, 0x4d, 0x57, 0xc3, 0x05, 0xb9, - 0x91, 0xb6, 0xce, 0xc1, 0x79, 0x7c, 0x87, 0x44, 0x68, 0x70, 0x9d, 0xdd, 0x86, 0xb5, 0x18, 0x2d, - 0xe4, 0x89, 0xeb, 0x36, 0x58, 0xd2, 0x07, 0x74, 0x7e, 0xb9, 0x42, 0x56, 0xae, 0xb3, 0x56, 0x1c, - 0xa1, 0x9c, 0xf6, 0x82, 0x3b, 0x85, 0xaa, 0x43, 0xc7, 0xbb, 0x4c, 0x98, 0x45, 0x20, 0x97, 0x89, - 0xea, 0xf1, 0x28, 0x6b, 0xf1, 0x37, 0x2f, 0x71, 0x37, 0xba, 0xde, 0xba, 0x4e, 0x02, 0x00, 0x14, - 0x2c, 0x00, 0xb0, 0x0f, 0x02, 0x14, 0xd9, 0x6e, 0x81, 0x3e, 0x9f, 0xae, 0x56, 0xbf, 0x59, 0x37, - 0x52, 0xa6, 0x12, 0x3d, 0xaa, 0xdd, 0x0d, 0x38, 0xa0, 0x5f, 0x53, 0x70, 0x4b, 0xdb, 0xb9, 0xad, - 0xd7, 0x31, 0xdf, 0x1f, 0x15, 0x15, 0x61, 0x30, 0x5b, 0x28, 0x87, 0x57, 0x39, 0x08, 0xca, 0xc4, - 0x23, 0x58, 0x5a, 0xc9, 0xef, 0x44, 0xc9, 0x73, 0x5e, 0x12, 0x89, 0x4c, 0x6c, 0xb9, 0xa3, 0xed, - 0xce, 0xe5, 0x8a, 0x96, 0x6b, 0x59, 0x15, 0x3f, 0x57, 0x52, 0xa8, 0xeb, 0x39, 0xaf, 0xeb, 0x14, - 0x25, 0xcc, 0x9f, 0xbd, 0xee, 0xe1, 0x61, 0xe7, 0x40, 0x8c, 0xf6, 0x4f, 0x1e, 0x79, 0x2b, 0x8a, - 0x97, 0x32, 0xc9, 0xd7, 0xce, 0x80, 0xbf, 0xa3, 0x07, 0xa2, 0xc5, 0x6f, 0x7e, 0xb2, 0x41, 0x22, - 0x8e, 0xb4, 0xd3, 0x1d, 0x9a, 0x75, 0xa0, 0x4c, 0x12, 0xfd, 0x04, 0xf4, 0x30, 0x3a, 0x4c, 0x86, - 0x36, 0x06, 0x16, 0x42, 0xc2, 0xb8, 0xc0, 0x4b, 0xa1, 0xa7, 0xec, 0x49, 0x66, 0x45, 0x60, 0x00, - 0xaf, 0xdd, 0x2f, 0xae, 0x48, 0xcb, 0xa3, 0x57, 0x06, 0xb3, 0xc5, 0x09, 0xd4, 0x78, 0xea, 0xe1, - 0x99, 0xee, 0x7a, 0x62, 0x1f, 0x1e, 0xee, 0xaf, 0x92, 0xa3, 0xa3, 0xa3, 0x7d, 0x8c, 0x77, 0x07, - 0x95, 0xfc, 0xec, 0x30, 0x68, 0x81, 0xe9, 0xe7, 0x0e, 0x78, 0x93, 0x19, 0xf3, 0xa4, 0x45, 0x05, - 0x43, 0x01, 0xc6, 0x0c, 0x8f, 0xba, 0x32, 0x1c, 0xe2, 0xa7, 0x23, 0xef, 0x67, 0xe5, 0xff, 0xf0, - 0x31, 0x6c, 0x8e, 0x64, 0x90, 0x9f, 0xf5, 0xc6, 0x33, 0xc6, 0xe3, 0x20, 0xa1, 0x97, 0xc1, 0x26, - 0xdf, 0xd8, 0xf0, 0x80, 0x9c, 0x2a, 0x23, 0x2b, 0x69, 0x40, 0x56, 0xe1, 0xba, 0x80, 0xe6, 0x6d, - 0xb0, 0xcb, 0x00, 0xd5, 0x16, 0x39, 0x95, 0xf0, 0xb0, 0xd2, 0x7e, 0xb7, 0x47, 0x39, 0x57, 0x2b, - 0x78, 0xea, 0xf1, 0xa7, 0x80, 0x51, 0x38, 0x68, 0x6c, 0xcf, 0x69, 0x34, 0x20, 0x9b, 0xb4, 0x53, - 0x4a, 0x95, 0x01, 0xfe, 0x9c, 0x24, 0xb7, 0x4a, 0xa2, 0x7c, 0xad, 0xb1, 0x00, 0x1d, 0x55, 0x31, - 0x4c, 0xaf, 0x03, 0xf4, 0x99, 0xe1, 0x8b, 0x83, 0x76, 0x8a, 0x9f, 0x32, 0xa3, 0xd3, 0x69, 0xbb, - 0x62, 0x6d, 0xe0, 0x63, 0x64, 0x0e, 0x45, 0x5a, 0x5f, 0xa5, 0x25, 0x32, 0xad, 0x2b, 0xf3, 0x19, - 0xc7, 0x24, 0xc0, 0x5a, 0xa8, 0x54, 0x3e, 0x13, 0x4d, 0x80, 0x2a, 0x68, 0x75, 0x41, 0x68, 0x8b, - 0xe2, 0x7b, 0x32, 0xab, 0xb6, 0x94, 0xc6, 0xf5, 0x64, 0x91, 0xde, 0xe9, 0x62, 0x3f, 0xcb, 0x08, - 0x1c, 0x09, 0xd0, 0x40, 0xbd, 0xb6, 0x7e, 0xce, 0x4d, 0x2f, 0x20, 0x69, 0xf8, 0xd8, 0x44, 0xcc, - 0xf1, 0xef, 0x47, 0x1d, 0x80, 0x10, 0xfe, 0x71, 0xfc, 0xd8, 0x2e, 0x15, 0xe8, 0x83, 0x48, 0x38, - 0xe4, 0x17, 0xce, 0x8d, 0xaa, 0x20, 0x44, 0x4c, 0xb3, 0x26, 0x65, 0x18, 0x38, 0x55, 0x19, 0x76, - 0x77, 0xbb, 0x07, 0x83, 0x86, 0xc5, 0x8e, 0x8e, 0xf0, 0x6e, 0xd7, 0xdd, 0x41, 0xaf, 0xdb, 0x6e, - 0x58, 0x9d, 0x76, 0xb7, 0x57, 0x67, 0x68, 0x0d, 0x5b, 0xaa, 0x77, 0x03, 0x85, 0x9c, 0x4c, 0x20, - 0xe7, 0x60, 0x5f, 0x25, 0x8d, 0x15, 0x0e, 0xf3, 0xb4, 0x2b, 0x99, 0xd6, 0xee, 0xaa, 0xb4, 0x99, - 0x4c, 0xeb, 0xb9, 0x9d, 0x76, 0x05, 0x2e, 0xea, 0x75, 0xec, 0xab, 0x2c, 0x27, 0x8b, 0x89, 0x42, - 0xbb, 0x03, 0x97, 0xff, 0xee, 0xb9, 0x44, 0x91, 0x53, 0xbe, 0x1f, 0xcf, 0x45, 0x02, 0x3c, 0xf2, - 0xfa, 0xfb, 0xa0, 0x57, 0x1f, 0x7a, 0x79, 0x08, 0xab, 0x9f, 0x45, 0xc0, 0x28, 0xa8, 0xb7, 0xd9, - 0x71, 0x7a, 0xb6, 0x5c, 0x42, 0xf9, 0xcb, 0x49, 0xbb, 0xb9, 0x77, 0xda, 0xd8, 0x41, 0x6e, 0x76, - 0x92, 0xfc, 0x8c, 0x42, 0xe6, 0xec, 0xab, 0x23, 0x3c, 0xc9, 0x11, 0xf2, 0x52, 0xd9, 0xc7, 0x69, - 0x97, 0xb3, 0xdb, 0x48, 0x8b, 0x9e, 0x72, 0xe4, 0x74, 0x9c, 0x4d, 0xf6, 0x70, 0xcc, 0x36, 0xf9, - 0xe0, 0xea, 0xf5, 0xdd, 0x41, 0x8d, 0xf6, 0x3c, 0xec, 0xee, 0xd5, 0x88, 0xd8, 0x89, 0xca, 0xab, - 0x86, 0x24, 0xf7, 0x88, 0x10, 0x3f, 0xe0, 0x56, 0xef, 0xea, 0xa1, 0x5d, 0xeb, 0x2b, 0xf6, 0x16, - 0xcb, 0xa7, 0xa1, 0x4c, 0xf2, 0x75, 0xbb, 0x10, 0x00, 0x8d, 0x07, 0xe5, 0x60, 0x43, 0xc0, 0x31, - 0x67, 0x2f, 0x4e, 0x9e, 0x30, 0x4b, 0x56, 0x31, 0xf5, 0xc1, 0x2e, 0xc0, 0xc9, 0x6f, 0x39, 0x4e, - 0x8f, 0xbc, 0x83, 0x3d, 0x1b, 0x08, 0xae, 0x79, 0xb0, 0xd7, 0xe8, 0xb4, 0xd5, 0x61, 0x12, 0x48, - 0x1f, 0xec, 0x52, 0xfa, 0x60, 0x57, 0xa6, 0x73, 0x8b, 0x31, 0xe5, 0x03, 0x92, 0xc2, 0x80, 0xec, - 0xd9, 0x42, 0x32, 0x60, 0xbe, 0xfe, 0xfe, 0x9a, 0x0f, 0x57, 0x67, 0x20, 0x52, 0x23, 0x2f, 0x05, - 0xb4, 0x76, 0x06, 0x8f, 0x93, 0x86, 0x38, 0xb0, 0x4d, 0x0d, 0x47, 0x30, 0xe5, 0xa2, 0x2f, 0x42, - 0xe0, 0x09, 0x72, 0x49, 0xa4, 0xc8, 0xcf, 0x30, 0xac, 0x99, 0x97, 0x63, 0x52, 0x93, 0x07, 0x84, - 0x36, 0xe9, 0x07, 0xef, 0x08, 0xd9, 0x42, 0xf4, 0xc6, 0xf2, 0x4c, 0x58, 0x48, 0xac, 0xb2, 0x14, - 0x35, 0x3e, 0x61, 0x8f, 0xbd, 0xc3, 0x81, 0xe6, 0x77, 0x6f, 0xa1, 0xc3, 0x81, 0xad, 0xdd, 0x87, - 0xcb, 0x9f, 0x73, 0xe7, 0x1d, 0xb3, 0x29, 0xb8, 0x26, 0x4c, 0xf1, 0x1f, 0x23, 0xb5, 0x5e, 0x81, - 0x79, 0x00, 0xac, 0x9f, 0x8b, 0xae, 0x97, 0x8f, 0xb8, 0x3f, 0x17, 0x68, 0xd0, 0x5e, 0x9f, 0x81, - 0xba, 0x18, 0x4c, 0x6f, 0xdc, 0x0c, 0x54, 0xd0, 0x35, 0x2d, 0xbc, 0x1b, 0xf9, 0x36, 0x14, 0x56, - 0x9c, 0x08, 0xb8, 0x67, 0x5e, 0x10, 0xe4, 0x32, 0x71, 0xdf, 0x59, 0x97, 0xcc, 0xc1, 0x55, 0x1f, - 0xf2, 0xea, 0x2f, 0x78, 0x6e, 0x67, 0xec, 0xd6, 0xc0, 0x50, 0xac, 0xfd, 0x4a, 0xd4, 0x20, 0x5c, - 0x1c, 0xcc, 0x9b, 0x8c, 0xa8, 0x72, 0xca, 0x22, 0xe2, 0x6c, 0x27, 0x1e, 0xbd, 0x3a, 0x33, 0x96, - 0x13, 0x39, 0x5a, 0x98, 0x38, 0x4d, 0x62, 0x14, 0x66, 0xcf, 0xbf, 0xf6, 0x03, 0xc8, 0x06, 0x88, - 0x1c, 0x41, 0x6b, 0x09, 0xd6, 0xcc, 0x41, 0x90, 0xd5, 0xbb, 0x02, 0x42, 0x7c, 0x18, 0x96, 0x80, - 0xc7, 0xfd, 0xc5, 0x4e, 0xab, 0xd5, 0xca, 0x9d, 0x59, 0xca, 0xe7, 0xdc, 0xec, 0x9c, 0x0e, 0xb7, - 0x9c, 0x62, 0x88, 0x28, 0x5c, 0x03, 0xd8, 0xd0, 0xbc, 0xed, 0x4f, 0xcc, 0xf1, 0x41, 0xb8, 0xd1, - 0xb3, 0x0f, 0xf5, 0x6d, 0xe4, 0xc7, 0x68, 0x4a, 0x23, 0xfc, 0xe3, 0x2e, 0x29, 0x52, 0x88, 0x75, - 0xc5, 0x28, 0x8e, 0x4b, 0xed, 0x82, 0xe2, 0x25, 0x03, 0x8f, 0xbd, 0xa3, 0x1d, 0xa9, 0x0e, 0xc6, - 0x76, 0xb9, 0xc2, 0xd5, 0x22, 0x5b, 0xd6, 0x7d, 0xcb, 0x9c, 0x87, 0xcc, 0xb2, 0xf8, 0x4b, 0xcc, - 0xf8, 0x89, 0xbd, 0x56, 0xe2, 0x2c, 0x41, 0x5f, 0x9b, 0x82, 0xaa, 0x13, 0x80, 0xee, 0xe9, 0x9a, - 0x29, 0x58, 0x5f, 0xcd, 0x38, 0x09, 0xce, 0x83, 0xc8, 0xd4, 0x37, 0x51, 0xce, 0x58, 0x61, 0x69, - 0x85, 0x86, 0x42, 0xae, 0xaf, 0x14, 0xc6, 0x23, 0x2f, 0xb2, 0x90, 0x93, 0xac, 0xee, 0xe5, 0xfa, - 0x40, 0x2b, 0xc7, 0xe8, 0xc2, 0x12, 0xc6, 0xa3, 0x0a, 0xca, 0x98, 0x18, 0xa0, 0xbc, 0xb3, 0x35, - 0xfc, 0x79, 0x8b, 0x0a, 0xdd, 0x99, 0xbd, 0x26, 0x53, 0x99, 0x6b, 0x56, 0xc7, 0x17, 0xc1, 0xa5, - 0x17, 0x4a, 0x17, 0xd6, 0x94, 0xf1, 0x05, 0xd4, 0x87, 0xb4, 0x4c, 0x08, 0x53, 0x77, 0x23, 0x53, - 0x56, 0xd3, 0xa4, 0x5e, 0xaf, 0x1a, 0xe6, 0x1a, 0x1f, 0xe7, 0x51, 0xe2, 0x8a, 0x9e, 0x68, 0xeb, - 0x81, 0x63, 0x4a, 0xa1, 0x4d, 0xc2, 0xad, 0x45, 0x92, 0x47, 0x30, 0x9e, 0x8a, 0x9c, 0xa1, 0xb2, - 0x74, 0xbd, 0x29, 0x73, 0x42, 0xbe, 0x83, 0x87, 0xc0, 0x7a, 0xed, 0xcf, 0x69, 0x9b, 0x87, 0xb6, - 0x41, 0xa3, 0x74, 0x14, 0x90, 0x6e, 0x1f, 0x0c, 0x69, 0xd7, 0x7e, 0x5e, 0x44, 0x5c, 0x98, 0x59, - 0x0b, 0x84, 0x07, 0x30, 0xf7, 0x81, 0x98, 0x1f, 0x22, 0x61, 0xb5, 0xb3, 0x29, 0x7a, 0x15, 0xe5, - 0x82, 0x3b, 0xdd, 0xe7, 0xd8, 0x02, 0x25, 0xfa, 0x92, 0x79, 0xe8, 0x0d, 0x7f, 0xe8, 0x40, 0xc5, - 0x6b, 0xd1, 0x69, 0xb0, 0x04, 0xa1, 0x85, 0x5f, 0x12, 0xda, 0xa2, 0x04, 0x0f, 0xd7, 0xfc, 0x21, - 0x33, 0x2e, 0x18, 0x64, 0xcb, 0x9d, 0xe5, 0x40, 0x32, 0xc2, 0x27, 0x8e, 0x81, 0x80, 0x79, 0xd9, - 0x4f, 0xcc, 0xfb, 0xa1, 0x68, 0xbc, 0x5f, 0xe0, 0xda, 0x1d, 0xca, 0xbd, 0xd2, 0x6a, 0x7f, 0xbd, - 0xfe, 0xa6, 0x5e, 0xff, 0xba, 0x5e, 0x7f, 0x0a, 0x74, 0x56, 0x3b, 0x5f, 0xad, 0x9e, 0x23, 0xc1, - 0xd5, 0x6e, 0x57, 0xab, 0xef, 0x90, 0x3f, 0x5e, 0x09, 0x67, 0x75, 0xed, 0x69, 0xbe, 0xf0, 0xbb, - 0xdd, 0x49, 0x41, 0x2b, 0x84, 0x47, 0x26, 0xed, 0x15, 0x0b, 0x26, 0x26, 0x17, 0x4f, 0xd2, 0x91, - 0x45, 0x2b, 0xcb, 0xc3, 0xed, 0x85, 0x71, 0x31, 0xb8, 0xb4, 0x44, 0x09, 0x34, 0x88, 0x34, 0x83, - 0x41, 0x94, 0x38, 0x2f, 0xa0, 0x43, 0x1a, 0x90, 0xfa, 0x7a, 0xc1, 0x6f, 0x6d, 0x7e, 0x3b, 0xe6, - 0xf1, 0x0b, 0xc8, 0x05, 0x51, 0x5a, 0x3e, 0x65, 0x3c, 0x86, 0x1e, 0xda, 0x07, 0x68, 0x99, 0xe7, - 0x4b, 0x9e, 0x76, 0x9e, 0x51, 0xc4, 0x86, 0x86, 0x41, 0x64, 0x62, 0xcb, 0xa1, 0x79, 0xfc, 0xec, - 0xfb, 0x97, 0xef, 0xde, 0x13, 0xb0, 0xad, 0xcc, 0x3f, 0xc7, 0x1d, 0x6f, 0x23, 0x4b, 0x5c, 0x02, - 0xe0, 0x79, 0x56, 0x30, 0x32, 0xb5, 0x85, 0x60, 0x53, 0x79, 0xe9, 0x00, 0x57, 0x7f, 0x44, 0xb2, - 0x42, 0x1e, 0x2d, 0xe4, 0x2e, 0xae, 0x0e, 0x43, 0x01, 0xcd, 0x4d, 0x03, 0x78, 0x17, 0x65, 0x6c, - 0xd7, 0x7c, 0xf5, 0xf2, 0xcd, 0x1f, 0x0b, 0xcd, 0xa2, 0x33, 0x0d, 0x97, 0x91, 0xf5, 0x56, 0xf5, - 0xc5, 0x64, 0xd5, 0xb8, 0x48, 0xc4, 0xfa, 0xbe, 0xe1, 0x87, 0x6a, 0x5a, 0x31, 0x47, 0x8c, 0xb2, - 0xf1, 0x41, 0x1a, 0x48, 0x44, 0xb8, 0x78, 0x7f, 0xde, 0x62, 0x9c, 0x25, 0x8c, 0x91, 0x03, 0xd5, - 0x79, 0x87, 0x73, 0x0c, 0x86, 0x0b, 0x9c, 0xa3, 0x23, 0x0b, 0x41, 0x50, 0x86, 0x16, 0xdd, 0x18, - 0x7a, 0x0c, 0xb8, 0x66, 0xf6, 0x77, 0xa8, 0x97, 0xd0, 0x2c, 0xa8, 0xbe, 0x6e, 0xba, 0x64, 0x28, - 0x7f, 0x8a, 0xf9, 0x65, 0x28, 0x7d, 0xab, 0x24, 0x4e, 0x71, 0x6a, 0x52, 0x32, 0xf1, 0xb3, 0x5a, - 0x06, 0x6a, 0xfc, 0xae, 0xe0, 0x8d, 0xa9, 0x74, 0xb9, 0x6c, 0xb6, 0xcc, 0xf8, 0xd1, 0xa2, 0xb5, - 0x70, 0xb7, 0x5d, 0x33, 0xe7, 0x96, 0x79, 0xd0, 0xe8, 0x39, 0x5d, 0xe2, 0x83, 0x32, 0xb4, 0x5d, - 0x96, 0xf5, 0x0f, 0x99, 0x5c, 0x04, 0x70, 0xb8, 0x76, 0x90, 0x4b, 0x5b, 0x4d, 0x90, 0x4b, 0xa9, - 0x7b, 0xb7, 0x44, 0x07, 0xfb, 0x13, 0x19, 0x13, 0xa3, 0xe8, 0xd7, 0x82, 0x7a, 0xfd, 0x82, 0xa9, - 0xe5, 0x9a, 0x11, 0x2e, 0xa9, 0xb8, 0x42, 0x60, 0xa7, 0xce, 0x6f, 0x56, 0x32, 0xba, 0xc1, 0x60, - 0xfd, 0xcc, 0x59, 0x72, 0xa7, 0xa8, 0x0b, 0x4c, 0x93, 0xa0, 0xcb, 0x84, 0x13, 0xe9, 0xc4, 0xd3, - 0xb0, 0xa7, 0xa0, 0xe3, 0x4b, 0x91, 0x73, 0x0c, 0x0d, 0x46, 0xe7, 0x6d, 0x81, 0x57, 0xe5, 0x65, - 0xc3, 0x86, 0x4f, 0x29, 0xde, 0x72, 0xe1, 0x42, 0x76, 0x37, 0x05, 0x48, 0x84, 0x1f, 0x75, 0x26, - 0x1f, 0x8e, 0xe5, 0xc3, 0x2b, 0xf9, 0xe0, 0xcb, 0x87, 0xa9, 0x7c, 0x18, 0xab, 0xad, 0x6a, 0xf2, - 0x21, 0x72, 0x6b, 0x1d, 0x27, 0xe3, 0x91, 0xbe, 0x2e, 0x5d, 0x7e, 0x2d, 0x28, 0x41, 0x60, 0x17, - 0xc2, 0x03, 0x0d, 0x21, 0xcd, 0x6f, 0x2d, 0x1a, 0x46, 0xa3, 0x81, 0xcb, 0x8d, 0x43, 0x7c, 0x06, - 0xfd, 0x44, 0x00, 0xc7, 0x3f, 0x62, 0x6c, 0x00, 0xbf, 0x35, 0xf3, 0x38, 0x7d, 0x28, 0x7f, 0x7c, - 0x2a, 0xed, 0x0a, 0x5c, 0x61, 0x81, 0xc9, 0xda, 0x87, 0x89, 0x2c, 0x75, 0x53, 0x68, 0x94, 0xad, - 0xf9, 0x3c, 0x6e, 0xfd, 0x8e, 0x0d, 0xae, 0x56, 0xdf, 0x0b, 0x5c, 0x60, 0x80, 0x13, 0x3c, 0x2a, - 0x1e, 0xf0, 0xf5, 0xd5, 0x09, 0x5d, 0x1c, 0x82, 0xca, 0x28, 0x8a, 0x30, 0x1e, 0x8c, 0x41, 0xbc, - 0x9f, 0x17, 0xd7, 0x65, 0x70, 0x52, 0x92, 0xfb, 0x96, 0xe8, 0xc0, 0x7a, 0x90, 0x30, 0xb5, 0x75, - 0x90, 0x07, 0x6e, 0xd7, 0xb7, 0xee, 0x99, 0x47, 0x4b, 0xc3, 0x2c, 0x4a, 0x4e, 0xd3, 0x35, 0x4e, - 0x4c, 0xbd, 0x1a, 0xf3, 0xd4, 0x58, 0x6b, 0xce, 0x1a, 0x7b, 0x58, 0x80, 0xe7, 0xbb, 0x12, 0x3c, - 0x24, 0x68, 0xfd, 0x16, 0x85, 0x68, 0x5b, 0xaf, 0x71, 0x5f, 0x84, 0xdf, 0xf2, 0x3d, 0xdd, 0x76, - 0xf6, 0xcc, 0x7f, 0x31, 0xed, 0xe5, 0xcf, 0x1e, 0x98, 0x48, 0xcc, 0xcb, 0xa7, 0xc2, 0xee, 0xe3, - 0x9f, 0xd5, 0x3a, 0x38, 0x1a, 0xfd, 0xfb, 0x7c, 0xb9, 0xec, 0xe8, 0xcf, 0x20, 0x23, 0x7f, 0xe7, - 0xcb, 0x57, 0x43, 0x78, 0x1b, 0xda, 0x7f, 0x7e, 0xec, 0x75, 0x87, 0xdf, 0x90, 0x1b, 0x40, 0xbb, - 0xb2, 0xd9, 0xfa, 0xb3, 0xed, 0xfc, 0x64, 0x99, 0x37, 0x24, 0x86, 0xf0, 0x0f, 0x4a, 0x6b, 0x96, - 0xf9, 0xa0, 0x81, 0xe3, 0x58, 0x88, 0xf6, 0xc9, 0x59, 0x76, 0x15, 0xdf, 0x06, 0x0c, 0x1d, 0xdc, - 0x7c, 0xad, 0x89, 0x7b, 0xfd, 0xb3, 0x5b, 0x54, 0x6f, 0x69, 0x34, 0xa7, 0x6c, 0xbc, 0x38, 0x3f, - 0x67, 0x34, 0x30, 0x17, 0x09, 0x2d, 0x43, 0x42, 0xeb, 0xc1, 0x0c, 0xf7, 0x72, 0xf0, 0x73, 0x1b, - 0x0c, 0xc3, 0x70, 0x97, 0x1d, 0x0f, 0xdf, 0x38, 0x9d, 0x81, 0xd3, 0x69, 0xef, 0xc2, 0xd0, 0xfd, - 0x5e, 0xe8, 0x30, 0x2e, 0x19, 0xe2, 0x1e, 0x6b, 0xc3, 0x4f, 0x2f, 0x4d, 0x3a, 0x4f, 0xce, 0x2f, - 0x4b, 0x61, 0xad, 0x97, 0xca, 0x8b, 0x81, 0x3e, 0x9b, 0x3c, 0x51, 0x56, 0x99, 0xe0, 0x35, 0x47, - 0x2a, 0xb5, 0xd7, 0x55, 0xa9, 0xbe, 0x48, 0xd5, 0xfc, 0x20, 0x09, 0x6e, 0x82, 0xcc, 0x53, 0xb5, - 0x2a, 0x62, 0x0f, 0x4c, 0xba, 0x7e, 0xae, 0x41, 0x84, 0x96, 0x0c, 0x22, 0x81, 0x77, 0xcb, 0xb6, - 0x1d, 0x34, 0x3b, 0x7c, 0xf8, 0x17, 0xc2, 0xbf, 0x29, 0xfc, 0xbb, 0x00, 0x8a, 0xbf, 0xf0, 0xe2, - 0x61, 0xec, 0xc5, 0x0d, 0x2c, 0xd9, 0x5e, 0xb5, 0x87, 0xd1, 0xc9, 0xde, 0xc1, 0xee, 0xa9, 0xd7, - 0x19, 0xa6, 0x27, 0x3d, 0x7c, 0x68, 0xd3, 0xc3, 0x00, 0x1f, 0x82, 0x93, 0xc1, 0xde, 0xa9, 0x17, - 0x9c, 0x74, 0x4f, 0x29, 0x97, 0x4c, 0xa3, 0x5f, 0x4c, 0xe8, 0x8b, 0x84, 0xfd, 0x53, 0xef, 0xa2, - 0xd1, 0x6d, 0xf7, 0xf7, 0xf1, 0xe5, 0x00, 0x5e, 0xe8, 0xeb, 0x1e, 0x7e, 0x05, 0x0d, 0x29, 0x38, - 0xe9, 0x9d, 0xae, 0xda, 0x76, 0xa3, 0xd9, 0x5d, 0x61, 0xee, 0xbd, 0xf6, 0xa9, 0xc7, 0x86, 0x99, - 0xc7, 0x1a, 0xf0, 0x65, 0xd0, 0x3f, 0x05, 0x82, 0xb0, 0xf9, 0x87, 0xce, 0x29, 0x10, 0x0d, 0x73, - 0xf9, 0xea, 0x70, 0x07, 0x6f, 0xbd, 0x61, 0x8d, 0xbc, 0x4c, 0x42, 0xee, 0x8d, 0xa3, 0xa3, 0xa3, - 0xf6, 0x91, 0x97, 0xe1, 0x0f, 0xde, 0x72, 0xdd, 0xd9, 0x17, 0xfb, 0x80, 0x32, 0x77, 0x1a, 0x2f, - 0x85, 0x7f, 0x21, 0x3d, 0x49, 0xc0, 0x86, 0xc6, 0x36, 0xb9, 0x8b, 0xe1, 0xc0, 0x95, 0x56, 0xac, - 0xb0, 0x8c, 0xc5, 0x6f, 0xd7, 0x95, 0x16, 0x30, 0xfd, 0xf6, 0xba, 0x2e, 0xb7, 0x83, 0x44, 0xee, - 0x8e, 0x8b, 0x1c, 0x0a, 0xff, 0xe3, 0xf8, 0x80, 0xea, 0x3c, 0xaf, 0x3d, 0x02, 0xf1, 0x07, 0xe0, - 0xba, 0x6d, 0x7b, 0x64, 0xdd, 0x58, 0xac, 0xd1, 0x5f, 0xb5, 0x39, 0x71, 0xd8, 0xfc, 0x3b, 0x7d, - 0x98, 0x81, 0xf8, 0xb7, 0x38, 0x5e, 0x79, 0xaa, 0xed, 0x12, 0xb4, 0x07, 0x1c, 0x58, 0x43, 0x58, - 0x57, 0x00, 0xfe, 0x9e, 0x00, 0x5f, 0x34, 0xb9, 0x4b, 0x4d, 0xf2, 0x26, 0xf2, 0xfa, 0xbb, 0xc5, - 0xfa, 0x97, 0x0b, 0x0c, 0xff, 0x0e, 0x65, 0xab, 0x6b, 0xd9, 0x3d, 0x70, 0x97, 0xe5, 0xb4, 0xfe, - 0x9e, 0xab, 0x70, 0x03, 0x75, 0x16, 0xb0, 0x03, 0xdf, 0x96, 0xbf, 0x40, 0x8d, 0x1c, 0xb4, 0x4c, - 0x14, 0xe8, 0xba, 0xcb, 0x87, 0x30, 0x06, 0x2a, 0x55, 0x5a, 0xf8, 0x58, 0xf5, 0x40, 0x75, 0x63, - 0x5b, 0xb2, 0x58, 0xe1, 0xe7, 0xd7, 0x7c, 0x5b, 0x21, 0x81, 0xde, 0xd9, 0x43, 0x14, 0xe4, 0x44, - 0x05, 0x63, 0xba, 0x66, 0xfc, 0x17, 0xc6, 0x38, 0xf3, 0x88, 0x00, 0x56, 0xed, 0x75, 0x5e, 0xe2, - 0x00, 0x03, 0x05, 0xcb, 0x0c, 0xbc, 0x18, 0xc3, 0x8e, 0x1f, 0xa8, 0xed, 0x7e, 0xb2, 0xea, 0x81, - 0xbd, 0x14, 0x64, 0x9c, 0x53, 0x58, 0x65, 0xc6, 0x7d, 0x9b, 0x6c, 0x62, 0x4e, 0xbc, 0x90, 0x84, - 0x2d, 0x24, 0x5a, 0x56, 0x9c, 0x12, 0x80, 0x90, 0xb4, 0x12, 0x08, 0x44, 0x4e, 0x92, 0x59, 0x81, - 0x24, 0xb3, 0xa1, 0xef, 0x65, 0x1a, 0x59, 0x5a, 0xa2, 0x0f, 0xb6, 0x24, 0xcf, 0xfd, 0x6e, 0x25, - 0x79, 0x66, 0xff, 0x4c, 0xf2, 0x2c, 0x51, 0x67, 0x76, 0x0f, 0x75, 0x2e, 0x67, 0x44, 0x3d, 0xfb, - 0x1d, 0x49, 0x3d, 0xfb, 0x9d, 0x6a, 0x1a, 0xcc, 0x3e, 0x83, 0x06, 0xb7, 0xd5, 0x72, 0x70, 0xc0, - 0x81, 0x2b, 0xd7, 0xd2, 0x1b, 0x38, 0xfb, 0x1a, 0xa3, 0x7c, 0x43, 0xe4, 0xd8, 0xe9, 0x0a, 0x74, - 0x10, 0xe0, 0x4b, 0x21, 0x3a, 0x3a, 0x77, 0x54, 0xdf, 0x6f, 0xbb, 0x4b, 0xdf, 0x23, 0xc1, 0x43, - 0xa4, 0x23, 0x51, 0x00, 0x45, 0xb2, 0x3a, 0x79, 0xe0, 0x60, 0x80, 0xfc, 0x86, 0x15, 0x1e, 0x1e, - 0xf6, 0x60, 0x2c, 0xba, 0x58, 0x5b, 0xe2, 0x11, 0x05, 0xad, 0x94, 0x78, 0xcb, 0x1a, 0x1d, 0x10, - 0x3d, 0x03, 0x68, 0x7b, 0xa0, 0xe5, 0x46, 0xe6, 0xe8, 0x9e, 0x12, 0x4d, 0x94, 0xda, 0x04, 0x7c, - 0x6b, 0x2d, 0x11, 0x19, 0x65, 0xb2, 0x02, 0x5c, 0x86, 0xf7, 0x7a, 0x39, 0x03, 0x80, 0x11, 0xd7, - 0x68, 0xe6, 0xd5, 0xcb, 0x16, 0x01, 0x08, 0x2e, 0x64, 0x79, 0x05, 0x89, 0xcc, 0x50, 0x83, 0x91, - 0xb3, 0xa6, 0x00, 0xa0, 0x45, 0xf2, 0x13, 0x85, 0xa5, 0x65, 0x25, 0xbc, 0x27, 0x36, 0x55, 0xd4, - 0xa5, 0x6e, 0x00, 0x06, 0x21, 0xc7, 0x14, 0x44, 0x2d, 0x7f, 0xb3, 0x51, 0xd5, 0xa6, 0x42, 0xfb, - 0xa2, 0x90, 0xe8, 0xbe, 0x9d, 0x77, 0x05, 0x89, 0x1c, 0xd1, 0x9a, 0x79, 0x53, 0x1c, 0x02, 0x0e, - 0x78, 0x80, 0x24, 0xc8, 0xbf, 0x89, 0x47, 0x0f, 0x74, 0x30, 0xa8, 0x19, 0xc7, 0x02, 0x5e, 0x60, - 0xb4, 0xe4, 0x74, 0x90, 0xe8, 0x1d, 0xb9, 0x83, 0x6e, 0xba, 0x3d, 0x14, 0x02, 0x12, 0xc7, 0x34, - 0x3a, 0x38, 0xa8, 0x43, 0x0c, 0xf5, 0x2d, 0x38, 0x2a, 0x3d, 0x09, 0xc5, 0x48, 0x7b, 0x5e, 0xbf, - 0x03, 0xba, 0x04, 0x3c, 0x51, 0xd7, 0x11, 0xfd, 0xfd, 0xbc, 0x4b, 0xc8, 0x79, 0x1c, 0x64, 0xa8, - 0xa4, 0x2b, 0x98, 0x9f, 0x26, 0x07, 0xba, 0xdf, 0x06, 0x14, 0xa7, 0x93, 0x5d, 0x9a, 0x5c, 0x44, - 0x08, 0x71, 0x72, 0x75, 0x9d, 0x64, 0x8d, 0xee, 0x3e, 0x01, 0xaf, 0xb6, 0x86, 0xe6, 0x52, 0x28, - 0x27, 0x96, 0x44, 0x27, 0x96, 0xa4, 0x9a, 0x58, 0x2c, 0x4e, 0x82, 0x82, 0xa5, 0xba, 0xae, 0x1a, - 0xc0, 0xe4, 0x2e, 0x92, 0x61, 0xf9, 0xa4, 0xb7, 0x89, 0x1c, 0x60, 0x2a, 0x56, 0x22, 0x1e, 0x56, - 0x20, 0x9e, 0x7e, 0x3e, 0x37, 0xe4, 0xc0, 0x86, 0x30, 0x10, 0x9b, 0x64, 0x44, 0x41, 0x92, 0x08, - 0x67, 0x20, 0xa4, 0xb4, 0xf1, 0x56, 0x08, 0xec, 0xdb, 0xcb, 0xf9, 0x9d, 0xec, 0xd9, 0x03, 0xf6, - 0xbc, 0xb4, 0x7a, 0x07, 0xf6, 0x06, 0xa4, 0xbd, 0x3e, 0x7d, 0xe9, 0x6f, 0x7e, 0xf9, 0x27, 0x4e, - 0x21, 0x4c, 0x23, 0x13, 0xa8, 0x8c, 0x57, 0x35, 0x4c, 0x5c, 0x4e, 0x26, 0x35, 0xeb, 0x85, 0xe5, - 0xdb, 0x24, 0x9b, 0x45, 0x83, 0xbe, 0xc2, 0xd4, 0x52, 0xb2, 0x22, 0xe4, 0x7b, 0x57, 0x24, 0xfd, - 0x09, 0x21, 0xa7, 0x40, 0xf7, 0x2b, 0x92, 0xc1, 0x03, 0x89, 0xd9, 0x44, 0x04, 0x06, 0xf5, 0x06, - 0x03, 0x95, 0xa2, 0x86, 0x87, 0x8b, 0x56, 0x6d, 0x3a, 0xd3, 0x32, 0xad, 0x33, 0x8d, 0x7c, 0x26, - 0x85, 0x41, 0xbc, 0x42, 0x56, 0x6a, 0x20, 0x27, 0x17, 0xdb, 0x1d, 0x69, 0xe9, 0x22, 0xb5, 0xe6, - 0x0d, 0x80, 0xa8, 0xa9, 0x62, 0x31, 0x28, 0x03, 0x31, 0xe9, 0x6c, 0xeb, 0xe6, 0xc0, 0x15, 0x02, - 0x1e, 0xa8, 0x40, 0xca, 0xc8, 0x46, 0xb3, 0xbf, 0x2f, 0xc7, 0xbc, 0xc3, 0xfb, 0x37, 0xd8, 0xe8, - 0xdf, 0x41, 0xb1, 0x7f, 0xfd, 0x9e, 0xcb, 0xd9, 0x4f, 0xab, 0x07, 0xa8, 0xa4, 0xf7, 0x99, 0xa5, - 0x77, 0x2b, 0x4b, 0xef, 0xde, 0x5b, 0x5a, 0x47, 0x66, 0x9e, 0xaa, 0x71, 0xa5, 0x1c, 0x71, 0x31, - 0xd5, 0x0e, 0x06, 0x42, 0x41, 0x40, 0xc4, 0x8e, 0x71, 0x77, 0xff, 0x1d, 0x34, 0xd0, 0x76, 0xab, - 0x40, 0xdd, 0xa3, 0x69, 0x87, 0xeb, 0xaa, 0x1b, 0xa3, 0xcf, 0x89, 0x59, 0x41, 0xb5, 0x5e, 0xe3, - 0x94, 0xd0, 0xe3, 0x33, 0x88, 0x2f, 0x64, 0x14, 0x4d, 0xe4, 0x87, 0x5e, 0x42, 0x13, 0xb8, 0xf4, - 0x95, 0x33, 0xa9, 0xba, 0x72, 0x0d, 0x24, 0xcb, 0x89, 0x56, 0xf4, 0xa5, 0x66, 0xbd, 0xa6, 0x89, - 0x8e, 0xdf, 0x85, 0xf7, 0x9e, 0x3f, 0x2f, 0x3f, 0xbb, 0x46, 0x51, 0xcb, 0x7b, 0x4b, 0xd5, 0x8b, - 0xe5, 0xb1, 0xaa, 0x5f, 0x39, 0x16, 0x96, 0xe7, 0xc0, 0x5c, 0x4a, 0x03, 0xcf, 0x39, 0xd3, 0xc8, - 0xa4, 0xd6, 0xd2, 0x29, 0x3d, 0x10, 0x71, 0x55, 0x69, 0x61, 0x83, 0x03, 0x5e, 0x1b, 0x28, 0x3a, - 0x6b, 0x51, 0x23, 0x2b, 0xd6, 0x28, 0x66, 0xf0, 0x81, 0x3e, 0xc5, 0xde, 0x23, 0x35, 0x85, 0x04, - 0xa4, 0xee, 0xdc, 0x2d, 0x2b, 0x29, 0x5f, 0x6f, 0x28, 0xc5, 0xd3, 0xb0, 0x38, 0x26, 0x24, 0xb1, - 0xaa, 0xa0, 0xde, 0xef, 0xdc, 0xa1, 0x3b, 0x6a, 0x1a, 0x63, 0x0f, 0xc8, 0xe3, 0x77, 0xde, 0x3b, - 0x6d, 0x72, 0xd0, 0x14, 0xc0, 0xfe, 0xc1, 0x3d, 0x19, 0xf6, 0xbb, 0xa8, 0x12, 0xe6, 0x0a, 0x22, - 0xce, 0x00, 0x96, 0x98, 0xb4, 0x79, 0xcf, 0x6c, 0xd9, 0x2d, 0x52, 0x62, 0x36, 0xe7, 0x9a, 0x18, - 0xcc, 0x1f, 0xb9, 0x4b, 0x16, 0x80, 0xcb, 0x3d, 0xd7, 0x5b, 0x6c, 0xb3, 0x09, 0xfc, 0x8b, 0x85, - 0x8d, 0x36, 0x83, 0x7f, 0x0b, 0xf8, 0x37, 0x86, 0x7f, 0x73, 0xf8, 0x77, 0x0d, 0xff, 0x6e, 0xe1, - 0xdf, 0x39, 0x7a, 0x2a, 0x94, 0x2a, 0xbc, 0x40, 0x4c, 0x13, 0xe1, 0x9e, 0x7b, 0x33, 0x98, 0xb2, - 0x95, 0x3e, 0x7a, 0x0e, 0x03, 0x75, 0x61, 0x91, 0x39, 0xa5, 0x29, 0xce, 0xc8, 0x4e, 0x16, 0xe3, - 0x53, 0xeb, 0x39, 0xca, 0xa6, 0x9a, 0xf5, 0x84, 0x2c, 0x0c, 0x9c, 0x64, 0xed, 0x5b, 0x18, 0x0e, - 0x26, 0x19, 0xf1, 0x96, 0x63, 0x11, 0xa6, 0x5e, 0x4d, 0x5f, 0x4d, 0x4a, 0xac, 0x47, 0x53, 0xbd, - 0xd0, 0xb2, 0x1b, 0x5d, 0x68, 0x49, 0x34, 0x99, 0xa8, 0x26, 0x95, 0xba, 0x0c, 0x75, 0xfe, 0x49, - 0x90, 0xf0, 0x25, 0x46, 0xa3, 0x23, 0x6b, 0x90, 0xf2, 0xd8, 0x9a, 0x1a, 0xcd, 0xcd, 0xa1, 0xe5, - 0x4b, 0xca, 0x99, 0x43, 0xbe, 0x56, 0x5d, 0xf9, 0x84, 0x9b, 0x71, 0x6d, 0xde, 0x17, 0x96, 0xa3, - 0xbf, 0xdf, 0xb7, 0x05, 0x1c, 0x5a, 0xad, 0x0a, 0x1e, 0x90, 0xda, 0x89, 0x06, 0x53, 0xb1, 0x28, - 0x88, 0x7c, 0x7b, 0x79, 0xeb, 0x75, 0x76, 0xc5, 0xf8, 0x61, 0xe7, 0x13, 0x8e, 0xa2, 0x8c, 0xc4, - 0x0e, 0x7c, 0xeb, 0xe6, 0xdf, 0x88, 0x7b, 0x8f, 0x4a, 0xea, 0x3d, 0x64, 0xe9, 0xcb, 0xe1, 0xcf, - 0x91, 0xd7, 0xe9, 0x72, 0x0a, 0x2b, 0x58, 0x7a, 0xda, 0xe7, 0xfe, 0xdd, 0x9f, 0x77, 0x65, 0x97, - 0x92, 0x46, 0x57, 0xb1, 0xa4, 0x3e, 0x0d, 0x77, 0x75, 0xdc, 0x0b, 0x0c, 0x9d, 0xab, 0x5e, 0x7e, - 0xb2, 0xce, 0x9d, 0x73, 0x4c, 0x2a, 0x09, 0x3b, 0x65, 0x1d, 0x6d, 0x1b, 0xd3, 0x36, 0x08, 0xd4, - 0x19, 0xd4, 0xd9, 0xe9, 0xab, 0x61, 0x99, 0xc9, 0xcc, 0x16, 0x6f, 0xc6, 0x2e, 0x95, 0x39, 0xd8, - 0x73, 0x49, 0x45, 0x53, 0xf8, 0x05, 0x35, 0x3f, 0xc3, 0x61, 0x75, 0x76, 0x73, 0x35, 0x7f, 0x64, - 0x4d, 0x50, 0xd3, 0x6e, 0x43, 0x2a, 0xca, 0xb7, 0x49, 0x2e, 0xdf, 0x50, 0xc3, 0xe3, 0x0d, 0x4d, - 0xa0, 0x1f, 0x98, 0x34, 0xbc, 0xf5, 0xba, 0xdd, 0x75, 0xc1, 0x18, 0x81, 0xde, 0x62, 0x62, 0xd9, - 0xb6, 0x28, 0x36, 0xab, 0xda, 0xed, 0xe9, 0xed, 0xfa, 0xb2, 0xdd, 0x73, 0x10, 0x5e, 0x3e, 0x6f, - 0xd7, 0xf9, 0xc6, 0x42, 0xec, 0xac, 0xce, 0x75, 0x4a, 0xe8, 0xd9, 0x2e, 0x9f, 0xb0, 0x11, 0x16, - 0x1f, 0x78, 0x91, 0x77, 0xd7, 0x89, 0x73, 0xf5, 0x5c, 0x64, 0x5a, 0x5e, 0x7b, 0x31, 0x00, 0xd9, - 0xeb, 0x54, 0xcc, 0x25, 0x45, 0x16, 0xea, 0x76, 0x31, 0xba, 0xa1, 0x00, 0xd2, 0x01, 0x00, 0x43, - 0x02, 0x70, 0xd0, 0x77, 0x80, 0x00, 0x34, 0x9f, 0x40, 0xe2, 0x85, 0x8d, 0xce, 0x40, 0x18, 0x31, - 0xc2, 0x6b, 0xc1, 0x39, 0xf6, 0x1b, 0x31, 0xa3, 0x88, 0x31, 0xc8, 0xca, 0xca, 0x81, 0xb0, 0x16, - 0xfb, 0xdd, 0x92, 0xea, 0x22, 0x67, 0x3b, 0xe9, 0x34, 0xc9, 0x24, 0x7b, 0xe2, 0x0e, 0x7e, 0x8d, - 0x77, 0xba, 0x55, 0xbc, 0x23, 0x33, 0xaf, 0xf5, 0xcc, 0x35, 0xaf, 0x4f, 0x5d, 0xcf, 0x78, 0xd7, - 0x4b, 0x02, 0x5a, 0x88, 0x8c, 0xce, 0xc8, 0x1a, 0xab, 0xfe, 0xbe, 0xb4, 0xae, 0x11, 0x81, 0x73, - 0x95, 0x30, 0x27, 0xfe, 0x19, 0x13, 0xdf, 0x60, 0xb7, 0x9f, 0x59, 0xcc, 0x99, 0x39, 0x63, 0x67, - 0x6e, 0x0f, 0xcb, 0x40, 0x34, 0xbb, 0x8a, 0x37, 0x78, 0xae, 0xb6, 0xd3, 0x96, 0xb9, 0xd0, 0x56, - 0x54, 0x5f, 0x15, 0x0d, 0xaa, 0x6f, 0x6d, 0x49, 0x47, 0xb9, 0xf0, 0x03, 0x88, 0x77, 0x87, 0x9b, - 0x14, 0x55, 0x4c, 0x94, 0xd6, 0x2a, 0x5a, 0xa9, 0x1b, 0x64, 0x94, 0x51, 0xcd, 0x90, 0xfa, 0x5a, - 0x33, 0xdc, 0x0b, 0xe4, 0x9b, 0x01, 0xff, 0x09, 0x1c, 0xdf, 0xaa, 0x86, 0x5f, 0x12, 0xa1, 0x69, - 0x9c, 0xf9, 0xcc, 0xba, 0x75, 0xce, 0x1d, 0xf8, 0x77, 0x67, 0x97, 0x51, 0x35, 0xe8, 0x6b, 0x6e, - 0xb2, 0x02, 0xe8, 0xfb, 0xae, 0xda, 0xd9, 0x51, 0x35, 0xe6, 0x4c, 0x93, 0x42, 0x3d, 0x25, 0x47, - 0x00, 0xfa, 0x41, 0x2e, 0xa3, 0x4b, 0x02, 0xb4, 0x7b, 0xa7, 0x00, 0xd5, 0x7b, 0xc3, 0xfe, 0x19, - 0xbd, 0x51, 0x52, 0x28, 0xc9, 0x3d, 0x2a, 0xb9, 0x30, 0x3b, 0xdf, 0x9c, 0xbb, 0xa4, 0x00, 0xe2, - 0xd8, 0xdc, 0x10, 0x40, 0xca, 0x53, 0xd2, 0x93, 0x64, 0x3f, 0xd4, 0x58, 0xb2, 0x28, 0x24, 0x32, - 0x2e, 0xdd, 0x71, 0x1e, 0xb4, 0x05, 0x7c, 0xc3, 0x67, 0xe4, 0xc3, 0x95, 0x87, 0x49, 0xca, 0x62, - 0xae, 0x86, 0x13, 0x8c, 0xd4, 0xd8, 0x94, 0xae, 0xb1, 0xbd, 0xb7, 0x1a, 0x63, 0x9c, 0x7b, 0xe5, - 0xca, 0x3c, 0xf4, 0xd4, 0x16, 0x67, 0xe5, 0xf3, 0x91, 0xa2, 0xb8, 0x5d, 0x10, 0x0d, 0x9a, 0x73, - 0x45, 0xe2, 0x64, 0x7f, 0x38, 0xb5, 0x66, 0x8e, 0xa8, 0x09, 0x27, 0xcf, 0x85, 0xb4, 0x49, 0x7b, - 0x5d, 0x77, 0xc1, 0x05, 0x87, 0x42, 0x24, 0xd6, 0xcd, 0xb8, 0xad, 0x21, 0x82, 0x07, 0xc9, 0x6e, - 0x06, 0xc2, 0xc9, 0xd2, 0xe5, 0xee, 0x31, 0xa8, 0x57, 0x3c, 0x33, 0xa2, 0x0e, 0xe8, 0xd5, 0x5a, - 0xb6, 0xd8, 0xec, 0xea, 0xfa, 0x39, 0xbf, 0xca, 0x2d, 0x5f, 0x48, 0xbf, 0x5b, 0x83, 0x19, 0x4e, - 0x54, 0xef, 0x98, 0x37, 0xd1, 0xf5, 0x12, 0xc6, 0x35, 0x8c, 0xbb, 0xa7, 0x13, 0x74, 0xea, 0xe4, - 0x86, 0x56, 0x9c, 0x6b, 0x9c, 0x89, 0x17, 0x2b, 0x8d, 0x53, 0xb7, 0xa9, 0xbc, 0x5d, 0x9d, 0x52, - 0xb8, 0xd6, 0x19, 0x17, 0xb4, 0xce, 0xa2, 0x65, 0xe6, 0xf1, 0x55, 0x9a, 0xf4, 0x84, 0xb4, 0x48, - 0xc1, 0xc9, 0x30, 0xc8, 0x03, 0x9d, 0x08, 0xa5, 0xf4, 0x1f, 0x5e, 0x5b, 0x13, 0x47, 0x8a, 0xaf, - 0x36, 0x68, 0x1f, 0xe4, 0xa1, 0xe4, 0x2e, 0x0d, 0x72, 0x25, 0xa1, 0x9b, 0x06, 0x7a, 0xac, 0xfc, - 0x39, 0xc2, 0x5d, 0x32, 0x29, 0x00, 0x90, 0x80, 0x89, 0x3e, 0x51, 0x26, 0x3a, 0x77, 0xe2, 0x80, - 0xbc, 0x10, 0x88, 0x88, 0x4b, 0x18, 0xc8, 0xcd, 0xf2, 0x4a, 0x8b, 0xbc, 0x34, 0xe7, 0xdc, 0x45, - 0x89, 0x5b, 0xf4, 0xac, 0x7b, 0x26, 0xf4, 0x7e, 0xdf, 0xad, 0x10, 0x07, 0x02, 0x1f, 0x13, 0xd5, - 0xfd, 0xe0, 0x64, 0xa2, 0x10, 0x1a, 0x6b, 0xfe, 0x59, 0xe8, 0xfa, 0x80, 0x92, 0x63, 0x60, 0xf4, - 0x49, 0xa3, 0x0b, 0x79, 0xda, 0xe8, 0x79, 0xe3, 0x55, 0xc6, 0x3a, 0x80, 0xca, 0xa3, 0x26, 0x86, - 0x2d, 0x77, 0x62, 0xea, 0xfe, 0x8e, 0x58, 0x6b, 0x32, 0xce, 0xc7, 0x10, 0x63, 0x71, 0x70, 0x6a, - 0xd6, 0xc1, 0x8c, 0x30, 0x30, 0x87, 0x6c, 0x52, 0x0c, 0x86, 0x54, 0xdc, 0x8b, 0xd5, 0x4a, 0x20, - 0x3e, 0x0b, 0x93, 0x05, 0xdd, 0x6b, 0x50, 0x85, 0x9f, 0x0a, 0xc9, 0x81, 0xcc, 0x7e, 0x80, 0x53, - 0x87, 0xa6, 0x00, 0x70, 0x0d, 0xa5, 0xdf, 0x57, 0x8c, 0x4e, 0x33, 0x48, 0xee, 0x0a, 0xe1, 0xa7, - 0x7b, 0xb8, 0xb2, 0x3c, 0xd2, 0x2c, 0x41, 0x90, 0xd2, 0xe8, 0x37, 0x90, 0xbc, 0x8c, 0x64, 0x39, - 0x71, 0xb2, 0xc6, 0x3e, 0xfa, 0x64, 0xed, 0x92, 0x66, 0x28, 0xa9, 0x48, 0x11, 0x8e, 0x9f, 0x2f, - 0x90, 0xe4, 0xaa, 0x7b, 0x41, 0x08, 0x29, 0xc4, 0x2f, 0x73, 0x11, 0xa0, 0x7a, 0xaf, 0xeb, 0xf1, - 0x95, 0x2e, 0x6e, 0x29, 0x1d, 0xf3, 0xd9, 0xa5, 0x26, 0x15, 0x7e, 0x5e, 0xa8, 0xa4, 0x71, 0xfb, - 0x5e, 0xaf, 0xa7, 0x1f, 0xdc, 0x36, 0xee, 0xb4, 0x0a, 0x10, 0xb3, 0x3e, 0x9f, 0xce, 0x7a, 0xf6, - 0x26, 0xe2, 0xe3, 0xcf, 0x11, 0xb2, 0xf1, 0xa8, 0x24, 0x63, 0x11, 0xeb, 0xba, 0x02, 0x9e, 0xcb, - 0x5a, 0xbd, 0x1b, 0xd2, 0x6a, 0x99, 0x02, 0xba, 0x59, 0x51, 0x5b, 0x2f, 0x94, 0x5e, 0x6b, 0x3b, - 0x1f, 0x15, 0x6c, 0x72, 0x9a, 0x11, 0xda, 0xad, 0xda, 0xa6, 0x87, 0xa3, 0xa1, 0x89, 0x57, 0xa1, - 0x30, 0xfa, 0x72, 0x65, 0x62, 0x59, 0x31, 0x1c, 0x9b, 0x44, 0xc9, 0xed, 0xde, 0x8e, 0x5a, 0x33, - 0xd9, 0x30, 0xb8, 0x32, 0x3e, 0x50, 0x8c, 0x1b, 0x29, 0x78, 0x95, 0xa8, 0x28, 0x88, 0x46, 0x7c, - 0x96, 0xab, 0x98, 0x7f, 0xe2, 0x36, 0x20, 0xe6, 0x90, 0x63, 0x12, 0x7b, 0x99, 0x36, 0x00, 0x31, - 0x34, 0x10, 0x6b, 0x83, 0x00, 0x3a, 0x30, 0xe1, 0x23, 0xb1, 0xcb, 0xa6, 0xb3, 0xf8, 0xbe, 0xab, - 0x61, 0x76, 0x7d, 0xc7, 0x3c, 0x32, 0xe5, 0xfb, 0xb1, 0x60, 0xf6, 0xa1, 0x4e, 0xc0, 0xcc, 0x4c, - 0x4b, 0xa7, 0x72, 0x8f, 0x64, 0x52, 0x22, 0x87, 0x2d, 0x1a, 0x70, 0x2e, 0x2d, 0x23, 0x6f, 0xb7, - 0x5a, 0x62, 0xe6, 0x1f, 0xe4, 0x30, 0x01, 0x7c, 0x6b, 0x81, 0xf7, 0x88, 0x80, 0x06, 0x98, 0xf1, - 0x62, 0xef, 0x44, 0xc9, 0xfa, 0xce, 0xa6, 0x46, 0xc3, 0xf5, 0x62, 0xa1, 0x59, 0x6a, 0x3a, 0xf4, - 0xc1, 0x9e, 0xb8, 0x79, 0xb6, 0x60, 0x65, 0xde, 0x58, 0x09, 0xd1, 0xdb, 0xde, 0xbe, 0x58, 0x31, - 0x89, 0xbc, 0x0e, 0xf7, 0xca, 0x14, 0xf3, 0x81, 0x51, 0xae, 0x2b, 0xe4, 0x9d, 0xce, 0x01, 0xb2, - 0x3d, 0x94, 0x55, 0x8c, 0x8f, 0x6b, 0x31, 0x5c, 0x18, 0x24, 0xca, 0xe1, 0x8a, 0x19, 0x07, 0x2a, - 0x75, 0xa0, 0xe5, 0xed, 0xa3, 0x35, 0x4f, 0x6d, 0xe5, 0xbd, 0xeb, 0x74, 0x72, 0x73, 0x52, 0x11, - 0x90, 0x4c, 0xb0, 0x2c, 0x36, 0x1a, 0xb8, 0x7d, 0xe4, 0x9e, 0x2d, 0xfa, 0x0f, 0x9a, 0x3d, 0xb2, - 0xbc, 0x4e, 0x7d, 0x62, 0xc5, 0x8e, 0xe9, 0x8b, 0xb5, 0x42, 0x17, 0xd6, 0x8c, 0x88, 0xfb, 0x07, - 0x6e, 0xbb, 0x01, 0x52, 0x3d, 0x9e, 0xf7, 0xe6, 0x97, 0xc3, 0x9c, 0x79, 0x2f, 0xc9, 0x7c, 0x2a, - 0xd9, 0x31, 0xbb, 0xc0, 0x64, 0x91, 0xd7, 0x6d, 0x17, 0x10, 0xa1, 0x57, 0x77, 0xf7, 0xfc, 0xf8, - 0x65, 0xf3, 0x33, 0x34, 0xd4, 0xcf, 0xe5, 0xc4, 0x97, 0xb6, 0x45, 0x4b, 0x06, 0x50, 0xc5, 0x41, - 0x69, 0xce, 0xec, 0x97, 0x3d, 0xd5, 0x90, 0x67, 0xff, 0xae, 0x66, 0xaa, 0xa7, 0x27, 0xe4, 0xd5, - 0xbc, 0xf6, 0x5c, 0x55, 0xd6, 0x68, 0xa7, 0xdb, 0xde, 0x18, 0x7b, 0xc9, 0xef, 0x22, 0x43, 0xff, - 0xbe, 0x0c, 0xfb, 0xf7, 0x65, 0x38, 0x40, 0x28, 0xf2, 0x49, 0x3e, 0x92, 0x1a, 0x04, 0xe3, 0x2f, - 0x9b, 0xb3, 0xfc, 0xbd, 0xb2, 0x65, 0x4c, 0x31, 0x6f, 0x49, 0xb2, 0xb0, 0xc2, 0x9a, 0x2b, 0x2b, - 0xac, 0x58, 0xa0, 0xbf, 0x43, 0x5b, 0xce, 0x50, 0x8e, 0xed, 0x65, 0xbe, 0x08, 0xca, 0xbc, 0x57, - 0x30, 0x73, 0x34, 0x71, 0xd9, 0x72, 0x7f, 0x1f, 0xe6, 0x5a, 0x49, 0x64, 0x72, 0x28, 0xd0, 0x1e, - 0xd3, 0x33, 0x1d, 0x74, 0x9d, 0x9e, 0x9e, 0x49, 0x5b, 0xee, 0xc8, 0x13, 0xd7, 0x6a, 0xf1, 0xf6, - 0x8e, 0xd6, 0x3b, 0xbb, 0x85, 0xaf, 0xfd, 0x12, 0x6c, 0xd4, 0xec, 0x07, 0x6c, 0x76, 0x80, 0xf2, - 0xaa, 0xdd, 0xd9, 0x00, 0x0d, 0xad, 0x62, 0x2d, 0xcb, 0xc1, 0xc1, 0xe7, 0xc2, 0x05, 0xa2, 0xa5, - 0xd0, 0xa5, 0x7d, 0xa7, 0xbf, 0xd9, 0xef, 0xce, 0x5e, 0x21, 0x53, 0xa7, 0x3d, 0xa0, 0x89, 0xf5, - 0xf3, 0x3a, 0xde, 0x75, 0x97, 0x15, 0xab, 0x09, 0x9d, 0x4e, 0x67, 0x54, 0xec, 0x2c, 0x4a, 0xb4, - 0x0e, 0x48, 0x34, 0x1d, 0x11, 0x83, 0xe2, 0xb2, 0xf9, 0x81, 0x02, 0x03, 0x95, 0x21, 0xb0, 0x8a, - 0x8b, 0x60, 0x08, 0x60, 0xbb, 0xc5, 0x5c, 0xbd, 0x76, 0x71, 0x28, 0xab, 0x81, 0x55, 0x7b, 0x01, - 0x0a, 0xf6, 0x77, 0xde, 0xef, 0x2e, 0x55, 0xd5, 0xd7, 0xb0, 0xb3, 0x56, 0x87, 0x59, 0x96, 0xb9, - 0x7b, 0x7f, 0x66, 0x61, 0x20, 0x18, 0xdc, 0x38, 0x04, 0x50, 0x33, 0xd0, 0x4b, 0x45, 0xbd, 0x18, - 0xf6, 0xa8, 0xd3, 0xef, 0x3a, 0xbb, 0x1b, 0xc5, 0x3b, 0x6a, 0xe0, 0xa8, 0x89, 0x76, 0x7b, 0x23, - 0x47, 0xbf, 0x08, 0xc4, 0x6e, 0xd7, 0xd9, 0xdb, 0xc8, 0x33, 0x28, 0xe6, 0x19, 0x0c, 0x2a, 0x00, - 0x3d, 0xb8, 0x93, 0xfe, 0x73, 0x38, 0x68, 0x88, 0x3b, 0xed, 0x0a, 0xcc, 0x76, 0x8a, 0x64, 0xb0, - 0xd7, 0xff, 0x1c, 0xfa, 0x97, 0xa9, 0xb8, 0xfe, 0x50, 0xe6, 0xe2, 0xa2, 0xbf, 0x7c, 0x5e, 0x61, - 0x6d, 0xa2, 0x7a, 0xa0, 0x76, 0x8a, 0x68, 0xce, 0x5d, 0x6d, 0x1e, 0x62, 0x5e, 0xd2, 0x10, 0xc8, - 0x4f, 0x0a, 0x9b, 0x85, 0x32, 0xa0, 0x28, 0x81, 0x82, 0x2d, 0x42, 0x01, 0xd7, 0x3c, 0x32, 0x6f, - 0xaf, 0xd8, 0xcf, 0xde, 0x40, 0x52, 0x6c, 0x61, 0x12, 0xc6, 0x99, 0x31, 0xf3, 0x72, 0x63, 0x42, - 0x77, 0x27, 0x11, 0xc9, 0x25, 0xe4, 0xf9, 0xa8, 0x58, 0x73, 0xe2, 0x7a, 0x2d, 0x77, 0x47, 0x0c, - 0x6c, 0x95, 0x33, 0xdf, 0x18, 0x25, 0x4d, 0xe0, 0x48, 0x37, 0x81, 0xa3, 0x6a, 0x13, 0xb8, 0x2f, - 0x0d, 0xdf, 0xe8, 0x4e, 0xc3, 0x37, 0x17, 0xbc, 0xbc, 0xdd, 0x3d, 0xa5, 0xee, 0x73, 0x63, 0x56, - 0xb4, 0x57, 0x6d, 0x86, 0xc9, 0x16, 0xc4, 0xb2, 0x33, 0x2a, 0x0e, 0xd1, 0xe6, 0xb2, 0x73, 0xcd, - 0xeb, 0xd9, 0xbf, 0x6b, 0x77, 0xa5, 0x8a, 0x96, 0x3a, 0xb9, 0x65, 0x31, 0xfc, 0x5d, 0x45, 0x7c, - 0xd6, 0x42, 0x68, 0xe7, 0xf2, 0x9a, 0xae, 0x24, 0xd2, 0x06, 0x5a, 0x1f, 0x5e, 0x90, 0xe4, 0xba, - 0x87, 0x34, 0x13, 0xde, 0x56, 0xdd, 0x47, 0xb9, 0xc7, 0x03, 0x47, 0xc1, 0x1f, 0xe1, 0x3a, 0x15, - 0xc6, 0x09, 0xc2, 0x23, 0xad, 0x27, 0x09, 0xdc, 0xfb, 0xbb, 0x73, 0xe4, 0xfb, 0xc8, 0x1a, 0xdd, - 0xcf, 0x5d, 0xe8, 0x66, 0x15, 0x0b, 0xdd, 0x19, 0x40, 0x55, 0xe5, 0x1e, 0x8a, 0x54, 0xcf, 0x60, - 0x60, 0xf5, 0x2d, 0x6e, 0x22, 0x4b, 0x44, 0x6b, 0x86, 0x45, 0x53, 0x4b, 0x5d, 0x69, 0xa4, 0xf3, - 0xc8, 0xe5, 0x56, 0xec, 0x51, 0x20, 0x5c, 0xff, 0x2e, 0x53, 0x21, 0x92, 0xca, 0xbe, 0x32, 0x19, - 0x7c, 0xc9, 0x28, 0x07, 0x9a, 0xc5, 0x10, 0xe5, 0x16, 0x43, 0x92, 0x2b, 0x10, 0xf9, 0xe6, 0x05, - 0x9d, 0xaf, 0x8a, 0x79, 0x0e, 0xba, 0xa8, 0x19, 0x67, 0x72, 0xd7, 0x89, 0xb6, 0x2d, 0x0f, 0xc8, - 0x82, 0xd8, 0x27, 0x6b, 0x70, 0xd7, 0xb7, 0xe6, 0x59, 0x45, 0x8a, 0x19, 0x65, 0x2e, 0x5f, 0x4f, - 0x86, 0x0e, 0x25, 0x8a, 0xa0, 0x7e, 0x12, 0xf6, 0x4a, 0x0e, 0x9e, 0xc8, 0x12, 0x69, 0x0c, 0x75, - 0x20, 0xa9, 0x2d, 0x1a, 0x56, 0x13, 0xa3, 0xfc, 0x5a, 0xa6, 0xc3, 0x4f, 0x77, 0xda, 0x24, 0xd2, - 0xcd, 0xa5, 0xd1, 0x64, 0xa4, 0x91, 0xe3, 0xc4, 0x93, 0xeb, 0x6b, 0xd8, 0x0e, 0xa0, 0x7d, 0x32, - 0x6a, 0xbb, 0x0c, 0x92, 0xf1, 0x97, 0x76, 0xad, 0x44, 0xba, 0xd5, 0x90, 0xeb, 0xe4, 0xfd, 0x2d, - 0x0b, 0x76, 0xd2, 0x36, 0xbb, 0x84, 0x5f, 0xc4, 0x4f, 0x85, 0x79, 0x9c, 0xc9, 0x45, 0x33, 0xcc, - 0x99, 0x8f, 0xef, 0x3a, 0xda, 0x58, 0x8e, 0x53, 0x8b, 0x5b, 0x35, 0x61, 0x97, 0x72, 0xb7, 0xa7, - 0xef, 0x4c, 0x14, 0x51, 0x45, 0x3a, 0x51, 0x5d, 0x8b, 0x4d, 0xe5, 0x69, 0x11, 0x1d, 0x89, 0x97, - 0xa0, 0x4e, 0xef, 0xa5, 0x02, 0x35, 0x12, 0x25, 0xb4, 0x4a, 0xbc, 0x2b, 0x76, 0xe9, 0xec, 0x9e, - 0x7a, 0x7e, 0xa3, 0xd7, 0x2d, 0x78, 0x8b, 0x2c, 0x6b, 0x22, 0xdd, 0x96, 0xdd, 0x7d, 0x77, 0xd2, - 0xe8, 0xee, 0x13, 0x4d, 0x8b, 0x3d, 0x47, 0x83, 0x2e, 0x2e, 0x00, 0xf1, 0x0d, 0x3e, 0x3e, 0xad, - 0x14, 0xef, 0xe7, 0xce, 0xba, 0x2e, 0xa0, 0x34, 0x45, 0x90, 0x71, 0x97, 0x9e, 0x5c, 0xe1, 0x16, - 0x69, 0x23, 0x92, 0xf3, 0x6e, 0x9b, 0xca, 0xc8, 0x7d, 0x4b, 0xf8, 0x22, 0x9c, 0x6c, 0x6a, 0x53, - 0x11, 0xee, 0x1c, 0xc5, 0x2c, 0x03, 0xe5, 0x01, 0xf5, 0xc5, 0x0e, 0x2a, 0x2f, 0x1d, 0x46, 0xf8, - 0x22, 0xdc, 0x46, 0xa2, 0xe2, 0x7a, 0x87, 0x67, 0x91, 0x5e, 0xd2, 0x32, 0xa9, 0xdc, 0x6e, 0x4e, - 0x4c, 0x1c, 0xd9, 0x25, 0x4e, 0x2b, 0x4c, 0x4a, 0x65, 0x5e, 0x4b, 0x24, 0xaf, 0x0d, 0xee, 0x9e, - 0x93, 0xe4, 0xee, 0xbf, 0x0e, 0x79, 0x47, 0x07, 0x25, 0x3d, 0xaf, 0x57, 0x31, 0x61, 0xf1, 0xe9, - 0x27, 0xab, 0x9e, 0x7e, 0xb2, 0xf2, 0xf4, 0xa3, 0xc9, 0x66, 0xda, 0x13, 0xb0, 0x7d, 0xa2, 0x60, - 0xde, 0x41, 0x6f, 0x5d, 0x35, 0x51, 0x9f, 0x57, 0xe0, 0xa3, 0xd0, 0x77, 0xcd, 0x62, 0x2c, 0x6c, - 0x9e, 0xdc, 0xba, 0x71, 0x32, 0x91, 0x7d, 0x5a, 0x6f, 0xd9, 0x32, 0xa9, 0x63, 0x25, 0x29, 0x23, - 0x00, 0x84, 0xb4, 0x94, 0xe6, 0x72, 0x99, 0x60, 0x09, 0x63, 0x56, 0x54, 0x80, 0x0e, 0xb4, 0x75, - 0xd4, 0xfe, 0x26, 0x9e, 0xb4, 0x05, 0xe1, 0x3d, 0x9c, 0xd6, 0x36, 0x88, 0xe0, 0x2a, 0x97, 0xbc, - 0x5b, 0x46, 0x6e, 0x40, 0xe3, 0x50, 0xd6, 0x74, 0x07, 0xe5, 0x4d, 0x85, 0x6a, 0xcf, 0x2e, 0xea, - 0x87, 0x05, 0x75, 0xb3, 0xa8, 0xe9, 0x75, 0xdb, 0xed, 0x4d, 0x2d, 0xae, 0xdb, 0x29, 0xe5, 0xd1, - 0x75, 0xe0, 0xb5, 0xae, 0xcb, 0xe5, 0x79, 0xba, 0x6d, 0x4d, 0x4f, 0x2b, 0xe8, 0x63, 0x55, 0x83, - 0xfb, 0xf0, 0xce, 0x19, 0x46, 0x08, 0x80, 0x2a, 0xf9, 0xe4, 0x6b, 0x3c, 0xa1, 0x6d, 0x9f, 0xf5, - 0x25, 0x1f, 0xf8, 0x3a, 0x1f, 0xa8, 0xf3, 0xa7, 0xba, 0x83, 0xaa, 0xc6, 0x46, 0x3f, 0x59, 0x11, - 0x77, 0xd9, 0xf1, 0x0c, 0x45, 0x41, 0xda, 0xef, 0xa2, 0xcd, 0xe0, 0x6b, 0x5a, 0x19, 0x8c, 0x3c, - 0x62, 0xdf, 0x93, 0x3e, 0x4f, 0x1f, 0xa4, 0x24, 0x0e, 0x24, 0x97, 0x3f, 0xfb, 0xf9, 0x82, 0x1d, - 0xc2, 0xd1, 0x57, 0xab, 0x39, 0xd9, 0xc6, 0xe8, 0xde, 0xc8, 0xcd, 0xfd, 0x9b, 0x02, 0x10, 0xb1, - 0x90, 0x42, 0xcf, 0x03, 0xaf, 0xad, 0xf6, 0x4d, 0xd4, 0x12, 0x9b, 0x02, 0xeb, 0xa1, 0x40, 0x56, - 0x7d, 0x4d, 0xbd, 0x08, 0x29, 0x82, 0x8b, 0x74, 0x78, 0xce, 0xe4, 0xf3, 0xcc, 0x4a, 0x0f, 0x0f, - 0x51, 0xe6, 0x74, 0xfb, 0x35, 0x2f, 0x90, 0x8f, 0xa2, 0x8b, 0x09, 0x6d, 0xb8, 0x14, 0x08, 0x20, - 0x00, 0xda, 0x45, 0xef, 0x23, 0xad, 0xd9, 0x70, 0x98, 0xf0, 0x97, 0x7c, 0xfd, 0x29, 0x5e, 0xa0, - 0x6a, 0x37, 0xad, 0x80, 0x7e, 0x57, 0xf7, 0x69, 0xd6, 0x4f, 0xaa, 0x6d, 0x64, 0x56, 0x76, 0x77, - 0x88, 0xf5, 0xc6, 0xde, 0x9e, 0xf8, 0xed, 0xe9, 0x44, 0xaa, 0x3b, 0x3e, 0x59, 0xbd, 0xb9, 0xaf, - 0x79, 0x17, 0xfa, 0xed, 0x15, 0x52, 0xdb, 0xae, 0xda, 0xa8, 0x36, 0x50, 0xc6, 0xcf, 0xb6, 0xb6, - 0xe4, 0x52, 0xde, 0x81, 0x60, 0xec, 0x83, 0xbe, 0xd6, 0x96, 0x6e, 0x4c, 0x50, 0x7f, 0x71, 0x57, - 0x64, 0xb7, 0x27, 0x6b, 0xef, 0xaf, 0xef, 0xe9, 0xef, 0x8b, 0xbf, 0xbb, 0xbf, 0x45, 0x5f, 0x8b, - 0xd8, 0x49, 0x53, 0xe8, 0x19, 0xf5, 0xb4, 0xdf, 0x96, 0xef, 0x7b, 0x75, 0xa6, 0xa9, 0xa4, 0x9d, - 0x7c, 0xff, 0xda, 0xd6, 0x0e, 0xf7, 0x95, 0xb0, 0xd2, 0xad, 0x04, 0xd1, 0x0b, 0xdd, 0x15, 0xb7, - 0x5b, 0x2f, 0xf7, 0x1b, 0x07, 0x7a, 0xa3, 0xe7, 0xda, 0x5d, 0x2a, 0xc7, 0x1b, 0xbc, 0xab, 0xef, - 0x5d, 0xcb, 0x77, 0xfd, 0x64, 0x8d, 0xe6, 0x81, 0xa8, 0xf4, 0x08, 0x1d, 0xa2, 0x5b, 0xfc, 0x76, - 0x9d, 0x41, 0x5b, 0xed, 0x44, 0x47, 0xad, 0xaf, 0x6a, 0x70, 0x30, 0xf8, 0x2f, 0xd7, 0xad, 0xa5, - 0xba, 0xaa, 0xa1, 0x03, 0x90, 0x25, 0x16, 0x38, 0x56, 0xc2, 0x23, 0x9e, 0xc9, 0x19, 0x07, 0xaa, - 0xdb, 0xe8, 0x49, 0x41, 0xd3, 0x7d, 0x7b, 0xb7, 0xa6, 0x9b, 0xc8, 0x43, 0x2d, 0x03, 0x52, 0xcd, - 0x70, 0xc6, 0x8f, 0xd4, 0x74, 0x3f, 0xe8, 0x4b, 0xc3, 0xaa, 0xc7, 0x37, 0x9d, 0x82, 0x79, 0xc4, - 0xc4, 0xb1, 0x13, 0x26, 0x24, 0x92, 0xd8, 0x22, 0x42, 0xf9, 0x23, 0xa5, 0x4b, 0xa0, 0x3e, 0x83, - 0xbf, 0x7c, 0xbb, 0x31, 0x57, 0x52, 0xf0, 0x77, 0xf7, 0x40, 0xfc, 0xee, 0x8b, 0xf4, 0x9e, 0xf8, - 0x6d, 0xe3, 0x6f, 0x8c, 0x1b, 0x8f, 0x2a, 0xfa, 0xf0, 0xea, 0x6e, 0xa9, 0x82, 0x7d, 0x49, 0xf1, - 0x64, 0x0d, 0x1e, 0x8d, 0x69, 0x37, 0x13, 0x01, 0x61, 0x2a, 0x4c, 0x04, 0x26, 0xe1, 0xa7, 0xd3, - 0xfe, 0xb9, 0x8f, 0x1f, 0x57, 0x91, 0x29, 0x3a, 0x24, 0xcf, 0x2f, 0xd6, 0x90, 0x49, 0xe1, 0xd6, - 0xd6, 0x22, 0x34, 0xef, 0xc3, 0x31, 0x09, 0xd5, 0xa1, 0xf2, 0x71, 0x54, 0xb1, 0xcc, 0xb3, 0x3c, - 0xba, 0xe0, 0x26, 0xb0, 0x91, 0x17, 0x69, 0x82, 0x10, 0xd1, 0x9f, 0x96, 0x74, 0xc0, 0x14, 0x14, - 0x2c, 0xae, 0x18, 0xf6, 0xa4, 0x0e, 0xe8, 0x6b, 0x4b, 0xd7, 0x3e, 0x8d, 0x93, 0x2d, 0x54, 0x30, - 0x8e, 0x3e, 0xfc, 0x4d, 0x15, 0xe2, 0x53, 0xa1, 0xba, 0x65, 0xf4, 0xbc, 0xaf, 0xd4, 0xb8, 0x54, - 0x6a, 0x7a, 0x11, 0x7f, 0x19, 0x6c, 0xd1, 0xd1, 0x7e, 0xbd, 0x77, 0x7a, 0xfe, 0x2c, 0x77, 0x8e, - 0x3c, 0x64, 0xb1, 0xe1, 0xae, 0xc2, 0x10, 0x0c, 0x9b, 0x1e, 0xb0, 0x92, 0xdb, 0xe8, 0xbe, 0xb9, - 0xf5, 0xc3, 0x56, 0x9b, 0x63, 0x98, 0x68, 0x83, 0x9d, 0xf0, 0x1d, 0xa4, 0x62, 0xb0, 0xf5, 0x95, - 0x41, 0xc5, 0x5c, 0x62, 0xc0, 0x13, 0x6d, 0xc0, 0x13, 0x39, 0xe0, 0x18, 0xbf, 0xa0, 0x00, 0xbf, - 0x04, 0x34, 0xc9, 0xc7, 0x3e, 0xd1, 0xc1, 0x7a, 0x5d, 0x12, 0x97, 0x24, 0xe1, 0x73, 0x11, 0x71, - 0xb8, 0x7b, 0xaf, 0x34, 0xef, 0xc9, 0xa3, 0x2b, 0x83, 0xf6, 0x1d, 0x62, 0x5c, 0x97, 0x94, 0x83, - 0xba, 0xf5, 0x84, 0x8b, 0x86, 0x7b, 0x64, 0xf9, 0x2f, 0x55, 0xca, 0xe6, 0xdd, 0x1e, 0xa1, 0x6c, - 0xc3, 0x23, 0xc4, 0x34, 0xa5, 0xe3, 0x7e, 0x0d, 0xb3, 0x2c, 0x9f, 0xc1, 0xa6, 0x5d, 0x6f, 0xd5, - 0x1c, 0x5e, 0xe6, 0xc8, 0xd3, 0x17, 0xe5, 0xbe, 0xe1, 0x9d, 0x53, 0x6a, 0xcc, 0x13, 0xfd, 0x7d, - 0xdb, 0x6a, 0x3d, 0xd3, 0x84, 0xf5, 0xc6, 0x91, 0x81, 0x9c, 0xcc, 0x2a, 0x69, 0xeb, 0xfb, 0x1c, - 0x4f, 0x84, 0x1f, 0x8b, 0x84, 0x16, 0xb5, 0x20, 0x0e, 0x8f, 0xc8, 0x9e, 0xb3, 0xbc, 0xcf, 0x38, - 0x58, 0xcd, 0x82, 0x16, 0x4a, 0x3a, 0xac, 0x5a, 0x39, 0xca, 0x09, 0x9a, 0x35, 0xe5, 0xb1, 0x3e, - 0x00, 0xa7, 0x12, 0x80, 0x77, 0x39, 0x22, 0x08, 0x76, 0xf2, 0x79, 0xee, 0xb7, 0xc9, 0xe7, 0x89, - 0x5b, 0x50, 0xe9, 0xfd, 0x80, 0xeb, 0xa2, 0xb8, 0x14, 0x2e, 0xbc, 0xa2, 0x07, 0x03, 0xee, 0x9f, - 0x95, 0xc6, 0x5e, 0x25, 0x11, 0xbc, 0xdf, 0xe0, 0x6e, 0x76, 0xc7, 0x5c, 0x55, 0x3c, 0x4d, 0x25, - 0xe7, 0xdd, 0x2a, 0x5d, 0x66, 0x1b, 0xa3, 0xbe, 0x29, 0xf4, 0xa5, 0xb4, 0x38, 0x3f, 0xda, 0xd8, - 0x1a, 0x3f, 0xa0, 0xee, 0x94, 0xfd, 0xd9, 0xfd, 0xc1, 0xdd, 0x22, 0xf7, 0xb7, 0x62, 0x23, 0x02, - 0xbd, 0x95, 0xf2, 0x9b, 0x8b, 0x2c, 0x32, 0xf2, 0x2b, 0x2a, 0xfa, 0x76, 0x73, 0xe8, 0x07, 0x9c, - 0xb8, 0xb8, 0xec, 0x54, 0xfb, 0x83, 0x68, 0xb0, 0x45, 0xa5, 0x85, 0x01, 0xad, 0xac, 0xf6, 0xf9, - 0x56, 0x8a, 0xfa, 0x87, 0xaa, 0xfd, 0x6e, 0x2b, 0xb4, 0xfb, 0xff, 0x40, 0xad, 0x3f, 0x6e, 0x07, - 0x76, 0xf0, 0x0f, 0x54, 0xfb, 0x74, 0x6b, 0xb5, 0xfd, 0x7f, 0xa0, 0xd6, 0xaf, 0x4b, 0xb5, 0x52, - 0x95, 0xbc, 0x7e, 0xe1, 0x57, 0xe2, 0xae, 0x13, 0x96, 0xbb, 0x4e, 0x56, 0x52, 0x0b, 0x91, 0x11, - 0xad, 0x28, 0x63, 0xcd, 0x6b, 0xeb, 0xf5, 0xfe, 0xb1, 0x54, 0xef, 0xa0, 0x5d, 0x51, 0x2f, 0x30, - 0x08, 0xcb, 0xa7, 0xe3, 0x95, 0xd4, 0x62, 0xee, 0xaa, 0x17, 0xec, 0xe1, 0xa5, 0x38, 0xfe, 0xdb, - 0x11, 0xe7, 0x81, 0x95, 0x00, 0x2b, 0x74, 0x36, 0x5f, 0x8d, 0xec, 0x88, 0xf5, 0xbb, 0xb2, 0xb8, - 0xfc, 0x26, 0x27, 0x7a, 0xd5, 0x5e, 0xa7, 0xab, 0x1b, 0x13, 0xc0, 0xc9, 0xab, 0xe2, 0xf4, 0xa3, - 0x83, 0xf2, 0xa7, 0x72, 0x79, 0x43, 0xdb, 0x72, 0xd2, 0x3b, 0x58, 0xe9, 0x6f, 0x7d, 0xbd, 0xe0, - 0x0f, 0x96, 0x0c, 0xaf, 0x62, 0xe9, 0xc3, 0x28, 0x68, 0xae, 0xd0, 0x0d, 0xbd, 0xd8, 0x9f, 0x4b, - 0xc5, 0x04, 0xa9, 0xf6, 0xef, 0x29, 0xf6, 0xd3, 0x5d, 0x60, 0x76, 0x7a, 0x3a, 0x98, 0x9d, 0x02, - 0xaa, 0x7f, 0xd6, 0xdb, 0x23, 0x28, 0xef, 0x69, 0x89, 0xb1, 0x62, 0x09, 0x00, 0xf0, 0x9e, 0x12, - 0x59, 0x5e, 0xc2, 0xf0, 0xf5, 0x79, 0xa2, 0xcf, 0x0d, 0x56, 0x3d, 0x6f, 0xc2, 0x34, 0x21, 0x05, - 0xb5, 0x29, 0x32, 0x29, 0x45, 0x80, 0x13, 0x00, 0xa8, 0x23, 0xd0, 0x25, 0x02, 0x4a, 0xb5, 0x26, - 0x89, 0x7e, 0xf4, 0x8f, 0x81, 0xd6, 0x46, 0x0c, 0xaa, 0xf0, 0xc1, 0x41, 0xb7, 0xd1, 0xd9, 0xad, - 0x37, 0x3b, 0x03, 0x89, 0x3b, 0x48, 0x11, 0x62, 0x7a, 0x99, 0x2e, 0xdc, 0x80, 0x39, 0x7e, 0xe0, - 0xfe, 0xe8, 0x30, 0x37, 0xc5, 0xb8, 0x03, 0xee, 0x9f, 0x1d, 0x16, 0x32, 0xf7, 0x5b, 0xf8, 0x9b, - 0xba, 0xdf, 0x39, 0x2c, 0x75, 0x19, 0x73, 0x66, 0x6e, 0xc4, 0x9c, 0x60, 0xea, 0x7e, 0xef, 0x04, - 0xcc, 0x7d, 0xea, 0x04, 0x73, 0x37, 0x83, 0xf7, 0xd4, 0xfd, 0xd9, 0x99, 0xbb, 0xa1, 0x93, 0x30, - 0xf7, 0x8f, 0x4e, 0x12, 0xb8, 0x5f, 0x3b, 0xa9, 0xef, 0xbe, 0x75, 0x52, 0xe6, 0x3e, 0x87, 0x3f, - 0xa9, 0x9b, 0x30, 0x27, 0x4d, 0xdd, 0x1f, 0xd6, 0x6b, 0xab, 0xea, 0x86, 0x25, 0x8c, 0x0a, 0x44, - 0x97, 0xd7, 0xb8, 0xe7, 0x61, 0x3c, 0xf6, 0x43, 0x67, 0xb9, 0x76, 0xbe, 0xb1, 0x9d, 0x3f, 0x79, - 0xbf, 0xb7, 0xd2, 0x85, 0xf5, 0xe7, 0x26, 0x85, 0x3a, 0xd8, 0x53, 0x17, 0xfe, 0x44, 0x2a, 0x8a, - 0x5f, 0xa3, 0x33, 0x84, 0x2c, 0x2c, 0xb5, 0xfe, 0x64, 0x3b, 0xf0, 0xe0, 0x5b, 0x11, 0xc6, 0x33, - 0xfb, 0xc9, 0xfa, 0xb9, 0x22, 0xee, 0xc0, 0x9f, 0x30, 0x60, 0x04, 0xe4, 0x9a, 0x5b, 0x78, 0x7f, - 0x44, 0xc6, 0xa0, 0x72, 0x8c, 0x2d, 0x42, 0x61, 0xe7, 0xd4, 0x65, 0x00, 0x27, 0xa7, 0x3c, 0xda, - 0x3f, 0x05, 0x52, 0xf8, 0xbd, 0x95, 0x04, 0x96, 0x3d, 0xcc, 0xa3, 0xdf, 0xfc, 0xde, 0x0a, 0x52, - 0x0b, 0xef, 0xe1, 0x82, 0x07, 0x8a, 0xce, 0x05, 0x0f, 0x7e, 0x40, 0x81, 0xbc, 0x20, 0x65, 0x6a, - 0x61, 0x20, 0x02, 0x00, 0x03, 0xf3, 0xf8, 0xf8, 0x80, 0x71, 0x53, 0x28, 0x96, 0x37, 0x54, 0x15, - 0x40, 0xbb, 0xf5, 0xba, 0x35, 0xf1, 0x12, 0xc6, 0x2f, 0x09, 0x88, 0x46, 0x0c, 0xc5, 0x85, 0x53, - 0x88, 0x52, 0x26, 0xbf, 0x34, 0x3b, 0x2e, 0x46, 0xaa, 0x73, 0x52, 0x1e, 0x6b, 0x7f, 0x19, 0xb9, - 0x13, 0x07, 0xd0, 0x0f, 0x23, 0x93, 0x21, 0x22, 0x03, 0xc4, 0xac, 0xef, 0x4c, 0xdd, 0xc8, 0xf1, - 0xdd, 0x64, 0xcd, 0xef, 0x6a, 0x44, 0x78, 0x59, 0x09, 0x5e, 0x26, 0xe1, 0x65, 0x12, 0x5e, 0x18, - 0x4b, 0x01, 0x30, 0x8c, 0xad, 0x65, 0x97, 0xc3, 0xa4, 0x31, 0x04, 0x3d, 0x39, 0x02, 0x71, 0x56, - 0x48, 0x4e, 0x6c, 0x17, 0xc4, 0xb0, 0x88, 0xfc, 0xbf, 0x94, 0x90, 0x00, 0x59, 0x24, 0x0e, 0x50, - 0x48, 0xe4, 0x44, 0x6e, 0xaf, 0x8f, 0x97, 0x09, 0xac, 0x56, 0xbd, 0x03, 0xfc, 0x1d, 0x21, 0x79, - 0x43, 0xe7, 0x52, 0xdb, 0x95, 0xe1, 0xc5, 0x28, 0xb2, 0x57, 0x18, 0xb9, 0xc9, 0x61, 0x7b, 0xc4, - 0x83, 0x8a, 0xf0, 0x32, 0xbe, 0x28, 0xe3, 0x63, 0x99, 0x04, 0xca, 0xf8, 0x79, 0x19, 0xb4, 0x9a, - 0xd6, 0x72, 0xa5, 0xeb, 0x24, 0x75, 0x02, 0xa7, 0x56, 0xfb, 0xbd, 0x35, 0xb3, 0xec, 0xd3, 0x35, - 0x18, 0x6a, 0x7e, 0x6b, 0x61, 0xe7, 0x77, 0x87, 0x1c, 0x13, 0xec, 0x2d, 0xdf, 0x3b, 0x81, 0x41, - 0x84, 0xff, 0xd7, 0x3a, 0xa7, 0x52, 0x03, 0xf1, 0x5b, 0xc7, 0x1e, 0x64, 0x5f, 0xdb, 0x74, 0xbb, - 0xd8, 0x2b, 0xcf, 0x6f, 0xcd, 0x44, 0x30, 0x56, 0x15, 0x81, 0x84, 0x47, 0x92, 0x4b, 0x86, 0x7e, - 0x6b, 0xea, 0x89, 0xf8, 0x2c, 0x7a, 0x54, 0x50, 0xa8, 0xf7, 0xa4, 0xcd, 0x63, 0xc0, 0xf2, 0x32, - 0x30, 0x22, 0x09, 0xe2, 0x7f, 0x2d, 0xc2, 0x97, 0x58, 0x11, 0xe0, 0xac, 0x5e, 0xaf, 0xbd, 0x59, - 0xad, 0x9a, 0x18, 0x01, 0x32, 0x82, 0xe7, 0xaf, 0xb5, 0x28, 0x1f, 0xfc, 0xc6, 0x90, 0x68, 0xb5, - 0xaa, 0xc9, 0xd8, 0xf6, 0x9c, 0xe6, 0x96, 0x89, 0x9b, 0x3a, 0x63, 0x37, 0x10, 0x21, 0x4e, 0x30, - 0x8a, 0x57, 0x02, 0x30, 0x26, 0xab, 0x15, 0xf6, 0x4e, 0xb0, 0x29, 0xc6, 0x9b, 0x7f, 0x8a, 0x11, - 0x99, 0x80, 0x70, 0xf3, 0xfa, 0x88, 0x52, 0x9e, 0xd4, 0xeb, 0x4f, 0xac, 0xd4, 0x1e, 0x2d, 0xc7, - 0x6e, 0xba, 0x76, 0x2d, 0x8c, 0xb9, 0x2a, 0x6e, 0x8e, 0xa2, 0x40, 0x7f, 0x1b, 0x37, 0x25, 0x64, - 0xce, 0x52, 0xe5, 0x10, 0xb1, 0x5d, 0xe8, 0xbe, 0x62, 0xb2, 0x7b, 0xa1, 0x5d, 0xbb, 0x35, 0xb3, - 0xf3, 0x74, 0xbc, 0x82, 0x35, 0xcc, 0x78, 0x90, 0x25, 0x0c, 0x2e, 0x04, 0x38, 0x24, 0x6b, 0x96, - 0xc2, 0xc0, 0x50, 0xd0, 0x8c, 0x25, 0xdd, 0xb8, 0x20, 0x82, 0xe1, 0x94, 0xe3, 0xfd, 0x90, 0x85, - 0x9e, 0xb5, 0xc6, 0xab, 0x55, 0x72, 0x92, 0xb5, 0x16, 0x78, 0x55, 0x02, 0x7f, 0xf0, 0x3a, 0x22, - 0x96, 0x4e, 0xd6, 0x7a, 0xe5, 0x6c, 0x62, 0x3b, 0x6b, 0x4d, 0x09, 0xd5, 0x18, 0x69, 0x9d, 0x2a, - 0xa1, 0x2b, 0x26, 0x22, 0x64, 0xdb, 0x16, 0xde, 0x08, 0x32, 0x55, 0x37, 0x1b, 0xb1, 0x56, 0x44, - 0x01, 0x1d, 0x27, 0x4e, 0x6c, 0x3b, 0xd7, 0x2a, 0x68, 0x78, 0x19, 0x06, 0x5c, 0x2c, 0x40, 0x30, - 0x6a, 0xbc, 0x79, 0x75, 0xa1, 0x01, 0x07, 0xa6, 0xad, 0x5d, 0xbf, 0x13, 0xf1, 0xb0, 0x50, 0x53, - 0x1b, 0x63, 0x72, 0xca, 0x6b, 0x82, 0x4f, 0x22, 0x27, 0x05, 0x0b, 0xa5, 0xe5, 0x03, 0x7f, 0x67, - 0xad, 0x63, 0x71, 0x17, 0xc8, 0x55, 0xbd, 0x7e, 0xcd, 0x46, 0x22, 0x38, 0x3b, 0x46, 0x3a, 0xbb, - 0x66, 0xeb, 0x47, 0xc3, 0x33, 0xd7, 0x34, 0xd5, 0x41, 0xb4, 0x19, 0xc9, 0x92, 0x7c, 0xd3, 0x37, - 0x13, 0x21, 0x5a, 0x66, 0x27, 0xb3, 0x3c, 0x90, 0xdc, 0x21, 0xd3, 0x58, 0x76, 0xc6, 0xef, 0xfd, - 0x18, 0xfa, 0x0d, 0xef, 0x8c, 0x62, 0xa3, 0x13, 0x1f, 0xe0, 0xce, 0x49, 0x8a, 0x6c, 0xfc, 0x04, - 0x3a, 0x04, 0x83, 0xb4, 0x3e, 0x83, 0x26, 0xd8, 0x1a, 0x32, 0xe9, 0x39, 0x28, 0x4d, 0x75, 0x85, - 0xb8, 0x34, 0x45, 0x0e, 0x05, 0x59, 0x91, 0x02, 0xad, 0x4e, 0xd7, 0x18, 0x9d, 0x4e, 0x5d, 0x52, - 0x32, 0xb5, 0x45, 0x08, 0x3d, 0xe8, 0xed, 0x49, 0xdc, 0x68, 0x9c, 0x82, 0x50, 0x48, 0x5a, 0x63, - 0x27, 0xf4, 0x6a, 0xd1, 0x30, 0x04, 0xea, 0xb1, 0xf0, 0x1d, 0xef, 0x4f, 0xe0, 0x0f, 0xde, 0x8d, - 0x75, 0xc6, 0x28, 0x72, 0x4c, 0x3e, 0xc4, 0x8b, 0x87, 0xbf, 0x58, 0x97, 0xf6, 0xf2, 0xe1, 0x32, - 0x01, 0xfe, 0xe8, 0x70, 0xfe, 0x50, 0xe2, 0x01, 0xa3, 0xd9, 0xa9, 0xf0, 0xe0, 0xa9, 0xf7, 0xc8, - 0x7c, 0x84, 0xd7, 0xe9, 0xb4, 0x8e, 0x4f, 0x18, 0xde, 0x5e, 0xf3, 0xc8, 0x54, 0x6f, 0x82, 0xca, - 0xcf, 0xd8, 0xc3, 0x5f, 0x1e, 0x2e, 0xa3, 0xb5, 0x77, 0xf9, 0x70, 0x99, 0x8e, 0xcc, 0x13, 0xd3, - 0x35, 0x5b, 0xe6, 0x1a, 0xeb, 0x3e, 0xd6, 0x44, 0xc8, 0x9a, 0x3e, 0x9e, 0x9a, 0x78, 0xa1, 0xd3, - 0xd9, 0xda, 0x16, 0x77, 0x8b, 0x38, 0x78, 0xb9, 0x88, 0x02, 0x83, 0xa3, 0x76, 0x74, 0x86, 0xfd, - 0x2b, 0xc2, 0xc6, 0x63, 0x07, 0x9a, 0xd0, 0x92, 0xd9, 0xc8, 0xf4, 0xc2, 0x34, 0x6e, 0x6b, 0xd1, - 0xbf, 0x3b, 0x3b, 0x24, 0xc1, 0x04, 0x72, 0x37, 0x36, 0x80, 0x3b, 0x2b, 0x00, 0xf4, 0x31, 0xda, - 0xd9, 0xf9, 0xca, 0x48, 0xe3, 0x45, 0x32, 0x61, 0x1f, 0xbe, 0x7f, 0xe5, 0x61, 0xf6, 0x64, 0x3d, - 0x9a, 0xdc, 0x4e, 0x42, 0x76, 0x86, 0x44, 0x0d, 0x14, 0x81, 0x13, 0x16, 0x0e, 0xf6, 0xce, 0xe3, - 0x7c, 0xb8, 0x31, 0xb4, 0x67, 0x6a, 0xaf, 0x1f, 0xef, 0xd0, 0x80, 0x47, 0x38, 0xdc, 0xb5, 0x10, - 0xe3, 0x1a, 0xe2, 0x65, 0xa7, 0x98, 0x79, 0xa8, 0xdd, 0x08, 0x80, 0xd0, 0xc4, 0x6b, 0x79, 0x2f, - 0x00, 0x8c, 0x20, 0x10, 0x21, 0xff, 0xbc, 0x84, 0xe1, 0x41, 0x28, 0x17, 0x3c, 0xcb, 0x5a, 0x65, - 0x49, 0x21, 0x8b, 0x48, 0xb4, 0x44, 0x79, 0xfb, 0x0c, 0x2f, 0x51, 0x91, 0xe1, 0xf7, 0x81, 0x92, - 0x52, 0xf2, 0x26, 0x92, 0x2c, 0x9b, 0x8e, 0x80, 0xe8, 0x2e, 0xbd, 0xe5, 0x22, 0x09, 0x5d, 0xa0, - 0x3e, 0x47, 0x44, 0xce, 0x73, 0xc7, 0x6c, 0xed, 0x20, 0xb3, 0x5e, 0x02, 0x73, 0x2e, 0xa8, 0x33, - 0xbc, 0x2b, 0x79, 0x7c, 0xbf, 0xd6, 0x2f, 0xc9, 0x89, 0x20, 0x5a, 0x10, 0xd5, 0x80, 0x4e, 0xa4, - 0x5b, 0x98, 0x13, 0xac, 0x05, 0x48, 0xfa, 0x01, 0xe5, 0x36, 0x31, 0x1f, 0xe0, 0x6b, 0x26, 0x6e, - 0x95, 0x41, 0x7c, 0x4c, 0x30, 0x5a, 0x5c, 0xa6, 0x7a, 0xfb, 0x31, 0xd2, 0x3a, 0x24, 0x7b, 0x91, - 0x51, 0x2f, 0x30, 0x74, 0x12, 0x12, 0x21, 0x8c, 0x58, 0xaa, 0xcb, 0xaa, 0x56, 0x18, 0xd9, 0xc5, - 0xc1, 0xa3, 0xa9, 0x07, 0xa5, 0xb5, 0xc6, 0x56, 0x3c, 0xf0, 0x23, 0x60, 0xa4, 0x34, 0x6e, 0x72, - 0x56, 0xf9, 0xc5, 0x06, 0xf1, 0xf6, 0x31, 0x3a, 0xd3, 0x2e, 0x56, 0xc0, 0x0d, 0xb7, 0xda, 0x55, - 0x29, 0x49, 0x43, 0x86, 0x36, 0x86, 0x89, 0x34, 0xd0, 0xee, 0x83, 0x8a, 0x4c, 0x8c, 0xe5, 0x18, - 0x7b, 0x24, 0xf6, 0xd3, 0x11, 0x4c, 0xd9, 0x32, 0x04, 0xf2, 0x02, 0x06, 0x14, 0x3b, 0x2e, 0xaf, - 0xc0, 0x0a, 0x54, 0x08, 0xe0, 0x18, 0xa5, 0x5c, 0xc2, 0xef, 0x70, 0x03, 0x1c, 0xc4, 0x74, 0xfb, - 0xc6, 0x18, 0xaa, 0xd5, 0x03, 0x6f, 0xbe, 0x00, 0x24, 0xcf, 0x4b, 0x69, 0xc7, 0xb8, 0x63, 0xe2, - 0x70, 0x02, 0xe8, 0x1a, 0xd3, 0x7d, 0x3d, 0x73, 0x7a, 0x9e, 0xd3, 0x33, 0x01, 0x30, 0x86, 0x57, - 0x62, 0xfa, 0xf9, 0x6a, 0x35, 0x3f, 0x1a, 0xc3, 0xbc, 0x34, 0x85, 0x8a, 0x9c, 0xb1, 0xf8, 0x3c, - 0x87, 0xcf, 0x53, 0xa8, 0xc5, 0x99, 0x8b, 0x79, 0x0a, 0xf2, 0x8f, 0x8f, 0xe6, 0x2a, 0x97, 0x0d, - 0x40, 0x4b, 0xf8, 0xc5, 0xcc, 0x33, 0xe6, 0x63, 0xf3, 0x82, 0x35, 0x10, 0x64, 0x18, 0xac, 0xb1, - 0x07, 0xe2, 0xf7, 0x06, 0x03, 0x97, 0x83, 0x84, 0x14, 0x74, 0x24, 0xe4, 0xb2, 0x0c, 0x77, 0x86, - 0x31, 0x1b, 0x03, 0xf8, 0x37, 0x01, 0xa1, 0x4d, 0x87, 0xcb, 0x4b, 0x17, 0xcb, 0x40, 0x83, 0x37, - 0x4c, 0x46, 0xaa, 0xff, 0xc4, 0x6e, 0x53, 0x2b, 0x56, 0xa1, 0x2e, 0x31, 0x60, 0x36, 0x4c, 0x38, - 0x32, 0x4c, 0x1a, 0xea, 0x3c, 0xe7, 0x8c, 0xd7, 0x07, 0xd5, 0xd5, 0xeb, 0x18, 0x75, 0x73, 0x0c, - 0xd3, 0xfb, 0x39, 0x85, 0x6c, 0x13, 0xfa, 0xdc, 0xcc, 0x93, 0x85, 0x61, 0x02, 0x9d, 0xe0, 0x04, - 0x52, 0x8b, 0x46, 0x93, 0xd6, 0xd8, 0x9d, 0xb4, 0x16, 0xaa, 0x2a, 0x78, 0x5e, 0x2b, 0x07, 0xd9, - 0x84, 0x13, 0x9d, 0x28, 0x05, 0x6f, 0x30, 0x05, 0x22, 0x7d, 0xcd, 0x00, 0xe9, 0x95, 0xd0, 0xcd, - 0xb4, 0x95, 0x2e, 0x7e, 0xcb, 0xae, 0x08, 0x49, 0x5b, 0x0e, 0x7d, 0x8d, 0xc1, 0x5e, 0xf9, 0x65, - 0x77, 0x74, 0xc1, 0xec, 0xcb, 0x69, 0xc8, 0x9e, 0xc1, 0x5c, 0x37, 0xf6, 0x27, 0x9f, 0x46, 0xdb, - 0x3e, 0xb8, 0xfa, 0x87, 0x27, 0x51, 0x70, 0x49, 0x91, 0x0f, 0xbf, 0xc6, 0xeb, 0x14, 0x86, 0x51, - 0x7e, 0xaf, 0xba, 0x91, 0x5a, 0xf9, 0x75, 0x45, 0x9d, 0x76, 0xfb, 0x31, 0xad, 0x07, 0x07, 0x47, - 0x4a, 0xd3, 0x28, 0x87, 0x47, 0x14, 0x14, 0x17, 0x38, 0x41, 0x03, 0xf7, 0xc5, 0xe5, 0xb3, 0x0f, - 0x8f, 0x29, 0x07, 0x78, 0xc5, 0x2b, 0x07, 0xf8, 0x9d, 0x95, 0xf9, 0x95, 0x03, 0xac, 0x35, 0xb6, - 0xd7, 0x59, 0xa3, 0xe1, 0x44, 0xa0, 0x70, 0xac, 0xf5, 0x4b, 0x85, 0x9e, 0x68, 0xa1, 0x69, 0xcf, - 0x30, 0xe4, 0xa7, 0x0a, 0x65, 0xbe, 0xf3, 0x68, 0xe7, 0xdc, 0x31, 0x3f, 0x7e, 0x7c, 0x04, 0x6c, - 0xf5, 0xe8, 0x4c, 0x5e, 0x0d, 0xc8, 0x3c, 0xb3, 0x2c, 0x1a, 0x4d, 0xe7, 0xb8, 0x94, 0x2a, 0xae, - 0xaa, 0xe1, 0x1f, 0xdf, 0x32, 0x6f, 0xe7, 0x2f, 0x16, 0x06, 0x43, 0x5f, 0x41, 0x32, 0x40, 0x4f, - 0x98, 0xb0, 0x3f, 0xee, 0x58, 0x37, 0x4d, 0x7b, 0x94, 0x5f, 0x97, 0x60, 0x0d, 0x57, 0x0f, 0xed, - 0x1d, 0xe7, 0x15, 0x65, 0x2f, 0xe6, 0xbc, 0xf6, 0xd3, 0x4b, 0xf1, 0xf9, 0xd9, 0xb6, 0xda, 0x30, - 0x46, 0x9b, 0xc8, 0xf3, 0xeb, 0xb6, 0x3c, 0x13, 0xd0, 0xef, 0x79, 0x96, 0x0f, 0x90, 0x05, 0x64, - 0xe2, 0x47, 0xeb, 0x63, 0xfa, 0xd8, 0x1a, 0xb9, 0xd6, 0x89, 0xf9, 0xe8, 0xd4, 0xb6, 0xe0, 0xe9, - 0xe3, 0xc7, 0xd6, 0xea, 0xe4, 0x2f, 0x1f, 0xa3, 0x8f, 0x1f, 0x31, 0xa5, 0x61, 0x7f, 0xec, 0xac, - 0xb4, 0xe4, 0xd4, 0x31, 0x1f, 0x59, 0xf6, 0xc7, 0x8f, 0xf8, 0xc5, 0x86, 0xa2, 0x1f, 0xed, 0x9d, - 0x73, 0x52, 0x29, 0x5e, 0x33, 0xb4, 0x3f, 0x7e, 0x41, 0x1f, 0x43, 0x49, 0x95, 0x7a, 0xc9, 0xe4, - 0x7a, 0x07, 0x0c, 0xec, 0x25, 0x90, 0xbd, 0xa6, 0xe7, 0x15, 0x43, 0xdb, 0xbd, 0x89, 0x0d, 0xf5, - 0x05, 0xaf, 0xd7, 0xc6, 0x28, 0xbf, 0x6b, 0x8c, 0xbf, 0x0a, 0x4a, 0x03, 0x5e, 0x2d, 0x24, 0x05, - 0x97, 0x16, 0xcd, 0x1b, 0xaa, 0x6c, 0x34, 0x7e, 0x61, 0x47, 0x48, 0x0a, 0xda, 0xf5, 0x7c, 0xda, - 0x15, 0x1f, 0xaf, 0x19, 0x17, 0xce, 0x8c, 0xc7, 0xce, 0x8e, 0x64, 0xf4, 0xc3, 0x88, 0xe4, 0x2f, - 0x5f, 0xbd, 0x10, 0xea, 0x2b, 0x97, 0xa9, 0x5c, 0x7c, 0xaa, 0x40, 0xb1, 0x18, 0x45, 0x9f, 0xee, - 0x39, 0xf0, 0xb4, 0x60, 0xb1, 0x74, 0xc3, 0xac, 0x0e, 0x9e, 0xd1, 0x04, 0x43, 0x90, 0x41, 0xdb, - 0xd9, 0x75, 0x9c, 0x7c, 0x32, 0xc2, 0xf8, 0x9c, 0x3a, 0x30, 0x65, 0x99, 0x1f, 0x84, 0x69, 0x0b, - 0xe4, 0x70, 0x43, 0x55, 0xe4, 0x64, 0x6b, 0x1e, 0x64, 0xee, 0x76, 0xf9, 0x0b, 0x6b, 0x36, 0x9d, - 0xd7, 0xf9, 0xbd, 0x76, 0xf0, 0x98, 0x5e, 0x04, 0xb3, 0xcc, 0x02, 0x6d, 0x7f, 0x4d, 0x81, 0x05, - 0x5b, 0xf1, 0xa7, 0x72, 0xfc, 0xbf, 0x14, 0x2f, 0xbf, 0xcc, 0x16, 0xe9, 0xda, 0xc8, 0x9f, 0xf1, - 0x3e, 0x0b, 0xfe, 0x0e, 0x83, 0x2a, 0x81, 0x3a, 0x53, 0xa2, 0x21, 0x2d, 0xc7, 0x36, 0xfe, 0x9e, - 0x95, 0xef, 0x30, 0xe3, 0x38, 0x50, 0x83, 0x85, 0xc1, 0xea, 0xe8, 0xc2, 0x02, 0x96, 0xa4, 0x18, - 0x60, 0xd6, 0x32, 0xc5, 0x55, 0x04, 0x4d, 0xb4, 0x7b, 0xf9, 0xc5, 0x83, 0x6f, 0xc5, 0xbd, 0x99, - 0xa9, 0xbc, 0x27, 0x11, 0x0c, 0x82, 0x08, 0x01, 0x00, 0x73, 0x4f, 0x20, 0xb9, 0x45, 0x57, 0x40, - 0x83, 0x5c, 0x75, 0xcd, 0x5f, 0x53, 0x93, 0xf4, 0xed, 0x57, 0x79, 0x29, 0x15, 0x1e, 0x9b, 0xc2, - 0xc4, 0x82, 0x36, 0x25, 0xa0, 0xf8, 0x91, 0x8d, 0x9f, 0xa4, 0x29, 0xbb, 0x1c, 0x87, 0xb7, 0x2d, - 0x0c, 0xb3, 0x19, 0x84, 0xec, 0x38, 0x4b, 0x98, 0x7f, 0x09, 0x3c, 0x85, 0xe1, 0xf5, 0x55, 0x88, - 0x7c, 0xbe, 0x02, 0x6f, 0x9a, 0xc3, 0x52, 0x6c, 0x54, 0xbd, 0x02, 0x7e, 0x4d, 0x81, 0xbc, 0x52, - 0x0b, 0x06, 0xd6, 0x4e, 0xd4, 0x3c, 0x6f, 0x3c, 0x46, 0x1d, 0x03, 0x9e, 0x33, 0xbc, 0x53, 0x8a, - 0x5f, 0x6b, 0x45, 0x32, 0x80, 0x47, 0x46, 0x84, 0x49, 0x1a, 0x46, 0x0e, 0x24, 0x8d, 0x77, 0x56, - 0x48, 0x75, 0x45, 0x89, 0x46, 0x63, 0xed, 0x9c, 0x0d, 0x11, 0x08, 0xac, 0x52, 0x48, 0x31, 0x71, - 0xc5, 0x90, 0xe1, 0x19, 0x9b, 0x9d, 0x11, 0x91, 0x08, 0x03, 0x3f, 0x03, 0x09, 0xa6, 0x69, 0x1a, - 0xd7, 0x27, 0x3c, 0xd8, 0xf0, 0xa9, 0x83, 0xfa, 0x5b, 0x80, 0xc1, 0x3f, 0xa1, 0xe1, 0xcf, 0xe8, - 0x15, 0x57, 0xfa, 0x54, 0xaf, 0x44, 0xe6, 0x1b, 0xd1, 0x1f, 0x4f, 0x41, 0x43, 0xf5, 0xd3, 0x9d, - 0x3b, 0xd0, 0x08, 0x75, 0x0a, 0xb3, 0x4b, 0x95, 0x51, 0x96, 0x80, 0xfe, 0x20, 0x3e, 0x4c, 0x95, - 0xd7, 0x34, 0x48, 0x87, 0x18, 0x6e, 0x0c, 0x6f, 0x82, 0x23, 0x8a, 0x52, 0xc9, 0xa4, 0xc5, 0xde, - 0x67, 0x77, 0x50, 0x82, 0x29, 0x5a, 0x11, 0xde, 0x75, 0xc3, 0x6c, 0x54, 0xd1, 0x46, 0x1c, 0x71, - 0xea, 0xf8, 0xf5, 0x8e, 0x9a, 0xce, 0x38, 0xb7, 0x22, 0x83, 0x3f, 0x3b, 0x3e, 0xa6, 0x1b, 0xba, - 0x8f, 0x2f, 0x18, 0xd0, 0xa6, 0x3d, 0x4c, 0xa5, 0xd4, 0x3e, 0x46, 0x03, 0xf7, 0xe1, 0xb2, 0x14, - 0xf6, 0xd8, 0x2a, 0x36, 0x69, 0x2b, 0x19, 0xff, 0x81, 0x39, 0x68, 0x65, 0xd1, 0x75, 0x0b, 0x74, - 0xf9, 0xd5, 0x19, 0x34, 0x65, 0xa1, 0x56, 0xf5, 0x70, 0xf9, 0xc1, 0x82, 0x49, 0x37, 0x45, 0xeb, - 0x05, 0xdf, 0xed, 0x33, 0x0c, 0xcc, 0x3a, 0x2c, 0x75, 0x26, 0x1d, 0x9e, 0x21, 0xfc, 0x74, 0x29, - 0xd1, 0xb0, 0x14, 0x59, 0x3a, 0x8f, 0x9c, 0xfc, 0x4c, 0xb0, 0x0e, 0x5e, 0xcf, 0x2c, 0xaf, 0x2f, - 0xcb, 0xef, 0x95, 0xca, 0x65, 0x9c, 0xb8, 0xc6, 0x19, 0x14, 0xe3, 0x05, 0x0c, 0xe3, 0x18, 0x6f, - 0x67, 0x4a, 0xae, 0xa0, 0xfc, 0x75, 0x90, 0x5d, 0x18, 0xbe, 0x71, 0xe5, 0x87, 0xa0, 0x99, 0xbc, - 0x7e, 0xf9, 0xfa, 0x05, 0x05, 0xfa, 0x34, 0xc2, 0xe0, 0x13, 0x33, 0x34, 0x01, 0xaf, 0x5d, 0xbd, - 0x03, 0xe2, 0x52, 0x5b, 0x83, 0x41, 0x41, 0x58, 0xe3, 0x2b, 0x50, 0xb5, 0x8d, 0x38, 0xc2, 0xdb, - 0xef, 0x6b, 0x0d, 0x46, 0xe6, 0x9d, 0x97, 0xc2, 0xba, 0x5b, 0x3e, 0xe3, 0xed, 0xad, 0x14, 0xd1, - 0x77, 0xf8, 0x25, 0x4d, 0xdd, 0x71, 0x37, 0x2d, 0xb4, 0xb4, 0xf5, 0x9a, 0xd8, 0xaf, 0xa9, 0xa1, - 0x2f, 0xef, 0xd9, 0xb6, 0x3b, 0x72, 0x4b, 0x6d, 0x89, 0x6b, 0x6a, 0xa1, 0xa1, 0x3f, 0x52, 0x8c, - 0xe2, 0x7c, 0xf1, 0xa9, 0x10, 0xdf, 0x1f, 0x74, 0x6d, 0xe9, 0xd1, 0x2d, 0x7a, 0x31, 0xf2, 0x37, - 0x4f, 0xfb, 0x82, 0xc1, 0x96, 0x41, 0x51, 0x06, 0x2d, 0x8e, 0x25, 0xef, 0x62, 0x18, 0x3f, 0x9e, - 0xb7, 0x98, 0xe4, 0x95, 0xf3, 0xd8, 0x0e, 0x06, 0x19, 0x6d, 0x6a, 0x01, 0xd2, 0x79, 0xe0, 0xe5, - 0x49, 0x12, 0xa7, 0xe9, 0x5b, 0x0a, 0x92, 0x3e, 0xa2, 0x6b, 0x91, 0xe4, 0x67, 0xcf, 0x14, 0x97, - 0x47, 0x43, 0xa7, 0xfc, 0x28, 0x8e, 0x6e, 0x2f, 0xe3, 0xc5, 0xfd, 0x65, 0x60, 0xea, 0xcc, 0x4c, - 0xb7, 0x94, 0xa8, 0x07, 0x62, 0x87, 0x09, 0x8c, 0xee, 0xd6, 0x63, 0x1b, 0x37, 0x6f, 0xd9, 0xce, - 0x6f, 0xb8, 0x42, 0x95, 0xaf, 0x41, 0xa1, 0x87, 0xb7, 0x5d, 0xf3, 0x9a, 0xcd, 0xdf, 0xd8, 0x6a, - 0x75, 0x01, 0x3a, 0x2c, 0xc5, 0x14, 0x5e, 0xad, 0xd4, 0xd0, 0xe0, 0x7d, 0x5a, 0x38, 0xe1, 0x52, - 0x5c, 0x64, 0x0a, 0x92, 0xcd, 0x9f, 0xcc, 0xe7, 0x6f, 0x5f, 0x0b, 0xb6, 0xc1, 0xcb, 0xc6, 0xd9, - 0x14, 0xef, 0x4c, 0xcf, 0x40, 0xab, 0xdf, 0x1e, 0xc5, 0x79, 0xa3, 0x84, 0x93, 0xbb, 0xc8, 0x54, - 0x18, 0xe4, 0x6f, 0xe9, 0xa2, 0x33, 0x7e, 0x93, 0x59, 0x01, 0xd4, 0xef, 0x14, 0xa8, 0xcf, 0xbf, - 0x14, 0xd4, 0x8d, 0x20, 0xce, 0xca, 0xdb, 0xfb, 0x23, 0xf3, 0xb8, 0xa3, 0x07, 0xc4, 0xce, 0x71, - 0x30, 0x06, 0x76, 0x39, 0xc7, 0x2b, 0xe1, 0xf9, 0x25, 0x4a, 0x18, 0xb9, 0xbb, 0x5e, 0xff, 0x11, - 0xe8, 0x48, 0x4b, 0xb0, 0x9d, 0xa7, 0x3c, 0x9a, 0xbc, 0x8d, 0xe5, 0xf0, 0xf2, 0x62, 0xba, 0xbe, - 0xb0, 0xc6, 0xf0, 0x56, 0x20, 0x50, 0x9e, 0x58, 0x7e, 0x31, 0x11, 0x7c, 0xc2, 0xc2, 0x78, 0x09, - 0x2e, 0xfa, 0xb4, 0xe8, 0x52, 0xdf, 0xf2, 0x65, 0xf3, 0x14, 0x70, 0x1b, 0x32, 0xd4, 0x2c, 0xc6, - 0xef, 0xa2, 0xd3, 0xcc, 0xc1, 0xaf, 0x79, 0x9c, 0xf9, 0xe7, 0x0c, 0xf7, 0x5a, 0x52, 0xac, 0x74, - 0x6e, 0x55, 0xf2, 0x23, 0xbb, 0xd8, 0x9e, 0x2d, 0xc2, 0xc2, 0x0b, 0x55, 0x1c, 0xef, 0x5b, 0x5e, - 0x5f, 0x61, 0x64, 0xeb, 0x5b, 0xe6, 0xdd, 0xb2, 0xb2, 0x1b, 0x92, 0xc7, 0x82, 0xc7, 0x72, 0x23, - 0x1e, 0xf2, 0x38, 0x57, 0x29, 0x30, 0xd1, 0x21, 0x8e, 0x01, 0xd9, 0x4b, 0x8a, 0xaa, 0xed, 0x6a, - 0x41, 0xea, 0xb5, 0x4e, 0xd1, 0x95, 0x98, 0xc9, 0x64, 0xb5, 0xe2, 0x21, 0xe5, 0xed, 0x96, 0x50, - 0xc7, 0x4a, 0xb7, 0xde, 0x67, 0x30, 0x6d, 0xe8, 0xb7, 0xf9, 0x81, 0xd8, 0xcf, 0xfc, 0x1b, 0x12, - 0xbd, 0xe4, 0x3b, 0xd4, 0xae, 0xf1, 0xcb, 0xb5, 0x36, 0x6a, 0x4c, 0x5c, 0xaf, 0x4d, 0xd7, 0x5a, - 0xa2, 0x25, 0x2e, 0x94, 0xb2, 0x35, 0xd4, 0xe6, 0xa2, 0x30, 0xe6, 0xad, 0x6b, 0x10, 0xad, 0xf1, - 0x72, 0xbf, 0x63, 0xba, 0x00, 0x4f, 0xbf, 0xc6, 0x40, 0xbb, 0xea, 0xe3, 0x8f, 0x25, 0x44, 0x4a, - 0x3c, 0xea, 0xbe, 0x52, 0xd0, 0x57, 0xc4, 0x95, 0xa4, 0xe5, 0x41, 0x22, 0x04, 0x62, 0x10, 0x74, - 0x2c, 0x0f, 0x96, 0xd6, 0x6f, 0xf0, 0x33, 0x4c, 0xf0, 0x15, 0xcd, 0x95, 0x7a, 0xfd, 0x37, 0xbc, - 0xf7, 0x56, 0x3a, 0xa2, 0x1e, 0x0a, 0x64, 0x22, 0x7e, 0x08, 0x9f, 0x8e, 0xa4, 0x0c, 0x0d, 0x62, - 0xa7, 0x16, 0xa0, 0xbd, 0xfa, 0x86, 0x15, 0xee, 0xc1, 0xc3, 0x2c, 0x5b, 0x49, 0x98, 0x07, 0x62, - 0xcf, 0xf1, 0x7d, 0x6c, 0x23, 0x08, 0x16, 0xb0, 0x78, 0xca, 0xeb, 0xf8, 0x0e, 0x2f, 0x0e, 0x00, - 0x68, 0xc4, 0xeb, 0xb7, 0x4c, 0x92, 0xf8, 0xef, 0x0c, 0x85, 0x5f, 0xbe, 0x92, 0xc7, 0x97, 0x6d, - 0xc4, 0xb5, 0xdb, 0xe2, 0xfe, 0xc3, 0xdf, 0xf1, 0xfa, 0x76, 0xf4, 0x0c, 0xa0, 0x17, 0x35, 0x7f, - 0xf1, 0x50, 0x0b, 0xe5, 0x1e, 0x03, 0x41, 0x1b, 0x80, 0x55, 0xcb, 0x7e, 0x70, 0x28, 0x43, 0x51, - 0x97, 0xe2, 0x5a, 0xe7, 0x21, 0xe8, 0x8f, 0x8c, 0xe5, 0x03, 0x83, 0xfe, 0x97, 0x5f, 0xe0, 0xa6, - 0x92, 0x20, 0x11, 0x66, 0x62, 0x86, 0x71, 0xae, 0xcd, 0x8b, 0x2c, 0x9b, 0xa7, 0xee, 0xce, 0xce, - 0x22, 0x9a, 0x7f, 0x3a, 0x47, 0x5d, 0x72, 0x87, 0x3e, 0xfd, 0x4b, 0xbb, 0xd5, 0xd9, 0x1d, 0xb4, - 0x3a, 0x3b, 0xe3, 0x45, 0x10, 0x4e, 0x79, 0x9a, 0xd0, 0xee, 0x80, 0x3c, 0x4d, 0xa7, 0x54, 0xd3, - 0x0e, 0x08, 0x1b, 0xe8, 0xec, 0xce, 0xe7, 0xd4, 0xc8, 0x6e, 0x7c, 0x8c, 0x0b, 0x9f, 0x82, 0x3d, - 0x76, 0xb9, 0x63, 0x8a, 0x8a, 0xd6, 0xf4, 0xbb, 0x36, 0xb4, 0x9e, 0xed, 0xa0, 0x72, 0x0d, 0xbf, - 0xe3, 0x78, 0x7a, 0x6b, 0x88, 0xbb, 0xc2, 0xcc, 0x38, 0x42, 0xd1, 0x65, 0xd9, 0xd0, 0xc1, 0xc3, - 0x69, 0x70, 0x65, 0xd0, 0x8d, 0x04, 0x9e, 0x0c, 0xd6, 0x0f, 0x89, 0x17, 0xe7, 0x49, 0xbc, 0x98, - 0x1f, 0x19, 0x0f, 0x0e, 0x2f, 0x3a, 0x06, 0xdd, 0x48, 0xe8, 0x99, 0x33, 0x28, 0x9b, 0xb9, 0x21, - 0x9b, 0x65, 0xe6, 0xd1, 0x71, 0xe6, 0x27, 0xa0, 0x44, 0xfc, 0xed, 0xaf, 0xff, 0xf5, 0x7f, 0x1a, - 0xaf, 0x5e, 0x3c, 0x4f, 0x8d, 0xbf, 0xfd, 0xf5, 0xbf, 0xfc, 0x0f, 0x63, 0x7c, 0x0b, 0x9a, 0x85, - 0xba, 0xb0, 0x0b, 0xd2, 0xfe, 0xd3, 0xbf, 0x42, 0xfb, 0x1d, 0xa8, 0xcf, 0x37, 0x1e, 0x20, 0xfe, - 0x3d, 0xd5, 0x2d, 0x76, 0x1d, 0x5f, 0x07, 0xad, 0x73, 0x50, 0x38, 0x16, 0xe3, 0x56, 0x10, 0xef, - 0x60, 0x85, 0xcf, 0xe3, 0x49, 0x6a, 0x16, 0x5b, 0x83, 0x89, 0xe0, 0x02, 0x9a, 0xfb, 0xf7, 0xff, - 0xf6, 0x6f, 0x87, 0x3b, 0x3e, 0xf5, 0x46, 0x00, 0x76, 0x38, 0x4e, 0x8e, 0x1e, 0x00, 0x9c, 0xdd, - 0x23, 0xea, 0x40, 0x00, 0x9d, 0xe2, 0x77, 0x1d, 0xe0, 0xd5, 0x00, 0xe6, 0xd1, 0xe1, 0x0e, 0xa4, - 0xc2, 0x5f, 0xf8, 0x6e, 0x1c, 0x06, 0xd1, 0x7c, 0x21, 0xc7, 0x16, 0x78, 0x21, 0x03, 0x1d, 0x10, - 0x75, 0x9c, 0x05, 0xbc, 0x3e, 0x99, 0xcf, 0x4d, 0xe3, 0x01, 0x96, 0xbe, 0xa2, 0xc7, 0x18, 0xe6, - 0xb1, 0x60, 0xf2, 0x09, 0x2b, 0xcb, 0x7e, 0x08, 0xd8, 0xb5, 0x85, 0xb7, 0x63, 0x10, 0x9a, 0xee, - 0xa8, 0xe4, 0xb9, 0x9f, 0x5e, 0x3c, 0x8d, 0xfd, 0x64, 0x2a, 0xab, 0xc2, 0x84, 0xbf, 0xb3, 0xae, - 0x0f, 0xd0, 0x0b, 0x59, 0x0d, 0x7f, 0xfe, 0xbb, 0xaa, 0x39, 0x86, 0x79, 0x82, 0x5d, 0xca, 0x8a, - 0xe0, 0xed, 0xef, 0xac, 0x07, 0x94, 0x18, 0xd3, 0xe0, 0xe8, 0xc1, 0xa7, 0x07, 0x7f, 0x1f, 0x30, - 0x20, 0x9f, 0xe6, 0xa2, 0x1a, 0xf1, 0x7c, 0x47, 0x45, 0x20, 0x39, 0xa2, 0x23, 0x63, 0x85, 0x34, - 0x4c, 0x4f, 0x77, 0xd6, 0xec, 0x5f, 0x31, 0xd1, 0xc9, 0x31, 0x7f, 0xce, 0xeb, 0x85, 0x57, 0x20, - 0x44, 0x16, 0xde, 0x51, 0x73, 0xe8, 0x8f, 0x59, 0x78, 0xf4, 0xfe, 0x82, 0x5d, 0xb2, 0xc3, 0x1d, - 0xfe, 0x02, 0x14, 0x9f, 0x92, 0x02, 0x67, 0xa0, 0x61, 0xe2, 0x01, 0x5f, 0xc2, 0xc7, 0x26, 0x4f, - 0xe2, 0x5d, 0x28, 0xa6, 0x40, 0x7b, 0x34, 0x17, 0x53, 0x47, 0xa8, 0xa6, 0xbc, 0x3d, 0x1e, 0x1a, - 0xff, 0x81, 0x04, 0x16, 0x26, 0x91, 0x04, 0x38, 0x4c, 0x31, 0xcf, 0xe1, 0x0e, 0xcf, 0xa0, 0x72, - 0xca, 0x8c, 0xd7, 0x21, 0x28, 0x15, 0x47, 0x3f, 0x02, 0x5f, 0x6d, 0x66, 0x79, 0x20, 0xf2, 0x9c, - 0x27, 0xfe, 0x2d, 0x63, 0x91, 0x79, 0xf4, 0x0d, 0x7f, 0xd8, 0x5a, 0xd9, 0x94, 0x5d, 0x99, 0x47, - 0xcf, 0xd9, 0xd5, 0xf6, 0xaa, 0x42, 0xce, 0x63, 0xaf, 0xf0, 0x67, 0x7b, 0x35, 0x7e, 0xf2, 0x09, - 0xea, 0x81, 0xbf, 0xdb, 0x2b, 0x1a, 0xc3, 0x5f, 0xf3, 0xe8, 0x29, 0xfc, 0xdd, 0x5a, 0xcd, 0x1c, - 0x14, 0x79, 0xf3, 0xe8, 0x1d, 0xfc, 0xdd, 0x5e, 0x0d, 0x0c, 0xce, 0x04, 0xea, 0x39, 0xc6, 0x9f, - 0xad, 0x15, 0x45, 0xb7, 0x3e, 0x74, 0xfe, 0x0d, 0xfc, 0xd5, 0xb2, 0xec, 0xf0, 0x51, 0xc1, 0x27, - 0x64, 0xff, 0x07, 0x86, 0x92, 0x0d, 0x97, 0xd3, 0x10, 0x75, 0x36, 0x3f, 0x80, 0xa9, 0x4b, 0x0a, - 0x3d, 0x95, 0x1e, 0x2e, 0x2e, 0xa3, 0xb6, 0xa9, 0x84, 0xa0, 0x4c, 0x32, 0x65, 0x3d, 0x3c, 0xfb, - 0x83, 0x42, 0xfe, 0xce, 0xbd, 0xf9, 0x0b, 0xd9, 0xbb, 0x40, 0xa5, 0x5f, 0x92, 0xbf, 0x77, 0x67, - 0xf5, 0xfc, 0xe7, 0x81, 0x2a, 0x06, 0x33, 0x64, 0x14, 0x44, 0x40, 0x33, 0xf5, 0xaf, 0x0e, 0xf6, - 0x0e, 0xda, 0xc3, 0x8d, 0x6a, 0xe3, 0xa9, 0x1f, 0x22, 0x97, 0x99, 0x9a, 0xa4, 0xf7, 0x43, 0x29, - 0x26, 0x8d, 0xc3, 0xb9, 0xf1, 0x40, 0x88, 0xdd, 0x49, 0x1c, 0xc6, 0x89, 0x7b, 0x9e, 0xb0, 0x5b, - 0x68, 0xef, 0xff, 0xf9, 0x3f, 0x8d, 0x6e, 0xbb, 0xdb, 0x2f, 0x08, 0xf5, 0x7f, 0xff, 0xb7, 0xff, - 0xdb, 0x68, 0x1a, 0xaf, 0x82, 0x09, 0x8b, 0x52, 0x30, 0x19, 0x71, 0xa7, 0x42, 0x62, 0x7c, 0xf3, - 0xee, 0x55, 0xf3, 0xaa, 0x77, 0xb8, 0x33, 0xd7, 0x71, 0x35, 0xf1, 0x23, 0x30, 0x13, 0x5f, 0xb3, - 0x68, 0xa1, 0x84, 0xfa, 0x3c, 0x4e, 0x03, 0x1c, 0x2b, 0xd7, 0x1f, 0x83, 0x8a, 0x05, 0x6a, 0xc9, - 0x50, 0xdc, 0x73, 0xeb, 0xd2, 0x35, 0xb7, 0x08, 0xc9, 0xd1, 0x21, 0xe7, 0x71, 0xbd, 0x8e, 0xa7, - 0x94, 0xd2, 0x41, 0x78, 0xf9, 0xc7, 0x23, 0xde, 0x54, 0x9e, 0xb9, 0x9c, 0xb7, 0x5b, 0x91, 0xf7, - 0xc1, 0xb6, 0xcc, 0xbd, 0x8d, 0xcc, 0x28, 0x1f, 0xb4, 0x6c, 0xcf, 0xfd, 0xcc, 0x37, 0x8d, 0x8b, - 0x60, 0x0a, 0x76, 0x8a, 0x47, 0xf7, 0xb2, 0x9a, 0x47, 0x0f, 0x94, 0x14, 0x91, 0x83, 0x82, 0x33, - 0x2c, 0x4d, 0x51, 0xd9, 0x65, 0x78, 0xf4, 0xff, 0x02, 0x9e, 0x45, 0xb1, 0xe9, 0x77, 0x05, 0x01, - 0x00 + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xcd, 0xbd, 0xdb, 0x7a, 0xe3, 0x46, + 0xd2, 0x20, 0x78, 0x5f, 0x4f, 0x01, 0xc1, 0xd5, 0x2c, 0xc0, 0x84, 0x28, 0x9e, 0x44, 0x49, 0xa0, + 0x20, 0xfe, 0x75, 0xb2, 0x5d, 0xee, 0x3a, 0xb5, 0x55, 0x65, 0x77, 0x5b, 0xa5, 0xb6, 0x40, 0x32, + 0x29, 0xc1, 0x05, 0x01, 0x34, 0x00, 0xea, 0x60, 0x12, 0x6f, 0x30, 0x73, 0x33, 0xf3, 0x5f, 0xfc, + 0x77, 0xfd, 0xcd, 0xde, 0xed, 0x37, 0xb7, 0x7b, 0xbd, 0x17, 0xfb, 0x28, 0xff, 0x13, 0xf4, 0x23, + 0x6c, 0x44, 0xe4, 0x01, 0x09, 0x10, 0x94, 0x54, 0xdd, 0x3d, 0xbb, 0xe3, 0xee, 0x12, 0x81, 0x44, + 0x1e, 0x22, 0x23, 0x23, 0x22, 0x23, 0x22, 0x33, 0x23, 0x8d, 0xc3, 0xad, 0x17, 0xef, 0x9e, 0x7f, + 0xf8, 0xcb, 0xfb, 0x97, 0xc6, 0x45, 0x76, 0x19, 0x1e, 0x19, 0x87, 0xf2, 0x87, 0xf9, 0x53, 0xf8, + 0xb9, 0x64, 0x99, 0x6f, 0x4c, 0x2e, 0xfc, 0x24, 0x65, 0x99, 0x67, 0x2e, 0xb2, 0xd9, 0xf6, 0xbe, + 0x09, 0xc9, 0x59, 0x90, 0x85, 0xec, 0xe8, 0xd1, 0x71, 0xe6, 0x27, 0x6f, 0xe2, 0xe9, 0xdf, 0xff, + 0xf6, 0xdf, 0xfe, 0xa7, 0x31, 0xbe, 0x35, 0xde, 0xc4, 0x71, 0x04, 0xaf, 0x8b, 0x90, 0xa5, 0xc6, + 0xdf, 0xff, 0xf6, 0x5f, 0xfe, 0xfd, 0x70, 0x87, 0xe7, 0x33, 0x0e, 0xd3, 0xec, 0x16, 0xf3, 0xbb, + 0x49, 0x1c, 0x67, 0x0e, 0xfd, 0x6d, 0xa5, 0x50, 0xf6, 0x32, 0x9e, 0x2e, 0xb7, 0xb7, 0xc7, 0xe7, + 0xdb, 0x93, 0x38, 0x8c, 0x13, 0x37, 0x0c, 0x22, 0xe6, 0x27, 0xdb, 0xe7, 0x89, 0x3f, 0x0d, 0x58, + 0x94, 0x59, 0x59, 0x6c, 0x8c, 0xe3, 0x2c, 0x8b, 0x2f, 0x1d, 0xe3, 0xab, 0xd9, 0x6c, 0xcc, 0x7a, + 0x3d, 0xa3, 0xfd, 0x07, 0x78, 0x1e, 0x0f, 0xda, 0xb3, 0x41, 0xd7, 0xe8, 0xb4, 0xdb, 0x7f, 0xb0, + 0x87, 0xdb, 0xdb, 0x19, 0xbb, 0xc9, 0x44, 0x0d, 0x5f, 0xb5, 0x7b, 0xf8, 0x3f, 0x4c, 0xbc, 0x90, + 0x49, 0x3c, 0xf7, 0x7e, 0x07, 0x12, 0x2b, 0x69, 0x90, 0x32, 0x8e, 0x93, 0x29, 0x4b, 0x64, 0xf2, + 0x60, 0x30, 0x80, 0xb4, 0x94, 0x85, 0x6c, 0xa2, 0x6a, 0xfc, 0x86, 0xfe, 0x83, 0xe4, 0x59, 0x1c, + 0x65, 0xdb, 0x69, 0xf0, 0x3b, 0x73, 0x3b, 0xed, 0xf9, 0x4d, 0xce, 0x7b, 0x71, 0x1d, 0xb2, 0x52, + 0x17, 0xbe, 0xea, 0x74, 0xf1, 0x7f, 0x15, 0xa8, 0x66, 0xb3, 0x99, 0x0e, 0x52, 0x72, 0x3e, 0xb6, + 0xba, 0xbb, 0xbb, 0x8e, 0xd1, 0x19, 0xb4, 0x1d, 0xa3, 0x6d, 0x6b, 0x90, 0xd5, 0x7c, 0x2a, 0x81, + 0x58, 0xf3, 0xbd, 0x04, 0x6e, 0xcd, 0xf7, 0x5a, 0xb8, 0x01, 0xc7, 0xb7, 0x8c, 0x45, 0x0f, 0xc5, + 0xfe, 0xc1, 0xde, 0x41, 0xf7, 0xa0, 0xcf, 0xb1, 0xdf, 0xdf, 0xeb, 0xef, 0xf6, 0xeb, 0xb1, 0x3f, + 0x1b, 0xcf, 0xfa, 0xb3, 0x7e, 0x09, 0xfb, 0xdd, 0x4e, 0x7f, 0xbf, 0x3b, 0xd6, 0x71, 0xaf, 0x52, + 0xca, 0xb8, 0x57, 0xc9, 0x65, 0xf4, 0xab, 0xe4, 0x72, 0x37, 0xf4, 0x84, 0xed, 0xd4, 0xdd, 0x57, + 0x1d, 0x9b, 0xb2, 0xab, 0xfb, 0xc7, 0x63, 0x32, 0x9b, 0xb6, 0x0f, 0x06, 0x25, 0x38, 0x27, 0xdd, + 0x3d, 0x46, 0xa3, 0xbf, 0x9e, 0x52, 0x86, 0x73, 0x32, 0xf5, 0xa7, 0x03, 0x7f, 0x0d, 0xce, 0x8e, + 0xbf, 0xef, 0xd3, 0x28, 0x87, 0xfe, 0x98, 0x85, 0x32, 0x75, 0xbf, 0x37, 0xd9, 0x65, 0x08, 0xfd, + 0x24, 0xbe, 0xbc, 0x04, 0xa4, 0xca, 0xf4, 0xdd, 0x83, 0x7d, 0xbf, 0xdf, 0xdb, 0x34, 0x38, 0x61, + 0x70, 0x7e, 0x91, 0x95, 0x7a, 0x21, 0x08, 0x48, 0xeb, 0x42, 0xa7, 0xdb, 0xd3, 0x81, 0x6d, 0xd3, + 0x7f, 0xa5, 0x1e, 0x0d, 0xa6, 0x83, 0xfd, 0x81, 0x4f, 0x74, 0x5f, 0x06, 0x55, 0x7e, 0x90, 0x18, + 0xf3, 0x93, 0xcf, 0xf7, 0xa3, 0x6c, 0x70, 0x30, 0x98, 0xee, 0x4d, 0x45, 0x91, 0x71, 0xb8, 0x60, + 0xa5, 0x22, 0xed, 0xdd, 0xde, 0xc1, 0xe0, 0x59, 0xa5, 0xc8, 0xcb, 0xbd, 0x6f, 0x3a, 0xdf, 0xbc, + 0x7c, 0x38, 0x2f, 0x96, 0xa1, 0x94, 0x59, 0x45, 0x93, 0xf3, 0x20, 0xfa, 0x5c, 0x41, 0xc9, 0xc4, + 0x9f, 0xf6, 0x2b, 0x4d, 0xb2, 0xbd, 0xdd, 0xfe, 0x7e, 0x7b, 0xad, 0x2e, 0x9e, 0x2c, 0x6a, 0x4a, + 0xe7, 0xfe, 0xa4, 0x02, 0x3d, 0xc7, 0x9c, 0x4e, 0xc8, 0xdd, 0xf1, 0xb4, 0x43, 0x63, 0x7f, 0xbe, + 0xbd, 0x48, 0x42, 0x17, 0xfe, 0x59, 0x4f, 0xa6, 0x7e, 0xe6, 0xbb, 0xfe, 0x7c, 0x1e, 0x06, 0x13, + 0x3f, 0x0b, 0xe2, 0x68, 0x27, 0x9e, 0x64, 0x0c, 0x46, 0x2f, 0x4b, 0x98, 0x7f, 0x39, 0x1c, 0xfb, + 0x29, 0x1b, 0xf4, 0x9d, 0x27, 0x8a, 0xe5, 0x66, 0xfe, 0x65, 0x10, 0xde, 0xba, 0x4f, 0xde, 0x27, + 0x2c, 0x4d, 0x0d, 0x14, 0x95, 0x99, 0xd1, 0x7d, 0xff, 0xc4, 0x99, 0x2c, 0x92, 0x34, 0xb8, 0x62, + 0x02, 0x9a, 0xe8, 0xd6, 0x8f, 0xca, 0xc0, 0x74, 0x7a, 0xbd, 0xc1, 0x5e, 0xad, 0x00, 0xf9, 0x17, + 0x00, 0xf3, 0x3c, 0xbe, 0x0c, 0x26, 0xc6, 0x5b, 0xb6, 0x60, 0x15, 0x40, 0x00, 0x86, 0xc9, 0x76, + 0x07, 0x06, 0xbf, 0x83, 0x83, 0x33, 0xd9, 0x9e, 0xc9, 0x46, 0x27, 0xdb, 0x5d, 0xe0, 0xc2, 0x6e, + 0x97, 0x1e, 0x7b, 0xee, 0x57, 0xbd, 0x5e, 0x8f, 0x1e, 0xfb, 0xee, 0x57, 0xfd, 0x7e, 0x9f, 0x1e, + 0x77, 0x81, 0xa0, 0x77, 0x77, 0xe9, 0x71, 0x20, 0x85, 0xe8, 0x64, 0x7b, 0x1f, 0xc8, 0x7f, 0x7f, + 0x9f, 0x1e, 0xc7, 0x30, 0x9c, 0x63, 0x62, 0x83, 0xed, 0x09, 0x70, 0xd0, 0x64, 0x42, 0x8f, 0x0c, + 0x06, 0x86, 0x31, 0x7a, 0x9c, 0xba, 0x5f, 0x4d, 0xa7, 0x53, 0x7a, 0x44, 0x16, 0xeb, 0xf1, 0xd6, + 0xce, 0xa1, 0xe1, 0x09, 0x07, 0x27, 0x84, 0xd6, 0xf6, 0x7d, 0x7a, 0xbc, 0x75, 0xbf, 0xf2, 0x0f, + 0x68, 0xc0, 0xa0, 0xde, 0x76, 0x8b, 0xb7, 0x1b, 0xa3, 0xe4, 0xf3, 0xad, 0x5e, 0xdf, 0x31, 0xe4, + 0xbf, 0x76, 0xeb, 0xc0, 0xa6, 0x6f, 0xd9, 0x78, 0xfd, 0xe3, 0x95, 0x9f, 0x58, 0x54, 0x83, 0x2d, + 0xf3, 0xf8, 0x3c, 0x53, 0xa7, 0xdd, 0x05, 0xe1, 0xa9, 0xfe, 0xac, 0xe7, 0xbb, 0xe0, 0xf9, 0x76, + 0x3b, 0x8e, 0x21, 0xff, 0x95, 0x33, 0x65, 0x17, 0xee, 0x1e, 0x97, 0x50, 0xd9, 0x5c, 0x3e, 0x41, + 0xa9, 0x41, 0x8f, 0xa7, 0x8d, 0xe7, 0x6e, 0xa7, 0x3f, 0xbf, 0x31, 0xf8, 0x9f, 0xb6, 0x78, 0xc2, + 0x3c, 0xf0, 0xe5, 0x00, 0x5e, 0xdb, 0xc6, 0x1e, 0xfe, 0xa5, 0x52, 0x53, 0x37, 0x8a, 0x23, 0x44, + 0x51, 0x7a, 0x3e, 0x77, 0xcd, 0x71, 0x18, 0x4f, 0x3e, 0x9b, 0xf8, 0xe1, 0x32, 0x73, 0x51, 0x5c, + 0x8c, 0xe3, 0xe9, 0xed, 0x52, 0x1f, 0xdf, 0xa7, 0x49, 0xe0, 0x87, 0xce, 0x77, 0x2c, 0xbc, 0x62, + 0x19, 0x10, 0x86, 0x93, 0xfa, 0x51, 0x0a, 0xbc, 0x90, 0x04, 0x33, 0x20, 0x89, 0xc9, 0xe7, 0xf3, + 0x24, 0x5e, 0x44, 0x53, 0x4e, 0xf0, 0x9c, 0xb2, 0x04, 0xe8, 0x8a, 0xd4, 0xec, 0x61, 0x21, 0x91, + 0xf8, 0x37, 0xf5, 0x6e, 0xe7, 0x17, 0x1d, 0xe7, 0xa2, 0xbb, 0xd4, 0x0b, 0x5e, 0xc8, 0x52, 0x38, + 0x79, 0x6c, 0x5f, 0x30, 0x14, 0x5c, 0xee, 0x2e, 0x40, 0x36, 0x0d, 0xae, 0x96, 0x7a, 0x5a, 0x37, + 0x27, 0xb9, 0xb8, 0xbc, 0xf4, 0x93, 0xf3, 0x20, 0xda, 0x4e, 0x28, 0x71, 0x00, 0xfd, 0xd6, 0x6b, + 0xd3, 0x44, 0xa7, 0x9d, 0x0b, 0x89, 0xc9, 0xbb, 0x47, 0xfa, 0x83, 0x1b, 0x64, 0x3e, 0x90, 0xfb, + 0x50, 0xd4, 0x11, 0xb2, 0xd9, 0x7a, 0x15, 0x25, 0x39, 0x6b, 0xe7, 0x41, 0x34, 0x5f, 0x64, 0x4b, + 0xad, 0xeb, 0x6d, 0xe3, 0x21, 0x3d, 0xc7, 0xe9, 0x84, 0x4b, 0x90, 0x7f, 0xac, 0x6c, 0x3c, 0x47, + 0x96, 0x5c, 0x6e, 0xca, 0xac, 0xd5, 0xc9, 0x3f, 0x4a, 0xee, 0xb7, 0x73, 0xbf, 0x1e, 0xbd, 0x54, + 0x7a, 0xca, 0x26, 0x71, 0x42, 0xcc, 0x4e, 0x54, 0x91, 0x63, 0xa2, 0x0f, 0xec, 0xbe, 0xbc, 0x0e, + 0xa6, 0x40, 0x74, 0x38, 0x21, 0x0f, 0x05, 0xba, 0xe9, 0x59, 0xcc, 0x5b, 0x38, 0x9f, 0x2f, 0x52, + 0xb7, 0xd3, 0x05, 0x54, 0x3d, 0xac, 0x37, 0xf9, 0xc4, 0x8f, 0xae, 0xfc, 0xf4, 0x4b, 0xea, 0xa5, + 0x24, 0xb7, 0x03, 0x84, 0x9b, 0xc6, 0x61, 0x30, 0x35, 0x88, 0xc4, 0xaa, 0xad, 0x81, 0xbc, 0x81, + 0xe6, 0xa6, 0x6c, 0xe6, 0x2f, 0xc2, 0x2c, 0x6f, 0x81, 0xf6, 0xe7, 0x87, 0xcb, 0x79, 0x9c, 0x06, + 0xd4, 0xa7, 0x59, 0x70, 0xc3, 0xa6, 0x43, 0x1a, 0x55, 0x28, 0x4a, 0x9a, 0x07, 0x3c, 0x70, 0x4a, + 0x69, 0x0f, 0xb3, 0x78, 0xee, 0xea, 0x35, 0x6e, 0x97, 0x46, 0x7d, 0x3b, 0x06, 0x1c, 0x25, 0x40, + 0xec, 0xb3, 0x38, 0xb9, 0x74, 0xe9, 0x29, 0xf4, 0x33, 0xf6, 0x17, 0x8b, 0x6b, 0x29, 0x94, 0xc0, + 0x5b, 0x51, 0xb9, 0x8c, 0x56, 0x3f, 0x1d, 0xce, 0xfd, 0xe9, 0x34, 0x88, 0xce, 0x71, 0xd0, 0x86, + 0xf1, 0x15, 0x4b, 0x66, 0x61, 0x7c, 0xed, 0xfa, 0x8b, 0x2c, 0xae, 0x74, 0xb2, 0x0f, 0x9d, 0xcc, + 0x5b, 0x11, 0x52, 0xb5, 0x4e, 0x7d, 0x34, 0x67, 0xb7, 0x32, 0x7f, 0x1c, 0xb2, 0x07, 0xb3, 0xa1, + 0x52, 0x26, 0x42, 0x7f, 0x9e, 0x32, 0x57, 0x3e, 0x0c, 0x35, 0x64, 0x57, 0x10, 0xdc, 0x56, 0x08, + 0x16, 0x7c, 0x70, 0x11, 0x4c, 0xa7, 0x2c, 0x82, 0xb4, 0x9b, 0xed, 0xf4, 0xc2, 0x9f, 0x02, 0xc8, + 0x80, 0x5e, 0xf8, 0x1f, 0xa2, 0x1f, 0xc5, 0xaf, 0x00, 0xc9, 0xc8, 0xa6, 0x8e, 0x7c, 0xba, 0x58, + 0xd6, 0x0f, 0x91, 0x44, 0x00, 0xf2, 0x11, 0xf4, 0x1f, 0xa1, 0x0d, 0xb7, 0x81, 0xcb, 0xce, 0x01, + 0x53, 0xf1, 0x3c, 0x2f, 0x8a, 0x13, 0x79, 0xf0, 0x0f, 0xd8, 0xf5, 0x4d, 0x23, 0x91, 0x29, 0x92, + 0xdd, 0xc8, 0xd8, 0xad, 0xcb, 0x69, 0xf8, 0x1c, 0x90, 0xe5, 0x83, 0x78, 0x48, 0xba, 0xcb, 0x69, + 0x90, 0xce, 0x43, 0xff, 0xd6, 0x3d, 0x4f, 0x82, 0xe9, 0x10, 0xff, 0x00, 0x25, 0x5e, 0xce, 0x71, + 0xf4, 0xb0, 0xc0, 0xe2, 0x32, 0x4a, 0xdd, 0x84, 0xcd, 0x99, 0x9f, 0x59, 0x5d, 0xa7, 0x33, 0xab, + 0x96, 0xef, 0x7d, 0x41, 0xf9, 0x5e, 0x4d, 0xf9, 0xfe, 0x17, 0x94, 0xef, 0x8b, 0xf2, 0x30, 0xeb, + 0x02, 0xe9, 0x3a, 0x48, 0xbf, 0x60, 0xea, 0x38, 0xad, 0xf4, 0x36, 0xa5, 0xf7, 0x05, 0x8c, 0x30, + 0x5a, 0x34, 0x02, 0xd3, 0x5d, 0x85, 0x69, 0xc1, 0xe4, 0x9a, 0x1a, 0x79, 0x97, 0x0c, 0xa8, 0x1b, + 0x7e, 0x39, 0x4c, 0x20, 0x5a, 0x85, 0xf8, 0xa3, 0x47, 0xc1, 0x51, 0x97, 0x40, 0xba, 0x12, 0xac, + 0x16, 0x92, 0xb1, 0xc3, 0xfb, 0x88, 0xd0, 0xcb, 0x77, 0x82, 0x55, 0xbc, 0x70, 0x80, 0xc5, 0x8b, + 0x80, 0x9a, 0xde, 0x74, 0xd0, 0xa7, 0xc0, 0x81, 0xac, 0x16, 0xf6, 0xfc, 0xab, 0x49, 0x1c, 0x45, + 0x41, 0x34, 0xad, 0xf2, 0xae, 0x60, 0x5a, 0x20, 0xa1, 0x89, 0x25, 0xca, 0x5d, 0xd8, 0x46, 0xd3, + 0x00, 0x50, 0x6d, 0xce, 0xd8, 0xfd, 0x4a, 0x5f, 0xca, 0x5d, 0xdd, 0x2d, 0x49, 0x28, 0xa9, 0xfb, + 0xe0, 0x64, 0xff, 0xfb, 0x36, 0x34, 0xc7, 0x6e, 0xdc, 0xed, 0x2e, 0x90, 0x64, 0x1c, 0x87, 0x59, + 0x30, 0x2f, 0x1a, 0x4f, 0x18, 0x8c, 0x16, 0x28, 0x32, 0x43, 0x39, 0x94, 0x41, 0x44, 0x53, 0x0f, + 0x4d, 0x97, 0xb2, 0x09, 0x01, 0x5b, 0xa7, 0xe8, 0x19, 0xd2, 0xbf, 0xaa, 0xcd, 0x90, 0x0f, 0x48, + 0xe7, 0xcb, 0xab, 0x20, 0x0d, 0xc6, 0x41, 0x18, 0x64, 0xb7, 0x92, 0xd7, 0x04, 0x77, 0x76, 0xdb, + 0x75, 0x20, 0x56, 0x07, 0x70, 0x7d, 0xca, 0xda, 0x3c, 0x45, 0x0d, 0x35, 0xc6, 0x9a, 0x40, 0x32, + 0x4b, 0x74, 0x04, 0x19, 0xed, 0x0a, 0x8a, 0x90, 0x4f, 0x55, 0xc7, 0xfd, 0x31, 0xd0, 0xd7, 0x22, + 0x63, 0x0a, 0x3d, 0x1d, 0x39, 0x04, 0x9d, 0xee, 0xee, 0x1f, 0x38, 0xc6, 0x77, 0x41, 0x9e, 0xe8, + 0x22, 0x6b, 0x7b, 0x80, 0x5d, 0x88, 0x41, 0x07, 0xc6, 0xde, 0xb5, 0x75, 0xd1, 0x28, 0x12, 0x8d, + 0x56, 0x2f, 0xad, 0xc7, 0x8b, 0xeb, 0xfa, 0x33, 0x00, 0x10, 0xa6, 0x28, 0x80, 0x33, 0xca, 0x5c, + 0xd3, 0xac, 0x81, 0x05, 0x05, 0x35, 0x49, 0xb1, 0xfa, 0xe6, 0xb5, 0x51, 0xe7, 0x38, 0xdd, 0xad, + 0x4a, 0x37, 0xe2, 0x99, 0x61, 0xd9, 0xe8, 0x02, 0xf5, 0xd2, 0x20, 0x48, 0xe7, 0x30, 0xe1, 0x45, + 0xd9, 0xa6, 0x67, 0x05, 0xb6, 0x7b, 0x81, 0xe4, 0xbc, 0x71, 0x50, 0xe9, 0x31, 0x64, 0x0a, 0x0d, + 0x9d, 0xbc, 0xc5, 0xa7, 0x7b, 0x30, 0xe6, 0xd7, 0x18, 0x53, 0x37, 0x25, 0xec, 0xfc, 0xd1, 0xe1, + 0x0e, 0x77, 0x66, 0x18, 0x87, 0xe9, 0x24, 0x81, 0xaa, 0x8f, 0x66, 0x8b, 0x68, 0x82, 0x28, 0x30, + 0x80, 0x01, 0xdf, 0xfa, 0x97, 0xcc, 0xb2, 0x97, 0x09, 0xcb, 0x16, 0x49, 0x64, 0xbe, 0x60, 0x97, + 0xb1, 0x99, 0xab, 0xef, 0xc8, 0x69, 0xdf, 0x2c, 0x22, 0x2b, 0xb2, 0x97, 0x39, 0xd4, 0xc2, 0x4b, + 0x1b, 0x8f, 0x64, 0x3d, 0x3b, 0x3b, 0xc6, 0xbf, 0x01, 0xad, 0xb0, 0x28, 0x65, 0x86, 0x61, 0x7c, + 0xfb, 0xf6, 0xa3, 0xf1, 0xed, 0xcb, 0xb7, 0x2f, 0x7f, 0x78, 0xfa, 0xda, 0x78, 0xff, 0xf1, 0xd9, + 0xeb, 0x57, 0xcf, 0x0d, 0xf8, 0xf7, 0xf2, 0xed, 0xf1, 0x4b, 0xe3, 0x47, 0x06, 0x7a, 0x3b, 0xd4, + 0xd7, 0x73, 0x8c, 0xee, 0x81, 0xf1, 0xfd, 0x22, 0x62, 0x46, 0xb7, 0xdd, 0xde, 0x7b, 0x54, 0xae, + 0xe0, 0x9b, 0x38, 0x31, 0x40, 0x4d, 0x30, 0xbe, 0x7d, 0xff, 0x7a, 0xfb, 0xaa, 0x07, 0x8d, 0xfb, + 0xe7, 0xcc, 0x31, 0x88, 0xf8, 0x92, 0x09, 0x4c, 0x4f, 0x86, 0xc8, 0x9a, 0x1a, 0x97, 0x8b, 0x34, + 0x33, 0xc6, 0xcc, 0x98, 0x2f, 0x92, 0xc9, 0x05, 0x18, 0x0e, 0xd3, 0x96, 0x41, 0xf2, 0x71, 0x92, + 0x19, 0x97, 0x71, 0x1c, 0x71, 0xd1, 0x91, 0xfe, 0x5b, 0x30, 0x09, 0xe3, 0xc5, 0xb4, 0x05, 0x35, + 0x3c, 0x0a, 0x59, 0x66, 0x4c, 0xbd, 0x69, 0x3c, 0x59, 0x20, 0x25, 0x3b, 0xd7, 0xa9, 0x17, 0x2d, + 0xc2, 0xd0, 0x89, 0x92, 0x77, 0xb3, 0x37, 0x52, 0xf0, 0xa4, 0x5e, 0xdf, 0xf9, 0x35, 0x8d, 0xa3, + 0x1f, 0x7d, 0x30, 0x16, 0x53, 0x6f, 0x99, 0x3b, 0x8b, 0x00, 0x7a, 0x0f, 0x06, 0xc8, 0xa5, 0x1f, + 0x4d, 0x53, 0xef, 0xe4, 0xd4, 0x81, 0x9a, 0x59, 0x88, 0x0f, 0xa9, 0x7f, 0xc5, 0xa6, 0x3f, 0x06, + 0xec, 0x9a, 0xea, 0x01, 0x6e, 0x89, 0x00, 0xa2, 0x8f, 0xaf, 0xde, 0x7e, 0xd8, 0xff, 0xe5, 0xcd, + 0xd3, 0x3f, 0x7b, 0xe8, 0xd0, 0xc0, 0xb7, 0xce, 0x80, 0x5e, 0x07, 0xbb, 0xbb, 0xbd, 0xdd, 0xa1, + 0x42, 0xeb, 0xf9, 0xab, 0xa9, 0xc5, 0x24, 0xce, 0x8d, 0x69, 0xeb, 0x9c, 0x65, 0x2f, 0x43, 0x86, + 0x80, 0x3d, 0xbb, 0xa5, 0x4f, 0xc5, 0x08, 0x4c, 0x5e, 0x96, 0x72, 0x4e, 0x40, 0x79, 0xca, 0x98, + 0xc8, 0x5c, 0xca, 0x78, 0x01, 0x20, 0x86, 0xec, 0x47, 0x45, 0x31, 0xcf, 0x21, 0xe1, 0x1c, 0x47, + 0x16, 0x41, 0x8b, 0x41, 0x90, 0x86, 0xf1, 0xb9, 0x65, 0xd6, 0xe7, 0x32, 0xb5, 0x7a, 0xe2, 0xe8, + 0x75, 0xec, 0x4f, 0xa1, 0x1c, 0x00, 0xf5, 0xe1, 0x82, 0x21, 0x71, 0x38, 0x97, 0xfe, 0x67, 0xf6, + 0xd3, 0x31, 0x3c, 0x04, 0x51, 0x90, 0x15, 0xe8, 0x82, 0x84, 0x69, 0x0b, 0x38, 0xff, 0xe5, 0x15, + 0x00, 0xf3, 0x3a, 0x48, 0x81, 0xc3, 0x58, 0x62, 0x99, 0x05, 0xd5, 0x4e, 0x78, 0xed, 0x4e, 0x7d, + 0xab, 0xce, 0x56, 0x47, 0x6b, 0x57, 0xb6, 0xb1, 0x0c, 0x66, 0xd6, 0x75, 0x6a, 0xf3, 0x1e, 0x0f, + 0x71, 0xd8, 0x98, 0x07, 0x70, 0x67, 0xd9, 0x3c, 0x75, 0x4d, 0xcf, 0xbb, 0x06, 0xb1, 0x11, 0x5f, + 0x43, 0x67, 0xb8, 0x0d, 0xd9, 0x9a, 0x27, 0x71, 0x16, 0x03, 0xa1, 0x8f, 0xcc, 0xeb, 0x34, 0x35, + 0x5d, 0xf8, 0x6b, 0xda, 0x4d, 0xd3, 0xdd, 0xd9, 0x31, 0x9b, 0xd5, 0xac, 0x17, 0x71, 0x9a, 0x45, + 0x40, 0xed, 0x4d, 0x73, 0x07, 0x72, 0x0d, 0x4b, 0x78, 0xe1, 0xad, 0x1b, 0x60, 0xa7, 0x9a, 0x0e, + 0xb3, 0x89, 0x3c, 0xd8, 0xb5, 0xf1, 0x13, 0x1b, 0x1f, 0x83, 0x40, 0x66, 0x88, 0x69, 0x48, 0x6b, + 0x8d, 0x83, 0xc8, 0x4f, 0x6e, 0x3f, 0xdc, 0xce, 0x99, 0x67, 0xfa, 0x49, 0xe2, 0xdf, 0x8e, 0x17, + 0xb3, 0x19, 0x4b, 0x4c, 0xfc, 0x06, 0x54, 0x07, 0x46, 0x33, 0x50, 0xac, 0xc7, 0xbc, 0x23, 0xec, + 0x04, 0x6b, 0xa1, 0xc1, 0x6b, 0x04, 0x40, 0x18, 0x7e, 0x34, 0x61, 0xf1, 0xcc, 0x78, 0x8a, 0x45, + 0x9e, 0x51, 0x11, 0x7b, 0x89, 0x3d, 0x0b, 0xa9, 0x95, 0x8f, 0x41, 0x94, 0xed, 0xd3, 0x37, 0x51, + 0xc6, 0x1e, 0x42, 0xf1, 0xb6, 0xe7, 0x85, 0x27, 0xed, 0x53, 0x7b, 0x39, 0x4f, 0xd8, 0x15, 0xd0, + 0xd9, 0xb3, 0xd8, 0x4f, 0xa6, 0x16, 0x52, 0x8e, 0x39, 0xc6, 0x47, 0xd3, 0x76, 0x42, 0x3b, 0x67, + 0x21, 0x70, 0x8e, 0xe4, 0x52, 0xf1, 0xbe, 0x9c, 0x84, 0xcc, 0x4f, 0x3e, 0x04, 0x97, 0x2c, 0x5e, + 0x64, 0x16, 0x12, 0xb4, 0x78, 0xb6, 0x1d, 0xed, 0x85, 0xd3, 0x3f, 0xd5, 0x27, 0xe6, 0x46, 0xd3, + 0x6e, 0x91, 0x9c, 0x68, 0x15, 0xf2, 0xe4, 0x39, 0x4a, 0x10, 0xcf, 0x94, 0x2a, 0x6b, 0x68, 0x9b, + 0x43, 0x01, 0x37, 0x12, 0x7d, 0x96, 0xdc, 0x2e, 0x43, 0xef, 0xfb, 0xe3, 0x77, 0x6f, 0x5b, 0x73, + 0x74, 0xb7, 0x4a, 0xf0, 0x41, 0x19, 0xcf, 0x26, 0x17, 0x96, 0x0f, 0x9d, 0xe4, 0xad, 0x48, 0x54, + 0xb3, 0x24, 0x89, 0x13, 0x85, 0x6c, 0x04, 0xc6, 0xa0, 0x24, 0xd3, 0xf1, 0x1d, 0x59, 0x16, 0xba, + 0x1e, 0xda, 0xf8, 0xa7, 0x95, 0x01, 0x9e, 0x1b, 0x8d, 0x13, 0x93, 0x6b, 0x09, 0xa6, 0x63, 0x8a, + 0x79, 0x1f, 0x9e, 0xb8, 0x3a, 0x60, 0x9e, 0xb6, 0x82, 0x68, 0x12, 0x2e, 0xa6, 0x2c, 0x15, 0xd9, + 0x6d, 0x8e, 0x57, 0xe6, 0x6d, 0x75, 0x60, 0x4a, 0x4b, 0x2c, 0x7c, 0xf1, 0x0d, 0x40, 0x3d, 0xf1, + 0xad, 0xed, 0xb7, 0x82, 0x29, 0xa0, 0x15, 0xfe, 0x36, 0x1a, 0x16, 0x64, 0x6a, 0x13, 0xa6, 0x99, + 0x5d, 0x66, 0x91, 0xec, 0x32, 0x14, 0x45, 0x40, 0x88, 0x18, 0x7e, 0x08, 0x2c, 0x37, 0xbd, 0x35, + 0xce, 0x91, 0xb8, 0x81, 0xf7, 0xa0, 0xf9, 0xd0, 0x1e, 0x12, 0x9e, 0x79, 0x53, 0xe1, 0x90, 0x2a, + 0x6f, 0xcd, 0x17, 0xe9, 0x05, 0xd2, 0x49, 0xa9, 0x32, 0xe8, 0x66, 0xc2, 0x26, 0x0c, 0xa6, 0x7a, + 0x83, 0xb3, 0xee, 0x77, 0x1f, 0xde, 0xbc, 0x26, 0x12, 0x2b, 0x5e, 0xb1, 0x90, 0x79, 0x7c, 0x0b, + 0xec, 0x73, 0x09, 0x04, 0xce, 0x38, 0x74, 0xa5, 0x5a, 0x52, 0xfa, 0x68, 0x70, 0x76, 0x4a, 0xa9, + 0x38, 0x6b, 0x21, 0x51, 0x40, 0xc6, 0x42, 0x10, 0xf1, 0x24, 0xfc, 0x94, 0x21, 0xdf, 0x36, 0x1a, + 0x3c, 0x3f, 0x36, 0xc1, 0x19, 0x59, 0x7c, 0xb0, 0x81, 0x96, 0xab, 0xac, 0x91, 0xb0, 0x59, 0x81, + 0x4b, 0xb3, 0xdf, 0xea, 0xb5, 0xba, 0xad, 0x8e, 0x69, 0x8f, 0x8a, 0x2a, 0xb0, 0x09, 0xe0, 0xed, + 0x63, 0xe0, 0xcb, 0xb9, 0x69, 0xbb, 0x95, 0x0f, 0x0a, 0x8a, 0xd5, 0xca, 0xbc, 0x7a, 0x3a, 0x87, + 0x1c, 0x9c, 0xb4, 0xf8, 0x73, 0xeb, 0x0a, 0x25, 0xaa, 0xa7, 0x66, 0x1b, 0x67, 0x16, 0x02, 0xb2, + 0x3e, 0xbe, 0xd2, 0x84, 0xab, 0x65, 0xe7, 0x9c, 0x98, 0x89, 0x11, 0x5a, 0x41, 0xca, 0x19, 0x22, + 0x04, 0x10, 0x74, 0x4c, 0x4c, 0xd9, 0x95, 0x41, 0x9c, 0x07, 0x13, 0x05, 0x20, 0xff, 0x66, 0x4e, + 0x33, 0x20, 0x0e, 0x89, 0x2b, 0xf0, 0xfc, 0x02, 0xa8, 0x08, 0x39, 0x21, 0xe7, 0x4c, 0x09, 0x33, + 0x40, 0xca, 0x59, 0xb2, 0x3a, 0x2e, 0xf4, 0xc5, 0x80, 0xb6, 0x61, 0x84, 0x80, 0x92, 0x09, 0xab, + 0x5f, 0xc6, 0x0e, 0x89, 0x6d, 0x3a, 0x29, 0x48, 0x49, 0xc1, 0x69, 0x9c, 0xac, 0x9d, 0xce, 0x6e, + 0xbb, 0x6d, 0xcb, 0x09, 0x46, 0x40, 0x11, 0xcf, 0x59, 0x54, 0x0b, 0x04, 0x7e, 0xa0, 0x96, 0x13, + 0xf6, 0x5b, 0xfa, 0x9a, 0x9d, 0xfb, 0x21, 0x50, 0xa5, 0x28, 0x44, 0xac, 0x51, 0x5b, 0x4a, 0x30, + 0x0d, 0x88, 0xff, 0x42, 0x7e, 0x72, 0x5f, 0xf8, 0x87, 0xf8, 0x75, 0x7c, 0xee, 0x27, 0x41, 0x76, + 0x71, 0x69, 0x31, 0xc0, 0xca, 0x52, 0x48, 0x12, 0x21, 0x4f, 0x41, 0x39, 0x03, 0xe0, 0x0d, 0x1f, + 0x68, 0xe5, 0x32, 0x88, 0x46, 0xf4, 0xd7, 0x6d, 0x3b, 0x19, 0xbe, 0xfb, 0x37, 0x23, 0xfa, 0xeb, + 0xe2, 0xdc, 0x15, 0x79, 0xfe, 0xe8, 0x8d, 0x9f, 0x5d, 0x50, 0x93, 0xbe, 0x0d, 0x79, 0x62, 0xcf, + 0x52, 0x09, 0x99, 0xbd, 0x1d, 0xd9, 0x3b, 0x16, 0x28, 0x81, 0x36, 0xc9, 0x83, 0xc4, 0xa3, 0x4f, + 0x30, 0x1c, 0x56, 0xd4, 0x8c, 0xbf, 0xb6, 0xc0, 0x1e, 0xb3, 0xed, 0xa1, 0x68, 0x92, 0x3e, 0x11, + 0xfa, 0xac, 0x44, 0x9f, 0xd8, 0x34, 0xfa, 0x77, 0x84, 0x9c, 0xf0, 0x71, 0xde, 0x24, 0x98, 0xb7, + 0xca, 0x64, 0x20, 0x19, 0x1b, 0x00, 0x45, 0x8e, 0x2d, 0x7f, 0xcc, 0x38, 0x79, 0xd9, 0x8d, 0x06, + 0x94, 0xde, 0xf2, 0x7c, 0xaa, 0xc0, 0x3f, 0x14, 0xc9, 0xad, 0x90, 0x45, 0xe7, 0xd9, 0x45, 0xa3, + 0x81, 0x2d, 0x78, 0x9e, 0x48, 0x3d, 0xf1, 0x4f, 0xe5, 0x14, 0x03, 0x99, 0x4d, 0x34, 0x93, 0x4d, + 0x94, 0x0c, 0x93, 0xd0, 0x4f, 0x53, 0x24, 0xd2, 0x46, 0xc3, 0x3f, 0xf2, 0xca, 0x55, 0x48, 0x1c, + 0x5e, 0xc5, 0x60, 0x20, 0x95, 0x86, 0xa4, 0xe8, 0x8b, 0x81, 0x35, 0x19, 0x42, 0xcd, 0x8b, 0x62, + 0xd1, 0x4b, 0xa0, 0x4f, 0x27, 0x03, 0x19, 0x57, 0xa9, 0x2f, 0xe7, 0x20, 0x85, 0xc0, 0xc5, 0xa1, + 0x47, 0xa4, 0xa7, 0x6c, 0x20, 0xb3, 0x99, 0xb5, 0xe2, 0x3f, 0x94, 0xb5, 0x13, 0x9b, 0x23, 0x3b, + 0x02, 0x30, 0x23, 0x90, 0x38, 0x08, 0x25, 0x68, 0x8b, 0xaf, 0x81, 0x87, 0x43, 0xf6, 0x3a, 0xbe, + 0x66, 0xc9, 0x73, 0xd0, 0x84, 0x80, 0xb9, 0x62, 0x8e, 0xcc, 0x84, 0xff, 0x04, 0xfc, 0x67, 0x0a, + 0x74, 0xe5, 0xa4, 0x1e, 0xa8, 0x13, 0x26, 0x99, 0xb6, 0xc0, 0xa0, 0x13, 0x6f, 0x06, 0x64, 0xfe, + 0x9e, 0x60, 0xfd, 0x11, 0x48, 0x3a, 0x03, 0xc9, 0x43, 0x02, 0x71, 0xd2, 0x68, 0xe0, 0xf3, 0x96, + 0x37, 0x21, 0x59, 0xc4, 0xff, 0x62, 0x4a, 0x2b, 0x5d, 0x8c, 0xd3, 0x2c, 0x01, 0x4d, 0xdf, 0x6a, + 0x3b, 0x98, 0x2c, 0x7b, 0xe2, 0x51, 0xd6, 0x51, 0x0a, 0x32, 0x04, 0xc8, 0xf6, 0x03, 0xe8, 0xae, + 0x1e, 0xaa, 0x0a, 0xcf, 0xfd, 0xb9, 0x55, 0x29, 0xa7, 0x97, 0xb2, 0xdd, 0x4d, 0x05, 0xb0, 0x13, + 0x08, 0x2a, 0x0e, 0x0b, 0x3c, 0xa3, 0xd8, 0xc6, 0xe4, 0xa6, 0xc5, 0x47, 0x78, 0x64, 0x7e, 0x65, + 0x36, 0x7d, 0x50, 0xe6, 0x61, 0xaa, 0xff, 0x05, 0xe7, 0x83, 0x6c, 0x6a, 0x6e, 0x79, 0x51, 0xa3, + 0x61, 0x4e, 0x2e, 0xd8, 0xe4, 0xf3, 0x38, 0xbe, 0x81, 0xd7, 0x4c, 0x4c, 0x20, 0x30, 0x5f, 0x2e, + 0xc0, 0xc2, 0x88, 0x4c, 0x4f, 0x24, 0xad, 0x56, 0x0f, 0x9c, 0x53, 0x78, 0x76, 0x7b, 0xb5, 0x8a, + 0xd1, 0x52, 0x65, 0xc0, 0xff, 0x17, 0x41, 0x38, 0xb5, 0x60, 0x20, 0x9c, 0x2f, 0xab, 0xc1, 0x5e, + 0x02, 0xfa, 0x3b, 0x30, 0x22, 0xaa, 0x4f, 0x42, 0xb1, 0xc1, 0xf7, 0x0b, 0x94, 0x2d, 0x28, 0x30, + 0x43, 0xfe, 0xda, 0xc5, 0xaf, 0x5c, 0xf4, 0x78, 0xe6, 0x2c, 0x8c, 0xfd, 0xcc, 0x35, 0xc8, 0x7f, + 0x01, 0x54, 0xb4, 0x11, 0x5d, 0xac, 0x04, 0x61, 0xc8, 0xeb, 0xf7, 0xa9, 0x42, 0x30, 0x34, 0x22, + 0xa8, 0xd2, 0xd7, 0xca, 0x9a, 0x7f, 0xff, 0xdb, 0xdf, 0xfe, 0x07, 0x4c, 0xba, 0x95, 0x56, 0xc8, + 0x71, 0x35, 0xc4, 0xf4, 0x75, 0xa5, 0x6e, 0x02, 0xba, 0xf7, 0x67, 0x10, 0x39, 0x55, 0x69, 0x04, + 0x02, 0x64, 0x91, 0x1a, 0xf2, 0x6b, 0x2b, 0x03, 0xc3, 0x89, 0x65, 0xb6, 0x7a, 0x6a, 0x71, 0x56, + 0x78, 0x0b, 0xf4, 0xba, 0xe1, 0x91, 0x5b, 0xab, 0x28, 0xf5, 0xaa, 0xbd, 0xf0, 0x25, 0xbd, 0x63, + 0x2f, 0x7c, 0xe8, 0x42, 0xa4, 0x77, 0xe1, 0x3f, 0xff, 0xfb, 0x7f, 0x98, 0x4e, 0x54, 0xdf, 0x03, + 0x2a, 0x17, 0x7b, 0xe6, 0x4f, 0x71, 0xf2, 0x19, 0xfd, 0x63, 0x34, 0xf4, 0x40, 0x9f, 0x38, 0xcb, + 0xbe, 0x81, 0x11, 0x72, 0xe5, 0xe8, 0x49, 0x92, 0x18, 0xa9, 0xa9, 0xa9, 0x69, 0xf2, 0x0c, 0x72, + 0x54, 0x55, 0x0e, 0xf3, 0x23, 0xa4, 0xf0, 0x6f, 0xa2, 0x16, 0x80, 0x07, 0xa4, 0xff, 0xd3, 0x0c, + 0x08, 0x1b, 0x28, 0x8c, 0xc1, 0xd0, 0xc1, 0x2c, 0x0a, 0x64, 0xc0, 0x75, 0xd5, 0x9d, 0x1d, 0x76, + 0x1d, 0x5f, 0x07, 0xad, 0x73, 0x90, 0xc5, 0x8b, 0x71, 0x2b, 0x88, 0x77, 0x70, 0x3d, 0xe5, 0x45, + 0x3c, 0x49, 0x41, 0x35, 0x8d, 0x41, 0x07, 0xc5, 0xbf, 0xa5, 0x41, 0xac, 0xf6, 0x3f, 0x82, 0x59, + 0xa1, 0x94, 0xc0, 0xaa, 0x09, 0x88, 0x98, 0x71, 0x62, 0xda, 0x1b, 0xd3, 0xf9, 0x94, 0x8a, 0x12, + 0x8e, 0xbc, 0x62, 0xaa, 0x37, 0x25, 0x82, 0xe4, 0x9f, 0x74, 0x92, 0xcc, 0x70, 0x29, 0x1d, 0x52, + 0xd8, 0x5a, 0xad, 0x59, 0x4d, 0x6b, 0xcc, 0x16, 0x4a, 0x21, 0x65, 0x40, 0x07, 0xbf, 0x49, 0x62, + 0x24, 0xa9, 0xd0, 0xa4, 0xb3, 0x95, 0xc1, 0x3c, 0x00, 0x4c, 0x3a, 0x0b, 0x42, 0xf6, 0x61, 0x1c, + 0x12, 0x8f, 0x42, 0xbf, 0x97, 0x45, 0xc3, 0xe4, 0xfc, 0xa6, 0x86, 0x33, 0x52, 0xb2, 0x05, 0xe7, + 0xa2, 0xb6, 0x43, 0x1a, 0x84, 0xd9, 0xc4, 0xe7, 0x87, 0x53, 0xe7, 0x07, 0xf2, 0x05, 0x36, 0x35, + 0xca, 0xa4, 0xf9, 0x2f, 0xf4, 0x96, 0x50, 0xc7, 0x0f, 0xf1, 0xb5, 0xbb, 0xcc, 0x73, 0x60, 0x36, + 0xfe, 0x22, 0xa5, 0x0c, 0xce, 0xc5, 0x60, 0xff, 0x65, 0xdf, 0x83, 0x7e, 0x8a, 0x9a, 0x04, 0x0a, + 0xa0, 0x72, 0x7f, 0xf3, 0x75, 0xbc, 0x46, 0xb6, 0x40, 0xe6, 0x85, 0x89, 0xf8, 0xd9, 0xc0, 0xa7, + 0x43, 0x55, 0x8e, 0x9b, 0xe8, 0x9a, 0x4c, 0x32, 0xe7, 0x81, 0x2e, 0xa2, 0xcc, 0x60, 0x5e, 0x8c, + 0x16, 0xe2, 0x6d, 0x94, 0x68, 0xdc, 0xec, 0x5a, 0xe2, 0x8d, 0xd7, 0x42, 0x23, 0xb2, 0x8e, 0x14, + 0x61, 0x7d, 0xad, 0x61, 0x85, 0x97, 0x32, 0xd4, 0x77, 0x1b, 0xb4, 0x98, 0x68, 0x4a, 0x56, 0xaf, + 0xa5, 0x10, 0x95, 0xdb, 0x1a, 0xb4, 0xdc, 0xbb, 0xae, 0x91, 0x4f, 0x31, 0x64, 0x42, 0xbc, 0xb0, + 0xb2, 0x78, 0xf9, 0xf7, 0xff, 0x6a, 0xae, 0x61, 0xad, 0x92, 0xa0, 0x11, 0x2f, 0x55, 0x24, 0xda, + 0xa8, 0xef, 0xcb, 0x74, 0x1c, 0x6a, 0x63, 0x9c, 0xc5, 0xe7, 0xe7, 0x21, 0x7b, 0x83, 0xce, 0x78, + 0x1d, 0x60, 0x6d, 0x54, 0xc4, 0x3a, 0xc3, 0xff, 0x5a, 0x88, 0x55, 0x2b, 0x08, 0x33, 0x5a, 0x09, + 0xef, 0xa2, 0xf0, 0xd6, 0xc3, 0xc1, 0xfa, 0x57, 0xf4, 0x01, 0x6d, 0x51, 0x05, 0x7e, 0xa2, 0x84, + 0x60, 0x31, 0x26, 0x72, 0xaa, 0x2b, 0xfa, 0x88, 0x4c, 0x57, 0x9a, 0xe2, 0xc5, 0xc4, 0x78, 0x4f, + 0xef, 0x4b, 0x24, 0xda, 0x34, 0x0d, 0x73, 0x8d, 0xc1, 0xf3, 0x8d, 0x2c, 0xca, 0x9b, 0x46, 0xeb, + 0x2d, 0x48, 0x91, 0x15, 0xa6, 0xbc, 0xff, 0x58, 0xfd, 0x94, 0x65, 0x20, 0x43, 0xc1, 0x64, 0xce, + 0xd0, 0xd4, 0xaa, 0xe7, 0xdb, 0x0d, 0x24, 0xca, 0x6b, 0x05, 0x50, 0x54, 0x86, 0xf5, 0xf9, 0xa4, + 0x8e, 0x6a, 0xf5, 0xcf, 0xf9, 0x9d, 0x72, 0x4a, 0xa0, 0x41, 0xd3, 0xf8, 0x3c, 0x8e, 0xd1, 0x4b, + 0x3f, 0xf9, 0x5c, 0x45, 0x40, 0xa8, 0x0d, 0x4b, 0x45, 0x99, 0x10, 0x23, 0x23, 0xb0, 0x02, 0xe5, + 0x74, 0xac, 0x24, 0x15, 0xac, 0x24, 0x42, 0x8c, 0x95, 0xe7, 0xee, 0xe4, 0xe1, 0x02, 0xad, 0xc0, + 0x4b, 0x75, 0xc2, 0xad, 0xe5, 0xe0, 0x82, 0x58, 0x12, 0x42, 0x63, 0x41, 0x29, 0x77, 0x43, 0x0d, + 0x83, 0x06, 0x2f, 0x68, 0x21, 0x64, 0xc2, 0x42, 0x48, 0xd0, 0x32, 0xc0, 0x34, 0xb0, 0x12, 0x32, + 0x65, 0x25, 0x54, 0xfa, 0x27, 0x66, 0x90, 0x8d, 0x9a, 0x5a, 0x72, 0x65, 0x0e, 0xeb, 0x3a, 0xcb, + 0xc1, 0x00, 0xfd, 0xe7, 0x68, 0xc9, 0x3d, 0x63, 0xa0, 0xb4, 0xf1, 0x07, 0x8d, 0x48, 0x33, 0x44, + 0xc0, 0x68, 0xdd, 0xca, 0xc9, 0x40, 0x2b, 0x12, 0x83, 0xcf, 0xcd, 0x00, 0xb7, 0xf2, 0x9e, 0xdf, + 0x2f, 0x1d, 0x6b, 0x91, 0x07, 0x9a, 0x73, 0x41, 0x28, 0x4e, 0x80, 0xb3, 0x03, 0x2b, 0xc8, 0x60, + 0x12, 0xc7, 0xc9, 0xb4, 0xf7, 0xa2, 0x8e, 0xf9, 0x44, 0x09, 0x9a, 0xed, 0xee, 0x9a, 0xdc, 0xa2, + 0xc5, 0xe5, 0x18, 0x9d, 0x47, 0xac, 0x06, 0xdf, 0x84, 0x63, 0x74, 0x52, 0x14, 0x78, 0x47, 0xf5, + 0x60, 0x1e, 0xfa, 0x13, 0x76, 0x11, 0x87, 0x53, 0x06, 0x66, 0xe8, 0xcd, 0x17, 0x15, 0xfd, 0xdf, + 0x85, 0xf9, 0x18, 0x70, 0x1c, 0xd8, 0xb6, 0x98, 0xcb, 0x42, 0xfe, 0x2b, 0x75, 0xe9, 0x16, 0x75, + 0xdc, 0xff, 0x9f, 0x21, 0x55, 0xca, 0x73, 0x19, 0x52, 0xbf, 0x0c, 0xe9, 0xef, 0x1b, 0xd4, 0xe4, + 0xff, 0x2f, 0x21, 0xf5, 0x75, 0x45, 0x64, 0x9e, 0xc4, 0xe7, 0xb8, 0x6d, 0xa7, 0x2a, 0x99, 0x54, + 0xba, 0x5d, 0xcb, 0xd8, 0x92, 0x5a, 0x34, 0x06, 0xd7, 0xc4, 0x06, 0x6a, 0x6a, 0x6b, 0x52, 0x43, + 0x72, 0x04, 0x92, 0x33, 0x02, 0x56, 0x12, 0x25, 0x2a, 0xb5, 0x24, 0x52, 0x8a, 0xd4, 0xbb, 0x51, + 0x26, 0x49, 0x84, 0x77, 0xde, 0xf1, 0xc1, 0xd4, 0x45, 0x10, 0xd2, 0x93, 0xf6, 0xa9, 0x13, 0x91, + 0xb3, 0xf4, 0x9b, 0x38, 0xb9, 0x44, 0x17, 0x4f, 0xd9, 0x7d, 0x8b, 0x99, 0x0c, 0xb4, 0x99, 0x41, + 0x7b, 0xf3, 0x9d, 0x08, 0x2d, 0x1b, 0xdc, 0xfe, 0x01, 0xc4, 0xa4, 0x59, 0x1a, 0xa0, 0xd4, 0x25, + 0xb7, 0xc7, 0xa4, 0xfb, 0xa0, 0x17, 0xb2, 0x40, 0x0c, 0x75, 0x5d, 0x73, 0x53, 0xf0, 0xd2, 0x3b, + 0x1d, 0xd6, 0xb7, 0xc1, 0xc2, 0xe0, 0x18, 0x17, 0xb8, 0x70, 0x7c, 0xdb, 0x99, 0x31, 0xf4, 0x6e, + 0xa2, 0x02, 0x4f, 0xed, 0x2d, 0x2f, 0x59, 0x76, 0x11, 0x4f, 0x5d, 0xf3, 0xfd, 0xbb, 0xe3, 0x0f, + 0xa6, 0x83, 0xfa, 0xaf, 0x1b, 0xe5, 0xeb, 0xa3, 0xa5, 0x70, 0xa0, 0x6b, 0xda, 0x05, 0x10, 0x43, + 0xcd, 0x14, 0x7a, 0xc0, 0xc4, 0x55, 0x3f, 0x41, 0x09, 0x05, 0x5b, 0xcc, 0x51, 0xd2, 0x06, 0xae, + 0x55, 0x1d, 0x37, 0xc9, 0xfe, 0x7f, 0x86, 0xa6, 0x37, 0x4c, 0x43, 0x8e, 0x14, 0x75, 0xca, 0x98, + 0xb2, 0x1e, 0x4a, 0x8a, 0xb6, 0x2b, 0x52, 0x93, 0x8a, 0xad, 0x05, 0x89, 0xdc, 0x8b, 0x60, 0x3a, + 0x22, 0xe7, 0xb0, 0xa4, 0x8e, 0x8f, 0xc2, 0xea, 0x78, 0x0b, 0xa3, 0x66, 0x2d, 0x19, 0x14, 0xba, + 0x12, 0x2e, 0x13, 0x40, 0x51, 0x5c, 0x49, 0x41, 0xa9, 0xa4, 0x25, 0xc4, 0x64, 0x03, 0x6d, 0x74, + 0x4a, 0xc0, 0xb7, 0x42, 0xab, 0x90, 0x1c, 0xd0, 0x68, 0x94, 0x2b, 0x0d, 0xbe, 0xd4, 0x89, 0x80, + 0xbe, 0x5e, 0x74, 0xbe, 0xf2, 0xed, 0xca, 0x80, 0x25, 0x5d, 0x72, 0xe8, 0x6f, 0xad, 0x69, 0xe2, + 0x9f, 0x9f, 0x23, 0x22, 0xd0, 0xc3, 0x0d, 0xe8, 0x41, 0xc7, 0x08, 0x47, 0x0c, 0xea, 0x82, 0x80, + 0xa6, 0x92, 0xcd, 0xc5, 0xfd, 0x11, 0xec, 0x4e, 0x1f, 0x0b, 0x99, 0x60, 0x9a, 0xa6, 0x44, 0xfe, + 0xb2, 0x75, 0x75, 0x59, 0xf3, 0xe9, 0x41, 0xab, 0x0e, 0x03, 0x6e, 0xe1, 0x74, 0x59, 0xf9, 0x90, + 0xc0, 0x07, 0xe9, 0x1e, 0x94, 0x6e, 0xb9, 0xd9, 0x22, 0x5a, 0xad, 0xb6, 0xbb, 0xe2, 0x71, 0x04, + 0xf9, 0x26, 0x17, 0x9f, 0x3d, 0xf3, 0x9c, 0x45, 0x5d, 0xd3, 0x29, 0xbc, 0xcd, 0x30, 0xdf, 0x83, + 0x5c, 0x00, 0xba, 0x90, 0x6e, 0x3f, 0xdd, 0xcd, 0x0d, 0x1f, 0x97, 0x94, 0xe8, 0x8a, 0x8f, 0x50, + 0xf0, 0xb3, 0x8b, 0x75, 0x74, 0xcc, 0x1c, 0x59, 0x97, 0xea, 0x3e, 0xf2, 0xda, 0x80, 0xcb, 0xd2, + 0xd2, 0x1e, 0x77, 0xde, 0x73, 0x75, 0xac, 0xfc, 0x81, 0x13, 0xd9, 0x51, 0xbf, 0xd1, 0xa8, 0xf3, + 0x59, 0xf3, 0x0a, 0xbd, 0xed, 0x0e, 0x12, 0x44, 0xce, 0x5a, 0x69, 0x9c, 0x64, 0x96, 0x25, 0x7d, + 0x9c, 0xdc, 0x03, 0xab, 0xbb, 0x41, 0xfd, 0x71, 0x0a, 0x8c, 0x11, 0xdb, 0xdb, 0xea, 0x2d, 0x84, + 0x37, 0x34, 0xb5, 0xe4, 0x6a, 0x45, 0x86, 0x4b, 0x0f, 0xcc, 0xd6, 0x11, 0xe6, 0x84, 0x88, 0xc7, + 0x62, 0xf1, 0x90, 0x45, 0x64, 0xd6, 0x82, 0xc5, 0x5a, 0xeb, 0x3d, 0x15, 0x7e, 0x52, 0x07, 0xfd, + 0x84, 0x55, 0x5a, 0xe7, 0xc6, 0xb9, 0x70, 0xae, 0x21, 0xe5, 0x0f, 0xa3, 0x0a, 0x61, 0x2b, 0x40, + 0x18, 0x02, 0x02, 0x83, 0x25, 0x57, 0xaa, 0xa8, 0x04, 0x3a, 0x05, 0xe2, 0xaa, 0x59, 0x5f, 0xf6, + 0xe4, 0x3a, 0x7c, 0x0d, 0x67, 0x4d, 0xfb, 0xc9, 0xa6, 0xca, 0xc5, 0x25, 0x15, 0xa1, 0x50, 0xd1, + 0x1c, 0xd1, 0x1a, 0xfa, 0xf2, 0xc0, 0x6a, 0x71, 0xc2, 0x8a, 0xf1, 0x1f, 0x4a, 0xe3, 0x7f, 0x7b, + 0x83, 0x76, 0x70, 0xa7, 0xf1, 0xbf, 0x5d, 0x63, 0xfc, 0x43, 0x33, 0x85, 0xf1, 0xcf, 0x5f, 0x94, + 0xf1, 0xaf, 0x12, 0x92, 0xf8, 0xfa, 0x6d, 0xe2, 0xf9, 0xeb, 0xde, 0x80, 0xaa, 0xaf, 0x6d, 0xdd, + 0x3d, 0x50, 0x4b, 0x2a, 0xd0, 0xed, 0x14, 0xbd, 0x1e, 0xdc, 0x17, 0xd5, 0x68, 0x00, 0x33, 0xbf, + 0x12, 0x6b, 0x83, 0x04, 0xa9, 0x5a, 0x54, 0x2d, 0x86, 0x1a, 0xc0, 0xfd, 0x81, 0xe1, 0x56, 0x19, + 0xbe, 0x22, 0x0d, 0x73, 0x1f, 0x00, 0xa6, 0xfc, 0xfa, 0x0c, 0x06, 0xa7, 0xb4, 0xc8, 0x85, 0x09, + 0x65, 0xd7, 0xb8, 0xaf, 0x5c, 0xe3, 0xe2, 0xa9, 0x95, 0xe2, 0xf6, 0x5b, 0x86, 0x50, 0xd7, 0x57, + 0xee, 0xe3, 0xaa, 0xa2, 0x02, 0x40, 0x5f, 0x53, 0xe1, 0x2a, 0xee, 0xbb, 0xf1, 0xaf, 0x40, 0x4c, + 0xad, 0xcf, 0xec, 0x36, 0x45, 0xaf, 0xbc, 0x6c, 0x9f, 0x56, 0xcc, 0x2a, 0xdf, 0x96, 0x42, 0x8d, + 0x3a, 0x09, 0x4f, 0x49, 0x36, 0x13, 0x63, 0xa1, 0x97, 0xbd, 0xbc, 0xde, 0xa6, 0xb5, 0x81, 0x1e, + 0x73, 0x9f, 0x5a, 0x36, 0x89, 0x90, 0x0a, 0x45, 0xc4, 0x0f, 0x9e, 0x49, 0xbb, 0x6b, 0x73, 0xf1, + 0x6a, 0x21, 0x5c, 0x0e, 0x7b, 0x40, 0x01, 0xa7, 0xb2, 0x96, 0xa5, 0x57, 0x41, 0x0b, 0x66, 0x5f, + 0x56, 0x07, 0x5f, 0x6b, 0xf3, 0xd7, 0xbc, 0x27, 0x94, 0xf9, 0x1f, 0xeb, 0x3d, 0x58, 0xd2, 0x7e, + 0x10, 0xa6, 0x54, 0x5a, 0xb0, 0x14, 0x8e, 0x67, 0xe2, 0xf0, 0x55, 0x5c, 0x0f, 0xde, 0x88, 0x5a, + 0x47, 0x20, 0x00, 0x5c, 0xf1, 0x0c, 0xfc, 0xcf, 0x0a, 0x71, 0x9e, 0x91, 0x38, 0xc7, 0xfd, 0x2f, + 0xf6, 0x70, 0x63, 0xfb, 0xb2, 0x19, 0x68, 0x1d, 0xc4, 0x87, 0x93, 0xf1, 0xf5, 0xb0, 0x88, 0xe4, + 0x3f, 0x90, 0x90, 0xf6, 0xd2, 0x4a, 0x88, 0x72, 0x2c, 0x5b, 0x78, 0x5a, 0x71, 0x21, 0x01, 0x97, + 0x10, 0x98, 0x5c, 0x42, 0x88, 0x5b, 0xd8, 0x7c, 0x04, 0xac, 0x11, 0x6d, 0x98, 0x6b, 0xa2, 0x8d, + 0xd3, 0x0a, 0xb5, 0x63, 0xeb, 0x13, 0xda, 0xe6, 0x69, 0x26, 0xa6, 0x69, 0x26, 0xab, 0x67, 0xb9, + 0x42, 0x39, 0xe6, 0x0e, 0x3e, 0xc2, 0x1f, 0xae, 0x6f, 0xdc, 0x3d, 0x94, 0x3e, 0xb1, 0x27, 0x22, + 0x76, 0x4b, 0x22, 0xb6, 0xc0, 0x3a, 0x4a, 0x08, 0x99, 0x0a, 0xe8, 0x57, 0x1d, 0x07, 0x4d, 0xd1, + 0xe3, 0x36, 0x2b, 0xae, 0xbf, 0x6c, 0x10, 0xbc, 0x65, 0xd4, 0x73, 0xa0, 0x0c, 0x50, 0x60, 0x00, + 0xd9, 0xc0, 0x90, 0x55, 0xc1, 0x8e, 0xc9, 0x71, 0xb9, 0xa6, 0xa7, 0x61, 0x28, 0x34, 0x16, 0xb9, + 0x84, 0xc4, 0xa7, 0xd7, 0xea, 0x12, 0xa9, 0x3e, 0xaa, 0xa2, 0x19, 0x20, 0xae, 0x60, 0x8a, 0xcb, + 0x9d, 0x3b, 0x71, 0x62, 0x10, 0xf8, 0x46, 0x3a, 0x67, 0x93, 0x60, 0x16, 0xd0, 0xfa, 0x69, 0x85, + 0xde, 0x42, 0x89, 0xae, 0xe5, 0x3d, 0xcc, 0xa6, 0xe1, 0xa5, 0x82, 0x0d, 0x89, 0xa4, 0x58, 0xe0, + 0x05, 0x26, 0x0e, 0xa8, 0x97, 0x65, 0xd8, 0x3f, 0xa0, 0xa3, 0xce, 0x26, 0x09, 0x04, 0xdd, 0xae, + 0x2c, 0xa2, 0x73, 0x70, 0x08, 0x51, 0x31, 0x7c, 0xd4, 0x5c, 0x64, 0x73, 0x35, 0xac, 0x62, 0x80, + 0x24, 0x04, 0x3e, 0x4d, 0xe5, 0xfa, 0x48, 0x09, 0x01, 0x08, 0x80, 0xb5, 0x87, 0x6b, 0x52, 0x73, + 0xa9, 0xe9, 0x10, 0xbe, 0xd2, 0x21, 0x4e, 0xa2, 0x53, 0xae, 0x40, 0x88, 0x76, 0x72, 0x1c, 0xa5, + 0xa8, 0xd9, 0xe4, 0x56, 0x57, 0xa5, 0xc5, 0x50, 0xec, 0x25, 0x58, 0x16, 0x1b, 0x24, 0x6a, 0xf9, + 0x12, 0xa8, 0x9f, 0x54, 0x86, 0x2e, 0xd0, 0x19, 0x69, 0x38, 0x5c, 0x2c, 0xea, 0x2a, 0x0e, 0xe8, + 0x4d, 0x6a, 0x6f, 0xc7, 0x46, 0x66, 0x05, 0x29, 0x6b, 0x04, 0x29, 0x0e, 0x2b, 0xa0, 0x31, 0x20, + 0xed, 0x8e, 0x4f, 0xbe, 0xf7, 0x94, 0x83, 0x02, 0x5c, 0x4e, 0x83, 0xfe, 0x46, 0xbf, 0xfa, 0x9a, + 0xac, 0x0e, 0x43, 0x45, 0xa1, 0xa0, 0x1d, 0x1f, 0xd0, 0xc3, 0x8c, 0x86, 0x53, 0xe8, 0x88, 0x4c, + 0x4d, 0xde, 0x2e, 0xb1, 0xbe, 0xb3, 0x95, 0x49, 0xb1, 0x2f, 0xb7, 0x5a, 0xad, 0x13, 0xf0, 0xd9, + 0xe3, 0x25, 0xb7, 0x0e, 0xf3, 0x93, 0x60, 0xfa, 0x57, 0xcf, 0xc4, 0xd7, 0x60, 0x9a, 0x7f, 0x65, + 0x9e, 0x9e, 0x55, 0xf4, 0x20, 0xbf, 0x34, 0x30, 0x08, 0x12, 0xed, 0x33, 0x79, 0x85, 0x47, 0xbd, + 0xca, 0xcb, 0x8a, 0xac, 0x58, 0x56, 0x04, 0xca, 0xb2, 0xed, 0x9c, 0x6b, 0x5d, 0x39, 0x5f, 0x40, + 0xca, 0xee, 0x5c, 0x30, 0x1d, 0xd2, 0x6e, 0x93, 0x0b, 0x3f, 0x7d, 0x77, 0x1d, 0xbd, 0x4f, 0xe2, + 0x39, 0x4b, 0xb2, 0x5b, 0xe5, 0x42, 0xa5, 0x49, 0x0f, 0xbd, 0xfa, 0xe8, 0xe2, 0xcf, 0x6a, 0x9c, + 0xa6, 0x61, 0x8b, 0x72, 0x6a, 0xdc, 0xa3, 0x79, 0x08, 0x95, 0x6c, 0xb3, 0xb3, 0x8a, 0xeb, 0x6f, + 0xbd, 0x58, 0xc9, 0x9f, 0xab, 0x17, 0xac, 0xc8, 0x12, 0x6e, 0xc6, 0xdd, 0x01, 0x09, 0x7a, 0x70, + 0xf5, 0x0d, 0x2a, 0xd9, 0x1d, 0x46, 0xb0, 0xe8, 0xe5, 0x90, 0x91, 0xc3, 0x68, 0x73, 0x9d, 0x40, + 0x8d, 0xfc, 0xc9, 0x13, 0x29, 0x79, 0x2d, 0xd2, 0xc4, 0x46, 0x51, 0x0d, 0x6d, 0xe4, 0x7d, 0xa6, + 0xe7, 0x29, 0xd9, 0xa3, 0xf5, 0x8b, 0x80, 0x77, 0x0d, 0x8f, 0x60, 0xed, 0x61, 0x49, 0xd5, 0x28, + 0x55, 0x34, 0xc1, 0x89, 0x01, 0x9f, 0x52, 0x9b, 0xbb, 0xe6, 0x38, 0x10, 0xde, 0x3d, 0x0b, 0xe5, + 0xf6, 0x12, 0x37, 0xef, 0x8c, 0x61, 0x32, 0xf9, 0x9c, 0xb3, 0xd5, 0xca, 0xe2, 0x53, 0x94, 0xea, + 0x82, 0x93, 0x6d, 0x9e, 0x82, 0x6c, 0x47, 0x47, 0x56, 0xd8, 0x12, 0x85, 0x4a, 0x82, 0xa1, 0x34, + 0xdf, 0x69, 0x6e, 0x4c, 0xf5, 0xec, 0xe8, 0xe4, 0x64, 0xaa, 0xa9, 0x10, 0x15, 0x5b, 0xd4, 0x72, + 0x01, 0x65, 0x7c, 0x2b, 0xa8, 0xb9, 0x79, 0x35, 0x17, 0xf9, 0xa2, 0x68, 0x1e, 0x25, 0x4a, 0x6d, + 0x0d, 0xb8, 0x50, 0x61, 0xae, 0x2f, 0xaf, 0x02, 0x00, 0x15, 0xc5, 0x95, 0xc9, 0xaa, 0xb4, 0x3e, + 0xd5, 0x0e, 0x34, 0x3f, 0x2e, 0x92, 0x9a, 0x62, 0x74, 0x02, 0xef, 0x84, 0xeb, 0x78, 0x82, 0x51, + 0x96, 0x81, 0xf7, 0x80, 0xa5, 0xdf, 0xfa, 0x49, 0xb2, 0x46, 0x60, 0xf0, 0x05, 0x2b, 0x90, 0x16, + 0x5f, 0x2b, 0x69, 0x81, 0xc2, 0x82, 0xb0, 0x5d, 0xac, 0xa4, 0x81, 0x99, 0x1b, 0x08, 0x43, 0xae, + 0x62, 0xc6, 0x04, 0xf6, 0x12, 0xdf, 0x51, 0xfb, 0x8f, 0x41, 0xfc, 0x83, 0x05, 0xc6, 0xc1, 0x6f, + 0x34, 0xd4, 0xa3, 0x34, 0xf4, 0xda, 0x43, 0x9b, 0x49, 0xed, 0xa6, 0xcd, 0xab, 0xc1, 0x62, 0x09, + 0x56, 0x13, 0xca, 0xcc, 0xba, 0x4d, 0xc4, 0x93, 0x60, 0x48, 0xca, 0x9a, 0x77, 0x62, 0x8f, 0x2c, + 0x69, 0xb8, 0x24, 0xe8, 0xbe, 0x02, 0xab, 0x06, 0xc7, 0x39, 0x39, 0xe9, 0x9c, 0x82, 0xf1, 0x2a, + 0x3f, 0xc5, 0x2a, 0xbd, 0xce, 0xae, 0xa0, 0xa9, 0x46, 0x36, 0xea, 0xa9, 0xe6, 0x1d, 0xb1, 0x6f, + 0xa4, 0xc6, 0x00, 0x66, 0x72, 0xf2, 0x62, 0xba, 0x01, 0x2c, 0x47, 0x2b, 0x17, 0xc6, 0xd9, 0xfa, + 0x78, 0x52, 0x66, 0xc5, 0xb6, 0x6a, 0x4d, 0x73, 0x6d, 0xaf, 0x8d, 0x68, 0xd3, 0xae, 0xe8, 0x05, + 0x05, 0x04, 0x06, 0x7d, 0x37, 0x78, 0x15, 0xa8, 0x9a, 0x15, 0x6a, 0x42, 0x54, 0x5a, 0x20, 0x06, + 0xfb, 0x90, 0x91, 0x47, 0x55, 0x2c, 0x76, 0x3b, 0xd9, 0x06, 0x7a, 0x90, 0x3a, 0x66, 0x5b, 0x0d, + 0x46, 0xc0, 0x07, 0x83, 0x43, 0x82, 0x10, 0x07, 0xb8, 0x5b, 0xb5, 0x6a, 0x15, 0x83, 0xb2, 0x20, + 0xfd, 0x66, 0x35, 0x33, 0x7e, 0xdd, 0x84, 0x1f, 0x80, 0xa5, 0xc2, 0x11, 0xc6, 0xc1, 0xcf, 0xa1, + 0x06, 0x27, 0x84, 0x41, 0xc0, 0x81, 0xb8, 0xc7, 0xa6, 0x63, 0xf7, 0xd8, 0x74, 0xeb, 0x93, 0x72, + 0x3d, 0xce, 0xc8, 0x08, 0x40, 0x54, 0x6b, 0xc8, 0xd3, 0xac, 0x11, 0xce, 0x5d, 0x5c, 0x1c, 0xdc, + 0xcf, 0x61, 0xa4, 0x85, 0x3d, 0x94, 0xcb, 0x48, 0xaf, 0x74, 0xe2, 0x8a, 0x0a, 0x95, 0x78, 0xf5, + 0x04, 0x30, 0x0a, 0x4b, 0x7b, 0x99, 0xdc, 0x8e, 0x13, 0x70, 0x17, 0xea, 0xa5, 0x7f, 0x63, 0x81, + 0xf1, 0x21, 0x15, 0xd4, 0x62, 0x42, 0x87, 0x51, 0xc8, 0x0e, 0x83, 0x61, 0xd6, 0x6c, 0x0a, 0x99, + 0x31, 0xbc, 0x83, 0xba, 0x70, 0x50, 0x25, 0x81, 0x9f, 0x64, 0xa7, 0x0e, 0xee, 0x8c, 0x7a, 0x19, + 0xd1, 0x52, 0x93, 0x40, 0xb6, 0xd4, 0xf8, 0x50, 0x1b, 0x91, 0x20, 0x63, 0x2e, 0x94, 0xf6, 0x72, + 0xc7, 0x21, 0x94, 0x94, 0x53, 0x1b, 0xf7, 0xad, 0x82, 0x84, 0xd0, 0xde, 0xbc, 0xad, 0x0e, 0x72, + 0x1d, 0x7f, 0x59, 0xad, 0x02, 0x9c, 0x03, 0x0a, 0x27, 0xac, 0xad, 0xbc, 0xeb, 0x12, 0x90, 0x61, + 0x76, 0x24, 0xfb, 0xb5, 0xdd, 0x01, 0x7b, 0xa8, 0x42, 0x72, 0x31, 0xee, 0xf0, 0xb2, 0xcb, 0x8a, + 0x5c, 0x76, 0x98, 0x8c, 0x24, 0x75, 0x71, 0xd2, 0xe2, 0x27, 0x74, 0xcc, 0xdc, 0x15, 0xc9, 0x7c, + 0x83, 0xac, 0xfe, 0xe5, 0x7e, 0x73, 0x26, 0xe3, 0xfb, 0x52, 0xbe, 0x7c, 0x2e, 0x6d, 0x34, 0x36, + 0x20, 0x1c, 0x6a, 0x05, 0x95, 0xce, 0xc3, 0xcd, 0x73, 0x77, 0x13, 0x29, 0xdf, 0x7c, 0x99, 0x5e, + 0xc4, 0x8b, 0x70, 0x4a, 0x7b, 0x30, 0x2f, 0x48, 0x68, 0x19, 0xd7, 0x17, 0xf0, 0x07, 0x68, 0x97, + 0x74, 0xdc, 0x35, 0xc6, 0xaf, 0x30, 0xa0, 0x6c, 0xb6, 0x4e, 0x70, 0xf9, 0x1c, 0x19, 0x04, 0x1f, + 0x7a, 0xed, 0x22, 0xae, 0x72, 0x73, 0xfe, 0xa9, 0xc9, 0x1f, 0xaa, 0x0d, 0x7d, 0x5a, 0xc1, 0x2e, + 0x89, 0xba, 0xe1, 0xda, 0x5a, 0xba, 0xae, 0x56, 0xad, 0xad, 0xfe, 0x67, 0xb5, 0xdb, 0x79, 0x24, + 0xac, 0xb5, 0x9b, 0x21, 0x8a, 0xfa, 0x4a, 0x58, 0x43, 0xbc, 0x00, 0xe6, 0x81, 0x58, 0xc1, 0xe0, + 0xba, 0xbd, 0x8c, 0x13, 0x66, 0xde, 0xaf, 0xe8, 0xc9, 0xed, 0xc4, 0x82, 0xd6, 0xea, 0x07, 0x4a, + 0xee, 0x71, 0xa4, 0xfd, 0xcb, 0x45, 0xd7, 0xed, 0x75, 0xe9, 0x29, 0x9c, 0x6c, 0x2d, 0x6a, 0x8d, + 0x4d, 0x3d, 0xb6, 0x39, 0x4b, 0x79, 0xa9, 0x9e, 0x4f, 0x2e, 0x2c, 0xbf, 0x5b, 0x9f, 0xfd, 0xe7, + 0xa0, 0x45, 0x9e, 0x94, 0x1a, 0x31, 0xb3, 0xeb, 0x57, 0x55, 0xb5, 0xb6, 0x68, 0xca, 0x12, 0xe2, + 0x5e, 0x6e, 0x81, 0xe4, 0xed, 0x6e, 0x14, 0x21, 0x5a, 0xd3, 0x51, 0xa9, 0x69, 0xdd, 0x49, 0x15, + 0x11, 0xe1, 0x33, 0xcd, 0x53, 0x69, 0x9a, 0x30, 0x31, 0xe1, 0x84, 0xfc, 0x9c, 0x1f, 0x18, 0xc2, + 0x84, 0x8d, 0x3e, 0x2e, 0x28, 0x5e, 0xca, 0xdc, 0xf4, 0x58, 0x33, 0xc2, 0x39, 0x04, 0xea, 0x71, + 0x4c, 0x5d, 0x17, 0x6c, 0xdf, 0x59, 0x89, 0x92, 0xe7, 0x85, 0x22, 0x7b, 0xc2, 0x9a, 0xcd, 0xd3, + 0xa1, 0xb0, 0x59, 0x3d, 0xaa, 0xd4, 0xc7, 0xc5, 0xf6, 0x39, 0xee, 0xac, 0x27, 0xff, 0xa7, 0x85, + 0xab, 0x61, 0xfc, 0x49, 0x0e, 0x64, 0xad, 0xed, 0x67, 0x18, 0x06, 0x7a, 0x04, 0x38, 0xf7, 0x0a, + 0xfc, 0x8a, 0x37, 0x24, 0x53, 0x6e, 0x03, 0x9e, 0xdc, 0x38, 0xb7, 0xce, 0xef, 0xa7, 0xa8, 0x83, + 0xa2, 0x21, 0xcf, 0xfd, 0xa0, 0x62, 0xf9, 0x3c, 0xaf, 0xdb, 0xb3, 0xa4, 0x06, 0x47, 0xdb, 0xb8, + 0xa4, 0xa7, 0x89, 0xdd, 0x4b, 0xc5, 0x18, 0x2a, 0x3c, 0xe3, 0x44, 0x4e, 0x2f, 0x4a, 0x07, 0xe3, + 0x9e, 0x16, 0xd9, 0x5e, 0x49, 0xe3, 0x52, 0xb9, 0x6c, 0x65, 0xf8, 0xc9, 0x7c, 0x9e, 0x17, 0x13, + 0x11, 0xe9, 0x83, 0x95, 0x90, 0xce, 0x34, 0x14, 0x4b, 0x61, 0xfa, 0x17, 0x51, 0xaa, 0x76, 0x8b, + 0x79, 0x85, 0x62, 0x46, 0x92, 0x30, 0x0b, 0xaa, 0x71, 0x2b, 0x49, 0x35, 0x0b, 0xa4, 0xeb, 0x3d, + 0x2d, 0x9b, 0x60, 0xf5, 0xac, 0xe7, 0xf8, 0xeb, 0x9f, 0xb4, 0x05, 0xdb, 0xc8, 0xdb, 0x60, 0xfd, + 0x0d, 0x07, 0xbb, 0xbb, 0xdd, 0x5d, 0xa5, 0x02, 0x8e, 0x60, 0xb2, 0x2e, 0x16, 0x0f, 0xa3, 0xca, + 0x4e, 0xcf, 0xff, 0xa3, 0xd8, 0x3f, 0x57, 0x3a, 0x8d, 0xc1, 0xf7, 0x82, 0x2d, 0x26, 0x13, 0x86, + 0x7a, 0xbc, 0x0b, 0x55, 0x76, 0x1e, 0x58, 0xe5, 0xbf, 0xff, 0x5f, 0x77, 0x55, 0x39, 0xf3, 0x03, + 0x34, 0x9c, 0x5d, 0x2b, 0x2a, 0xdb, 0x37, 0x45, 0x85, 0x1d, 0xc7, 0x2f, 0x23, 0x54, 0x88, 0x00, + 0xc6, 0x97, 0x2f, 0xa9, 0x8f, 0xb8, 0x86, 0x57, 0x3b, 0x86, 0xae, 0xf5, 0x4f, 0x8f, 0x1f, 0x50, + 0xf8, 0xbd, 0xbc, 0xc4, 0x95, 0x3b, 0x52, 0xe5, 0x48, 0xa5, 0x50, 0x27, 0x33, 0x68, 0xa3, 0x76, + 0xca, 0x92, 0x2b, 0x96, 0x08, 0x5d, 0x43, 0xb7, 0x04, 0x79, 0xfd, 0xca, 0xf9, 0x41, 0xd1, 0x84, + 0x54, 0x2f, 0x87, 0x9c, 0xd4, 0x99, 0x54, 0xdc, 0x2b, 0x9b, 0xdc, 0x45, 0xae, 0xd5, 0xaa, 0xbe, + 0x83, 0xab, 0x95, 0xe8, 0xa0, 0x25, 0x44, 0x34, 0x4f, 0xaf, 0x66, 0x97, 0xd5, 0x6c, 0x9c, 0xec, + 0x47, 0x24, 0x14, 0xf5, 0x2a, 0x48, 0x27, 0xe2, 0x18, 0x3a, 0x39, 0xb5, 0xe5, 0xd0, 0x02, 0xe2, + 0xb6, 0x34, 0x24, 0x8e, 0x8a, 0x64, 0x1d, 0xb5, 0x22, 0x75, 0xab, 0x30, 0x47, 0x54, 0x5d, 0x4a, + 0xbb, 0x70, 0x2b, 0xfd, 0xde, 0xfa, 0xb2, 0x8e, 0x8f, 0xfe, 0x01, 0x3c, 0x81, 0x2a, 0x33, 0xda, + 0xd0, 0xcc, 0x26, 0xbc, 0x10, 0x01, 0x79, 0xe4, 0xd5, 0x2a, 0xc1, 0xef, 0x56, 0x34, 0x22, 0x4d, + 0x1b, 0x5a, 0x44, 0x9f, 0xa3, 0xf8, 0x3a, 0xd2, 0xe5, 0xa6, 0x34, 0xbc, 0x24, 0x29, 0xf8, 0x76, + 0x1d, 0x8a, 0xea, 0xaa, 0xe4, 0xfa, 0x9f, 0x71, 0x1d, 0x64, 0x17, 0x46, 0x1c, 0x31, 0xd1, 0x04, + 0xc8, 0x43, 0x03, 0x54, 0x09, 0x54, 0xac, 0xd2, 0xbb, 0xdb, 0x71, 0xaa, 0x78, 0x77, 0xef, 0x1c, + 0xe5, 0x72, 0x67, 0xef, 0x1a, 0x3f, 0xb7, 0x86, 0x20, 0x8a, 0x6c, 0x1a, 0x3d, 0xd8, 0xf6, 0x43, + 0xc8, 0xa1, 0xde, 0x02, 0xc5, 0xd3, 0x60, 0xb8, 0xca, 0x60, 0x6d, 0xd2, 0x3f, 0x29, 0x83, 0x52, + 0x2c, 0xb5, 0x83, 0x9a, 0x27, 0x88, 0x0f, 0x84, 0x01, 0x93, 0x70, 0xa9, 0xbe, 0x5a, 0x35, 0x09, + 0xe9, 0x3b, 0x4c, 0x56, 0xda, 0x3d, 0x22, 0x96, 0xf9, 0xd0, 0x19, 0xce, 0xf8, 0x36, 0x92, 0x50, + 0x6c, 0xf5, 0x78, 0x1a, 0x4d, 0x5f, 0xde, 0xb0, 0x09, 0xea, 0x84, 0x67, 0xb8, 0xb7, 0xdb, 0xdd, + 0xd9, 0x79, 0xbc, 0xdc, 0x74, 0xb8, 0x30, 0xdf, 0xc1, 0xda, 0xce, 0x1c, 0xbe, 0x71, 0x85, 0x0f, + 0x55, 0x65, 0x41, 0x98, 0x9f, 0xc0, 0xd1, 0x8e, 0xcd, 0x85, 0xf6, 0x50, 0xeb, 0x0d, 0x3b, 0xf5, + 0x7c, 0xa7, 0xf4, 0xde, 0x02, 0xf1, 0x84, 0x52, 0xf8, 0x4e, 0xf8, 0x09, 0x54, 0x82, 0x1e, 0x8d, + 0x7c, 0x5b, 0x3f, 0x1a, 0x54, 0x67, 0x4c, 0xa0, 0x4e, 0x55, 0xbb, 0xd2, 0xdd, 0xe6, 0x00, 0x32, + 0x6f, 0x99, 0x0f, 0x59, 0x8b, 0xb2, 0x78, 0xa5, 0x8c, 0xa5, 0x05, 0x51, 0x66, 0xaf, 0x9d, 0x91, + 0xd5, 0x1b, 0x96, 0xeb, 0x01, 0x4e, 0xe8, 0xf1, 0x13, 0x78, 0x42, 0xd5, 0x21, 0x67, 0xb2, 0x9c, + 0xe9, 0xc9, 0xd5, 0x1b, 0xda, 0xc2, 0x63, 0x4e, 0x93, 0x3a, 0x1e, 0xd3, 0x63, 0x23, 0x98, 0x1c, + 0x5d, 0xda, 0xbd, 0x60, 0xf9, 0xc5, 0xd2, 0x02, 0xee, 0x67, 0xb0, 0x8b, 0xd3, 0x45, 0x7e, 0xb9, + 0xb5, 0xe2, 0x34, 0x4b, 0xb5, 0xcd, 0xe1, 0xda, 0xc1, 0x32, 0xdf, 0x0b, 0xc1, 0x7a, 0xe0, 0xd5, + 0xc3, 0x2f, 0xb7, 0x55, 0x0a, 0x47, 0xb7, 0xaf, 0x54, 0x91, 0x88, 0xfb, 0xa2, 0xc5, 0x4e, 0x05, + 0x14, 0x9e, 0x02, 0x40, 0x10, 0xf8, 0x6e, 0x44, 0x35, 0x64, 0x5e, 0xb5, 0x75, 0x1d, 0xc8, 0x2c, + 0xc7, 0x6a, 0xb4, 0xc3, 0x97, 0xfa, 0x71, 0xaf, 0xce, 0x50, 0x5b, 0x6e, 0xd5, 0x31, 0x8b, 0x43, + 0xf4, 0x65, 0x07, 0xd2, 0x6e, 0x6d, 0x13, 0x55, 0xeb, 0x2d, 0x55, 0xbb, 0x3c, 0xe3, 0xa4, 0x35, + 0x0d, 0x46, 0xae, 0x7e, 0x0a, 0x54, 0x3b, 0xbf, 0x66, 0xd9, 0xde, 0xd1, 0xf2, 0x1a, 0x14, 0xb2, + 0xeb, 0xb4, 0x45, 0x87, 0xe3, 0x2c, 0x75, 0x8c, 0xad, 0x42, 0x7a, 0x00, 0x0f, 0x13, 0x38, 0x87, + 0xb9, 0x1e, 0x88, 0xce, 0xce, 0x9d, 0x1e, 0xeb, 0xd9, 0xd2, 0xdf, 0x42, 0xb4, 0xcd, 0x3d, 0xf3, + 0xc1, 0x0c, 0x4f, 0x6f, 0x55, 0xd7, 0x1c, 0x55, 0x37, 0x69, 0xd3, 0x50, 0x28, 0x69, 0xaf, 0xd3, + 0xeb, 0xb7, 0x1b, 0x8d, 0x52, 0xde, 0x2c, 0x8e, 0x8d, 0x71, 0x70, 0x3e, 0x1a, 0x8d, 0x4c, 0x3a, + 0x82, 0x8b, 0x1b, 0x8c, 0xac, 0x70, 0xb5, 0x7a, 0xb2, 0x34, 0xaf, 0x4c, 0x37, 0x4b, 0x40, 0xa7, + 0x7b, 0xa2, 0xad, 0x60, 0x68, 0xfb, 0x8f, 0x84, 0x93, 0x6e, 0x68, 0xe2, 0xd9, 0xc4, 0x37, 0x48, + 0x09, 0x62, 0x0e, 0x07, 0xf5, 0x74, 0x7c, 0x0c, 0x69, 0xe2, 0x75, 0x64, 0x85, 0x9e, 0x96, 0x87, + 0x9f, 0x01, 0xe4, 0x19, 0xe4, 0xc1, 0x45, 0x93, 0xde, 0xca, 0x5f, 0xd4, 0xce, 0xd7, 0xad, 0x36, + 0xfa, 0xf3, 0xa8, 0xaa, 0x8d, 0x65, 0xbf, 0xde, 0x58, 0xb8, 0x63, 0x8b, 0x13, 0x79, 0xc0, 0x6e, + 0x48, 0x74, 0xa0, 0xe9, 0xe3, 0xc1, 0x73, 0xdd, 0x48, 0xd4, 0x96, 0x48, 0x6d, 0xfc, 0x2e, 0xed, + 0xa6, 0x7b, 0x2c, 0xbe, 0x9a, 0x05, 0x09, 0xbd, 0xa6, 0x61, 0x8d, 0xd1, 0xc5, 0xaa, 0x06, 0x5e, + 0x86, 0x60, 0x65, 0xad, 0x1b, 0x4f, 0xa9, 0xdf, 0xba, 0xb7, 0xfd, 0xa4, 0x2d, 0x60, 0x41, 0xf3, + 0xf3, 0x76, 0x43, 0x9e, 0x8e, 0x96, 0xe7, 0xf7, 0x0d, 0x79, 0xba, 0x2a, 0x4f, 0x85, 0xce, 0x00, + 0x30, 0x13, 0x7d, 0x2a, 0x5a, 0xb7, 0x33, 0xe1, 0xf5, 0xe5, 0x3a, 0xe2, 0xdd, 0xee, 0x8e, 0x51, + 0x09, 0x5d, 0x4a, 0x4d, 0x73, 0xb5, 0xe4, 0x00, 0x7a, 0xfb, 0x56, 0xa9, 0x06, 0x72, 0x36, 0x74, + 0x09, 0xce, 0x6f, 0xf0, 0x50, 0x91, 0xfa, 0x36, 0xac, 0x9c, 0xa1, 0x10, 0x84, 0x46, 0x5b, 0x02, + 0x75, 0xc6, 0xf5, 0xf9, 0x6e, 0x79, 0x0a, 0x15, 0xf4, 0x1e, 0x1d, 0x9c, 0xdf, 0xd1, 0x96, 0x51, + 0x27, 0x48, 0x69, 0xb3, 0x7f, 0x89, 0xe1, 0x4b, 0x87, 0x00, 0x80, 0xe1, 0x65, 0x16, 0xf1, 0x20, + 0xcb, 0x8c, 0xac, 0x6a, 0x6d, 0xe8, 0x4a, 0xbd, 0x67, 0xd9, 0xc4, 0xa9, 0x96, 0x69, 0x51, 0xf4, + 0x0a, 0x40, 0x04, 0xfd, 0xae, 0x7f, 0xe6, 0x01, 0x93, 0xe0, 0x3b, 0x7f, 0x70, 0x4a, 0x5e, 0xa5, + 0x92, 0xb3, 0x76, 0xad, 0x6f, 0xf2, 0xe8, 0x2c, 0x7d, 0xc0, 0x4d, 0x14, 0x95, 0x3d, 0x75, 0x74, + 0x60, 0x99, 0x37, 0x2f, 0x26, 0x4e, 0x1a, 0x8c, 0x9f, 0x08, 0x10, 0xd9, 0x60, 0xe9, 0xd3, 0x77, + 0x94, 0x04, 0x9c, 0x25, 0xcb, 0xad, 0x81, 0x7b, 0xce, 0xb2, 0x67, 0x28, 0x03, 0x41, 0xc8, 0x3c, + 0x0f, 0x31, 0xfc, 0xe3, 0x0f, 0xc0, 0x07, 0x96, 0x2d, 0x7a, 0xa7, 0x2a, 0x7d, 0x70, 0x39, 0xd1, + 0xeb, 0xb5, 0xfc, 0x9b, 0x90, 0xc0, 0xd6, 0xb2, 0xda, 0x35, 0x58, 0xe0, 0x12, 0x5b, 0x85, 0x70, + 0xf2, 0xe4, 0x88, 0x9a, 0x5a, 0xc4, 0xa7, 0xf6, 0xfc, 0xc6, 0x36, 0x5d, 0xb3, 0x1a, 0x03, 0x4a, + 0x8b, 0xc3, 0x21, 0x97, 0xe3, 0x54, 0x28, 0x08, 0x93, 0x4b, 0x57, 0x5c, 0x52, 0xbb, 0x9d, 0x63, + 0x6c, 0x01, 0x36, 0x32, 0x4d, 0x57, 0x41, 0x68, 0xed, 0x9c, 0x7c, 0xfa, 0xe9, 0x97, 0xd3, 0x9d, + 0x73, 0xc7, 0x34, 0x68, 0xb7, 0x86, 0x48, 0xb5, 0xfe, 0xfa, 0xe9, 0x7a, 0xd9, 0xc9, 0xed, 0x95, + 0xf5, 0x29, 0x6d, 0xf2, 0x47, 0xc8, 0xc3, 0xbc, 0x23, 0x24, 0xa1, 0x8f, 0x30, 0x60, 0x92, 0x78, + 0x68, 0xc2, 0xc2, 0x7d, 0x84, 0xc7, 0xc9, 0xe4, 0x65, 0x38, 0x2c, 0x01, 0xa2, 0x07, 0x80, 0x58, + 0x16, 0xc7, 0x56, 0x45, 0x78, 0x22, 0x12, 0x40, 0x92, 0xb3, 0x5b, 0xd0, 0xe7, 0x97, 0xfe, 0xe4, + 0x42, 0xdf, 0x13, 0x67, 0x2f, 0xeb, 0x76, 0x01, 0x63, 0x5b, 0x18, 0x00, 0x45, 0x06, 0x8b, 0x78, + 0x01, 0xef, 0xef, 0xe0, 0xbd, 0x7e, 0xeb, 0x3a, 0xe6, 0xa6, 0xc8, 0x33, 0x7a, 0xf6, 0x97, 0x98, + 0xb0, 0x39, 0x7f, 0xc8, 0x48, 0x88, 0x17, 0xf9, 0x5f, 0x63, 0xc2, 0xa6, 0xfc, 0xf1, 0xbc, 0xc8, + 0x1a, 0xcf, 0x51, 0xa1, 0x72, 0xb4, 0xdd, 0x97, 0xa5, 0x5d, 0x5a, 0xe5, 0xf4, 0x7f, 0x10, 0x23, + 0xf7, 0xe5, 0xd0, 0xb7, 0x7e, 0x32, 0xd2, 0xef, 0xec, 0x7a, 0x10, 0xee, 0x42, 0x30, 0x06, 0xb0, + 0xcd, 0x74, 0x14, 0x50, 0x88, 0xc7, 0xcd, 0x28, 0xfb, 0xdf, 0x69, 0x40, 0xb0, 0xfe, 0x69, 0xb9, + 0xf6, 0xe9, 0x43, 0x07, 0xaf, 0x12, 0x24, 0x45, 0xf5, 0x1c, 0x71, 0x95, 0x5d, 0x04, 0xa9, 0xe0, + 0x52, 0x11, 0x5b, 0xc7, 0x33, 0xdb, 0xad, 0xbe, 0xe9, 0x28, 0xea, 0xf7, 0x30, 0x8b, 0x88, 0x4f, + 0xf1, 0x81, 0x18, 0x19, 0xa4, 0x02, 0x9b, 0xcd, 0x40, 0x6c, 0x3c, 0x0d, 0x43, 0x90, 0xb8, 0x53, + 0xcf, 0xc4, 0xf5, 0x42, 0xb3, 0x9a, 0x07, 0x46, 0x85, 0x76, 0xce, 0xd1, 0x41, 0xb1, 0x1d, 0x8c, + 0x2b, 0x01, 0x93, 0x19, 0x36, 0xa7, 0x66, 0xa2, 0xca, 0x84, 0x57, 0x01, 0x8f, 0xe7, 0x76, 0x58, + 0xa5, 0x5e, 0xfb, 0xee, 0x76, 0x80, 0xd5, 0x83, 0x48, 0x36, 0x34, 0x2d, 0x6d, 0xe6, 0x43, 0x28, + 0x79, 0xed, 0xb7, 0x92, 0x50, 0x2a, 0x3d, 0xef, 0x08, 0x45, 0xe5, 0x5f, 0x4e, 0xbf, 0xda, 0xe2, + 0x36, 0xae, 0xba, 0x16, 0xeb, 0xd4, 0x62, 0xad, 0xd5, 0x24, 0x5a, 0x23, 0x3e, 0x7b, 0x78, 0xd6, + 0xba, 0x81, 0x05, 0xb2, 0xc0, 0xf6, 0x36, 0xe0, 0xf5, 0x25, 0xd2, 0x10, 0xc7, 0x2a, 0xce, 0xda, + 0x65, 0x84, 0x60, 0x7a, 0x6d, 0x9d, 0x48, 0xf7, 0x5a, 0x18, 0x1e, 0x98, 0x18, 0x13, 0x86, 0x34, + 0xf7, 0x82, 0xc7, 0x05, 0x04, 0x3d, 0x79, 0xab, 0x53, 0x0f, 0x4b, 0xc6, 0x0b, 0xd2, 0x60, 0x54, + 0xd6, 0xe6, 0x45, 0x2f, 0x6a, 0x8a, 0x11, 0x1f, 0xd4, 0x14, 0xab, 0xf4, 0x7f, 0xad, 0x64, 0x3c, + 0x17, 0x56, 0x03, 0x0e, 0x6b, 0x3c, 0x47, 0x03, 0xd8, 0x3f, 0x27, 0xf3, 0x14, 0x23, 0xf5, 0x48, + 0x72, 0xde, 0xf2, 0x88, 0xa0, 0x37, 0xa0, 0x08, 0x59, 0x47, 0x65, 0xdd, 0x40, 0x7f, 0x22, 0xda, + 0x51, 0xe8, 0xa9, 0x8c, 0xda, 0x49, 0x19, 0x0c, 0xaa, 0xa2, 0x8b, 0xa3, 0x70, 0x1d, 0xcf, 0x90, + 0x24, 0xa8, 0x53, 0x8b, 0x39, 0x52, 0x84, 0x3e, 0xb0, 0x47, 0x15, 0x1f, 0x40, 0x1c, 0x02, 0xc2, + 0x4c, 0x51, 0xa8, 0xbc, 0x46, 0x6e, 0xbb, 0x94, 0xa8, 0xcd, 0xd1, 0x41, 0x94, 0x82, 0xd5, 0xff, + 0x8c, 0x01, 0x15, 0x42, 0x4b, 0xbc, 0x4c, 0x04, 0x7c, 0x71, 0x1c, 0x8c, 0x43, 0x98, 0x31, 0x35, + 0x44, 0xa8, 0x4d, 0x8c, 0x62, 0xb3, 0x90, 0x3e, 0x86, 0x55, 0xc3, 0x9f, 0xb6, 0x43, 0xe1, 0x46, + 0x3d, 0x32, 0x87, 0xec, 0x25, 0x3f, 0x03, 0xc2, 0x9a, 0x61, 0x71, 0xfc, 0x03, 0xf4, 0x0a, 0x33, + 0xb7, 0x31, 0xc4, 0x0a, 0x10, 0x3c, 0xce, 0xa8, 0xf1, 0x67, 0x50, 0x27, 0x91, 0x25, 0x2d, 0xf4, + 0xc4, 0x58, 0xe6, 0x37, 0xfc, 0x90, 0x4a, 0xd8, 0x34, 0xc9, 0xf3, 0x3e, 0x43, 0x25, 0x04, 0xcf, + 0x68, 0x9a, 0x76, 0x51, 0x6a, 0x99, 0x59, 0x3e, 0xc6, 0xf5, 0x00, 0x96, 0xa3, 0x18, 0x3a, 0x25, + 0x1e, 0x02, 0x43, 0x13, 0xd4, 0x4b, 0xc7, 0x7c, 0x89, 0xe1, 0x3f, 0x0c, 0x68, 0x2f, 0x83, 0x0e, + 0x61, 0x8d, 0x65, 0x31, 0x42, 0xd3, 0x43, 0x0b, 0xec, 0x51, 0x3f, 0x0c, 0x6f, 0xb9, 0x55, 0x97, + 0x97, 0xe7, 0x8a, 0xfa, 0x35, 0x6a, 0x6d, 0x41, 0x55, 0xae, 0x6b, 0xd3, 0xde, 0xa8, 0x2d, 0xa6, + 0x47, 0x63, 0x12, 0x91, 0x2a, 0xae, 0x5e, 0xf8, 0xe9, 0x05, 0x4a, 0x06, 0x45, 0x9d, 0x13, 0x2e, + 0x2f, 0x52, 0xb9, 0x4e, 0x80, 0x66, 0xa1, 0xe3, 0xaf, 0x9b, 0x29, 0xe2, 0x1c, 0x06, 0x05, 0x1d, + 0xd9, 0xb0, 0x4d, 0x52, 0xc1, 0x2a, 0x3c, 0x26, 0xec, 0xd0, 0xaf, 0x3d, 0xb6, 0xa1, 0x09, 0x1d, + 0x19, 0xe5, 0xc3, 0xba, 0x2f, 0x27, 0xfa, 0x53, 0x84, 0x1f, 0x3a, 0xb4, 0xcb, 0xcb, 0x92, 0xd9, + 0x86, 0x45, 0x71, 0x1b, 0xdb, 0xaf, 0x6f, 0x6b, 0x43, 0xbd, 0x39, 0xd6, 0xcb, 0xfd, 0x79, 0x6f, + 0x13, 0xaf, 0x3b, 0x94, 0x8f, 0x87, 0x03, 0xf5, 0xd8, 0x6c, 0xda, 0x91, 0xca, 0xe2, 0x08, 0x50, + 0x8a, 0x8c, 0x0f, 0xec, 0xf0, 0x86, 0xea, 0xb6, 0xa0, 0x3e, 0xee, 0xa7, 0xbe, 0xf4, 0x4d, 0x5b, + 0x39, 0xad, 0xf1, 0xa5, 0x26, 0xf6, 0x42, 0x58, 0xbb, 0x05, 0x90, 0xf6, 0x42, 0x33, 0xa1, 0xcf, + 0xc8, 0xb8, 0x3f, 0x35, 0xd2, 0x48, 0x1b, 0x6d, 0x3d, 0xe4, 0xcf, 0x03, 0x32, 0xae, 0x91, 0xd0, + 0xc6, 0x9c, 0x18, 0x7b, 0xe1, 0x61, 0x39, 0x8f, 0x6f, 0xd3, 0x07, 0x42, 0x19, 0x86, 0x0f, 0xc9, + 0xc8, 0xec, 0xaa, 0xdc, 0x2e, 0x32, 0xe8, 0xfc, 0x50, 0x9e, 0x30, 0x81, 0xee, 0xdb, 0xe5, 0xad, + 0x8c, 0xa1, 0xbe, 0x4b, 0x4d, 0x6c, 0x1f, 0xaa, 0x06, 0xa9, 0xca, 0xd6, 0xf2, 0x64, 0x98, 0x87, + 0xb6, 0xb2, 0x23, 0xb8, 0x60, 0xee, 0xda, 0x90, 0xd2, 0xe6, 0xa6, 0x7b, 0x69, 0x45, 0x51, 0xa7, + 0x44, 0xbb, 0x14, 0xc6, 0x46, 0x8d, 0x1d, 0x94, 0x6e, 0x34, 0xd4, 0x6e, 0x55, 0x54, 0x0d, 0x5a, + 0x29, 0x79, 0xae, 0xf0, 0x90, 0x10, 0x1f, 0x35, 0xca, 0x52, 0xc4, 0xc6, 0x28, 0xd7, 0x23, 0x33, + 0x22, 0x86, 0x79, 0x46, 0x71, 0x54, 0x69, 0x53, 0x46, 0x1a, 0x34, 0x9e, 0xb3, 0x88, 0xa6, 0x51, + 0x9f, 0x95, 0x28, 0x81, 0x67, 0x95, 0xb2, 0x89, 0x76, 0xbb, 0xf3, 0x15, 0x17, 0xca, 0x85, 0x7b, + 0xde, 0xe4, 0xfa, 0x51, 0xe6, 0x64, 0x14, 0x33, 0x07, 0x92, 0xf3, 0x4c, 0xa5, 0x86, 0x4e, 0xd8, + 0x68, 0xf8, 0xcd, 0x66, 0x5e, 0x3a, 0xd4, 0x5d, 0x1a, 0x98, 0xa6, 0xef, 0x3c, 0xe0, 0xd8, 0xc5, + 0x5a, 0xdc, 0x2c, 0x18, 0x0c, 0x34, 0xaf, 0x8f, 0x81, 0x11, 0x41, 0x0d, 0x45, 0x7d, 0xeb, 0x55, + 0xc6, 0x2e, 0xe5, 0xe9, 0x00, 0x54, 0x25, 0xd4, 0x82, 0x8f, 0x7c, 0x10, 0x21, 0xfa, 0x34, 0x48, + 0x18, 0x27, 0x3c, 0x2a, 0xb3, 0x2d, 0x03, 0x37, 0x48, 0x6f, 0x39, 0x93, 0x3c, 0x5a, 0xf7, 0xd9, + 0xd3, 0xe3, 0xfc, 0x29, 0x4f, 0xd5, 0x9a, 0x96, 0xa3, 0xf9, 0xb0, 0xca, 0x27, 0xf1, 0xca, 0xc2, + 0x5f, 0xf2, 0xb5, 0x38, 0x0b, 0x83, 0x47, 0x60, 0xae, 0x78, 0xf8, 0xb0, 0xf5, 0xd0, 0x17, 0x7a, + 0x39, 0x85, 0x0b, 0xad, 0x20, 0x41, 0x2b, 0xd7, 0x17, 0x36, 0x16, 0x2e, 0x22, 0x09, 0xca, 0x5d, + 0x03, 0x3a, 0x36, 0xcf, 0xcb, 0xd8, 0xa4, 0x0d, 0x3b, 0x26, 0xce, 0xb2, 0x26, 0xa1, 0x65, 0x7d, + 0x30, 0x8a, 0x8a, 0x4b, 0xa1, 0xf1, 0x68, 0xa6, 0x90, 0x27, 0x77, 0xa1, 0x52, 0x5a, 0x36, 0x84, + 0xc9, 0xd7, 0xec, 0xf2, 0xd9, 0x86, 0xef, 0x4e, 0x0a, 0x22, 0xe9, 0x51, 0xd8, 0xe9, 0xb4, 0x95, + 0x97, 0x60, 0xa7, 0x8b, 0x8b, 0xad, 0x94, 0x63, 0x16, 0xc6, 0xc0, 0x58, 0x32, 0xd3, 0x76, 0xa7, + 0xfd, 0x75, 0x66, 0xe3, 0xe7, 0xd8, 0xdb, 0x1d, 0xe2, 0xfe, 0x4a, 0x86, 0x9b, 0xd6, 0x27, 0x99, + 0xd5, 0x76, 0xda, 0xd2, 0xa7, 0xa1, 0xaa, 0xd1, 0xb6, 0x1d, 0x7a, 0xad, 0xdd, 0x21, 0x3b, 0xec, + 0x0e, 0x19, 0x08, 0x66, 0x99, 0x98, 0x60, 0x62, 0x72, 0xd8, 0x69, 0x0f, 0x51, 0x5c, 0x87, 0x27, + 0xf1, 0x69, 0x13, 0xfe, 0x34, 0x3b, 0xfc, 0xa7, 0x7b, 0x7a, 0xd4, 0x6d, 0xd3, 0xa4, 0x32, 0x0b, + 0xc2, 0x90, 0x34, 0x25, 0xef, 0x0c, 0x2f, 0xc7, 0x78, 0xbc, 0xc4, 0xac, 0xb9, 0x43, 0xbf, 0x90, + 0x5b, 0x3e, 0x75, 0x4f, 0x73, 0xfb, 0xcc, 0xf1, 0x5b, 0x63, 0x76, 0x1e, 0x44, 0xef, 0x01, 0x76, + 0x0b, 0xcf, 0x2e, 0xf8, 0xc9, 0xc4, 0x4a, 0xbe, 0xce, 0x9a, 0x91, 0xc3, 0xbe, 0xce, 0x9c, 0x56, + 0x1f, 0xfe, 0xb4, 0x9d, 0xee, 0xd7, 0xd4, 0xb7, 0xf7, 0xaf, 0x30, 0x07, 0x56, 0x8f, 0xfe, 0xa1, + 0xb8, 0xe9, 0xf5, 0x28, 0x38, 0xa8, 0x08, 0xeb, 0x29, 0xa2, 0x7a, 0x1a, 0x7e, 0x7a, 0x1b, 0x4d, + 0x8e, 0x1e, 0x6d, 0x29, 0xd5, 0x83, 0xd3, 0x19, 0x6d, 0x8f, 0x00, 0x95, 0x85, 0x81, 0x0c, 0x61, + 0xd3, 0xc2, 0xf3, 0xc0, 0xbd, 0x36, 0x4e, 0x56, 0xfb, 0x51, 0x05, 0xdc, 0x4c, 0x3c, 0xae, 0x88, + 0xe0, 0x9a, 0xf6, 0xa8, 0x7e, 0x6f, 0x38, 0x50, 0x30, 0x01, 0x70, 0x42, 0xc7, 0xbf, 0x58, 0x7a, + 0x99, 0x6e, 0x8b, 0xd5, 0xff, 0x53, 0xd3, 0x76, 0x29, 0xea, 0x16, 0x86, 0xb0, 0x8a, 0x46, 0xda, + 0xd2, 0x49, 0x54, 0xec, 0x83, 0xb5, 0x5d, 0x20, 0x49, 0xb1, 0xb3, 0x02, 0x78, 0x2e, 0x38, 0x8f, + 0xac, 0x14, 0xb8, 0x20, 0x9c, 0xb5, 0xb0, 0xaa, 0x57, 0x51, 0x90, 0xbd, 0xe3, 0xb5, 0xad, 0x56, + 0xa0, 0x0f, 0x0d, 0xf9, 0xb6, 0xd5, 0xad, 0x6c, 0xb5, 0xda, 0xda, 0x02, 0x03, 0xf0, 0x22, 0xb8, + 0x44, 0xde, 0x11, 0xaa, 0xad, 0xef, 0x7d, 0xb6, 0x82, 0x46, 0x03, 0xa3, 0xb0, 0x05, 0x97, 0xf3, + 0x18, 0x6d, 0xe4, 0x89, 0x4c, 0x4a, 0x18, 0xb0, 0xdc, 0x15, 0x93, 0xdb, 0x12, 0xc1, 0xde, 0x41, + 0x5d, 0x70, 0xf4, 0xd9, 0x12, 0x4f, 0xb6, 0x4b, 0x3f, 0x4a, 0x49, 0x4e, 0x5b, 0x78, 0x23, 0xcd, + 0x48, 0x94, 0xc6, 0x67, 0xdb, 0x4d, 0x9c, 0x19, 0xa6, 0xfb, 0x73, 0xb4, 0x2c, 0x92, 0x00, 0x84, + 0x36, 0xd5, 0xb6, 0x80, 0xc4, 0x28, 0x06, 0xc9, 0x44, 0x6a, 0xd7, 0xa2, 0xd1, 0xc8, 0x0a, 0xd4, + 0xdf, 0x83, 0x33, 0x2a, 0x76, 0x2a, 0x76, 0x72, 0x2f, 0xc8, 0x2f, 0x0a, 0x09, 0xab, 0x15, 0xb1, + 0x82, 0xb6, 0xa9, 0x89, 0x92, 0x71, 0xab, 0x08, 0xaf, 0x77, 0xea, 0x21, 0xdc, 0x22, 0xd6, 0xdc, + 0x6a, 0x05, 0xb6, 0xe5, 0xd8, 0xc3, 0xf7, 0x79, 0x1c, 0xde, 0x22, 0x9d, 0x8c, 0xf8, 0x67, 0xf9, + 0x0a, 0x8a, 0xac, 0x5d, 0x3d, 0x66, 0xf7, 0x87, 0xc9, 0x5f, 0xff, 0x6a, 0x70, 0x65, 0xdf, 0xc0, + 0xd0, 0x98, 0x5c, 0x3b, 0xf5, 0xc7, 0x30, 0x9b, 0xe2, 0x01, 0x05, 0x59, 0x94, 0xf6, 0x42, 0x4d, + 0x8d, 0x89, 0x1f, 0x61, 0xe0, 0x56, 0x18, 0x1d, 0xd0, 0xcf, 0xa7, 0xc6, 0x5f, 0xff, 0x6a, 0x3a, + 0x26, 0x05, 0x1f, 0xbe, 0xe6, 0xe1, 0xda, 0x0f, 0x54, 0x9c, 0xff, 0xaf, 0x7a, 0x07, 0x1d, 0x5c, + 0x58, 0x00, 0xab, 0xeb, 0x2a, 0xfe, 0xcc, 0x9e, 0x85, 0xf1, 0xf8, 0xe3, 0x0f, 0xaf, 0x53, 0x77, + 0xee, 0x44, 0x31, 0x86, 0x28, 0x25, 0xab, 0xff, 0x07, 0x06, 0x3d, 0x3b, 0x3f, 0x67, 0x49, 0xea, + 0x02, 0x1b, 0x46, 0xc0, 0x69, 0x13, 0x74, 0x2f, 0xb3, 0xf3, 0x04, 0x83, 0xe4, 0x5e, 0xe6, 0x5e, + 0x5a, 0x28, 0x93, 0x9f, 0xd7, 0xdd, 0x67, 0x5e, 0xe1, 0x3e, 0x43, 0x4a, 0x01, 0x1d, 0xce, 0x65, + 0x02, 0x33, 0xd7, 0x95, 0x8d, 0x8f, 0x60, 0x64, 0x88, 0x9e, 0xf0, 0x7d, 0x88, 0xf6, 0xa8, 0x9a, + 0xe2, 0x9e, 0x9c, 0x3a, 0xb7, 0xde, 0xb5, 0x66, 0xd3, 0x4c, 0xd2, 0x74, 0x5b, 0xc4, 0xa2, 0x45, + 0x75, 0xa2, 0xf4, 0x0d, 0x17, 0x61, 0xb4, 0x8f, 0x57, 0xde, 0x56, 0xe4, 0x5f, 0x05, 0x60, 0xae, + 0xc5, 0x09, 0x05, 0xb8, 0x7e, 0x8a, 0xfe, 0x14, 0x34, 0xeb, 0x1b, 0x8d, 0xad, 0xba, 0x4f, 0x40, + 0x3d, 0x68, 0x20, 0xec, 0xbc, 0x9c, 0x9e, 0xb3, 0x4f, 0x3b, 0x9f, 0xa6, 0xcd, 0x4f, 0x2d, 0xf8, + 0xb3, 0x63, 0x3b, 0x8f, 0x75, 0x06, 0xc3, 0x5b, 0x35, 0x3e, 0xfe, 0xf0, 0xca, 0x3d, 0x7b, 0xbc, + 0x5c, 0x0b, 0x99, 0x9a, 0xe3, 0x3a, 0x66, 0x69, 0x01, 0x33, 0xd7, 0x73, 0x81, 0xc0, 0xc0, 0x05, + 0x4d, 0x0d, 0xe4, 0x1d, 0x30, 0xcd, 0xd6, 0xbf, 0xa7, 0x74, 0xa0, 0xb0, 0xed, 0xac, 0x7f, 0x81, + 0xa9, 0x0f, 0xe6, 0xda, 0x29, 0xbb, 0x79, 0x37, 0xa3, 0xc2, 0xcd, 0x8e, 0xed, 0xae, 0xe5, 0xca, + 0xcf, 0x9c, 0x1b, 0x0f, 0x97, 0xf5, 0x3c, 0xee, 0xbe, 0xf8, 0xd5, 0xbf, 0xf2, 0x39, 0x4d, 0x9b, + 0x40, 0x6a, 0x30, 0xe2, 0x22, 0xe6, 0x2d, 0xe7, 0x6c, 0x78, 0xa7, 0xcd, 0x1a, 0x48, 0x0d, 0x16, + 0x0c, 0x97, 0xb3, 0xc4, 0x01, 0x74, 0xb3, 0x9c, 0xaf, 0x3d, 0x2d, 0xd3, 0xcf, 0xc1, 0xdc, 0x7d, + 0x8a, 0xc3, 0xbe, 0xb6, 0x33, 0xec, 0xa9, 0x5d, 0x30, 0xd3, 0x53, 0xe4, 0x3d, 0xb4, 0xb7, 0x28, + 0xfe, 0xea, 0x0f, 0xb8, 0x9d, 0xf0, 0xb1, 0x4d, 0x51, 0x30, 0xed, 0xe1, 0x53, 0x2f, 0x43, 0xeb, + 0x2d, 0x8d, 0x71, 0xb2, 0xf1, 0x8e, 0x00, 0x70, 0x0f, 0x34, 0x93, 0x13, 0xa6, 0x76, 0x7e, 0x9e, + 0x62, 0x30, 0x3c, 0x72, 0xa5, 0xa5, 0x3f, 0x05, 0x19, 0xc6, 0xfc, 0x5c, 0xad, 0x32, 0xcc, 0xa3, + 0x6d, 0x64, 0xab, 0xd2, 0xd7, 0xd3, 0xa2, 0x6d, 0x6c, 0xf2, 0x07, 0x76, 0xfe, 0xf2, 0x66, 0x0e, + 0x20, 0xc9, 0xd6, 0x32, 0x98, 0x37, 0xad, 0x4c, 0x72, 0xe5, 0x4b, 0x8c, 0xfa, 0x58, 0x5d, 0x99, + 0xcb, 0x2e, 0x92, 0xf8, 0xda, 0x60, 0xb9, 0xed, 0x1c, 0x63, 0x99, 0xa5, 0x45, 0xb2, 0x2d, 0x61, + 0x28, 0x9e, 0x5e, 0x72, 0xf6, 0x05, 0xde, 0x17, 0x3e, 0xf4, 0xd4, 0x9f, 0xf9, 0x49, 0x50, 0xac, + 0xa5, 0x09, 0xfe, 0x7e, 0x69, 0x43, 0x23, 0xce, 0x14, 0x5b, 0x2a, 0xf8, 0xe2, 0x9d, 0xee, 0xda, + 0x18, 0x99, 0x06, 0x97, 0x78, 0xc0, 0x9c, 0xb3, 0x24, 0xbe, 0x04, 0xf3, 0x92, 0xb9, 0xa6, 0x49, + 0x4b, 0x1a, 0xaf, 0x85, 0x36, 0xba, 0x15, 0xd0, 0x21, 0xf2, 0x8d, 0x07, 0x7c, 0x4a, 0x72, 0x9c, + 0x93, 0xf8, 0x36, 0x0a, 0xd8, 0x53, 0x47, 0xff, 0xc0, 0x9b, 0x81, 0x71, 0x10, 0xdf, 0xc0, 0x3a, + 0xff, 0x7c, 0x92, 0xb0, 0x50, 0x94, 0x80, 0xb9, 0x3d, 0x04, 0x2e, 0xe7, 0x1f, 0x8b, 0x03, 0x6f, + 0x81, 0xd4, 0x7f, 0xcb, 0x81, 0x5e, 0x39, 0xde, 0x48, 0xd3, 0xfe, 0x22, 0xb8, 0x36, 0x80, 0x04, + 0x0d, 0xda, 0xfc, 0x34, 0x17, 0x0e, 0xa6, 0x4a, 0x46, 0x4a, 0x90, 0x61, 0x05, 0xe1, 0xdb, 0x6b, + 0x84, 0x85, 0x9f, 0x1f, 0xe1, 0x8b, 0x52, 0xbc, 0x4e, 0x73, 0xab, 0x08, 0xe3, 0x95, 0xb5, 0xd8, + 0x9c, 0x8e, 0x96, 0xa0, 0xaa, 0xca, 0x81, 0x7c, 0xee, 0xed, 0x7c, 0xfa, 0xb4, 0x73, 0x5e, 0xe0, + 0xff, 0x57, 0xd1, 0xce, 0x76, 0xc7, 0xa3, 0x15, 0x49, 0xc9, 0x31, 0x2e, 0x00, 0x21, 0x3d, 0x13, + 0x14, 0x6b, 0x57, 0x9e, 0x98, 0x97, 0x34, 0x6b, 0x3b, 0x5b, 0x6d, 0x11, 0x6b, 0x57, 0x8d, 0xe0, + 0x56, 0x47, 0x5b, 0x7f, 0xff, 0x88, 0x7c, 0x55, 0x9c, 0x40, 0xa7, 0x37, 0x5c, 0xff, 0xb5, 0x70, + 0xa5, 0xcb, 0x7d, 0x63, 0x99, 0xad, 0x1d, 0x18, 0x5e, 0x48, 0xd4, 0x74, 0x2a, 0x9e, 0x4b, 0x50, + 0x6b, 0x42, 0xe7, 0x55, 0x04, 0x3c, 0x5f, 0x89, 0x1d, 0x69, 0x2a, 0x61, 0x24, 0xe2, 0xbc, 0x35, + 0xa3, 0xa3, 0xed, 0x2e, 0xe9, 0xe9, 0x99, 0x92, 0x06, 0xd4, 0x99, 0x64, 0x14, 0xb9, 0xf4, 0x10, + 0xad, 0x56, 0xd1, 0x51, 0x32, 0x4a, 0xdc, 0x08, 0xf4, 0x8e, 0xed, 0xce, 0x56, 0xa9, 0x9f, 0x9f, + 0x3e, 0x91, 0x89, 0x8a, 0x7a, 0xa4, 0x5c, 0xa8, 0x78, 0xee, 0xa0, 0xbc, 0xb0, 0x1d, 0xc9, 0x7c, + 0x6d, 0xe0, 0x39, 0xf9, 0xdc, 0x91, 0x91, 0x3b, 0x8d, 0xa2, 0xb5, 0xac, 0x84, 0x35, 0x90, 0x33, + 0x4d, 0x9a, 0x42, 0xcd, 0x56, 0x51, 0xdc, 0x2a, 0xca, 0xaf, 0x56, 0xf2, 0x43, 0x47, 0xff, 0xd0, + 0x85, 0x0f, 0x5d, 0x1a, 0x02, 0x65, 0xe0, 0xb3, 0xa6, 0x47, 0x80, 0xac, 0x56, 0x9d, 0x4d, 0x1f, + 0x0a, 0x10, 0x75, 0xa4, 0x6d, 0x04, 0x8c, 0x6f, 0x88, 0x26, 0xe0, 0xa8, 0x60, 0x76, 0x92, 0xa8, + 0x73, 0x6b, 0xa7, 0x23, 0xda, 0xaa, 0xe2, 0x22, 0x01, 0x25, 0x23, 0x2b, 0x52, 0xf5, 0xa8, 0x2c, + 0xa4, 0xa6, 0x46, 0x22, 0x35, 0x2a, 0xea, 0xe6, 0xc2, 0xd5, 0x76, 0x8b, 0x22, 0xfb, 0xfa, 0x8b, + 0x2a, 0xbf, 0xd6, 0xe8, 0x69, 0x09, 0xc9, 0x75, 0x88, 0x15, 0x52, 0xaf, 0xd8, 0xf8, 0x8e, 0xb8, + 0xe5, 0x1d, 0x4d, 0x15, 0x28, 0xb8, 0x43, 0xb0, 0x46, 0xda, 0x03, 0x6d, 0xd1, 0xc9, 0x20, 0xae, + 0x95, 0x6f, 0x77, 0x34, 0xf5, 0x18, 0x98, 0xf8, 0x50, 0x39, 0x31, 0x50, 0x49, 0x96, 0x0c, 0xc0, + 0xc3, 0xb7, 0xf2, 0x01, 0x42, 0xa7, 0x4a, 0xf9, 0xb5, 0xa9, 0x8d, 0x18, 0xbe, 0xe2, 0x98, 0xc1, + 0x5f, 0x7c, 0x53, 0x51, 0x45, 0x97, 0x01, 0x4c, 0xcc, 0x73, 0x50, 0x86, 0x61, 0x90, 0xd0, 0xf5, + 0x12, 0x65, 0x41, 0xb4, 0x60, 0xb9, 0x42, 0x39, 0xaf, 0x06, 0xcb, 0x75, 0xf4, 0x72, 0x4b, 0xc8, + 0xde, 0x29, 0xb2, 0x93, 0x0b, 0x67, 0xa8, 0x4a, 0x9c, 0x0e, 0x6d, 0x80, 0x72, 0xe8, 0x8b, 0x8d, + 0xd1, 0x45, 0x3a, 0x80, 0x23, 0x4e, 0x1d, 0xa5, 0x02, 0x19, 0x3e, 0x34, 0x8c, 0x01, 0x21, 0xb0, + 0xc7, 0x72, 0x0b, 0x08, 0xd1, 0xbc, 0xaf, 0x0e, 0x28, 0xa9, 0xac, 0x36, 0x2e, 0x8b, 0x6f, 0x44, + 0xb6, 0xdd, 0x0c, 0x5a, 0xbf, 0xc6, 0x60, 0xb2, 0x98, 0xa6, 0xbe, 0x9f, 0xe7, 0x17, 0x3a, 0xdd, + 0x92, 0x48, 0x7a, 0x8b, 0xbc, 0x25, 0x97, 0x50, 0xa9, 0x5b, 0x56, 0x7f, 0x41, 0xdb, 0x4e, 0x5a, + 0xe2, 0x13, 0x18, 0x84, 0x93, 0x78, 0xce, 0x6a, 0xb3, 0xf0, 0x2f, 0x76, 0xce, 0xf7, 0xe5, 0x8a, + 0x02, 0x8d, 0xc6, 0x87, 0xe2, 0x05, 0x37, 0x80, 0x8a, 0x27, 0x6c, 0x18, 0x0c, 0x1e, 0x51, 0x46, + 0x0e, 0x68, 0x6a, 0x04, 0xe8, 0x17, 0x17, 0xa9, 0x02, 0xb0, 0xc0, 0xfb, 0x08, 0x2a, 0x38, 0x58, + 0x45, 0x58, 0x13, 0xff, 0x74, 0x92, 0x9e, 0x62, 0xd0, 0x4e, 0xfe, 0x1c, 0xc0, 0x20, 0x58, 0xda, + 0x1b, 0xd8, 0x94, 0x36, 0xd5, 0x9f, 0x4b, 0x49, 0x57, 0xf4, 0xf9, 0x15, 0x17, 0x4b, 0x78, 0x00, + 0x15, 0x89, 0x42, 0x4e, 0x57, 0x22, 0xfc, 0xb0, 0xe4, 0xcc, 0xe1, 0x34, 0x56, 0x48, 0x29, 0x34, + 0x93, 0x04, 0xf9, 0x0e, 0x4a, 0xe2, 0xf2, 0xa5, 0x91, 0xd9, 0xaa, 0xf2, 0xeb, 0x0b, 0xe0, 0x36, + 0x8b, 0x86, 0xc6, 0xa2, 0x3a, 0xca, 0x14, 0xec, 0x24, 0xdb, 0x74, 0x94, 0x54, 0xc1, 0xf0, 0x43, + 0x59, 0x34, 0x72, 0x90, 0x48, 0x02, 0x16, 0x43, 0x01, 0xac, 0x45, 0x27, 0xe1, 0xf8, 0x66, 0x21, + 0x0c, 0x0b, 0xc9, 0x5d, 0xa7, 0xb2, 0xd1, 0x26, 0xab, 0xf0, 0xa4, 0x3e, 0xb0, 0xef, 0xe5, 0xc0, + 0xf2, 0x4d, 0xee, 0x49, 0xa3, 0xf1, 0xca, 0x4a, 0x0a, 0x64, 0x73, 0x17, 0x61, 0x34, 0x2c, 0x40, + 0xf8, 0xc1, 0xca, 0xd4, 0xe7, 0x93, 0xe8, 0x54, 0x00, 0x23, 0xda, 0x4a, 0x86, 0x11, 0xc0, 0x78, + 0x17, 0x8b, 0x6a, 0x03, 0x29, 0x51, 0xce, 0x6b, 0x94, 0x44, 0xb3, 0x5a, 0x11, 0x76, 0xca, 0x52, + 0x0c, 0xd4, 0x9f, 0x02, 0xe4, 0x0f, 0x1c, 0x64, 0x27, 0xe2, 0x47, 0xec, 0x0a, 0x5a, 0x90, 0x40, + 0xfa, 0xde, 0x1b, 0x20, 0x82, 0x04, 0xaa, 0x22, 0x9d, 0x0c, 0x94, 0x07, 0xb0, 0xb8, 0x66, 0x58, + 0xc9, 0x89, 0x7f, 0xca, 0xff, 0xe2, 0x74, 0x80, 0x7b, 0xf3, 0xb9, 0x86, 0x43, 0xba, 0x8c, 0x75, + 0xf6, 0x03, 0xfb, 0x95, 0xdc, 0x6c, 0x06, 0xcc, 0xbb, 0x46, 0x2c, 0xcc, 0x24, 0xc3, 0x7c, 0xbc, + 0xf4, 0x73, 0x93, 0x6b, 0x26, 0x8f, 0x97, 0x58, 0x38, 0x37, 0xb2, 0x18, 0x1e, 0xb1, 0x82, 0xbc, + 0x75, 0xc6, 0xe5, 0xeb, 0x04, 0xea, 0x4b, 0xf9, 0x81, 0xc4, 0xea, 0x3a, 0xf9, 0xc4, 0x96, 0x1c, + 0x2e, 0x84, 0x58, 0xec, 0xbd, 0xb7, 0x22, 0xe7, 0x8d, 0x35, 0x21, 0x18, 0xf1, 0xef, 0x30, 0x1e, + 0x61, 0xc5, 0x5e, 0xac, 0x36, 0x7e, 0x5e, 0xfb, 0x49, 0x64, 0x9d, 0xbd, 0xf1, 0xe7, 0x73, 0x72, + 0xb8, 0x3f, 0x5e, 0xa6, 0x00, 0xc3, 0xf6, 0x11, 0x3e, 0x61, 0x43, 0xf0, 0x32, 0x8d, 0x59, 0x4a, + 0x5e, 0x7d, 0x61, 0x1d, 0x9e, 0xc1, 0xb0, 0x22, 0x24, 0x6f, 0x9d, 0xdf, 0xc0, 0xc6, 0x04, 0x19, + 0xd1, 0x76, 0xd8, 0x95, 0x1f, 0xda, 0x96, 0xb9, 0xf0, 0x8e, 0x38, 0x76, 0xad, 0x85, 0x6d, 0xca, + 0xa5, 0x94, 0xef, 0x70, 0x5b, 0x19, 0xce, 0xeb, 0xef, 0xa1, 0x63, 0x41, 0x4a, 0x8a, 0xa7, 0xc0, + 0x5f, 0xe6, 0x95, 0x39, 0x56, 0xa9, 0x37, 0xe5, 0xab, 0x20, 0x4c, 0xa9, 0x33, 0x3b, 0xcb, 0x34, + 0x99, 0xb8, 0x37, 0xe4, 0xa7, 0x9c, 0xb5, 0x7e, 0x99, 0x7a, 0xe5, 0x06, 0x1d, 0x36, 0x77, 0x31, + 0xd6, 0xee, 0xb0, 0x7a, 0xda, 0x85, 0x1b, 0x86, 0xce, 0x82, 0x4e, 0x85, 0xae, 0xad, 0xa9, 0xa2, + 0x2a, 0x66, 0x3a, 0xa4, 0x87, 0xa2, 0x02, 0x68, 0xbd, 0xf5, 0xb6, 0xb6, 0xac, 0xdf, 0x3c, 0xd1, + 0x86, 0xad, 0x0e, 0xe9, 0x0a, 0xf5, 0x73, 0xbd, 0x02, 0x11, 0xb2, 0x1c, 0x95, 0x5d, 0x0f, 0x54, + 0xd0, 0xdf, 0x3c, 0x0b, 0x09, 0x9d, 0x2b, 0xe0, 0xb2, 0xd3, 0x30, 0x0e, 0xa9, 0xad, 0x3a, 0x1e, + 0x7c, 0x71, 0xc7, 0xc9, 0x14, 0x90, 0x4a, 0x98, 0xc3, 0xd1, 0x70, 0xc6, 0xfb, 0xfe, 0xb5, 0x9f, + 0x1a, 0x97, 0x44, 0x36, 0x4f, 0x80, 0x6c, 0xf2, 0x27, 0x43, 0x0e, 0x39, 0x7a, 0x06, 0x02, 0xef, + 0xf2, 0x0c, 0x63, 0x25, 0x16, 0x97, 0xa2, 0xe0, 0xcd, 0x05, 0xaa, 0x35, 0x5c, 0xad, 0x10, 0xce, + 0x61, 0x15, 0xb8, 0x49, 0x2b, 0x0c, 0xd3, 0xb4, 0xa5, 0xbd, 0x82, 0x19, 0xa1, 0x7f, 0xf5, 0xb8, + 0xd7, 0x02, 0xcc, 0xe6, 0x14, 0x90, 0x56, 0xba, 0x0c, 0x82, 0xf0, 0x83, 0x81, 0x59, 0x48, 0x6d, + 0x57, 0x1a, 0x3a, 0xed, 0x44, 0xe7, 0x1c, 0xc0, 0x0d, 0x69, 0xc4, 0x3c, 0x52, 0xdd, 0xe3, 0x65, + 0x82, 0x51, 0xb0, 0x20, 0xdb, 0xc7, 0x24, 0x04, 0xc5, 0x32, 0x37, 0xac, 0xc7, 0x30, 0xd3, 0x41, + 0x2f, 0x73, 0x1b, 0xe8, 0x1e, 0x06, 0x56, 0x36, 0x96, 0xcb, 0x27, 0x27, 0x00, 0xed, 0x13, 0x37, + 0x8e, 0x2e, 0x70, 0xe2, 0xd9, 0x34, 0xdc, 0xc1, 0xe6, 0xd1, 0xf2, 0xeb, 0xbf, 0x72, 0x62, 0xf0, + 0x35, 0xaf, 0x27, 0x21, 0xa9, 0x1c, 0xdd, 0x2a, 0xb7, 0xf3, 0xcd, 0x38, 0x44, 0x23, 0x84, 0x62, + 0x41, 0x18, 0x82, 0x82, 0x1c, 0x5c, 0x86, 0xbb, 0xab, 0x42, 0x0a, 0x67, 0x89, 0x34, 0xf6, 0x02, + 0x8f, 0x0f, 0x7c, 0x8f, 0x7a, 0x3f, 0x27, 0x93, 0x9f, 0x90, 0x75, 0xd0, 0xff, 0x73, 0x4c, 0x74, + 0x20, 0xfd, 0xae, 0xe9, 0x62, 0x4e, 0x22, 0x8c, 0xca, 0x3c, 0xf3, 0x7e, 0x42, 0x77, 0xb5, 0x48, + 0xc2, 0x99, 0xfb, 0xa7, 0x56, 0x44, 0x1e, 0xe8, 0x9f, 0x74, 0xed, 0xde, 0x76, 0xbe, 0xf1, 0xde, + 0x8a, 0x6a, 0xff, 0xe8, 0x3d, 0xe1, 0x1f, 0xcc, 0x1b, 0x13, 0x08, 0x90, 0x25, 0x99, 0x20, 0x2f, + 0xb0, 0xe9, 0x4d, 0xa0, 0x1f, 0xac, 0xf6, 0x77, 0xe7, 0x5b, 0xe7, 0x4f, 0xce, 0x8f, 0x9e, 0xa0, + 0x5f, 0xe9, 0x19, 0xb2, 0xbe, 0x13, 0xeb, 0x79, 0x92, 0x5d, 0xde, 0x2a, 0xbd, 0x6a, 0xb4, 0x89, + 0xc7, 0x37, 0x11, 0x77, 0x30, 0x4b, 0xe8, 0x8c, 0x01, 0xb2, 0x2b, 0xad, 0xd4, 0x8b, 0x0b, 0xa3, + 0x3c, 0x1c, 0x40, 0xb6, 0x7e, 0x66, 0xad, 0x18, 0xd6, 0x8d, 0x9c, 0x28, 0xae, 0x29, 0x31, 0x8b, + 0x6d, 0xc9, 0x46, 0x62, 0x2d, 0xe9, 0x72, 0xce, 0x28, 0xb7, 0x97, 0x65, 0xa3, 0x39, 0x02, 0x0a, + 0x35, 0x91, 0x94, 0x11, 0x69, 0x11, 0x57, 0xa4, 0x9f, 0xc1, 0x43, 0xe7, 0x14, 0x70, 0x15, 0x81, + 0xca, 0x0c, 0x43, 0x11, 0x9d, 0xf4, 0x4e, 0x9d, 0x17, 0xf0, 0xd3, 0x3f, 0xc5, 0x61, 0x74, 0xee, + 0x1c, 0x76, 0x01, 0x16, 0x4f, 0xdd, 0x04, 0x59, 0x82, 0x57, 0xc3, 0x20, 0x3d, 0xe0, 0xf6, 0x48, + 0x39, 0xd7, 0x9d, 0x49, 0xff, 0x24, 0xf5, 0xd1, 0x7b, 0xbc, 0x5c, 0x80, 0xf2, 0x6d, 0xe6, 0x47, + 0x63, 0x0f, 0x95, 0x0c, 0x34, 0xdf, 0x9e, 0x54, 0x1c, 0x08, 0x4f, 0xee, 0x75, 0x20, 0xa4, 0xc2, + 0x81, 0x80, 0xee, 0x83, 0xcd, 0xb4, 0xf7, 0x20, 0x39, 0xf4, 0x44, 0xb6, 0x29, 0xe4, 0xd0, 0x13, + 0x45, 0x57, 0x4f, 0x1c, 0x82, 0xd8, 0x85, 0xd9, 0x62, 0x91, 0x9b, 0x4e, 0xb1, 0x0d, 0xf1, 0xd3, + 0xd9, 0x52, 0x50, 0x5f, 0x6a, 0xba, 0x4b, 0x20, 0x34, 0xd7, 0xfc, 0xf4, 0x78, 0x39, 0xb6, 0x9e, + 0x3c, 0xb1, 0x73, 0x33, 0xcf, 0x3f, 0x9d, 0x21, 0x58, 0x92, 0xb8, 0x7c, 0x30, 0x60, 0x4f, 0x1e, + 0x2f, 0x9f, 0xe1, 0xce, 0x31, 0x3c, 0xc1, 0x02, 0x7f, 0x20, 0xff, 0x93, 0x9b, 0x27, 0x0e, 0x14, + 0xe0, 0xb5, 0x90, 0x73, 0xf1, 0x89, 0x6d, 0xe6, 0x0e, 0x48, 0x8b, 0xdb, 0xd1, 0x19, 0x7c, 0x78, + 0xbc, 0xfc, 0x63, 0xfe, 0x44, 0x99, 0x55, 0x22, 0xf7, 0x13, 0x87, 0x63, 0x0a, 0x48, 0xf9, 0x09, + 0x88, 0xee, 0x33, 0xd7, 0x9c, 0xf9, 0xa8, 0xd3, 0x52, 0xb9, 0xf3, 0x91, 0xa9, 0x2a, 0xfc, 0x64, + 0xde, 0x7c, 0x2a, 0x51, 0xff, 0x27, 0x72, 0x5b, 0x7d, 0x32, 0xd7, 0xeb, 0x5c, 0xe6, 0xb2, 0x56, + 0xcc, 0x81, 0xd5, 0x9a, 0xaa, 0xda, 0x53, 0xf2, 0xb6, 0xdc, 0x18, 0xde, 0x91, 0x98, 0x84, 0x6f, + 0x80, 0x98, 0x9e, 0xf0, 0x99, 0xf9, 0xc9, 0x48, 0x4c, 0x4e, 0x37, 0x82, 0x69, 0x30, 0xdb, 0xd6, + 0xd6, 0x0d, 0xcd, 0x35, 0x54, 0xde, 0x76, 0x6f, 0xe4, 0x02, 0xb9, 0xef, 0x1d, 0xf1, 0xd5, 0x4b, + 0x50, 0xf0, 0xd3, 0xec, 0x0d, 0x27, 0x17, 0xeb, 0xe4, 0x09, 0x12, 0xe8, 0x93, 0x53, 0x5c, 0x81, + 0x06, 0x6b, 0x18, 0x03, 0x1b, 0x3c, 0xf9, 0x1a, 0x20, 0x38, 0xfc, 0x24, 0x5d, 0xdb, 0x67, 0xe2, + 0x18, 0x2a, 0x48, 0x8e, 0xb4, 0xb4, 0xff, 0x32, 0xe0, 0x1b, 0xe1, 0xb7, 0x22, 0xfd, 0x6e, 0x07, + 0x2b, 0xa5, 0x9b, 0x61, 0xa4, 0xbf, 0x86, 0xaf, 0x6c, 0xa3, 0x33, 0x4e, 0x0c, 0x3c, 0xa9, 0xc9, + 0x8d, 0x46, 0x9b, 0x2c, 0x42, 0x22, 0x96, 0xb5, 0x65, 0x59, 0x5b, 0x31, 0x36, 0xdb, 0x34, 0x5d, + 0x0d, 0x17, 0xe4, 0x46, 0xda, 0x38, 0x07, 0x17, 0xf1, 0x1d, 0x12, 0xa1, 0xc1, 0x75, 0x76, 0x9b, + 0xd6, 0x62, 0xb4, 0x90, 0x27, 0xae, 0xdb, 0x60, 0x49, 0x1f, 0xd0, 0xf9, 0xe5, 0x1a, 0x59, 0x99, + 0x67, 0xad, 0x38, 0x42, 0x39, 0xed, 0x05, 0x77, 0x0a, 0x55, 0x87, 0x8e, 0x77, 0x99, 0x30, 0x8b, + 0x40, 0x2e, 0x13, 0xd5, 0xe3, 0x51, 0xd6, 0xe2, 0x6f, 0x5e, 0xe2, 0xae, 0x75, 0xbd, 0x75, 0x9d, + 0x04, 0x00, 0x28, 0x58, 0x00, 0x60, 0x1f, 0x04, 0x28, 0xb2, 0xdd, 0x12, 0x7d, 0x3e, 0x5b, 0xad, + 0x7e, 0xb3, 0x6e, 0xa4, 0x4c, 0x25, 0x7a, 0x54, 0xbb, 0x1b, 0x70, 0x40, 0xbf, 0xa1, 0xe0, 0x96, + 0xb6, 0x73, 0xdb, 0x68, 0x60, 0xbe, 0x3f, 0x2a, 0x2a, 0xc2, 0x60, 0xb6, 0x50, 0x0e, 0xaf, 0x72, + 0x10, 0x94, 0x89, 0x47, 0xb0, 0xb4, 0x92, 0xdf, 0x8b, 0x92, 0xe7, 0xbc, 0x24, 0x12, 0x99, 0xd8, + 0x72, 0x47, 0xdb, 0x9d, 0xab, 0x15, 0x2d, 0x73, 0x59, 0x15, 0x3f, 0x57, 0x52, 0xaa, 0xeb, 0x05, + 0xaf, 0xeb, 0x14, 0x25, 0xcc, 0x9f, 0xbd, 0xee, 0xe1, 0x61, 0xe7, 0x40, 0x8c, 0xf6, 0x5f, 0x3c, + 0xf2, 0x56, 0x94, 0x2f, 0x65, 0x92, 0xaf, 0x9d, 0x01, 0x7f, 0x47, 0x0f, 0x44, 0x8b, 0xdf, 0xfc, + 0x64, 0x83, 0x44, 0x1c, 0x69, 0xa7, 0x3b, 0x34, 0xeb, 0x40, 0x99, 0x24, 0xfa, 0x09, 0xe8, 0x61, + 0x74, 0x98, 0x0c, 0x6d, 0x0c, 0x2c, 0x84, 0x84, 0x71, 0xe1, 0x27, 0xcf, 0x81, 0x68, 0x9e, 0x66, + 0x56, 0x04, 0x06, 0x70, 0xee, 0x7e, 0x71, 0x45, 0x5a, 0x1e, 0xbd, 0x32, 0x98, 0x2d, 0x4e, 0xa0, + 0xc6, 0x53, 0x0f, 0xcf, 0x74, 0x37, 0x12, 0xfb, 0xf0, 0x70, 0x7f, 0x95, 0x1c, 0x1d, 0x1d, 0xed, + 0x63, 0xbc, 0x3b, 0xa8, 0xe4, 0x67, 0x87, 0x41, 0x0b, 0x4c, 0x3f, 0x77, 0xc0, 0x9b, 0xcc, 0x98, + 0x27, 0x2d, 0x2a, 0x18, 0x0a, 0x30, 0x66, 0x78, 0xd4, 0x95, 0xe1, 0x10, 0x3f, 0x1d, 0x79, 0x3f, + 0x2b, 0xff, 0x87, 0x8f, 0x61, 0x73, 0x24, 0x83, 0xfc, 0xac, 0x37, 0x9e, 0x31, 0x1e, 0x07, 0x09, + 0xbd, 0x0c, 0x36, 0xf9, 0xc6, 0x86, 0x07, 0xe4, 0x54, 0x19, 0x59, 0x49, 0x13, 0xb2, 0x0a, 0xd7, + 0x05, 0x34, 0x6f, 0x83, 0x5d, 0x06, 0xa8, 0xb6, 0xc8, 0xa9, 0x84, 0x87, 0x95, 0xf6, 0xbb, 0x3d, + 0xca, 0xb9, 0x5a, 0xc1, 0x53, 0x8f, 0x3f, 0x05, 0x8c, 0xc2, 0x41, 0x63, 0x7b, 0x4e, 0xb3, 0x09, + 0xd9, 0xa4, 0x9d, 0x52, 0xa9, 0x0c, 0xf0, 0xe7, 0x24, 0x85, 0x55, 0x12, 0x15, 0x6b, 0x8d, 0x25, + 0xe8, 0xa8, 0x8a, 0x61, 0x7a, 0x1d, 0xa0, 0xcf, 0x0c, 0x5f, 0x1c, 0xb4, 0x53, 0xfc, 0x94, 0x19, + 0x9d, 0x4e, 0xdb, 0x15, 0x6b, 0x03, 0x9f, 0x22, 0x73, 0x28, 0xd2, 0xfa, 0x2a, 0x2d, 0x91, 0x69, + 0x5d, 0x99, 0xcf, 0x38, 0x26, 0x01, 0xd6, 0x42, 0xa5, 0xf2, 0xb9, 0x68, 0x02, 0x54, 0x41, 0xab, + 0x0b, 0x42, 0x5b, 0x14, 0xdf, 0x93, 0x59, 0xb5, 0xa5, 0x34, 0xae, 0x27, 0x8b, 0xf4, 0x4e, 0x17, + 0xfb, 0x59, 0x45, 0xe0, 0x48, 0x80, 0x06, 0xea, 0xb5, 0xf5, 0x73, 0x61, 0x7a, 0x01, 0x49, 0xc3, + 0xc7, 0x6d, 0xc4, 0x1c, 0xff, 0x7e, 0xd4, 0x01, 0x08, 0xe1, 0x1f, 0xc7, 0x8f, 0xed, 0x52, 0x81, + 0x3e, 0x88, 0x84, 0x43, 0x7e, 0xe1, 0xdc, 0xa8, 0x0e, 0x42, 0xc4, 0x34, 0xdb, 0xa6, 0x0c, 0x03, + 0xa7, 0x2e, 0xc3, 0xee, 0x6e, 0xf7, 0x60, 0xd0, 0xb4, 0xd8, 0xd1, 0x51, 0x07, 0x44, 0xcc, 0xee, + 0xa0, 0xd7, 0x6d, 0x37, 0xf1, 0x8e, 0xe9, 0x5e, 0x83, 0xa1, 0x35, 0x6c, 0xa9, 0xde, 0x0d, 0x14, + 0x72, 0x32, 0x81, 0x9c, 0x83, 0x7d, 0x95, 0x34, 0x56, 0x38, 0x2c, 0xd2, 0xae, 0x64, 0x5a, 0xbb, + 0xab, 0xd2, 0x66, 0x32, 0xad, 0xe7, 0x76, 0xda, 0x35, 0xb8, 0x68, 0x34, 0xb0, 0xaf, 0xb2, 0x9c, + 0x2c, 0x26, 0x0a, 0xed, 0x0e, 0x5c, 0xfe, 0xbb, 0xe7, 0x12, 0x45, 0x8a, 0x7b, 0x7a, 0x5d, 0x24, + 0xc0, 0x23, 0xaf, 0xbf, 0x0f, 0x7a, 0xf5, 0xa1, 0x57, 0x84, 0xb0, 0xfa, 0x59, 0x04, 0x8c, 0x82, + 0x7a, 0xb7, 0x3b, 0x4e, 0xcf, 0x96, 0x4b, 0x28, 0x7f, 0x3d, 0x69, 0x6f, 0xef, 0x9d, 0x36, 0x77, + 0x90, 0x9b, 0x9d, 0xa4, 0x38, 0xa3, 0x90, 0x39, 0xfb, 0xea, 0x08, 0x4f, 0x72, 0x84, 0xbc, 0x54, + 0xf5, 0x71, 0xda, 0xd5, 0xec, 0x36, 0xd2, 0xa2, 0xa7, 0x1c, 0x39, 0x1d, 0x67, 0x9d, 0x3d, 0x1c, + 0xb3, 0x4d, 0x3e, 0xb8, 0x46, 0x63, 0x77, 0xb0, 0x45, 0x7b, 0x1e, 0x76, 0xf7, 0xb6, 0x88, 0xd8, + 0x89, 0xca, 0xeb, 0x86, 0xa4, 0xf0, 0x88, 0x10, 0x3f, 0xe0, 0x56, 0xef, 0xfa, 0xa1, 0xcd, 0xf5, + 0x15, 0x7b, 0x8b, 0x15, 0xd3, 0x50, 0x26, 0xf9, 0xba, 0x5d, 0x0a, 0x80, 0xc6, 0x83, 0x72, 0xb0, + 0x21, 0xe0, 0x98, 0xb3, 0x17, 0x27, 0x4f, 0x98, 0x25, 0xeb, 0x98, 0xfa, 0x60, 0x17, 0xe0, 0x4c, + 0x69, 0xc6, 0x4c, 0x8f, 0xbc, 0x83, 0x3d, 0x1b, 0x08, 0x6e, 0xfb, 0x60, 0xaf, 0xd9, 0x69, 0xab, + 0xc3, 0x24, 0x90, 0x3e, 0xd8, 0xa5, 0xf4, 0xc1, 0xae, 0x4c, 0xe7, 0x16, 0x63, 0xca, 0x07, 0x24, + 0x85, 0x01, 0xd9, 0xb3, 0x85, 0x64, 0xc0, 0x7c, 0xfd, 0xfd, 0x9c, 0x0f, 0x57, 0x67, 0x20, 0x52, + 0x23, 0x2f, 0x05, 0xb4, 0x76, 0x06, 0x5f, 0x27, 0x4d, 0x71, 0x60, 0x9b, 0x1a, 0x8e, 0x60, 0xca, + 0x45, 0x5f, 0x84, 0xc0, 0x13, 0xe4, 0x92, 0x48, 0x91, 0x9f, 0x61, 0x58, 0x33, 0xaf, 0xc0, 0xa4, + 0x26, 0x0f, 0x08, 0x6d, 0xd2, 0x0f, 0xde, 0x11, 0xb2, 0x85, 0xe8, 0x8d, 0x15, 0x99, 0xb0, 0x90, + 0x58, 0x65, 0x29, 0x6b, 0x7c, 0xc2, 0x1e, 0x7b, 0x8f, 0x03, 0xcd, 0xef, 0xde, 0x42, 0x87, 0x03, + 0xcb, 0xdd, 0xc7, 0xcb, 0x9f, 0x0b, 0xe7, 0x1d, 0xb3, 0x29, 0xb8, 0x26, 0x4c, 0xf1, 0x9f, 0x22, + 0xb5, 0x5e, 0x81, 0x79, 0x00, 0xac, 0x9f, 0xcb, 0xae, 0x97, 0x4f, 0xb8, 0x3f, 0x17, 0x68, 0xd0, + 0xce, 0xcf, 0x40, 0x5d, 0x0c, 0xa6, 0x37, 0x6e, 0x06, 0x2a, 0x68, 0x4e, 0x0b, 0xef, 0x46, 0xb1, + 0x0d, 0x85, 0x95, 0x27, 0x02, 0xee, 0x99, 0x17, 0x04, 0xb9, 0x4c, 0xdc, 0xf7, 0xd6, 0x25, 0x73, + 0x70, 0xd5, 0x87, 0xbc, 0xfa, 0x0b, 0x9e, 0xdb, 0x19, 0xbb, 0x5b, 0x60, 0x28, 0x6e, 0xfd, 0x4a, + 0xd4, 0x20, 0x5c, 0x1c, 0xcc, 0x9b, 0x8c, 0xa8, 0x72, 0xca, 0x22, 0xe2, 0x6c, 0x27, 0x1e, 0xbd, + 0x3a, 0x33, 0x56, 0x10, 0x39, 0x5a, 0x98, 0x38, 0x4d, 0x62, 0x14, 0x66, 0xcf, 0xbf, 0xf6, 0x03, + 0xc8, 0x06, 0x88, 0x1c, 0x41, 0x6b, 0x09, 0xd6, 0xcc, 0x41, 0x90, 0xd5, 0xbb, 0x02, 0x42, 0x7c, + 0x18, 0x56, 0x80, 0xc7, 0xfd, 0xc5, 0x4e, 0xab, 0xd5, 0x2a, 0x9c, 0x59, 0xca, 0xe7, 0xbc, 0xdd, + 0x39, 0x1d, 0x6e, 0x38, 0xc5, 0x10, 0x51, 0xb8, 0x06, 0xb0, 0xa1, 0x79, 0xdb, 0x9f, 0x99, 0xe3, + 0x83, 0x70, 0xa3, 0x67, 0x1f, 0xea, 0x5b, 0xcb, 0x8f, 0xd1, 0x94, 0x46, 0xf8, 0xc7, 0x5d, 0x52, + 0xa4, 0x10, 0xeb, 0x8a, 0x51, 0x1c, 0x97, 0xad, 0x0b, 0x8a, 0x97, 0x0c, 0x3c, 0xf6, 0x9e, 0x76, + 0xa4, 0x3a, 0x18, 0xdb, 0xe5, 0x0a, 0x57, 0x8b, 0x6c, 0x59, 0xf7, 0x2d, 0x73, 0x1e, 0x33, 0xcb, + 0xe2, 0x2f, 0x31, 0xe3, 0x27, 0xf6, 0x5a, 0x89, 0xb3, 0x04, 0x7d, 0x6d, 0x0a, 0xaa, 0x4e, 0x00, + 0xba, 0xa7, 0x6b, 0xa6, 0x60, 0x7d, 0x6d, 0xc7, 0x49, 0x70, 0x1e, 0x44, 0xa6, 0xbe, 0x89, 0x72, + 0xc6, 0x4a, 0x4b, 0x2b, 0x34, 0x14, 0x72, 0x7d, 0xa5, 0x34, 0x1e, 0xda, 0x5d, 0xaa, 0x72, 0x92, + 0xd5, 0xbd, 0x5c, 0x1f, 0x23, 0x7e, 0x5b, 0x75, 0x2c, 0x1d, 0x47, 0x2a, 0x28, 0x63, 0x62, 0x80, + 0xf2, 0xce, 0x72, 0xf8, 0xf3, 0x0e, 0x15, 0xba, 0x33, 0x3b, 0x27, 0x53, 0x99, 0x6b, 0x56, 0xc7, + 0x17, 0xc1, 0xa5, 0x17, 0x4a, 0x17, 0xd6, 0x94, 0xf1, 0x05, 0xd4, 0xc7, 0xb4, 0x4c, 0x08, 0x53, + 0x77, 0x33, 0x53, 0x56, 0xd3, 0xa4, 0xd1, 0xa8, 0x1b, 0xe6, 0x2d, 0x3e, 0xce, 0xa3, 0xc4, 0x15, + 0x3d, 0xd1, 0xd6, 0x03, 0xc7, 0x94, 0x42, 0x9b, 0x84, 0x5b, 0x8b, 0xa4, 0x88, 0x60, 0x3c, 0x15, + 0x39, 0x43, 0x65, 0xe9, 0x7a, 0x53, 0xe6, 0x84, 0x7c, 0x07, 0x0f, 0x81, 0xf5, 0xc6, 0x9f, 0xd3, + 0x36, 0x0f, 0x6d, 0x83, 0x46, 0xe5, 0x28, 0x20, 0xdd, 0x3e, 0x18, 0xd2, 0xae, 0xfd, 0xa2, 0x88, + 0xb8, 0x30, 0x73, 0x2b, 0x10, 0x1e, 0xc0, 0xc2, 0x07, 0x62, 0x7e, 0x8c, 0x84, 0xd5, 0xce, 0xa6, + 0xe8, 0x55, 0x94, 0x0b, 0xee, 0x74, 0x9f, 0x63, 0x0b, 0x94, 0xe8, 0x4b, 0xe6, 0xa1, 0x37, 0xfc, + 0xb1, 0x03, 0x15, 0xe7, 0xa2, 0xd3, 0x60, 0x09, 0x42, 0x0b, 0xbf, 0x24, 0xb4, 0x45, 0x09, 0x1e, + 0xae, 0xf9, 0x43, 0x66, 0x5c, 0x30, 0xc8, 0x56, 0x38, 0xcb, 0x81, 0x64, 0x84, 0x4f, 0x1c, 0x03, + 0x01, 0xf3, 0xb2, 0x9f, 0x99, 0xf7, 0x63, 0xd9, 0x78, 0xbf, 0xc0, 0xb5, 0x3b, 0x94, 0x7b, 0x95, + 0xd5, 0xfe, 0x46, 0xe3, 0x6d, 0xa3, 0xf1, 0x4d, 0xa3, 0xf1, 0x0c, 0xe8, 0x6c, 0xeb, 0x7c, 0xb5, + 0x7a, 0x81, 0x04, 0xb7, 0x75, 0xbb, 0x5a, 0x7d, 0x8f, 0xfc, 0xf1, 0x5a, 0x38, 0xab, 0xb7, 0x9e, + 0x15, 0x0b, 0xbf, 0x9b, 0x9d, 0x14, 0xb4, 0x42, 0x78, 0x64, 0xd2, 0x5e, 0xb1, 0x60, 0x62, 0x72, + 0xf1, 0x24, 0x1d, 0x59, 0xb4, 0xb2, 0x3c, 0xdc, 0x5c, 0x18, 0x17, 0x83, 0x2b, 0x4b, 0x94, 0x40, + 0x83, 0x48, 0x33, 0x18, 0x44, 0x89, 0xf3, 0x02, 0x3a, 0xa4, 0x01, 0xa9, 0x6f, 0x16, 0x19, 0x2d, + 0xbe, 0xbf, 0x1b, 0xf3, 0xf8, 0x05, 0xe4, 0x82, 0xa8, 0x2c, 0x9f, 0x32, 0x1e, 0x43, 0x0f, 0xed, + 0x03, 0xb4, 0xcc, 0x8b, 0x25, 0x4f, 0xbb, 0xc8, 0x28, 0x62, 0x43, 0xc3, 0x20, 0x32, 0xb1, 0xe5, + 0xd0, 0x3c, 0x7e, 0xfe, 0xc3, 0xab, 0xf7, 0x1f, 0x08, 0xd8, 0x56, 0xe6, 0x9f, 0xe3, 0x8e, 0xb7, + 0x91, 0x25, 0x2e, 0x01, 0xf0, 0x3c, 0x2b, 0x18, 0x99, 0xda, 0x42, 0xb0, 0xa9, 0xbc, 0x74, 0x80, + 0xab, 0x3f, 0x22, 0x59, 0x21, 0x8f, 0x96, 0x72, 0x97, 0x57, 0x87, 0xa1, 0x80, 0xe6, 0xa6, 0x01, + 0xbc, 0x8b, 0x32, 0xb6, 0x6b, 0xbe, 0x7e, 0xf5, 0xf6, 0x8f, 0xa5, 0x66, 0xd1, 0x99, 0x86, 0xcb, + 0xc8, 0x7a, 0xab, 0xfa, 0x62, 0xb2, 0x6a, 0x5c, 0x24, 0x62, 0x7d, 0xdf, 0xf2, 0x43, 0x35, 0xad, + 0x98, 0x23, 0x46, 0xd9, 0xf8, 0x20, 0x0d, 0x24, 0x22, 0x5c, 0xbc, 0x3f, 0x6f, 0x31, 0xce, 0x12, + 0xc6, 0xc8, 0x81, 0xea, 0xbc, 0xc7, 0x39, 0x06, 0xc3, 0x05, 0xce, 0xd1, 0x91, 0x85, 0x20, 0x28, + 0x43, 0x8b, 0x6e, 0x0c, 0x3d, 0x06, 0x5c, 0x33, 0xfb, 0x7b, 0xd4, 0x4b, 0x68, 0x16, 0x54, 0x5f, + 0xd7, 0x5d, 0x32, 0x94, 0x3f, 0xc5, 0xfc, 0x32, 0x94, 0xbe, 0x55, 0x11, 0xa7, 0x38, 0x35, 0x29, + 0x99, 0xf8, 0xa0, 0x96, 0x81, 0x1a, 0xbf, 0x2f, 0x79, 0x63, 0x6a, 0x5d, 0x2e, 0xeb, 0x2d, 0x33, + 0x7e, 0xb4, 0x28, 0x17, 0xee, 0xb6, 0x6b, 0xe6, 0xdc, 0x32, 0x0f, 0x1a, 0x3d, 0xa7, 0x4b, 0x7c, + 0x50, 0x86, 0xb6, 0xab, 0xb2, 0xfe, 0x31, 0x93, 0x8b, 0x00, 0x0e, 0xd7, 0x0e, 0x0a, 0x69, 0xab, + 0x09, 0x72, 0x29, 0x75, 0xef, 0x96, 0xe8, 0x60, 0x7f, 0x22, 0x63, 0x62, 0x14, 0xfd, 0xad, 0xa0, + 0xd1, 0xb8, 0x60, 0x6a, 0xb9, 0x66, 0x84, 0x4b, 0x2a, 0xae, 0x10, 0xd8, 0xa9, 0xf3, 0x9b, 0x95, + 0x8c, 0x6e, 0x30, 0x58, 0x3f, 0x73, 0x96, 0xdc, 0x29, 0xea, 0x02, 0xd3, 0x24, 0xe8, 0x32, 0xe1, + 0x44, 0x3a, 0xf1, 0x34, 0xec, 0x29, 0xe8, 0xf8, 0x52, 0xe4, 0x1c, 0x43, 0x83, 0xd1, 0x79, 0x5b, + 0xe0, 0x55, 0x79, 0xd9, 0xb0, 0xe1, 0x53, 0x8a, 0xb7, 0x5c, 0xb8, 0x90, 0xdd, 0x4d, 0x01, 0x12, + 0xe1, 0x47, 0x9d, 0xc9, 0x87, 0x63, 0xf9, 0xf0, 0x5a, 0x3e, 0xf8, 0xf2, 0x61, 0x2a, 0x1f, 0xc6, + 0x6a, 0xab, 0x9a, 0x7c, 0x88, 0xdc, 0xad, 0x8e, 0x93, 0xf1, 0x48, 0x5f, 0x97, 0x2e, 0xbf, 0x16, + 0x94, 0x20, 0xb0, 0x4b, 0xe1, 0x81, 0x86, 0x90, 0xe6, 0xb7, 0x16, 0x4d, 0xa3, 0xd9, 0xc4, 0xe5, + 0xc6, 0x21, 0x3e, 0x83, 0x7e, 0x22, 0x80, 0xe3, 0x1f, 0x31, 0x36, 0x80, 0xdf, 0x9a, 0x79, 0x9c, + 0x3e, 0x94, 0x3f, 0x3e, 0x95, 0x76, 0x05, 0xae, 0xb0, 0xc0, 0x64, 0xed, 0xc3, 0x44, 0x96, 0xba, + 0x29, 0x34, 0xca, 0x72, 0x3e, 0x8f, 0x5b, 0xbf, 0x63, 0x83, 0xab, 0xd5, 0x0f, 0x02, 0x17, 0x18, + 0xe0, 0x04, 0x8f, 0x8a, 0x07, 0x7c, 0x7d, 0x75, 0x42, 0x17, 0x87, 0xa0, 0x32, 0x8a, 0x22, 0x8c, + 0x07, 0x63, 0x10, 0xef, 0xe7, 0xe5, 0x75, 0x19, 0x9c, 0x94, 0xe4, 0xbe, 0x25, 0x3a, 0xb0, 0x1e, + 0x24, 0x4c, 0x6d, 0x1d, 0xe4, 0x81, 0xdb, 0xf5, 0xad, 0x7b, 0xe6, 0xd1, 0xd2, 0x30, 0xcb, 0x92, + 0xd3, 0x74, 0x8d, 0x13, 0x53, 0xaf, 0xc6, 0x3c, 0x35, 0x72, 0xcd, 0x59, 0x63, 0x0f, 0x4b, 0xf0, + 0x7c, 0x5f, 0x81, 0x87, 0x04, 0xad, 0xdf, 0xa2, 0x10, 0x6d, 0x79, 0x8e, 0xfb, 0x22, 0xfc, 0x96, + 0xef, 0xe9, 0xb6, 0xb3, 0x67, 0xfe, 0x9b, 0x69, 0x2f, 0x7f, 0xf6, 0xc0, 0x44, 0x62, 0x5e, 0x31, + 0x15, 0x76, 0xbf, 0xfe, 0x59, 0xad, 0x83, 0xa3, 0xd1, 0xbf, 0xcf, 0x97, 0xcb, 0x8e, 0xfe, 0x0c, + 0x32, 0xf2, 0x77, 0xbe, 0x7c, 0x35, 0x84, 0xb7, 0xa1, 0xfd, 0xe7, 0xaf, 0xbd, 0xee, 0xf0, 0x5b, + 0x72, 0x03, 0x68, 0x57, 0x36, 0x5b, 0x7f, 0xb6, 0x9d, 0xbf, 0x58, 0xe6, 0x0d, 0x89, 0x21, 0xfc, + 0x83, 0xd2, 0x9a, 0x65, 0x3e, 0x68, 0xe0, 0x38, 0x16, 0xa2, 0x7d, 0x72, 0x96, 0x5d, 0xc5, 0xb7, + 0x01, 0x43, 0x07, 0x37, 0x5f, 0x6b, 0xe2, 0x5e, 0xff, 0xec, 0x16, 0xd5, 0x5b, 0x1a, 0xcd, 0x29, + 0x1b, 0x2f, 0xce, 0xcf, 0x19, 0x0d, 0xcc, 0x45, 0x42, 0xcb, 0x90, 0xd0, 0x7a, 0x30, 0xc3, 0xbd, + 0x1c, 0xfc, 0xdc, 0x06, 0xc3, 0x30, 0xdc, 0x55, 0xc7, 0xc3, 0xb7, 0x4e, 0x67, 0xe0, 0x74, 0xda, + 0xbb, 0x30, 0x74, 0xbf, 0x97, 0x3a, 0x8c, 0x4b, 0x86, 0xb8, 0xc7, 0xda, 0xf0, 0xd3, 0x4b, 0x93, + 0xce, 0x93, 0xf3, 0xcb, 0x52, 0x58, 0xeb, 0x95, 0xf2, 0x62, 0xa0, 0xcf, 0xa6, 0x48, 0x94, 0x55, + 0x26, 0x78, 0xcd, 0x91, 0x4a, 0xed, 0x75, 0x55, 0xaa, 0x2f, 0x52, 0x35, 0x3f, 0x48, 0x82, 0x9b, + 0x20, 0x8b, 0x54, 0xad, 0x8a, 0xd8, 0x03, 0x93, 0xae, 0x5f, 0x68, 0x10, 0xa1, 0x25, 0x83, 0x48, + 0xe0, 0xdd, 0xb2, 0x6d, 0x07, 0xcd, 0x0e, 0x1f, 0xfe, 0x85, 0xf0, 0x6f, 0x0a, 0xff, 0x2e, 0x80, + 0xe2, 0x2f, 0xbc, 0x78, 0x18, 0x7b, 0x71, 0x13, 0x4b, 0xb6, 0x57, 0xed, 0x61, 0x74, 0xb2, 0x77, + 0xb0, 0x7b, 0xea, 0x75, 0x86, 0xe9, 0x49, 0x0f, 0x1f, 0xda, 0xf4, 0x30, 0xc0, 0x87, 0xe0, 0x64, + 0xb0, 0x77, 0xea, 0x05, 0x27, 0xdd, 0x53, 0xca, 0x25, 0xd3, 0xe8, 0x17, 0x13, 0xfa, 0x22, 0x61, + 0xff, 0xd4, 0xbb, 0x68, 0x76, 0xdb, 0xfd, 0x7d, 0x7c, 0x39, 0x80, 0x17, 0xfa, 0xba, 0x87, 0x5f, + 0x41, 0x43, 0x0a, 0x4e, 0x7a, 0xa7, 0xab, 0xb6, 0xdd, 0xdc, 0xee, 0xae, 0x30, 0xf7, 0x5e, 0xfb, + 0xd4, 0x63, 0xc3, 0xcc, 0x63, 0x4d, 0xf8, 0x32, 0xe8, 0x9f, 0x02, 0x41, 0xd8, 0xfc, 0x43, 0xe7, + 0x14, 0x88, 0x86, 0xb9, 0x7c, 0x75, 0xb8, 0x83, 0xb7, 0xde, 0xb0, 0x66, 0x51, 0x26, 0x21, 0xf7, + 0xc6, 0xd1, 0xd1, 0x51, 0xfb, 0xc8, 0xcb, 0xf0, 0x07, 0x6f, 0xb9, 0xee, 0xec, 0x8b, 0x7d, 0x40, + 0x99, 0x3b, 0x8d, 0x97, 0xc2, 0xbf, 0x90, 0x9e, 0x24, 0x60, 0x43, 0x63, 0x9b, 0xdc, 0xc5, 0x70, + 0xe0, 0x4a, 0x2b, 0x56, 0x58, 0xc6, 0xe2, 0xb7, 0xeb, 0x4a, 0x0b, 0x98, 0x7e, 0x7b, 0x5d, 0x97, + 0xdb, 0x41, 0x22, 0x77, 0xc7, 0x45, 0x0e, 0x85, 0xff, 0x38, 0x3e, 0xa0, 0x3a, 0xcf, 0x6b, 0x8f, + 0x40, 0xfc, 0x01, 0xb8, 0x6e, 0xdb, 0x1e, 0x59, 0x37, 0x16, 0x6b, 0xf6, 0x57, 0x6d, 0x4e, 0x1c, + 0x36, 0xff, 0x4e, 0x1f, 0x66, 0x20, 0xfe, 0x2d, 0x8e, 0x57, 0x9e, 0x6a, 0xbb, 0x04, 0xed, 0x01, + 0x07, 0xd6, 0x10, 0xd6, 0x15, 0x80, 0xbf, 0x27, 0xc0, 0x17, 0x4d, 0xee, 0x52, 0x93, 0xbc, 0x89, + 0xa2, 0xfe, 0x6e, 0xb9, 0xfe, 0xe5, 0x02, 0xc3, 0xbf, 0x43, 0xd9, 0xfa, 0x5a, 0x76, 0x0f, 0xdc, + 0x65, 0x35, 0xad, 0xbf, 0xe7, 0x2a, 0xdc, 0x40, 0x9d, 0x25, 0xec, 0xc0, 0xb7, 0xe5, 0x2f, 0x50, + 0x23, 0x07, 0x2d, 0x13, 0x05, 0xba, 0xee, 0xf2, 0x31, 0x8c, 0x81, 0x4a, 0x95, 0x16, 0x3e, 0x56, + 0x3d, 0x50, 0xdd, 0xd8, 0x94, 0x2c, 0x56, 0xf8, 0xf9, 0x35, 0xdf, 0x56, 0x48, 0xa0, 0x77, 0xf6, + 0x10, 0x05, 0x05, 0x51, 0xc1, 0x98, 0xe6, 0x8c, 0xff, 0xc2, 0x18, 0x67, 0x1e, 0x11, 0xc0, 0xaa, + 0x9d, 0x17, 0x25, 0x0e, 0x30, 0x50, 0xb0, 0xcc, 0xc0, 0x8b, 0x31, 0xec, 0xf8, 0x81, 0xda, 0xee, + 0x27, 0xab, 0x1e, 0xd8, 0x4b, 0x41, 0xc6, 0x05, 0x85, 0xd5, 0x66, 0xdc, 0xb7, 0xc9, 0x26, 0xe6, + 0xc4, 0x0b, 0x49, 0xd8, 0x42, 0xa2, 0x65, 0xc5, 0x29, 0x01, 0x08, 0x49, 0x2b, 0x81, 0x40, 0x14, + 0x24, 0x99, 0x95, 0x48, 0x32, 0x1b, 0xfa, 0x5e, 0xa6, 0x91, 0xa5, 0x25, 0xfa, 0x60, 0x4b, 0xf2, + 0xdc, 0xef, 0xd6, 0x92, 0x67, 0xf6, 0xaf, 0x24, 0xcf, 0x0a, 0x75, 0x66, 0xf7, 0x50, 0xe7, 0x72, + 0x46, 0xd4, 0xb3, 0xdf, 0x91, 0xd4, 0xb3, 0xdf, 0xa9, 0xa7, 0xc1, 0xec, 0x01, 0x34, 0xb8, 0xa9, + 0x96, 0x83, 0x03, 0x0e, 0x5c, 0xb5, 0x96, 0xde, 0xc0, 0xd9, 0xd7, 0x18, 0xe5, 0x5b, 0x22, 0xc7, + 0x4e, 0x57, 0xa0, 0x83, 0x00, 0x5f, 0x0a, 0xd1, 0xd1, 0xb9, 0xa3, 0xfa, 0x7e, 0xdb, 0x5d, 0xfa, + 0x1e, 0x09, 0x1e, 0x22, 0x1d, 0x89, 0x02, 0x28, 0x92, 0x35, 0xc8, 0x03, 0x07, 0x03, 0xe4, 0x37, + 0xad, 0xf0, 0xf0, 0xb0, 0x07, 0x63, 0xd1, 0xc5, 0xda, 0x12, 0x8f, 0x28, 0x68, 0xa5, 0xc4, 0x5b, + 0xd6, 0xec, 0x80, 0xe8, 0x19, 0x40, 0xdb, 0x03, 0x2d, 0x37, 0x32, 0x47, 0xf7, 0x94, 0x68, 0xa2, + 0xd2, 0x26, 0xe0, 0x5b, 0x6b, 0x89, 0xc8, 0x28, 0x93, 0x15, 0xe0, 0x32, 0xbc, 0xd7, 0x2b, 0x18, + 0x00, 0x8c, 0xb8, 0xe6, 0x76, 0x51, 0xbd, 0x6c, 0x11, 0x80, 0xe0, 0x42, 0x96, 0x57, 0x90, 0xc8, + 0x0c, 0x5b, 0x30, 0x72, 0xd6, 0x14, 0x00, 0xb4, 0x48, 0x7e, 0xa2, 0xb0, 0xb4, 0xac, 0x84, 0xf7, + 0xc4, 0xa6, 0x8a, 0xba, 0xd4, 0x0d, 0xc0, 0x20, 0xe4, 0x98, 0x82, 0xa8, 0xe5, 0x6f, 0x36, 0xaa, + 0xda, 0x54, 0x68, 0x5f, 0x14, 0x12, 0xdd, 0xb7, 0x8b, 0xae, 0x20, 0x91, 0x23, 0x5a, 0x33, 0x6f, + 0x8a, 0x43, 0xc0, 0x01, 0x0f, 0x90, 0x04, 0xf9, 0x37, 0xf1, 0xe8, 0x81, 0x0e, 0x06, 0x35, 0xe3, + 0x58, 0xc0, 0x0b, 0x8c, 0x96, 0x9c, 0x0e, 0x12, 0xbd, 0x23, 0x77, 0xd0, 0x4d, 0xb7, 0x87, 0x42, + 0x40, 0xe2, 0x98, 0x46, 0x07, 0x07, 0x75, 0x88, 0xa1, 0xbe, 0x05, 0x47, 0xa5, 0x27, 0xa1, 0x18, + 0x69, 0xcf, 0xeb, 0x77, 0x40, 0x97, 0x80, 0x27, 0xea, 0x3a, 0xa2, 0xbf, 0x5f, 0x74, 0x09, 0x39, + 0x8f, 0x83, 0x0c, 0x95, 0x74, 0x05, 0xf3, 0xd3, 0xe4, 0x40, 0xf7, 0xdb, 0x80, 0xe2, 0x74, 0xb2, + 0x4b, 0x93, 0x8b, 0x08, 0x21, 0x4e, 0xae, 0xae, 0x93, 0xac, 0xd9, 0xdd, 0x27, 0xe0, 0xd5, 0xd6, + 0xd0, 0x42, 0x0a, 0x15, 0xc4, 0x92, 0xe8, 0xc4, 0x92, 0xd4, 0x13, 0x8b, 0xc5, 0x49, 0x50, 0xb0, + 0x54, 0xd7, 0x55, 0x03, 0x98, 0xdc, 0x45, 0x32, 0xac, 0x98, 0xf4, 0xd6, 0x91, 0x03, 0x4c, 0xc5, + 0x2a, 0xc4, 0xc3, 0x4a, 0xc4, 0xd3, 0x2f, 0xe6, 0x86, 0x02, 0xd8, 0x10, 0x06, 0x62, 0x9d, 0x8c, + 0x28, 0x48, 0x12, 0xe1, 0x0c, 0x84, 0x94, 0x36, 0xde, 0x0a, 0x81, 0x7d, 0x7b, 0x39, 0xbf, 0x93, + 0x3d, 0x7b, 0xc0, 0x9e, 0x97, 0x56, 0xef, 0xc0, 0x5e, 0x83, 0xb4, 0xd7, 0xa7, 0x2f, 0xfd, 0xf5, + 0x2f, 0xff, 0xc2, 0x29, 0x84, 0x69, 0x64, 0x02, 0x95, 0xf1, 0xaa, 0x86, 0x89, 0xcb, 0xc9, 0x64, + 0xcb, 0x7a, 0x69, 0xf9, 0x36, 0xc9, 0x66, 0xd1, 0xa0, 0xaf, 0x30, 0xb5, 0x94, 0xac, 0x08, 0xf9, + 0xde, 0x97, 0x49, 0x7f, 0x42, 0xc8, 0x29, 0xd1, 0xfd, 0x8a, 0x64, 0xf0, 0x40, 0x62, 0x36, 0x11, + 0x81, 0x41, 0xbd, 0xc1, 0x40, 0xa5, 0xa8, 0xe1, 0xe1, 0xa2, 0x55, 0x9b, 0xce, 0xb4, 0x4c, 0x79, + 0xa6, 0x91, 0xcf, 0xa4, 0x34, 0x88, 0x57, 0xc8, 0x4a, 0x4d, 0xe4, 0xe4, 0x72, 0xbb, 0x23, 0x2d, + 0x5d, 0xa4, 0x6e, 0x79, 0x03, 0x20, 0x6a, 0xaa, 0x58, 0x0c, 0xca, 0x40, 0x4c, 0x3a, 0x9b, 0xba, + 0x39, 0x70, 0x85, 0x80, 0x07, 0x2a, 0x90, 0x32, 0xb2, 0xb9, 0xdd, 0xdf, 0x97, 0x63, 0xde, 0xe1, + 0xfd, 0x1b, 0xac, 0xf5, 0xef, 0xa0, 0xdc, 0xbf, 0x7e, 0xcf, 0xe5, 0xec, 0xa7, 0xd5, 0x03, 0x54, + 0xd2, 0x7b, 0x60, 0xe9, 0xdd, 0xda, 0xd2, 0xbb, 0xf7, 0x96, 0xd6, 0x91, 0x59, 0xa4, 0x6a, 0x5c, + 0x29, 0x47, 0x5c, 0x4c, 0xb5, 0x83, 0x81, 0x50, 0x10, 0x10, 0xb1, 0x63, 0xdc, 0xdd, 0x7f, 0x07, + 0x0d, 0xb4, 0xdd, 0x3a, 0x50, 0xf7, 0x68, 0xda, 0xe1, 0xba, 0xea, 0xda, 0xe8, 0x73, 0x62, 0x56, + 0x50, 0xe5, 0x39, 0x4e, 0x09, 0x3d, 0x3e, 0x83, 0xf8, 0x42, 0x46, 0xd1, 0x44, 0x7e, 0xe8, 0x25, + 0x34, 0x81, 0x4b, 0x5f, 0x39, 0x93, 0xaa, 0x2b, 0xd7, 0x40, 0xb2, 0x82, 0x68, 0x45, 0x5f, 0xb6, + 0xac, 0x37, 0x34, 0xd1, 0xf1, 0xbb, 0xf0, 0x3e, 0xf0, 0xe7, 0xe5, 0x83, 0x6b, 0x14, 0xb5, 0x7c, + 0xb0, 0x54, 0xbd, 0x58, 0x1e, 0xab, 0xfa, 0x95, 0x63, 0x61, 0x79, 0x0e, 0xcc, 0xa5, 0x34, 0xf0, + 0x82, 0x33, 0x8d, 0x4c, 0x6a, 0x2d, 0x9d, 0xca, 0x03, 0x11, 0x57, 0x9d, 0x16, 0x36, 0x38, 0xe0, + 0xb5, 0x81, 0xa2, 0x93, 0x8b, 0x1a, 0x59, 0xb9, 0x46, 0x31, 0x83, 0x0f, 0xf4, 0x29, 0xf6, 0x1e, + 0xa9, 0x29, 0x24, 0x20, 0x75, 0xe7, 0x6e, 0x59, 0x49, 0xf9, 0x7a, 0x43, 0x29, 0x9e, 0x86, 0xe5, + 0x31, 0x21, 0x89, 0x55, 0x07, 0xf5, 0x7e, 0xe7, 0x0e, 0xdd, 0x51, 0xd3, 0x18, 0x7b, 0x40, 0x1e, + 0xbf, 0xf3, 0xde, 0x69, 0x93, 0x83, 0xa6, 0x00, 0xf6, 0x0f, 0xee, 0xc9, 0xb0, 0xdf, 0x45, 0x95, + 0xb0, 0x50, 0x10, 0x71, 0x06, 0xb0, 0xc4, 0xa4, 0xcd, 0x7b, 0x66, 0xcb, 0x6e, 0x91, 0x12, 0xb3, + 0x3e, 0xd7, 0xc4, 0x60, 0xfe, 0xc8, 0x5d, 0xb2, 0x00, 0x5c, 0xe1, 0xb9, 0xde, 0x60, 0x9b, 0x4d, + 0xe0, 0x5f, 0x2c, 0x6c, 0xb4, 0x19, 0xfc, 0x5b, 0xc0, 0xbf, 0x31, 0xfc, 0x9b, 0xc3, 0xbf, 0x6b, + 0xf8, 0x77, 0x0b, 0xff, 0xce, 0xd1, 0x53, 0xa1, 0x54, 0xe1, 0x05, 0x62, 0x9a, 0x08, 0xf7, 0xdc, + 0x9b, 0xc1, 0x94, 0xad, 0xf4, 0xd1, 0x73, 0x18, 0xa8, 0x0b, 0x8b, 0xcc, 0x29, 0x4d, 0x71, 0x46, + 0x76, 0xb2, 0x18, 0x9f, 0x5a, 0xcf, 0x51, 0x36, 0x6d, 0x59, 0x4f, 0xc9, 0xc2, 0xc0, 0x49, 0xd6, + 0xbe, 0x85, 0xe1, 0x60, 0x92, 0x11, 0x6f, 0x39, 0x16, 0x61, 0xea, 0xd5, 0xf4, 0xd5, 0xa4, 0xc2, + 0x7a, 0x34, 0xd5, 0x0b, 0x2d, 0xbb, 0xd9, 0x85, 0x96, 0x44, 0x93, 0x89, 0x6a, 0x52, 0xa9, 0xcb, + 0x50, 0xe7, 0x9f, 0x04, 0x09, 0x5f, 0x62, 0x34, 0x3a, 0xb2, 0x06, 0x29, 0x8f, 0xad, 0xa9, 0xd1, + 0xdc, 0x1c, 0x5a, 0xbe, 0xa2, 0x9c, 0x05, 0xe4, 0xb9, 0xea, 0xca, 0x67, 0xdc, 0x8c, 0x6b, 0xf3, + 0xbe, 0xb0, 0x02, 0xfd, 0xfd, 0xbe, 0x2d, 0xe0, 0xd0, 0x6a, 0x55, 0xf0, 0x80, 0xd4, 0x4e, 0x34, + 0x98, 0xca, 0x45, 0x41, 0xe4, 0xdb, 0xcb, 0x5b, 0xaf, 0xb3, 0x2b, 0xc6, 0x0f, 0x3b, 0x9f, 0x70, + 0x14, 0x65, 0x24, 0x76, 0xe0, 0x5b, 0xb7, 0xf8, 0x46, 0xdc, 0x7b, 0x54, 0x51, 0xef, 0x21, 0x4b, + 0x5f, 0x0e, 0x7f, 0x81, 0xbc, 0x4e, 0x97, 0x53, 0x58, 0xc9, 0xd2, 0xd3, 0x3e, 0xf7, 0xef, 0xfe, + 0xbc, 0x2b, 0xbb, 0x94, 0x34, 0xbb, 0x8a, 0x25, 0xf5, 0x69, 0xb8, 0xab, 0xe3, 0x5e, 0x60, 0xe8, + 0x5c, 0xf5, 0xf2, 0xb3, 0x75, 0xee, 0x9c, 0x63, 0x52, 0x45, 0xd8, 0x29, 0xeb, 0x68, 0xd3, 0x98, + 0xb6, 0x41, 0xa0, 0xce, 0xa0, 0xce, 0x4e, 0x5f, 0x0d, 0xcb, 0x4c, 0x66, 0xb6, 0x78, 0x33, 0x76, + 0xa5, 0xcc, 0xc1, 0x9e, 0x4b, 0x2a, 0x9a, 0xc2, 0x2f, 0xa8, 0xf9, 0x19, 0x0e, 0xab, 0xb3, 0x5b, + 0xa8, 0xf9, 0x23, 0x6b, 0x82, 0x9a, 0x76, 0x1b, 0x52, 0x51, 0xbe, 0x4d, 0x0a, 0xf9, 0x86, 0x1a, + 0x1e, 0x6f, 0x68, 0x02, 0xfd, 0xc0, 0xa4, 0xe1, 0xad, 0xd7, 0xed, 0xe6, 0x25, 0x63, 0x04, 0x7a, + 0x8b, 0x89, 0x55, 0xdb, 0xa2, 0xdc, 0xac, 0x6a, 0xb7, 0xa7, 0xb7, 0xeb, 0xcb, 0x76, 0xcf, 0x41, + 0x78, 0xf9, 0xbc, 0x5d, 0xe7, 0x5b, 0x0b, 0xb1, 0xb3, 0x3a, 0xd7, 0x29, 0xa1, 0x67, 0xbb, 0x7c, + 0xc2, 0x46, 0x58, 0x7c, 0xe0, 0x45, 0xde, 0x5d, 0x27, 0x2e, 0xd4, 0x73, 0x91, 0x69, 0x79, 0xed, + 0xc5, 0x00, 0x64, 0xaf, 0x53, 0x33, 0x97, 0x94, 0x59, 0xa8, 0xdb, 0xc5, 0xe8, 0x86, 0x02, 0x48, + 0x07, 0x00, 0x0c, 0x09, 0xc0, 0x41, 0xdf, 0x01, 0x02, 0xd0, 0x7c, 0x02, 0x89, 0x17, 0x36, 0x3b, + 0x03, 0x61, 0xc4, 0x08, 0xaf, 0x05, 0xe7, 0xd8, 0x6f, 0xc5, 0x8c, 0x22, 0xc6, 0x20, 0xab, 0x2a, + 0x07, 0xc2, 0x5a, 0xec, 0x77, 0x2b, 0xaa, 0x8b, 0x9c, 0xed, 0xa4, 0xd3, 0x24, 0x93, 0xec, 0x89, + 0x3b, 0xf8, 0x35, 0xde, 0xe9, 0xd6, 0xf1, 0x8e, 0xcc, 0x9c, 0xeb, 0x99, 0xb7, 0xbc, 0x3e, 0x75, + 0x3d, 0xe3, 0x5d, 0xaf, 0x08, 0x68, 0x21, 0x32, 0x3a, 0x23, 0x6b, 0xac, 0xfa, 0xfb, 0xca, 0xba, + 0x46, 0x04, 0xce, 0x55, 0xc2, 0x9c, 0xf8, 0x67, 0x4c, 0x7c, 0x83, 0xdd, 0x7e, 0x6e, 0x31, 0x67, + 0xe6, 0x8c, 0x9d, 0xb9, 0x3d, 0xac, 0x02, 0xb1, 0xdd, 0x55, 0xbc, 0xc1, 0x73, 0xb5, 0x9d, 0xb6, + 0xcc, 0x85, 0xb6, 0xa2, 0xfa, 0xaa, 0x68, 0x50, 0x7d, 0x6b, 0x4b, 0x3a, 0x2a, 0x84, 0x1f, 0x40, + 0xbc, 0x3b, 0x5c, 0xa7, 0xa8, 0x72, 0xa2, 0xb4, 0x56, 0xd1, 0x4a, 0x5d, 0x23, 0xa3, 0x8c, 0x6a, + 0x86, 0xd4, 0x37, 0x9a, 0xe1, 0x5e, 0x22, 0xdf, 0x0c, 0xf8, 0x4f, 0xe0, 0xf8, 0x56, 0x35, 0xfc, + 0x8a, 0x08, 0x4d, 0xe3, 0xcc, 0xe7, 0xd6, 0xad, 0x73, 0xee, 0xc0, 0xbf, 0x3b, 0xbb, 0x8c, 0xaa, + 0x41, 0x5f, 0x73, 0x93, 0x95, 0x40, 0xdf, 0x77, 0xd5, 0xce, 0x8e, 0xba, 0x31, 0x67, 0x9a, 0x14, + 0xea, 0x29, 0x39, 0x02, 0xd0, 0x0f, 0x0a, 0x19, 0x5d, 0x11, 0xa0, 0xdd, 0x3b, 0x05, 0xa8, 0xde, + 0x1b, 0xf6, 0xaf, 0xe8, 0x8d, 0x92, 0x42, 0x49, 0xe1, 0x51, 0x29, 0x84, 0xd9, 0xf9, 0xfa, 0xdc, + 0x25, 0x05, 0x10, 0xc7, 0xe6, 0x9a, 0x00, 0x52, 0x9e, 0x92, 0x9e, 0x24, 0xfb, 0xa1, 0xc6, 0x92, + 0x65, 0x21, 0x91, 0x71, 0xe9, 0x8e, 0xf3, 0xa0, 0x2d, 0xe0, 0x1b, 0x3e, 0x27, 0x1f, 0xae, 0x3c, + 0x4c, 0x52, 0x15, 0x73, 0x5b, 0x38, 0xc1, 0x48, 0x8d, 0x4d, 0xe9, 0x1a, 0x9b, 0x7b, 0xab, 0x31, + 0xc6, 0xb9, 0x57, 0xad, 0xcc, 0x43, 0x4f, 0x6d, 0x79, 0x56, 0x3e, 0x1f, 0x29, 0x8a, 0xdb, 0x05, + 0xd1, 0xa0, 0x39, 0x57, 0x24, 0x4e, 0xf6, 0x87, 0x53, 0x6b, 0xe6, 0x88, 0x9a, 0x70, 0xf2, 0x5c, + 0x48, 0x9b, 0xb4, 0xd7, 0x75, 0x17, 0x5c, 0x70, 0x28, 0x44, 0x62, 0xdd, 0x8c, 0xdb, 0x1a, 0x22, + 0x78, 0x90, 0xec, 0x66, 0x20, 0x9c, 0x2c, 0x5d, 0xee, 0x1e, 0x83, 0x7a, 0xc5, 0x33, 0x23, 0xea, + 0x80, 0x5e, 0xe5, 0xb2, 0xc5, 0xed, 0xae, 0xae, 0x9f, 0xf3, 0xab, 0xdc, 0x8a, 0x85, 0xf4, 0xbb, + 0x35, 0x98, 0xe1, 0x44, 0xf5, 0x8e, 0x79, 0x13, 0x5d, 0x2f, 0x61, 0x5c, 0xc3, 0xb8, 0x7b, 0x3a, + 0x41, 0xa7, 0x4e, 0x61, 0x68, 0xc5, 0x85, 0xc6, 0x99, 0x78, 0xb1, 0xd2, 0x38, 0x75, 0x9b, 0xca, + 0xdb, 0xd5, 0x29, 0x85, 0x6b, 0x9d, 0x71, 0x49, 0xeb, 0x2c, 0x5b, 0x66, 0x1e, 0x5f, 0xa5, 0x49, + 0x4f, 0x48, 0x8b, 0x14, 0x9c, 0x0c, 0x83, 0x3c, 0xd0, 0x89, 0x50, 0x4a, 0xff, 0xe1, 0xb5, 0x35, + 0x71, 0xa4, 0xf8, 0x6a, 0x83, 0xf6, 0x41, 0x1e, 0x4a, 0xee, 0xd2, 0x20, 0x57, 0x12, 0xba, 0x69, + 0xa0, 0xc7, 0xca, 0x9f, 0x23, 0xdc, 0x25, 0x93, 0x12, 0x00, 0x09, 0x98, 0xe8, 0x13, 0x65, 0xa2, + 0x73, 0x27, 0x0e, 0xc8, 0x0b, 0x81, 0x88, 0xb8, 0x82, 0x81, 0xc2, 0x2c, 0xaf, 0xb5, 0xc8, 0x2b, + 0x73, 0xce, 0x5d, 0x94, 0xb8, 0x41, 0xcf, 0xba, 0x67, 0x42, 0xef, 0xf7, 0xdd, 0x1a, 0x71, 0x20, + 0xf0, 0x31, 0x51, 0xdd, 0x0f, 0x4e, 0x26, 0x0a, 0xa1, 0xb1, 0xe6, 0x9f, 0x85, 0xae, 0x0f, 0x28, + 0x39, 0x06, 0x46, 0x9f, 0x34, 0xbb, 0x90, 0xa7, 0x8d, 0x9e, 0x37, 0x5e, 0x65, 0xac, 0x03, 0xa8, + 0x3c, 0x6a, 0x62, 0xd8, 0x0a, 0x27, 0xa6, 0xee, 0xef, 0x88, 0xb5, 0x26, 0xe3, 0x62, 0x0c, 0x31, + 0x16, 0x07, 0xa7, 0x66, 0x1d, 0xcc, 0x08, 0x03, 0x73, 0xc8, 0x26, 0xc5, 0x60, 0x48, 0xc5, 0xbd, + 0x5c, 0xad, 0x04, 0xe2, 0x41, 0x98, 0x2c, 0xe9, 0x5e, 0x83, 0x3a, 0xfc, 0xd4, 0x48, 0x0e, 0x64, + 0xf6, 0x03, 0x9c, 0x3a, 0x34, 0x05, 0x80, 0x6b, 0x28, 0xfd, 0xbe, 0x62, 0x74, 0x9a, 0x41, 0x0a, + 0x57, 0x08, 0x3f, 0xdd, 0xc3, 0x95, 0xe5, 0x91, 0x66, 0x09, 0x82, 0x94, 0x46, 0xbf, 0x81, 0xe4, + 0x65, 0x24, 0xcb, 0x89, 0x93, 0x35, 0xf7, 0xd1, 0x27, 0x6b, 0x57, 0x34, 0x43, 0x49, 0x45, 0x8a, + 0x70, 0xfc, 0x62, 0x81, 0xa4, 0x50, 0xdd, 0x4b, 0x42, 0x48, 0x21, 0x7e, 0x59, 0x88, 0x00, 0xd5, + 0x7b, 0x5d, 0x8f, 0xaf, 0x75, 0x71, 0x4b, 0xe9, 0x58, 0xcc, 0x2e, 0x5b, 0x52, 0xe1, 0xe7, 0x85, + 0x2a, 0x1a, 0xb7, 0xef, 0xf5, 0x7a, 0xfa, 0xc1, 0x6d, 0xe3, 0x4e, 0xab, 0x00, 0x31, 0xeb, 0xf3, + 0xe9, 0xac, 0x67, 0xaf, 0x23, 0x3e, 0x7e, 0x88, 0x90, 0x8d, 0x47, 0x15, 0x19, 0x8b, 0x58, 0xd7, + 0x15, 0xf0, 0x42, 0xd6, 0xea, 0xdd, 0x90, 0x56, 0xcb, 0x14, 0xd0, 0xcd, 0xca, 0xda, 0x7a, 0xa9, + 0x74, 0xae, 0xed, 0x7c, 0x54, 0xb0, 0xc9, 0x69, 0x46, 0x68, 0xb7, 0x6a, 0x9b, 0x1e, 0x8e, 0x86, + 0x26, 0x5e, 0x85, 0xc2, 0xe8, 0xcb, 0x95, 0x89, 0x65, 0xcd, 0x70, 0xac, 0x13, 0x25, 0xb7, 0x7b, + 0x3b, 0x6a, 0xcd, 0x64, 0xcd, 0xe0, 0xca, 0xf8, 0x40, 0x31, 0x6e, 0xa4, 0xe0, 0x55, 0xa2, 0xa2, + 0x20, 0x1a, 0xf1, 0x59, 0xa1, 0x62, 0xfe, 0x89, 0xdb, 0x80, 0x98, 0x43, 0x8e, 0x49, 0xec, 0x65, + 0xda, 0x00, 0xc4, 0xd0, 0x40, 0xac, 0x0d, 0x02, 0xe8, 0xc0, 0x84, 0x8f, 0xc4, 0xae, 0x9a, 0xce, + 0xe2, 0xfb, 0xae, 0x86, 0xd9, 0xfc, 0x8e, 0x79, 0x64, 0xca, 0xf7, 0x63, 0xc1, 0xec, 0x43, 0x9d, + 0x80, 0x99, 0x99, 0x96, 0x4e, 0xe5, 0x1e, 0xc9, 0xa4, 0x42, 0x0e, 0x1b, 0x34, 0xe0, 0x42, 0x5a, + 0x46, 0xde, 0x6e, 0xbd, 0xc4, 0x2c, 0x3e, 0xc8, 0x61, 0x02, 0xf8, 0x72, 0x81, 0xf7, 0x88, 0x80, + 0x06, 0x98, 0xf1, 0x62, 0xef, 0x44, 0xc9, 0xfa, 0xce, 0xba, 0x46, 0xc3, 0xf5, 0x62, 0xa1, 0x59, + 0x6a, 0x3a, 0xf4, 0xc1, 0x9e, 0xb8, 0x79, 0xb6, 0x64, 0x65, 0xde, 0x58, 0x09, 0xd1, 0xdb, 0xde, + 0xbe, 0x58, 0x31, 0x89, 0xbc, 0x0e, 0xf7, 0xca, 0x94, 0xf3, 0x81, 0x51, 0xae, 0x2b, 0xe4, 0x9d, + 0xce, 0x01, 0xb2, 0x3d, 0x94, 0x55, 0x8c, 0x8f, 0x6b, 0x31, 0x5c, 0x18, 0x24, 0xca, 0xe1, 0x8a, + 0x19, 0x07, 0x2a, 0x75, 0xa0, 0xe5, 0xed, 0xa3, 0x35, 0x4f, 0x6d, 0x15, 0xbd, 0xeb, 0x74, 0x0a, + 0x73, 0x52, 0x11, 0x90, 0x4c, 0xb0, 0x2c, 0x36, 0x1a, 0xb8, 0x7d, 0xe4, 0x9e, 0x0d, 0xfa, 0x0f, + 0x9a, 0x3d, 0xb2, 0xbc, 0x4e, 0x7d, 0x62, 0xc5, 0x8e, 0xe9, 0x8b, 0xb5, 0x42, 0x17, 0xd6, 0x8c, + 0x88, 0xfb, 0x07, 0x6e, 0xb3, 0x01, 0x52, 0x3f, 0x9e, 0xf7, 0xe6, 0x97, 0xc3, 0x9c, 0x79, 0xaf, + 0xc8, 0x7c, 0xaa, 0xd8, 0x31, 0xbb, 0xc0, 0x64, 0x91, 0xd7, 0x6d, 0x97, 0x10, 0xa1, 0x57, 0x77, + 0xf7, 0xfc, 0xf8, 0x65, 0xf3, 0x33, 0x34, 0xd4, 0x2f, 0xe4, 0xc4, 0x97, 0xb6, 0x45, 0x4b, 0x06, + 0x50, 0xc5, 0x41, 0x65, 0xce, 0xec, 0x57, 0x3d, 0xd5, 0x90, 0x67, 0xff, 0xae, 0x66, 0xea, 0xa7, + 0x27, 0xe4, 0xd5, 0xa2, 0xf6, 0x42, 0x55, 0xd6, 0x68, 0xa7, 0xdb, 0x5e, 0x1b, 0x7b, 0xc9, 0xef, + 0x22, 0x43, 0xff, 0xbe, 0x0c, 0xfb, 0xf7, 0x65, 0x38, 0x40, 0x28, 0x8a, 0x49, 0x3e, 0x92, 0x1a, + 0x04, 0xe3, 0x2f, 0xeb, 0xb3, 0xfc, 0xbd, 0xb2, 0x65, 0x4c, 0x31, 0x6f, 0x49, 0xb2, 0xb0, 0xd2, + 0x9a, 0x2b, 0x2b, 0xad, 0x58, 0xa0, 0xbf, 0x43, 0x5b, 0xce, 0x50, 0x8e, 0xed, 0x65, 0xb1, 0x08, + 0xca, 0xbc, 0xd7, 0x30, 0x73, 0x6c, 0xe3, 0xb2, 0xe5, 0xfe, 0x3e, 0xcc, 0xb5, 0x92, 0xc8, 0xe4, + 0x50, 0xa0, 0x3d, 0xa6, 0x67, 0x3a, 0xe8, 0x3a, 0x3d, 0x3d, 0x93, 0xb6, 0xdc, 0x51, 0x24, 0xe6, + 0x6a, 0xf1, 0xf6, 0x8e, 0xd6, 0x3b, 0xbb, 0xa5, 0xaf, 0xfd, 0x0a, 0x6c, 0xd4, 0xec, 0x47, 0x6c, + 0x76, 0x80, 0xf2, 0xaa, 0xdd, 0x59, 0x03, 0x0d, 0xad, 0x62, 0x2d, 0xcb, 0xc1, 0xc1, 0x43, 0xe1, + 0x02, 0xd1, 0x52, 0xea, 0xd2, 0xbe, 0xd3, 0x5f, 0xef, 0x77, 0x67, 0xaf, 0x94, 0xa9, 0xd3, 0x1e, + 0xd0, 0xc4, 0xfa, 0xb0, 0x8e, 0x77, 0xdd, 0x65, 0xcd, 0x6a, 0x42, 0xa7, 0xd3, 0x19, 0x95, 0x3b, + 0x8b, 0x12, 0xad, 0x03, 0x12, 0x4d, 0x47, 0xc4, 0xa0, 0xbc, 0x6c, 0x7e, 0xa0, 0xc0, 0x40, 0x65, + 0x08, 0xac, 0xe2, 0x32, 0x18, 0x02, 0xd8, 0x6e, 0x39, 0x57, 0xaf, 0x5d, 0x1e, 0xca, 0x7a, 0x60, + 0xd5, 0x5e, 0x80, 0x92, 0xfd, 0x5d, 0xf4, 0xbb, 0x4b, 0x55, 0xf5, 0x35, 0xec, 0xe4, 0xea, 0x30, + 0xcb, 0xb2, 0x70, 0xef, 0xcf, 0x2c, 0x0c, 0x04, 0x83, 0x1b, 0x87, 0x00, 0x6a, 0x06, 0x7a, 0xa9, + 0xa8, 0x17, 0xc3, 0x1e, 0x75, 0xfa, 0x5d, 0x67, 0x77, 0xad, 0x78, 0x47, 0x0d, 0x1c, 0x35, 0xd1, + 0x6e, 0xaf, 0xe5, 0xe8, 0x97, 0x81, 0xd8, 0xed, 0x3a, 0x7b, 0x6b, 0x79, 0x06, 0xe5, 0x3c, 0x83, + 0x41, 0x0d, 0xa0, 0x07, 0x77, 0xd2, 0x7f, 0x01, 0x07, 0x0d, 0x71, 0xa7, 0x5d, 0x83, 0xd9, 0x4e, + 0x99, 0x0c, 0xf6, 0xfa, 0x0f, 0xa1, 0x7f, 0x99, 0x8a, 0xeb, 0x0f, 0x55, 0x2e, 0x2e, 0xfb, 0xcb, + 0xe7, 0x35, 0xd6, 0x26, 0xaa, 0x07, 0x6a, 0xa7, 0x88, 0xe6, 0xdc, 0xd5, 0xe6, 0x21, 0xe6, 0x25, + 0x4d, 0x81, 0xfc, 0xa4, 0xb4, 0x59, 0x28, 0x03, 0x8a, 0x12, 0x28, 0xd8, 0x20, 0x14, 0x70, 0xcd, + 0x23, 0xf3, 0xf6, 0xca, 0xfd, 0xec, 0x0d, 0x24, 0xc5, 0x96, 0x26, 0x61, 0x9c, 0x19, 0x33, 0xaf, + 0x30, 0x26, 0x74, 0x77, 0x12, 0x91, 0x5c, 0x42, 0x9e, 0x8f, 0x9a, 0x35, 0x27, 0xae, 0xd7, 0x72, + 0x77, 0xc4, 0xc0, 0x56, 0x39, 0x8b, 0x8d, 0x51, 0xd2, 0x04, 0x8e, 0x74, 0x13, 0x38, 0xaa, 0x37, + 0x81, 0xfb, 0xd2, 0xf0, 0x8d, 0xee, 0x34, 0x7c, 0x0b, 0xc1, 0xcb, 0xdb, 0xdd, 0x53, 0xea, 0x3e, + 0x37, 0x66, 0x45, 0x7b, 0xf5, 0x66, 0x98, 0x6c, 0x41, 0x2c, 0x3b, 0xa3, 0xe2, 0x10, 0xad, 0x2f, + 0x3b, 0x6f, 0x79, 0x3d, 0xfb, 0x77, 0xed, 0xae, 0x54, 0xd1, 0x52, 0xa7, 0xb0, 0x2c, 0x86, 0xbf, + 0xab, 0x88, 0xcf, 0x5a, 0x08, 0xed, 0x42, 0x5e, 0xd3, 0x95, 0x44, 0xda, 0x40, 0xeb, 0xc3, 0x0b, + 0x92, 0x5c, 0xf7, 0x90, 0x66, 0xc2, 0xdb, 0xaa, 0xfb, 0x28, 0xf7, 0x78, 0xe0, 0x28, 0xf8, 0x23, + 0x5c, 0xa7, 0xc2, 0x38, 0x41, 0x78, 0xa4, 0xf5, 0x24, 0x81, 0xfb, 0x70, 0x77, 0x8e, 0x62, 0x1f, + 0x59, 0xb3, 0xfb, 0xd0, 0x85, 0x6e, 0x56, 0xb3, 0xd0, 0x9d, 0x01, 0x54, 0x75, 0xee, 0xa1, 0x48, + 0xf5, 0x0c, 0x06, 0x56, 0xdf, 0xe2, 0x26, 0xb2, 0x44, 0xb4, 0x66, 0x58, 0x36, 0xb5, 0xd4, 0x95, + 0x46, 0x3a, 0x8f, 0x5c, 0x6e, 0xc4, 0x1e, 0x05, 0xc2, 0xf5, 0xef, 0x32, 0x15, 0x22, 0xa9, 0xec, + 0x2b, 0x93, 0xc1, 0x97, 0x8c, 0x72, 0xa0, 0x59, 0x0c, 0x51, 0x61, 0x31, 0x24, 0x85, 0x02, 0x51, + 0x6c, 0x5e, 0xd0, 0xf9, 0xaa, 0x9c, 0xe7, 0xa0, 0x8b, 0x9a, 0x71, 0x26, 0x77, 0x9d, 0x68, 0xdb, + 0xf2, 0x80, 0x2c, 0x88, 0x7d, 0xb2, 0x26, 0x77, 0x7d, 0x6b, 0x9e, 0x55, 0xa4, 0x98, 0x51, 0xe6, + 0xf2, 0xf5, 0x64, 0xe8, 0x50, 0xa2, 0x08, 0xea, 0x2f, 0xc2, 0x5e, 0x29, 0xc0, 0x13, 0x59, 0x22, + 0x8d, 0xa1, 0x0e, 0x24, 0xb5, 0x45, 0xc3, 0x7a, 0x62, 0x94, 0x5f, 0xab, 0x74, 0xf8, 0xf9, 0x4e, + 0x9b, 0x44, 0xba, 0xb9, 0x34, 0x9a, 0x8c, 0x34, 0x72, 0x9c, 0x78, 0x72, 0x7d, 0x0d, 0xdb, 0x01, + 0xb4, 0x4f, 0x46, 0x6d, 0x97, 0x41, 0x32, 0xfe, 0xd2, 0xae, 0x95, 0x48, 0xb7, 0x1a, 0x0a, 0x9d, + 0xbc, 0xbf, 0x61, 0xc1, 0x4e, 0xda, 0x66, 0x97, 0xf0, 0x8b, 0xf8, 0xa9, 0x31, 0x8f, 0x33, 0xb9, + 0x68, 0x86, 0x39, 0x8b, 0xf1, 0xcd, 0xa3, 0xb5, 0xe5, 0x38, 0xb5, 0xb8, 0xb5, 0x25, 0xec, 0x52, + 0xee, 0xf6, 0xf4, 0x9d, 0x89, 0x22, 0xaa, 0x48, 0x27, 0xaa, 0x6b, 0xb1, 0xa9, 0x3c, 0x2d, 0xa3, + 0x23, 0xf1, 0x12, 0xd4, 0xe9, 0xbd, 0x54, 0xa0, 0x46, 0xa2, 0x84, 0x56, 0x89, 0x77, 0xc5, 0x2e, + 0x9d, 0xdd, 0x53, 0xcf, 0x6f, 0xf6, 0xba, 0x25, 0x6f, 0x91, 0x65, 0x4d, 0xa4, 0xdb, 0xb2, 0xbb, + 0xef, 0x4e, 0x9a, 0xdd, 0x7d, 0xa2, 0x69, 0xb1, 0xe7, 0x68, 0xd0, 0xc5, 0x05, 0x20, 0xbe, 0xc1, + 0xc7, 0xa7, 0x95, 0xe2, 0xfd, 0xc2, 0x59, 0xd7, 0x05, 0x94, 0xa6, 0x08, 0x32, 0xee, 0xd2, 0x93, + 0x2b, 0xdc, 0x22, 0x6d, 0x44, 0x72, 0xde, 0x6d, 0x53, 0x19, 0xb9, 0x6f, 0x09, 0x5f, 0x84, 0x93, + 0x4d, 0x6d, 0x2a, 0xc2, 0x9d, 0xa3, 0x98, 0x65, 0xa0, 0x3c, 0xa0, 0xbe, 0xd8, 0x41, 0xe5, 0xa5, + 0xc3, 0x08, 0x5f, 0x84, 0xdb, 0x48, 0x54, 0xdc, 0xe8, 0xf0, 0x2c, 0xd2, 0x4b, 0x5a, 0x25, 0x95, + 0xdb, 0xf5, 0x89, 0x89, 0x23, 0xbb, 0xc2, 0x69, 0xa5, 0x49, 0xa9, 0xca, 0x6b, 0x89, 0xe4, 0xb5, + 0xc1, 0xdd, 0x73, 0x92, 0xdc, 0xfd, 0xd7, 0x21, 0xef, 0xe8, 0xa0, 0xa2, 0xe7, 0xf5, 0x6a, 0x26, + 0x2c, 0x3e, 0xfd, 0x64, 0xf5, 0xd3, 0x4f, 0x56, 0x9d, 0x7e, 0x34, 0xd9, 0x4c, 0x7b, 0x02, 0x36, + 0x4f, 0x14, 0xcc, 0x3b, 0xe8, 0xe5, 0x75, 0x13, 0xf5, 0x79, 0x0d, 0x3e, 0x4a, 0x7d, 0xd7, 0x2c, + 0xc6, 0xd2, 0xe6, 0xc9, 0x8d, 0x1b, 0x27, 0x13, 0xd9, 0xa7, 0x7c, 0xc3, 0x96, 0x49, 0x1d, 0x2b, + 0x49, 0x15, 0x01, 0x20, 0xa4, 0xa5, 0x34, 0x97, 0xcb, 0x04, 0x4b, 0x18, 0xb3, 0xb2, 0x02, 0x74, + 0xa0, 0xad, 0xa3, 0xf6, 0xd7, 0xf1, 0xa4, 0x2d, 0x08, 0xef, 0xe1, 0xb4, 0xb6, 0x46, 0x04, 0x57, + 0x85, 0xe4, 0xdd, 0x30, 0x72, 0x03, 0x1a, 0x87, 0xaa, 0xa6, 0x3b, 0xa8, 0x6e, 0x2a, 0x54, 0x7b, + 0x76, 0x51, 0x3f, 0x2c, 0xa9, 0x9b, 0x65, 0x4d, 0xaf, 0xdb, 0x6e, 0xaf, 0x6b, 0x71, 0xdd, 0x4e, + 0x25, 0x8f, 0xae, 0x03, 0xe7, 0xba, 0x2e, 0x57, 0xe4, 0xe9, 0xb6, 0x35, 0x3d, 0xad, 0xa4, 0x8f, + 0xd5, 0x0d, 0xee, 0xe3, 0x3b, 0x67, 0x18, 0x21, 0x00, 0xea, 0xe4, 0x93, 0xaf, 0xf1, 0x84, 0xb6, + 0x7d, 0xd6, 0x97, 0x7c, 0xe0, 0xeb, 0x7c, 0xa0, 0xce, 0x9f, 0xea, 0x0e, 0xaa, 0x2d, 0x36, 0xfa, + 0x8b, 0x15, 0x71, 0x97, 0x1d, 0xcf, 0x50, 0x16, 0xa4, 0xfd, 0x2e, 0xda, 0x0c, 0xbe, 0xa6, 0x95, + 0xc1, 0xc8, 0x23, 0xf6, 0x3d, 0xe9, 0xf3, 0xf4, 0x41, 0x4a, 0xe2, 0x40, 0x72, 0xf9, 0xb3, 0x5f, + 0x2c, 0xd8, 0x21, 0x1c, 0x7d, 0xb5, 0x9a, 0x93, 0xad, 0x8d, 0xee, 0x8d, 0xdc, 0xdc, 0xbf, 0x2e, + 0x00, 0x11, 0x0b, 0x29, 0xf4, 0x3c, 0xf0, 0xda, 0x6a, 0xdf, 0xc4, 0x56, 0x62, 0x53, 0x60, 0x3d, + 0x14, 0xc8, 0xaa, 0xaf, 0xa9, 0x17, 0x21, 0x45, 0x70, 0x91, 0x0e, 0xcf, 0x99, 0x7c, 0x9e, 0x59, + 0xe9, 0xe1, 0x21, 0xca, 0x9c, 0x6e, 0x7f, 0xcb, 0x0b, 0xe4, 0xa3, 0xe8, 0x62, 0x42, 0x1b, 0x2e, + 0x05, 0x02, 0x08, 0x80, 0x76, 0xd9, 0xfb, 0x48, 0x6b, 0x36, 0x1c, 0x26, 0xfc, 0x25, 0x5f, 0x7f, + 0x8a, 0x17, 0xa8, 0xda, 0xdb, 0x56, 0x40, 0xbf, 0xab, 0xfb, 0x34, 0xeb, 0xa7, 0xf5, 0x36, 0x32, + 0xab, 0xba, 0x3b, 0xc4, 0x7a, 0x63, 0x6f, 0x4f, 0xfc, 0xf6, 0x74, 0x22, 0xd5, 0x1d, 0x9f, 0xac, + 0xb1, 0xbd, 0xaf, 0x79, 0x17, 0xfa, 0xed, 0x15, 0x52, 0xdb, 0xae, 0xda, 0xa8, 0x36, 0x50, 0xc6, + 0xcf, 0xa6, 0xb6, 0xe4, 0x52, 0xde, 0x81, 0x60, 0xec, 0x83, 0xbe, 0xd6, 0x96, 0x6e, 0x4c, 0x50, + 0x7f, 0x71, 0x57, 0x64, 0xb7, 0x27, 0x6b, 0xef, 0xe7, 0xf7, 0xf4, 0xf7, 0xe5, 0x3f, 0xdc, 0xdf, + 0xb2, 0xaf, 0x45, 0xec, 0xa4, 0x29, 0xf5, 0x8c, 0x7a, 0xda, 0x6f, 0xcb, 0xf7, 0xbd, 0x06, 0xd3, + 0x54, 0xd2, 0x4e, 0xb1, 0x7f, 0x6d, 0x63, 0x87, 0xfb, 0x4a, 0x58, 0xe9, 0x56, 0x82, 0xe8, 0x85, + 0xee, 0x8a, 0xdb, 0x6d, 0x54, 0xfb, 0x8d, 0x03, 0xbd, 0xd6, 0x73, 0xed, 0x2e, 0x95, 0xe3, 0x35, + 0xde, 0xd5, 0xf7, 0xae, 0x15, 0xbb, 0x7e, 0xb2, 0xe6, 0xf6, 0x81, 0xa8, 0xf4, 0x08, 0x1d, 0xa2, + 0x1b, 0xfc, 0x76, 0x9d, 0x41, 0x5b, 0xed, 0x44, 0x47, 0xad, 0xaf, 0x6e, 0x70, 0x30, 0xf8, 0x2f, + 0xd7, 0xad, 0xa5, 0xba, 0xaa, 0xa1, 0x03, 0x90, 0x25, 0x16, 0x38, 0x56, 0xc2, 0x23, 0x9e, 0xc9, + 0x19, 0x07, 0xaa, 0x5b, 0xeb, 0x49, 0x49, 0xd3, 0x7d, 0x77, 0xb7, 0xa6, 0x9b, 0xc8, 0x43, 0x2d, + 0x03, 0x52, 0xcd, 0x70, 0xc6, 0x8f, 0xd4, 0x74, 0x3f, 0xe8, 0x4b, 0xc3, 0xaa, 0xc7, 0x37, 0x9d, + 0x82, 0x79, 0xc4, 0xc4, 0xb1, 0x13, 0x26, 0x24, 0x92, 0xd8, 0x22, 0x42, 0xf9, 0x23, 0xa5, 0x4b, + 0xa0, 0x3e, 0x83, 0xbf, 0x7c, 0xbb, 0x31, 0x57, 0x52, 0xf0, 0x77, 0xf7, 0x40, 0xfc, 0xee, 0x8b, + 0xf4, 0x9e, 0xf8, 0x6d, 0xe3, 0x6f, 0x8c, 0x1b, 0x8f, 0x6a, 0xfa, 0xf0, 0xfa, 0x6e, 0xa9, 0x82, + 0x7d, 0x49, 0xf1, 0x64, 0x0d, 0x1e, 0x8d, 0x69, 0x6f, 0x27, 0x02, 0xc2, 0x54, 0x98, 0x08, 0x4c, + 0xc2, 0x4f, 0xa7, 0xfd, 0x0b, 0x1f, 0x3f, 0xae, 0x22, 0x53, 0x74, 0x48, 0x9e, 0x5f, 0xac, 0x21, + 0x93, 0xc2, 0xad, 0xad, 0x45, 0x68, 0xde, 0x87, 0x63, 0x12, 0xaa, 0x43, 0xe5, 0xe3, 0xa8, 0x63, + 0x99, 0xe7, 0x45, 0x74, 0xc1, 0x75, 0x60, 0x23, 0x2f, 0xd2, 0x04, 0x21, 0xa2, 0x3f, 0xad, 0xe8, + 0x80, 0x29, 0x28, 0x58, 0x5c, 0x31, 0xec, 0x49, 0x1d, 0xd0, 0xd7, 0x96, 0xae, 0x7d, 0x1a, 0x27, + 0x5b, 0xa8, 0x60, 0x1c, 0x7d, 0xf8, 0x9b, 0x2a, 0xc4, 0xa7, 0x42, 0x75, 0xcb, 0xe8, 0x79, 0x5f, + 0xa9, 0x71, 0xa9, 0xd4, 0xf4, 0x22, 0xfe, 0x32, 0xd8, 0xa0, 0xa3, 0xfd, 0x7a, 0xef, 0xf4, 0xfc, + 0x20, 0x77, 0x8e, 0x3c, 0x64, 0xb1, 0xe6, 0xae, 0xc2, 0x10, 0x0c, 0xeb, 0x1e, 0xb0, 0x8a, 0xdb, + 0xe8, 0xbe, 0xb9, 0xf5, 0xe3, 0x46, 0x9b, 0x63, 0x98, 0x68, 0x83, 0x9d, 0xf0, 0x1d, 0xa4, 0x62, + 0xb0, 0xf5, 0x95, 0x41, 0xc5, 0x5c, 0x62, 0xc0, 0x13, 0x6d, 0xc0, 0x13, 0x39, 0xe0, 0x18, 0xbf, + 0xa0, 0x04, 0xbf, 0x04, 0x34, 0x29, 0xc6, 0x3e, 0xd1, 0xc1, 0x7a, 0x53, 0x11, 0x97, 0x24, 0xe1, + 0x0b, 0x11, 0x71, 0xb8, 0x7b, 0xaf, 0x34, 0xef, 0xc9, 0xa3, 0x2b, 0x83, 0xf6, 0x1d, 0x62, 0x5c, + 0x97, 0x94, 0x83, 0x86, 0xf5, 0x94, 0x8b, 0x86, 0x7b, 0x64, 0xf9, 0x2f, 0x75, 0xca, 0xe6, 0xdd, + 0x1e, 0xa1, 0x6c, 0xcd, 0x23, 0xc4, 0x34, 0xa5, 0xe3, 0x7e, 0x0d, 0xb3, 0x2a, 0x9f, 0xc1, 0xa6, + 0xcd, 0x37, 0x6a, 0x0e, 0xaf, 0x0a, 0xe4, 0xe9, 0x8b, 0x72, 0xdf, 0xf2, 0xce, 0x29, 0x35, 0xe6, + 0xa9, 0xfe, 0xbe, 0x69, 0xb5, 0x9e, 0x69, 0xc2, 0x7a, 0xed, 0xc8, 0x40, 0x41, 0x66, 0xb5, 0xb4, + 0xf5, 0x43, 0x81, 0x27, 0xc2, 0x8f, 0x45, 0x42, 0x8b, 0x5a, 0x10, 0x87, 0x47, 0x64, 0xcf, 0x59, + 0xd1, 0x67, 0x1c, 0xac, 0xed, 0x92, 0x16, 0x4a, 0x3a, 0xac, 0x5a, 0x39, 0x2a, 0x08, 0x9a, 0x6d, + 0xcb, 0x63, 0x7d, 0x00, 0x4e, 0x2d, 0x00, 0xef, 0x0b, 0x44, 0x10, 0xec, 0xe4, 0xf3, 0xdc, 0x6f, + 0x93, 0xcf, 0x13, 0xb7, 0xa0, 0xd2, 0xfb, 0x01, 0xd7, 0x45, 0x71, 0x29, 0x5c, 0x78, 0x45, 0x0f, + 0x06, 0xdc, 0x3f, 0x2b, 0x8d, 0xbd, 0x5a, 0x22, 0xf8, 0xb0, 0xc6, 0xdd, 0xec, 0x8e, 0xb9, 0xaa, + 0x7c, 0x9a, 0x4a, 0xce, 0xbb, 0x75, 0xba, 0xcc, 0x26, 0x46, 0x7d, 0x5b, 0xea, 0x4b, 0x65, 0x71, + 0x7e, 0xb4, 0xb6, 0x35, 0x7e, 0x40, 0xdd, 0xa9, 0xfa, 0xb3, 0xfb, 0x83, 0xbb, 0x45, 0xee, 0x6f, + 0xe5, 0x46, 0x04, 0x7a, 0x6b, 0xe5, 0x37, 0x17, 0x59, 0x64, 0xe4, 0xd7, 0x54, 0xf4, 0xdd, 0xfa, + 0xd0, 0x0f, 0x38, 0x71, 0x71, 0xd9, 0xa9, 0xf6, 0x07, 0xd1, 0x60, 0x8b, 0x4a, 0x4b, 0x03, 0x5a, + 0x5b, 0xed, 0x8b, 0x8d, 0x14, 0xf5, 0x4f, 0x55, 0xfb, 0xfd, 0x46, 0x68, 0xf7, 0xff, 0x89, 0x5a, + 0x7f, 0xda, 0x0c, 0xec, 0xe0, 0x9f, 0xa8, 0xf6, 0xd9, 0xc6, 0x6a, 0xfb, 0xff, 0x44, 0xad, 0xdf, + 0x54, 0x6a, 0xa5, 0x2a, 0x79, 0xfd, 0xc2, 0xaf, 0xc4, 0x5d, 0x27, 0xac, 0x70, 0x9d, 0xac, 0xa4, + 0x16, 0x22, 0x23, 0x5a, 0x51, 0xc6, 0x2d, 0xaf, 0xad, 0xd7, 0xfb, 0xc7, 0x4a, 0xbd, 0x83, 0x76, + 0x4d, 0xbd, 0xc0, 0x20, 0xac, 0x98, 0x8e, 0x57, 0x52, 0x8b, 0xb9, 0xab, 0x5e, 0xb0, 0x87, 0x97, + 0xe2, 0xf8, 0x6f, 0x47, 0x9c, 0x07, 0x56, 0x02, 0xac, 0xd4, 0xd9, 0x62, 0x35, 0xb2, 0x23, 0xd6, + 0xef, 0xaa, 0xe2, 0xf2, 0xdb, 0x82, 0xe8, 0x55, 0x7b, 0x9d, 0xae, 0x6e, 0x4c, 0x00, 0x27, 0xaf, + 0xca, 0xd3, 0x8f, 0x0e, 0xca, 0x9f, 0xaa, 0xe5, 0x0d, 0x6d, 0xcb, 0x49, 0xef, 0x60, 0xa5, 0xbf, + 0xf5, 0xf5, 0x82, 0x3f, 0x5a, 0x32, 0xbc, 0x8a, 0xa5, 0x0f, 0xa3, 0xa0, 0xb9, 0x52, 0x37, 0xf4, + 0x62, 0x7f, 0xae, 0x14, 0x13, 0xa4, 0xda, 0xbf, 0xa7, 0xd8, 0x5f, 0xee, 0x02, 0xb3, 0xd3, 0xd3, + 0xc1, 0xec, 0x94, 0x50, 0xfd, 0xb3, 0xde, 0x1e, 0x41, 0x79, 0x4f, 0x4b, 0x8c, 0x95, 0x4b, 0x00, + 0x80, 0xf7, 0x94, 0xc8, 0x8a, 0x12, 0x86, 0xaf, 0xcf, 0x13, 0x7d, 0x6e, 0xb0, 0xea, 0x79, 0x13, + 0xa6, 0x09, 0x29, 0xa8, 0x4d, 0x91, 0x49, 0x25, 0x02, 0x9c, 0x00, 0x40, 0x1d, 0x81, 0xae, 0x10, + 0x50, 0xaa, 0x35, 0x49, 0xf4, 0xa3, 0x7f, 0x0c, 0xb4, 0x36, 0x62, 0x50, 0x85, 0x0f, 0x0e, 0xba, + 0xcd, 0xce, 0x6e, 0x63, 0xbb, 0x33, 0x90, 0xb8, 0x83, 0x14, 0x21, 0xa6, 0x97, 0xe9, 0xc2, 0x0d, + 0x98, 0xe3, 0x07, 0xee, 0x4f, 0x0e, 0x73, 0x53, 0x8c, 0x3b, 0xe0, 0xfe, 0xd9, 0x61, 0x21, 0x73, + 0xbf, 0x83, 0xbf, 0xa9, 0xfb, 0xbd, 0xc3, 0x52, 0x97, 0x31, 0x67, 0xe6, 0x46, 0xcc, 0x09, 0xa6, + 0xee, 0x0f, 0x4e, 0xc0, 0xdc, 0x67, 0x4e, 0x30, 0x77, 0x33, 0x78, 0x4f, 0xdd, 0x9f, 0x9d, 0xb9, + 0x1b, 0x3a, 0x09, 0x73, 0xff, 0xe8, 0x24, 0x81, 0xfb, 0x8d, 0x93, 0xfa, 0xee, 0x3b, 0x27, 0x65, + 0xee, 0x0b, 0xf8, 0x93, 0xba, 0x09, 0x73, 0xd2, 0xd4, 0xfd, 0x31, 0xcf, 0xad, 0xba, 0x1b, 0x96, + 0x30, 0x2a, 0x10, 0x5d, 0x5e, 0xe3, 0x9e, 0x87, 0xf1, 0xd8, 0x0f, 0x9d, 0x65, 0xee, 0x7c, 0x6b, + 0x3b, 0x7f, 0xf2, 0x7e, 0x6f, 0xa5, 0x0b, 0xeb, 0xcf, 0xdb, 0x14, 0xea, 0x60, 0x4f, 0x5d, 0xf8, + 0x13, 0xa9, 0x28, 0x7e, 0xcd, 0xce, 0x10, 0xb2, 0xb0, 0xd4, 0xfa, 0x93, 0xed, 0xc0, 0x83, 0x6f, + 0x45, 0x18, 0xcf, 0xec, 0x2f, 0xd6, 0xcf, 0x35, 0x71, 0x07, 0xfe, 0x84, 0x01, 0x23, 0x20, 0xd7, + 0xdc, 0xc2, 0xfb, 0x23, 0x32, 0x06, 0x95, 0x63, 0x6c, 0x11, 0x0a, 0x3b, 0xa7, 0x2e, 0x03, 0x38, + 0x39, 0xe5, 0xd1, 0xfe, 0x29, 0x90, 0xc2, 0xef, 0xad, 0x24, 0xb0, 0xec, 0x61, 0x11, 0xfd, 0xe6, + 0xf7, 0x56, 0x90, 0x5a, 0x78, 0x0f, 0x17, 0x3c, 0x50, 0x74, 0x2e, 0x78, 0xf0, 0x03, 0x0a, 0xe4, + 0x05, 0x29, 0x53, 0x0b, 0x03, 0x11, 0x00, 0x18, 0x98, 0xc7, 0xc7, 0x07, 0x8c, 0x9b, 0x42, 0xb1, + 0xbc, 0xa1, 0xaa, 0x00, 0xda, 0x6d, 0x34, 0xac, 0x89, 0x97, 0x30, 0x7e, 0x49, 0x40, 0x34, 0x62, + 0x28, 0x2e, 0x9c, 0x52, 0x94, 0x32, 0xf9, 0x65, 0xbb, 0xe3, 0x62, 0xa4, 0x3a, 0x27, 0xe5, 0xb1, + 0xf6, 0x97, 0x91, 0x3b, 0x71, 0x00, 0xfd, 0x30, 0x32, 0x19, 0x22, 0x32, 0x40, 0xcc, 0xfa, 0xce, + 0xd4, 0x8d, 0x1c, 0xdf, 0x4d, 0x72, 0x7e, 0x57, 0x23, 0xc2, 0xcb, 0x2a, 0xf0, 0x32, 0x09, 0x2f, + 0x93, 0xf0, 0xc2, 0x58, 0x0a, 0x80, 0x61, 0x6c, 0x2d, 0xbb, 0x1a, 0x26, 0x8d, 0x21, 0xe8, 0xc9, + 0x11, 0x88, 0xb3, 0x52, 0x72, 0x62, 0xbb, 0x20, 0x86, 0x45, 0xe4, 0xff, 0xa5, 0x84, 0x04, 0xc8, + 0x22, 0x71, 0x80, 0x42, 0x22, 0x27, 0x72, 0x7b, 0x7d, 0xbc, 0x4c, 0x60, 0xb5, 0xea, 0x1d, 0xe0, + 0xef, 0x08, 0xc9, 0x1b, 0x3a, 0x97, 0xda, 0xae, 0x0c, 0x2f, 0x46, 0x91, 0xbd, 0xc2, 0xc8, 0x4d, + 0x0e, 0xdb, 0x23, 0x1e, 0x54, 0x84, 0x97, 0xf1, 0x45, 0x19, 0x1f, 0xcb, 0x24, 0x50, 0xc6, 0x2f, + 0xca, 0xa0, 0xd5, 0x94, 0xcb, 0x95, 0xae, 0x93, 0xd4, 0x09, 0x9c, 0xad, 0xad, 0xdf, 0x5b, 0x33, + 0xcb, 0x3e, 0xcd, 0xc1, 0x50, 0xf3, 0x5b, 0x0b, 0xbb, 0xb8, 0x3b, 0xe4, 0x98, 0x60, 0x6f, 0xf9, + 0xde, 0x09, 0x0c, 0x22, 0xfc, 0x7f, 0xab, 0x73, 0x2a, 0x35, 0x10, 0xbf, 0x75, 0xec, 0x41, 0xf6, + 0xdc, 0xa6, 0xdb, 0xc5, 0x5e, 0x7b, 0x7e, 0x6b, 0x26, 0x82, 0xb1, 0xaa, 0x08, 0x24, 0x3c, 0x92, + 0x5c, 0x32, 0xf4, 0x5b, 0x53, 0x4f, 0xc4, 0x67, 0xd1, 0xa3, 0x82, 0x42, 0xbd, 0x27, 0x6d, 0x1e, + 0x03, 0x96, 0x97, 0x81, 0x11, 0x49, 0x10, 0xff, 0xb9, 0x08, 0x5f, 0x62, 0x45, 0x80, 0xb3, 0x46, + 0x63, 0xeb, 0xed, 0x6a, 0xb5, 0x8d, 0x11, 0x20, 0x23, 0x78, 0xfe, 0x46, 0x8b, 0xf2, 0xc1, 0x6f, + 0x0c, 0x89, 0x56, 0xab, 0x2d, 0x19, 0xdb, 0x9e, 0xd3, 0xdc, 0x32, 0x71, 0x53, 0x67, 0xec, 0x06, + 0x22, 0xc4, 0x09, 0x46, 0xf1, 0x4a, 0x00, 0xc6, 0x64, 0xb5, 0xc2, 0xde, 0x09, 0x36, 0xc5, 0x78, + 0xf3, 0xcf, 0x30, 0x22, 0x13, 0x10, 0x6e, 0x51, 0x1f, 0x51, 0xca, 0xd3, 0x46, 0xe3, 0xa9, 0x95, + 0xda, 0xa3, 0xe5, 0xd8, 0x4d, 0x73, 0xd7, 0xc2, 0x98, 0xab, 0xe2, 0xe6, 0x28, 0x0a, 0xf4, 0xb7, + 0x76, 0x53, 0x42, 0xe6, 0x2c, 0x55, 0x0e, 0x11, 0xdb, 0x85, 0xee, 0x2b, 0x26, 0xbb, 0x17, 0xda, + 0xb5, 0x5b, 0x33, 0xbb, 0x48, 0xc7, 0x2b, 0x58, 0xc3, 0x8c, 0x07, 0x59, 0xc2, 0xe0, 0x42, 0x80, + 0x43, 0xb2, 0x66, 0x29, 0x0c, 0x0c, 0x05, 0xcd, 0x58, 0xd2, 0x8d, 0x0b, 0x22, 0x18, 0x4e, 0x35, + 0xde, 0x0f, 0x59, 0xe8, 0x59, 0x6b, 0xbc, 0x5a, 0x25, 0x27, 0x59, 0x6b, 0x81, 0x57, 0x25, 0xf0, + 0x07, 0xaf, 0x23, 0x62, 0xe9, 0x64, 0xad, 0xd7, 0xce, 0x3a, 0xb6, 0xb3, 0xd6, 0x94, 0x50, 0x8d, + 0x91, 0xd6, 0xa9, 0x12, 0xba, 0x62, 0x22, 0x42, 0xb6, 0x6d, 0xe1, 0x8d, 0x20, 0x53, 0x75, 0xb3, + 0x11, 0x6b, 0x45, 0x14, 0xd0, 0x71, 0xe2, 0xc4, 0xb6, 0x73, 0xad, 0x82, 0x86, 0x57, 0x61, 0xc0, + 0xc5, 0x02, 0x04, 0x63, 0x8b, 0x37, 0xaf, 0x2e, 0x34, 0xe0, 0xc0, 0xb4, 0xb5, 0xeb, 0x77, 0x22, + 0x1e, 0x16, 0x6a, 0x6a, 0x63, 0x4c, 0x4e, 0x79, 0x4d, 0xf0, 0x49, 0xe4, 0xa4, 0x60, 0xa1, 0xb4, + 0x7c, 0xe0, 0xef, 0xac, 0x75, 0x2c, 0xee, 0x02, 0xb9, 0x6a, 0x34, 0xae, 0xd9, 0x48, 0x04, 0x67, + 0xc7, 0x48, 0x67, 0xd7, 0x2c, 0x7f, 0x32, 0x3c, 0x73, 0x4d, 0x53, 0x1d, 0x44, 0x9b, 0x91, 0x2c, + 0x29, 0x36, 0x7d, 0x33, 0x11, 0xa2, 0x65, 0x76, 0x32, 0x2b, 0x02, 0xc9, 0x1d, 0x32, 0x8d, 0x65, + 0x67, 0xfc, 0xde, 0x8f, 0xa1, 0xdf, 0xf4, 0xce, 0x28, 0x36, 0x3a, 0xf1, 0x01, 0xee, 0x9c, 0xa4, + 0xc8, 0xc6, 0x4f, 0xa1, 0x43, 0x30, 0x48, 0xf9, 0x19, 0x34, 0xc1, 0x72, 0xc8, 0xa4, 0xe7, 0xa0, + 0x34, 0xd5, 0x15, 0xe2, 0xd2, 0x14, 0x39, 0x14, 0x64, 0x45, 0x0a, 0xb4, 0x3a, 0xcd, 0x31, 0x3a, + 0x9d, 0xba, 0xa4, 0x64, 0x6a, 0x8b, 0x10, 0x7a, 0xd0, 0xdb, 0x93, 0xb8, 0xd9, 0x3c, 0x05, 0xa1, + 0x90, 0xb4, 0xc6, 0x4e, 0xe8, 0x6d, 0x45, 0xc3, 0x10, 0xa8, 0xc7, 0xc2, 0x77, 0xbc, 0x3f, 0x81, + 0x3f, 0x78, 0x37, 0xd6, 0x19, 0xa3, 0xc8, 0x31, 0xc5, 0x10, 0x2f, 0x1e, 0xff, 0x62, 0x5d, 0xda, + 0xcb, 0xc7, 0xcb, 0x04, 0xf8, 0xa3, 0xc3, 0xf9, 0x43, 0x89, 0x07, 0x8c, 0x66, 0xa7, 0xc2, 0x83, + 0xa7, 0xde, 0x13, 0xf3, 0x09, 0x5e, 0xa7, 0xd3, 0x3a, 0x3e, 0x61, 0x78, 0x7b, 0xcd, 0x13, 0x53, + 0xbd, 0x09, 0x2a, 0x3f, 0x63, 0x8f, 0x7f, 0x79, 0xbc, 0x8c, 0x72, 0xef, 0xf2, 0xf1, 0x32, 0x1d, + 0x99, 0x27, 0xa6, 0x6b, 0xb6, 0xcc, 0x1c, 0xeb, 0x3e, 0xd6, 0x44, 0x48, 0x4e, 0x1f, 0x4f, 0x4d, + 0xbc, 0xd0, 0xe9, 0x2c, 0xb7, 0xc5, 0xdd, 0x22, 0x0e, 0x5e, 0x2e, 0xa2, 0xc0, 0xe0, 0xa8, 0x1d, + 0x9d, 0x61, 0xff, 0xca, 0xb0, 0xf1, 0xd8, 0x81, 0x26, 0xb4, 0x64, 0x36, 0x33, 0xbd, 0x30, 0x8d, + 0x5b, 0x2e, 0xfa, 0x77, 0x67, 0x87, 0x24, 0x98, 0x40, 0xee, 0xc6, 0x1a, 0x70, 0x67, 0x25, 0x80, + 0x3e, 0x45, 0x3b, 0x3b, 0x5f, 0x19, 0x69, 0xbc, 0x48, 0x26, 0xec, 0xe3, 0x0f, 0xaf, 0x3d, 0xcc, + 0x9e, 0xe4, 0xa3, 0xc9, 0xed, 0x24, 0x64, 0x67, 0x48, 0xd4, 0x40, 0x11, 0x38, 0x61, 0xe1, 0x60, + 0xef, 0x7c, 0x5d, 0x0c, 0x37, 0x86, 0xf6, 0x4c, 0xed, 0xfc, 0xeb, 0x1d, 0x1a, 0xf0, 0x08, 0x87, + 0x7b, 0x2b, 0xc4, 0xb8, 0x86, 0x78, 0xd9, 0x29, 0x66, 0x1e, 0x6a, 0x37, 0x02, 0x20, 0x34, 0x71, + 0x2e, 0xef, 0x05, 0x80, 0x11, 0x04, 0x22, 0xe4, 0x9f, 0x97, 0x30, 0x3c, 0x08, 0xe5, 0x82, 0x67, + 0xc9, 0x55, 0x96, 0x14, 0xb2, 0x88, 0x44, 0x4b, 0x94, 0xb7, 0xcf, 0xf0, 0x12, 0x15, 0x19, 0x7e, + 0x1f, 0x28, 0x29, 0x25, 0x6f, 0x22, 0xc9, 0xb2, 0xe9, 0x08, 0x88, 0xee, 0xd2, 0x5b, 0x2e, 0x92, + 0xd0, 0x05, 0xea, 0x73, 0x44, 0xe4, 0x3c, 0x77, 0xcc, 0x72, 0x07, 0x99, 0xf5, 0x12, 0x98, 0x73, + 0x41, 0x9d, 0xe1, 0x5d, 0x29, 0xe2, 0xfb, 0xb5, 0x7e, 0x49, 0x4e, 0x04, 0xd1, 0x82, 0xa8, 0x06, + 0x74, 0x22, 0xdd, 0xc2, 0x9c, 0x60, 0x2d, 0x40, 0xd2, 0x0f, 0x28, 0xb7, 0x89, 0xf9, 0x00, 0x5f, + 0x33, 0x71, 0xab, 0x0c, 0xe2, 0x63, 0x82, 0xd1, 0xe2, 0x32, 0xd5, 0xdb, 0x4f, 0x91, 0xd6, 0x21, + 0xd9, 0x8b, 0x8c, 0x7a, 0x81, 0xa1, 0x93, 0x90, 0x08, 0x61, 0xc4, 0x52, 0x5d, 0x56, 0xb5, 0xc2, + 0xc8, 0x2e, 0x0f, 0x1e, 0x4d, 0x3d, 0x28, 0xad, 0x35, 0xb6, 0xe2, 0x81, 0x1f, 0x01, 0x23, 0x95, + 0x71, 0x93, 0xb3, 0xca, 0x2f, 0x36, 0x88, 0xb7, 0x4f, 0xd1, 0x99, 0x76, 0xb1, 0x02, 0x6e, 0xb8, + 0xd5, 0xae, 0x4a, 0x49, 0x9a, 0x32, 0xb4, 0x31, 0x4c, 0xa4, 0x81, 0x76, 0x1f, 0x54, 0x64, 0x62, + 0x2c, 0xc7, 0xd8, 0x23, 0xb1, 0x9f, 0x8e, 0x60, 0xca, 0x96, 0x21, 0x90, 0x17, 0x30, 0xa0, 0xd8, + 0x71, 0x79, 0x05, 0x56, 0xa0, 0x42, 0x00, 0xc7, 0x28, 0xe5, 0x12, 0x7e, 0x87, 0x1b, 0xe0, 0x20, + 0xa6, 0xdb, 0x37, 0xc6, 0x50, 0xad, 0x1e, 0x78, 0xf3, 0x25, 0x20, 0x79, 0x5e, 0x49, 0x3b, 0xc6, + 0x1d, 0x13, 0x87, 0x13, 0x40, 0xd7, 0x98, 0xee, 0xeb, 0x99, 0xd3, 0xf3, 0x9c, 0x9e, 0x09, 0x80, + 0x31, 0xbc, 0x12, 0xd3, 0xcf, 0x57, 0xab, 0xf9, 0xd1, 0x18, 0xe6, 0xa5, 0x29, 0x54, 0xe4, 0x8c, + 0xc5, 0xe7, 0x39, 0x7c, 0x9e, 0x42, 0x2d, 0xce, 0x5c, 0xcc, 0x53, 0x90, 0x7f, 0x7c, 0x34, 0x57, + 0xb9, 0x6c, 0x00, 0x5a, 0xc2, 0x2f, 0x66, 0x9e, 0x31, 0x1f, 0x9b, 0x97, 0xac, 0x89, 0x20, 0xc3, + 0x60, 0x8d, 0x3d, 0x10, 0xbf, 0x37, 0x18, 0xb8, 0x1c, 0x24, 0xa4, 0xa0, 0x23, 0x21, 0x97, 0x65, + 0xb8, 0x33, 0x8c, 0xd9, 0x18, 0xc0, 0xbf, 0x09, 0x08, 0x6d, 0x3a, 0x5c, 0x5e, 0xb9, 0x58, 0x06, + 0x1a, 0xbc, 0x61, 0x32, 0x52, 0xfd, 0x67, 0x76, 0x9b, 0x5a, 0xb1, 0x0a, 0x75, 0x89, 0x01, 0xb3, + 0x61, 0xc2, 0x91, 0x61, 0xd2, 0x50, 0xe7, 0x39, 0x67, 0xbc, 0x3e, 0xa8, 0xae, 0xd1, 0xc0, 0xa8, + 0x9b, 0x63, 0x98, 0xde, 0xcf, 0x29, 0x64, 0x9b, 0xd0, 0xe7, 0x66, 0x9e, 0x2c, 0x0c, 0x13, 0xe8, + 0x04, 0x27, 0x90, 0xad, 0x68, 0x34, 0x69, 0x8d, 0xdd, 0x49, 0x6b, 0xa1, 0xaa, 0x82, 0xe7, 0x5c, + 0x39, 0xc8, 0x26, 0x9c, 0xe8, 0x44, 0x29, 0x78, 0x83, 0x29, 0x10, 0xe9, 0x6b, 0x06, 0x48, 0xaf, + 0x85, 0x6e, 0xa6, 0xad, 0x74, 0xf1, 0x5b, 0x76, 0x45, 0x48, 0xda, 0x6a, 0xe8, 0x6b, 0x0c, 0xf6, + 0xca, 0x2f, 0xbb, 0xa3, 0x0b, 0x66, 0x5f, 0x4d, 0x43, 0xf6, 0x1c, 0xe6, 0xba, 0xb1, 0x3f, 0xf9, + 0x3c, 0xda, 0xf4, 0xc1, 0xd5, 0x3f, 0x3c, 0x8d, 0x82, 0x4b, 0x8a, 0x7c, 0xf8, 0x0d, 0x5e, 0xa7, + 0x30, 0x8c, 0x8a, 0x7b, 0xd5, 0x8d, 0xd4, 0x2a, 0xae, 0x2b, 0xea, 0xb4, 0xdb, 0x5f, 0xd3, 0x7a, + 0x70, 0x70, 0xa4, 0x34, 0x8d, 0x6a, 0x78, 0x44, 0x41, 0x71, 0x81, 0x13, 0x34, 0x71, 0x5f, 0x5c, + 0x31, 0xfb, 0xf0, 0x98, 0x72, 0x80, 0x57, 0xbc, 0x72, 0x80, 0xdf, 0x59, 0x59, 0x5c, 0x39, 0xc0, + 0x5a, 0x63, 0x3b, 0xcf, 0x9a, 0x4d, 0x27, 0x02, 0x85, 0x23, 0xd7, 0x2f, 0x15, 0x7a, 0xaa, 0x85, + 0xa6, 0x3d, 0xc3, 0x90, 0x9f, 0x2a, 0x94, 0xf9, 0xce, 0x93, 0x9d, 0x73, 0xc7, 0xfc, 0xf4, 0xe9, + 0x09, 0xb0, 0xd5, 0x93, 0x33, 0x79, 0x35, 0x20, 0xf3, 0xcc, 0xaa, 0x68, 0x34, 0x9d, 0xe3, 0x4a, + 0xaa, 0xb8, 0xaa, 0x86, 0x7f, 0x7c, 0xc7, 0xbc, 0x9d, 0xbf, 0x5a, 0x18, 0x0c, 0x7d, 0x05, 0xc9, + 0x00, 0x3d, 0x61, 0xc2, 0xfe, 0xb4, 0x63, 0xdd, 0x6c, 0xdb, 0xa3, 0xe2, 0xba, 0x04, 0x6b, 0xb8, + 0x7a, 0x6c, 0xef, 0x38, 0xaf, 0x29, 0x7b, 0x39, 0xe7, 0xb5, 0x9f, 0x5e, 0x8a, 0xcf, 0xcf, 0x37, + 0xd5, 0x86, 0x31, 0xda, 0x44, 0x9e, 0x5f, 0x37, 0xe5, 0x99, 0x80, 0x7e, 0xcf, 0xb3, 0x7c, 0x84, + 0x2c, 0x20, 0x13, 0x3f, 0x59, 0x9f, 0xd2, 0xaf, 0xad, 0x91, 0x6b, 0x9d, 0x98, 0x4f, 0x4e, 0x6d, + 0x0b, 0x9e, 0x3e, 0x7d, 0x6a, 0xad, 0x4e, 0xfe, 0xfa, 0x29, 0xfa, 0xf4, 0x09, 0x53, 0x9a, 0xf6, + 0xa7, 0xce, 0x4a, 0x4b, 0x4e, 0x1d, 0xf3, 0x89, 0x65, 0x7f, 0xfa, 0x84, 0x5f, 0x6c, 0x28, 0xfa, + 0xc9, 0xde, 0x39, 0x27, 0x95, 0xe2, 0x0d, 0x43, 0xfb, 0xe3, 0x17, 0xf4, 0x31, 0x54, 0x54, 0xa9, + 0x57, 0x4c, 0xae, 0x77, 0xc0, 0xc0, 0x5e, 0x02, 0xd9, 0x6b, 0x7a, 0x5e, 0x39, 0xb4, 0xdd, 0xdb, + 0xd8, 0x50, 0x5f, 0xf0, 0x7a, 0x6d, 0x8c, 0xf2, 0x9b, 0x63, 0xfc, 0x55, 0x50, 0x1a, 0xf0, 0x6a, + 0x21, 0x29, 0xb8, 0xb4, 0x68, 0xde, 0x50, 0x65, 0xb3, 0xf9, 0x0b, 0x3b, 0x42, 0x52, 0xd0, 0xae, + 0xe7, 0xd3, 0xae, 0xf8, 0x78, 0xc3, 0xb8, 0x70, 0x66, 0x3c, 0x76, 0x76, 0x24, 0xa3, 0x1f, 0x46, + 0x24, 0x7f, 0xf9, 0xea, 0x85, 0x50, 0x5f, 0xb9, 0x4c, 0xe5, 0xe2, 0x53, 0x05, 0x8a, 0xc5, 0x28, + 0xfa, 0x74, 0xcf, 0x81, 0xa7, 0x05, 0x8b, 0xa5, 0x1b, 0x66, 0x75, 0xf0, 0x8c, 0x6d, 0x30, 0x04, + 0x19, 0xb4, 0x9d, 0x5d, 0xc7, 0xc9, 0x67, 0x23, 0x8c, 0xcf, 0xa9, 0x03, 0x53, 0x96, 0xf9, 0x41, + 0x98, 0xb6, 0x40, 0x0e, 0x37, 0x55, 0x45, 0x4e, 0x96, 0xf3, 0x20, 0x73, 0xb7, 0xcb, 0x5f, 0xd8, + 0xf6, 0xb6, 0xf3, 0xa6, 0xb8, 0xd7, 0x0e, 0x1e, 0xd3, 0x8b, 0x60, 0x96, 0x59, 0xa0, 0xed, 0xe7, + 0x14, 0x58, 0xb0, 0x15, 0x7f, 0xae, 0xc6, 0xff, 0x4b, 0xf1, 0xf2, 0xcb, 0x6c, 0x91, 0xe6, 0x46, + 0xf1, 0x8c, 0xf7, 0x59, 0xf0, 0x77, 0x18, 0x54, 0x09, 0xd4, 0x99, 0x12, 0x0d, 0x69, 0x35, 0xb6, + 0xf1, 0x0f, 0xac, 0x7a, 0x87, 0x19, 0xc7, 0x81, 0x1a, 0x2c, 0x0c, 0x56, 0x47, 0x17, 0x16, 0xb0, + 0x24, 0xc5, 0x00, 0xb3, 0x96, 0x29, 0xae, 0x22, 0xd8, 0x46, 0xbb, 0x97, 0x5f, 0x3c, 0xf8, 0x4e, + 0xdc, 0x9b, 0x99, 0xca, 0x7b, 0x12, 0xc1, 0x20, 0x88, 0x10, 0x00, 0x30, 0xf7, 0x04, 0x92, 0x5b, + 0x74, 0x05, 0x34, 0xc8, 0x55, 0xd7, 0xfc, 0x35, 0x35, 0x49, 0xdf, 0x7e, 0x5d, 0x94, 0x52, 0xe1, + 0xb1, 0x29, 0x4c, 0x2c, 0x68, 0x53, 0x02, 0x8a, 0x9f, 0xd8, 0xf8, 0x69, 0x9a, 0xb2, 0xcb, 0x71, + 0x78, 0xdb, 0xc2, 0x30, 0x9b, 0x41, 0xc8, 0x8e, 0xb3, 0x84, 0xf9, 0x97, 0xc0, 0x53, 0x18, 0x5e, + 0x5f, 0x85, 0xc8, 0xe7, 0x2b, 0xf0, 0xa6, 0x39, 0xac, 0xc4, 0x46, 0xd5, 0x2b, 0xe0, 0xd7, 0x14, + 0xc8, 0x2b, 0xb5, 0x60, 0x60, 0xed, 0x44, 0xcd, 0xf3, 0xc6, 0xd7, 0xa8, 0x63, 0xc0, 0x73, 0x86, + 0x77, 0x4a, 0xf1, 0x6b, 0xad, 0x48, 0x06, 0xf0, 0xc8, 0x88, 0x30, 0x49, 0xc3, 0xc8, 0x81, 0xa4, + 0xf1, 0xce, 0x4a, 0xa9, 0xae, 0x28, 0xd1, 0x6c, 0xe6, 0xce, 0xd9, 0x10, 0x81, 0xc0, 0x2a, 0x85, + 0x14, 0x13, 0x57, 0x0c, 0x19, 0x9e, 0xb1, 0xde, 0x19, 0x11, 0x89, 0x30, 0xf0, 0x33, 0x90, 0x60, + 0x9a, 0xa6, 0x71, 0x7d, 0xc2, 0x83, 0x0d, 0x9f, 0x3a, 0xa8, 0xbf, 0x05, 0x18, 0xfc, 0x13, 0x1a, + 0x7e, 0x40, 0xaf, 0xb8, 0xd2, 0xa7, 0x7a, 0x25, 0x32, 0xdf, 0x88, 0xfe, 0x78, 0x0a, 0x1a, 0xaa, + 0x9f, 0xee, 0xdc, 0x81, 0x46, 0xa8, 0x53, 0x98, 0x5d, 0xaa, 0x8c, 0xb2, 0x04, 0xf4, 0x07, 0xf1, + 0x61, 0xaa, 0xbc, 0xa6, 0x41, 0x3a, 0xc4, 0x70, 0x6d, 0x78, 0x13, 0x1c, 0x51, 0x94, 0x4a, 0x26, + 0x2d, 0xf6, 0x3e, 0xbf, 0x83, 0x12, 0x4c, 0xd1, 0x8a, 0xf0, 0xae, 0x1b, 0x66, 0xb3, 0x8e, 0x36, + 0xe2, 0x88, 0x53, 0xc7, 0xaf, 0x77, 0xd4, 0x74, 0xc6, 0xb9, 0x15, 0x19, 0xfc, 0xf9, 0xf1, 0x31, + 0xdd, 0xd0, 0x7d, 0x7c, 0xc1, 0x80, 0x36, 0xed, 0x61, 0x2a, 0xa5, 0xf6, 0x31, 0x1a, 0xb8, 0x8f, + 0x97, 0x95, 0xb0, 0xc7, 0x56, 0xb9, 0x49, 0x5b, 0xc9, 0xf8, 0x8f, 0xcc, 0x41, 0x2b, 0x8b, 0xae, + 0x5b, 0xa0, 0xcb, 0xaf, 0xce, 0xa0, 0x29, 0x0b, 0xb5, 0xaa, 0xc7, 0xcb, 0x8f, 0x16, 0x4c, 0xba, + 0x29, 0x5a, 0x2f, 0xf8, 0x6e, 0x9f, 0x61, 0x60, 0xd6, 0x61, 0xa5, 0x33, 0xe9, 0xf0, 0x0c, 0xe1, + 0xa7, 0x4b, 0x89, 0x86, 0x95, 0xc8, 0xd2, 0x45, 0xe4, 0xe4, 0xe7, 0x82, 0x75, 0xf0, 0x7a, 0x66, + 0x79, 0x7d, 0x59, 0x71, 0xaf, 0x54, 0x21, 0xe3, 0xc4, 0x35, 0xce, 0xa0, 0x18, 0x2f, 0x60, 0x18, + 0xc7, 0x78, 0x3b, 0x53, 0x72, 0x05, 0xe5, 0xaf, 0x83, 0xec, 0xc2, 0xf0, 0x8d, 0x2b, 0x3f, 0x04, + 0xcd, 0xe4, 0xcd, 0xab, 0x37, 0x2f, 0x29, 0xd0, 0xa7, 0x11, 0x06, 0x9f, 0x99, 0xa1, 0x09, 0x78, + 0xed, 0xea, 0x1d, 0x10, 0x97, 0xda, 0x1a, 0x0c, 0x0a, 0xc2, 0x2d, 0xbe, 0x02, 0xb5, 0xb5, 0x16, + 0x47, 0x78, 0xf3, 0x7d, 0xad, 0xc1, 0xc8, 0xbc, 0xf3, 0x52, 0x58, 0x77, 0xc3, 0x67, 0xbc, 0xbd, + 0x95, 0x22, 0xfa, 0x0e, 0xbf, 0xa4, 0xa9, 0x3b, 0xee, 0xa6, 0x85, 0x96, 0x36, 0x5e, 0x13, 0xfb, + 0x0d, 0x35, 0xf4, 0xe5, 0x3d, 0xdb, 0x74, 0x47, 0x6e, 0xa5, 0x2d, 0x71, 0x4d, 0x2d, 0x34, 0xf4, + 0x47, 0x8a, 0x51, 0x5c, 0x2c, 0x3e, 0x95, 0xe2, 0xfb, 0x83, 0xae, 0x2d, 0x3d, 0xba, 0x65, 0x2f, + 0x46, 0xf1, 0xe6, 0x69, 0x5f, 0x30, 0xd8, 0x32, 0x28, 0xca, 0xa0, 0xc5, 0xb1, 0xe4, 0x7d, 0x0c, + 0xe3, 0xc7, 0xf3, 0x96, 0x93, 0xbc, 0x6a, 0x1e, 0xdb, 0xc1, 0x20, 0xa3, 0xdb, 0x5a, 0x80, 0x74, + 0x1e, 0x78, 0x79, 0x92, 0xc4, 0x69, 0xfa, 0x8e, 0x82, 0xa4, 0x8f, 0xe8, 0x5a, 0x24, 0xf9, 0xd9, + 0x33, 0xc5, 0xe5, 0xd1, 0xd0, 0x29, 0x3f, 0x8a, 0xa3, 0xdb, 0xcb, 0x78, 0x71, 0x7f, 0x19, 0x98, + 0x3a, 0x33, 0xd3, 0xad, 0x24, 0xea, 0x81, 0xd8, 0x61, 0x02, 0xa3, 0xbb, 0xf5, 0xd8, 0xda, 0xcd, + 0x5b, 0xb6, 0xf3, 0x1b, 0xae, 0x50, 0x15, 0x6b, 0x50, 0xe8, 0xe1, 0x6d, 0x6f, 0x79, 0xdb, 0xdb, + 0xbf, 0xb1, 0xd5, 0xea, 0x02, 0x74, 0x58, 0x8a, 0x29, 0xbc, 0x5a, 0xa9, 0xa1, 0xc1, 0xfb, 0xb4, + 0x70, 0xc2, 0xa5, 0xb8, 0xc8, 0x14, 0x24, 0x9b, 0x3f, 0x99, 0x2f, 0xde, 0xbd, 0x11, 0x6c, 0x83, + 0x97, 0x8d, 0xb3, 0x29, 0xde, 0x99, 0x9e, 0x81, 0x56, 0xbf, 0x39, 0x8a, 0xf3, 0x5a, 0x09, 0xa7, + 0x70, 0x91, 0xa9, 0x30, 0xc8, 0xdf, 0xd1, 0x45, 0x67, 0xfc, 0x26, 0xb3, 0x12, 0xa8, 0xdf, 0x2b, + 0x50, 0x5f, 0x7c, 0x29, 0xa8, 0x6b, 0x41, 0x9c, 0x95, 0xb7, 0xf7, 0x27, 0xe6, 0x71, 0x47, 0x0f, + 0x88, 0x9d, 0xe3, 0x60, 0x0c, 0xec, 0x72, 0x8e, 0x57, 0xc2, 0xf3, 0x4b, 0x94, 0x30, 0x72, 0x77, + 0xa3, 0xf1, 0x13, 0xd0, 0x91, 0x96, 0x60, 0x3b, 0xcf, 0x78, 0x34, 0x79, 0x1b, 0xcb, 0xe1, 0xe5, + 0xc5, 0x74, 0x7d, 0xe1, 0x16, 0xc3, 0x5b, 0x81, 0x40, 0x79, 0x62, 0xc5, 0xc5, 0x44, 0xf0, 0x09, + 0x0b, 0xe3, 0x25, 0xb8, 0xe8, 0xd3, 0xa2, 0x4b, 0x7d, 0xab, 0x97, 0xcd, 0x53, 0xc0, 0x6d, 0xc8, + 0xb0, 0x65, 0x31, 0x7e, 0x17, 0x9d, 0x66, 0x0e, 0x7e, 0xc3, 0xe3, 0xcc, 0xbf, 0x60, 0xb8, 0xd7, + 0x92, 0x62, 0xa5, 0x73, 0xab, 0x92, 0x1f, 0xd9, 0xc5, 0xf6, 0x6c, 0x11, 0x16, 0x5e, 0xa8, 0xe2, + 0x78, 0xdf, 0x72, 0x7e, 0x85, 0x91, 0xad, 0x6f, 0x99, 0x77, 0xcb, 0xaa, 0x6e, 0x48, 0x1e, 0x0b, + 0x1e, 0xcb, 0x8d, 0x78, 0xc8, 0xe3, 0x42, 0xa5, 0xc0, 0x44, 0x87, 0x38, 0x06, 0x64, 0x2f, 0x29, + 0xaa, 0xb6, 0xab, 0x05, 0xa9, 0xd7, 0x3a, 0x45, 0x57, 0x62, 0x26, 0x93, 0xd5, 0x8a, 0x87, 0x94, + 0xb7, 0x5b, 0x42, 0x1d, 0xab, 0xdc, 0x7a, 0x9f, 0xc1, 0xb4, 0xa1, 0xdf, 0xe6, 0x07, 0x62, 0x3f, + 0xf3, 0x6f, 0x48, 0xf4, 0x92, 0xef, 0x50, 0xbb, 0xc6, 0xaf, 0xd0, 0xda, 0xa8, 0x31, 0x71, 0xbd, + 0x36, 0x5d, 0x6b, 0x89, 0x96, 0xb8, 0x50, 0xca, 0x72, 0xa8, 0xcd, 0x45, 0x61, 0xcc, 0x5b, 0xd7, + 0x20, 0xca, 0xf1, 0x72, 0xbf, 0x63, 0xba, 0x00, 0x4f, 0xbf, 0xc6, 0x40, 0xbb, 0xea, 0xe3, 0x8f, + 0x15, 0x44, 0x4a, 0x3c, 0xea, 0xbe, 0x52, 0xd0, 0x57, 0xc4, 0x95, 0xa4, 0xd5, 0x41, 0x22, 0x04, + 0x62, 0x10, 0x74, 0x2c, 0x0f, 0x96, 0xd6, 0x6f, 0xf0, 0x33, 0x4c, 0xf0, 0x15, 0xcd, 0x95, 0x46, + 0xe3, 0x37, 0xbc, 0xf7, 0x56, 0x3a, 0xa2, 0x1e, 0x0b, 0x64, 0x22, 0x7e, 0x08, 0x9f, 0x8e, 0xa4, + 0x0c, 0x0d, 0x62, 0x67, 0x2b, 0x40, 0x7b, 0xf5, 0x2d, 0x2b, 0xdd, 0x83, 0x87, 0x59, 0x36, 0x92, + 0x30, 0x0f, 0xc4, 0x5e, 0xe0, 0xfb, 0xd8, 0x46, 0x10, 0x2c, 0x60, 0xf1, 0x94, 0xd7, 0xf1, 0x3d, + 0x5e, 0x1c, 0x00, 0xd0, 0x88, 0xd7, 0xef, 0x98, 0x24, 0xf1, 0xdf, 0x19, 0x0a, 0xbf, 0x62, 0x25, + 0x8f, 0x2f, 0xdb, 0x88, 0x6b, 0xb7, 0xc5, 0xfd, 0x87, 0xbf, 0xe3, 0xf5, 0xed, 0xe8, 0x19, 0x40, + 0x2f, 0x6a, 0xf1, 0xe2, 0xa1, 0x16, 0xca, 0x3d, 0x06, 0x82, 0x36, 0x00, 0xab, 0x96, 0xfd, 0xe8, + 0x50, 0x86, 0xa2, 0xae, 0xc4, 0xb5, 0x2e, 0x42, 0xd0, 0x1f, 0x19, 0xcb, 0x47, 0x06, 0xfd, 0x57, + 0x5c, 0xe0, 0xa6, 0x92, 0x20, 0x11, 0x66, 0x62, 0x86, 0x71, 0xae, 0xcd, 0x8b, 0x2c, 0x9b, 0xa7, + 0xee, 0xce, 0xce, 0x22, 0x9a, 0x7f, 0x3e, 0x47, 0x5d, 0x72, 0x87, 0x3e, 0xfd, 0x5b, 0xbb, 0xd5, + 0xd9, 0x1d, 0xb4, 0x3a, 0x3b, 0xe3, 0x45, 0x10, 0x4e, 0x79, 0x9a, 0xd0, 0xee, 0x80, 0x3c, 0x4d, + 0xa7, 0x52, 0xd3, 0x0e, 0x08, 0x1b, 0xe8, 0xec, 0xce, 0x43, 0x6a, 0x64, 0x37, 0x3e, 0xc6, 0x85, + 0x4f, 0xc1, 0x1e, 0xbb, 0xdc, 0x31, 0x45, 0x45, 0x39, 0xfd, 0xe6, 0x86, 0xd6, 0xb3, 0x1d, 0x54, + 0xae, 0xe1, 0x77, 0x1c, 0x4f, 0x6f, 0x0d, 0x71, 0x57, 0x98, 0x19, 0x47, 0x28, 0xba, 0x2c, 0x1b, + 0x3a, 0x78, 0x38, 0x0d, 0xae, 0x0c, 0xba, 0x91, 0xc0, 0x93, 0xc1, 0xfa, 0x21, 0xf1, 0xe2, 0x3c, + 0x89, 0x17, 0xf3, 0x23, 0xe3, 0xd1, 0xe1, 0x45, 0xc7, 0xa0, 0x1b, 0x09, 0x3d, 0x73, 0x06, 0x65, + 0x33, 0x37, 0x64, 0xb3, 0xcc, 0x3c, 0x3a, 0xce, 0xfc, 0x04, 0x94, 0x88, 0xbf, 0xff, 0xed, 0xbf, + 0xfd, 0x4f, 0x63, 0x7c, 0x0b, 0xfa, 0x84, 0xba, 0xa6, 0xcb, 0xf8, 0xfb, 0xdf, 0xfe, 0xcb, 0xbf, + 0x43, 0xab, 0x1d, 0xa8, 0xc5, 0x37, 0x1e, 0x21, 0xd6, 0x3d, 0xd5, 0x19, 0x76, 0x1d, 0x5f, 0x07, + 0xad, 0x73, 0x50, 0x33, 0x16, 0xe3, 0x56, 0x10, 0xef, 0x60, 0x35, 0x2f, 0xe2, 0x49, 0x6a, 0x96, + 0xdb, 0x00, 0xf1, 0x7f, 0x01, 0x8d, 0xfc, 0xe7, 0x7f, 0xff, 0x8f, 0xc3, 0x1d, 0x9f, 0xfa, 0x20, + 0xc0, 0x39, 0x1c, 0x27, 0x47, 0x8f, 0x00, 0xba, 0xee, 0x11, 0x81, 0x1d, 0x40, 0x57, 0xf8, 0x0d, + 0x07, 0x78, 0x21, 0x80, 0x79, 0x74, 0xb8, 0x03, 0xa9, 0xf0, 0x17, 0xbe, 0x1b, 0x87, 0x41, 0x34, + 0x5f, 0xc8, 0x11, 0x05, 0x0e, 0xc8, 0x40, 0xf3, 0x43, 0xcd, 0x66, 0x01, 0xaf, 0x4f, 0xe7, 0x73, + 0xd3, 0x78, 0x84, 0xa5, 0xaf, 0xe8, 0x31, 0x86, 0xd9, 0x2b, 0x98, 0x7c, 0xc6, 0xca, 0xb2, 0x1f, + 0x03, 0x76, 0x6d, 0xe1, 0x9d, 0x18, 0x84, 0x9c, 0x3b, 0x2a, 0x79, 0xe1, 0xa7, 0x17, 0xcf, 0x62, + 0x3f, 0x99, 0xca, 0xaa, 0x30, 0xe1, 0x1f, 0xac, 0xeb, 0x23, 0xf4, 0x42, 0x56, 0xc3, 0x9f, 0xff, + 0xa1, 0x6a, 0x8e, 0x61, 0x76, 0x60, 0x97, 0xb2, 0x22, 0x78, 0xfb, 0x07, 0xeb, 0x01, 0xd5, 0xc5, + 0x34, 0x38, 0x7a, 0xf0, 0xe9, 0xd1, 0x3f, 0x06, 0x0c, 0x48, 0xa5, 0xb9, 0xa8, 0x46, 0x3c, 0xdf, + 0x51, 0x11, 0xc8, 0x8b, 0xe8, 0xc8, 0x58, 0x21, 0xe5, 0xd2, 0xd3, 0x9d, 0x35, 0xfb, 0x57, 0x4c, + 0x74, 0x72, 0xcc, 0x9f, 0x8b, 0x7a, 0xe1, 0x15, 0x08, 0x91, 0x85, 0x77, 0xd4, 0x1c, 0xfa, 0x63, + 0x16, 0x1e, 0x7d, 0xb8, 0x60, 0x97, 0xec, 0x70, 0x87, 0xbf, 0x00, 0x9d, 0xa7, 0xa4, 0xb6, 0x19, + 0x68, 0x8e, 0x78, 0xc0, 0x8d, 0xf0, 0x71, 0x9b, 0x27, 0xf1, 0x2e, 0x94, 0x53, 0xa0, 0x3d, 0x9a, + 0x81, 0xa9, 0x23, 0x54, 0x53, 0xd1, 0x1e, 0x0f, 0x88, 0xff, 0x48, 0x02, 0x0b, 0x53, 0x47, 0x02, + 0x7c, 0xa5, 0x58, 0xe6, 0x70, 0x87, 0x67, 0x50, 0x39, 0x65, 0xc6, 0xeb, 0x10, 0x54, 0x89, 0xa3, + 0x9f, 0x5e, 0xbf, 0x7c, 0xb1, 0x9e, 0xe5, 0x91, 0xc8, 0x73, 0x9e, 0xf8, 0xb7, 0x8c, 0x45, 0xe6, + 0xd1, 0xb7, 0xfc, 0x61, 0x63, 0x65, 0x53, 0x76, 0x65, 0x1e, 0xbd, 0x60, 0x57, 0x9b, 0xab, 0x0a, + 0x39, 0x8f, 0xbd, 0xc6, 0x9f, 0xcd, 0xd5, 0xf8, 0xc9, 0x67, 0xa8, 0x07, 0xfe, 0x6e, 0xae, 0x68, + 0x0c, 0x7f, 0xcd, 0xa3, 0x67, 0xf0, 0x77, 0x63, 0x35, 0x73, 0x50, 0xdf, 0xcd, 0xa3, 0xf7, 0xf0, + 0x77, 0x73, 0x35, 0x30, 0x38, 0x13, 0xa8, 0xe7, 0x18, 0x7f, 0x36, 0x56, 0x14, 0xdd, 0xfa, 0xd0, + 0xf9, 0xb7, 0xf0, 0x57, 0xcb, 0xb2, 0xc3, 0x47, 0x05, 0x9f, 0x90, 0xfd, 0x1f, 0x19, 0x4a, 0x36, + 0x5c, 0x4e, 0x43, 0xd4, 0xd4, 0xfc, 0x00, 0x26, 0x2c, 0x29, 0xea, 0x54, 0x7a, 0xb8, 0xb8, 0x8c, + 0xda, 0xa6, 0x12, 0x7d, 0x32, 0xc9, 0x94, 0xf5, 0xf0, 0xec, 0x8f, 0x4a, 0xf9, 0x3b, 0xf7, 0xe6, + 0x2f, 0x65, 0xef, 0x02, 0x95, 0x7e, 0x49, 0xfe, 0xde, 0x9d, 0xd5, 0xf3, 0x9f, 0x47, 0xaa, 0x18, + 0xcc, 0x8b, 0x51, 0x10, 0x01, 0xcd, 0x34, 0xbe, 0x3a, 0xd8, 0x3b, 0x68, 0x0f, 0xd7, 0xaa, 0x8d, + 0xa7, 0x7e, 0x88, 0x5c, 0x66, 0x6a, 0xf2, 0xdd, 0x0f, 0xa5, 0x98, 0x34, 0x0e, 0xe7, 0xc6, 0x23, + 0x21, 0x76, 0x27, 0x71, 0x18, 0x27, 0xee, 0x79, 0xc2, 0x6e, 0xa1, 0xbd, 0xff, 0xe7, 0xff, 0x34, + 0xba, 0xed, 0x6e, 0xbf, 0x24, 0xd4, 0xff, 0xf3, 0x3f, 0xfe, 0x6f, 0x63, 0xdb, 0x78, 0x1d, 0x4c, + 0x58, 0x94, 0x82, 0xa1, 0x88, 0xfb, 0x13, 0x12, 0xe3, 0xdb, 0xf7, 0xaf, 0xb7, 0xaf, 0x7a, 0x87, + 0x3b, 0x73, 0x1d, 0x57, 0x13, 0x3f, 0x02, 0xe3, 0xf0, 0x0d, 0x8b, 0x16, 0x4a, 0xa8, 0xcf, 0xe3, + 0x34, 0xc0, 0xb1, 0x72, 0xfd, 0x31, 0x28, 0x56, 0xa0, 0x8c, 0x0c, 0xc5, 0xed, 0xb6, 0x2e, 0x5d, + 0x6e, 0x8b, 0x90, 0x1c, 0x1d, 0x72, 0x1e, 0xd7, 0xeb, 0x78, 0x46, 0x29, 0x1d, 0x84, 0x97, 0x7f, + 0x3c, 0xe2, 0x4d, 0x15, 0x99, 0xab, 0x79, 0xbb, 0x35, 0x79, 0x1f, 0x6d, 0xca, 0xdc, 0x5b, 0xcb, + 0x8c, 0xf2, 0x41, 0xcb, 0xf6, 0xc2, 0xcf, 0x7c, 0xd3, 0xb8, 0x08, 0xa6, 0x60, 0x9d, 0x78, 0x74, + 0x1b, 0xab, 0x79, 0xf4, 0x48, 0x49, 0x11, 0x39, 0x28, 0x38, 0xaf, 0xd2, 0x14, 0x95, 0x5d, 0x86, + 0x47, 0xff, 0x2f, 0x3f, 0x24, 0x6f, 0x36, 0xb4, 0xf0, 0x00, 0x00 }; diff --git a/src/main.cpp b/src/main.cpp index 2f29b73b..da22220b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -40,22 +40,26 @@ SysModNetwork *net; SysModPins *pins; UserModInstances *instances; UserModMDNS *mdns; -#ifdef STARMOD_APPMOD_LEDS - #include "App/LedModEffects.h" - #include "App/LedModFixture.h" - #include "App/LedModFixtureGen.h" - LedModFixture *fix; - LedModFixtureGen *lfg; - LedModEffects *eff; - #ifdef STARMOD_USERMOD_ARTNET - #include "User/UserModArtNet.h" - UserModArtNet *artnetmod; - #endif - #ifdef STARMOD_USERMOD_DDP - #include "User/UserModDDP.h" - UserModDDP *ddpmod; - #endif -#endif +// #ifdef STARMOD_APPMOD_LEDS +// #include "App/LedModEffects.h" +// #include "App/LedModFixture.h" +// #include "App/LedModFixtureGen.h" +// LedModFixture *fix; +// LedModFixtureGen *lfg; +// LedModEffects *eff; +// #ifdef STARMOD_USERMOD_ARTNET +// #include "User/UserModArtNet.h" +// UserModArtNet *artnetmod; +// #endif +// #ifdef STARMOD_USERMOD_DDP +// #include "User/UserModDDP.h" +// UserModDDP *ddpmod; +// #endif +// #endif + +#include "App/AppModDemo.h" +AppModDemo *appModDemo; + #ifdef STARMOD_USERMOD_E131 #include "User/UserModE131.h" UserModE131 *e131mod; @@ -64,10 +68,10 @@ UserModMDNS *mdns; #include "User/UserModHA.h" UserModHA *hamod; #endif -#ifdef STARMOD_USERMOD_WLEDAUDIO - #include "User/UserModWLEDAudio.h" - UserModWLEDAudio *wledAudioMod; -#endif +// #ifdef STARMOD_USERMOD_WLEDAUDIO +// #include "User/UserModWLEDAudio.h" +// UserModWLEDAudio *wledAudioMod; +// #endif //setup all modules void setup() { @@ -86,49 +90,53 @@ void setup() { pins = new SysModPins(); instances = new UserModInstances(); mdns = new UserModMDNS(); - #ifdef STARMOD_APPMOD_LEDS - eff= new LedModEffects(); - fix = new LedModFixture(); - lfg = new LedModFixtureGen(); - #ifdef STARMOD_USERMOD_ARTNET - artnetmod = new UserModArtNet(); - #endif - #ifdef STARMOD_USERMOD_DDP - ddpmod = new UserModDDP(); - #endif - #endif + appModDemo = new AppModDemo(); + // #ifdef STARMOD_APPMOD_LEDS + // eff= new LedModEffects(); + // fix = new LedModFixture(); + // lfg = new LedModFixtureGen(); + // #ifdef STARMOD_USERMOD_ARTNET + // artnetmod = new UserModArtNet(); + // #endif + // #ifdef STARMOD_USERMOD_DDP + // ddpmod = new UserModDDP(); + // #endif + // #endif #ifdef STARMOD_USERMOD_E131 e131mod = new UserModE131(); #endif #ifdef STARMOD_USERMOD_HA hamod = new UserModHA(); #endif - #ifdef STARMOD_USERMOD_WLEDAUDIO - wledAudioMod = new UserModWLEDAudio(); - #endif + // #ifdef STARMOD_USERMOD_WLEDAUDIO + // wledAudioMod = new UserModWLEDAudio(); + // #endif //Reorder with care! this is the order in which setup and loop is executed //If changed make sure mdlEnabled.chFun executes var["value"].to(); and saveModel! //Default: add below, not in between - #ifdef STARMOD_APPMOD_LEDS - mdls->add(fix); - mdls->add(eff); - mdls->add(lfg); - #endif + // #ifdef STARMOD_APPMOD_LEDS + // mdls->add(fix); + // mdls->add(eff); + // mdls->add(lfg); + // #endif + + mdls->add(appModDemo); + mdls->add(files); mdls->add(sys); mdls->add(pins); mdls->add(print); mdls->add(web); mdls->add(net); - #ifdef STARMOD_APPMOD_LEDS - #ifdef STARMOD_USERMOD_DDP - mdls->add(ddpmod); - #endif - #ifdef STARMOD_USERMOD_ARTNET - mdls->add(artnetmod); - #endif - #endif + // #ifdef STARMOD_APPMOD_LEDS + // #ifdef STARMOD_USERMOD_DDP + // mdls->add(ddpmod); + // #endif + // #ifdef STARMOD_USERMOD_ARTNET + // mdls->add(artnetmod); + // #endif + // #endif #ifdef STARMOD_USERMOD_E131 mdls->add(e131mod); #endif @@ -137,9 +145,9 @@ void setup() { #endif mdls->add(mdl); mdls->add(ui); - #ifdef STARMOD_USERMOD_WLEDAUDIO - mdls->add(wledAudioMod); //no ui - #endif + // #ifdef STARMOD_USERMOD_WLEDAUDIO + // mdls->add(wledAudioMod); //no ui + // #endif mdls->add(mdns); //no ui mdls->add(instances);