diff --git a/tools/cdata.js b/tools/cdata.js index d01c3e35f..bf5a65e84 100644 --- a/tools/cdata.js +++ b/tools/cdata.js @@ -220,6 +220,7 @@ function writeChunks(srcDir, specs, resultFile) { writeHtmlGzipped("wled00/data/index.htm", "wled00/html_ui.h", 'index'); writeHtmlGzipped("wled00/data/simple.htm", "wled00/html_simple.h", 'simple'); +writeHtmlGzipped("wled00/data/pixart/pixart.htm", "wled00/html_pixart.h", 'pixart'); /* writeChunks( "wled00/data", diff --git a/wled00/data/pixart/boxdraw.js b/wled00/data/pixart/boxdraw.js new file mode 100644 index 000000000..75f8f9430 --- /dev/null +++ b/wled00/data/pixart/boxdraw.js @@ -0,0 +1,91 @@ +function drawBoxes(inputPixelArray, widthPixels, heightPixels) { + + // Get a reference to the canvas element + var canvas = document.getElementById('pixelCanvas'); + + // Get the canvas context + var ctx = canvas.getContext('2d'); + + // Set the width and height of the canvas + if (window.innerHeight < window.innerWidth) { + canvas.width = Math.floor(window.innerHeight * 0.98); + } + else{ + canvas.width = Math.floor(window.innerWidth * 0.98); + } + //canvas.height = window.innerWidth; + + let pixelSize = Math.floor(canvas.width/widthPixels); + + //Set the canvas height to fit the right number of pixelrows + canvas.height = (pixelSize * heightPixels) + 10 + + //Iterate through the matrix + for (let y = 0; y < heightPixels; y++) { + for (let x = 0; x < widthPixels; x++) { + + // Calculate the index of the current pixel + let i = (y*widthPixels) + x; + + //Gets the RGB of the current pixel + let pixel = inputPixelArray[i]; + + let pixelColor = 'rgb(' + pixel[0] + ', ' + pixel[1] + ', ' + pixel[2] + ')'; + let r = pixel[0]; + let g = pixel[1]; + let b = pixel[2]; + let pos = pixel[4]; + + let textColor = 'rgb(128,128,128)'; + + // Set the fill style to the pixel color + ctx.fillStyle = pixelColor; + + //Draw the rectangle + ctx.fillRect(x * pixelSize, y * pixelSize, pixelSize, pixelSize); + + // Draw a border on the box + ctx.strokeStyle = '#888888'; + ctx.lineWidth = 1; + ctx.strokeRect(x * pixelSize, y * pixelSize, pixelSize, pixelSize); + + //Write text to box + ctx.font = "10px Arial"; + ctx.fillStyle = textColor; + ctx.textAlign = "center"; + ctx.textBaseline = 'middle'; + ctx.fillText((pos + 1), (x * pixelSize) + (pixelSize /2), (y * pixelSize) + (pixelSize /2)); + } + } +} + +function drawBackground() { + const grid = document.createElement("div"); + grid.id = "grid"; + grid.classList.add("grid-class"); + grid.style.cssText = ""; + + const boxSize = 20; + const boxCount = Math.ceil(window.innerWidth / boxSize) * Math.ceil(window.innerHeight / boxSize);; + + for (let i = 0; i < boxCount; i++) { + const box = document.createElement("div"); + box.classList.add("box"); + box.style.backgroundColor = getRandomColor(); + grid.appendChild(box); + } + grid.style.zIndex = -1; + document.body.appendChild(grid); +} + +function getRandomColor() { + const letters = "0123456789ABCDEF"; + let color = "rgba("; + for (let i = 0; i < 3; i++) { + color += Math.floor(Math.random() * 256) + ","; + } + color += "0.05)"; + return color; +} + + window.drawBackground = drawBackground; diff --git a/wled00/data/pixart/favicon-16x16.png b/wled00/data/pixart/favicon-16x16.png new file mode 100644 index 000000000..feb51ca09 Binary files /dev/null and b/wled00/data/pixart/favicon-16x16.png differ diff --git a/wled00/data/pixart/favicon-32x32.png b/wled00/data/pixart/favicon-32x32.png new file mode 100644 index 000000000..a3b5cceb1 Binary files /dev/null and b/wled00/data/pixart/favicon-32x32.png differ diff --git a/wled00/data/pixart/favicon.ico b/wled00/data/pixart/favicon.ico new file mode 100644 index 000000000..bde8945e5 Binary files /dev/null and b/wled00/data/pixart/favicon.ico differ diff --git a/wled00/data/pixart/getPixelValues.js b/wled00/data/pixart/getPixelValues.js new file mode 100644 index 000000000..76ded2e5d --- /dev/null +++ b/wled00/data/pixart/getPixelValues.js @@ -0,0 +1,303 @@ +function getPixelRGBValues(base64Image) { + httpArray = []; + fileJSON = JSONledStringStart + document.getElementById('brightnessNumber').value + JSONledStringMid1 + document.getElementById('targetSegment').value + JSONledStringMid2; + + //const copyJSONledbutton = document.getElementById('copyJSONledbutton'); + const JSONled = document.getElementById('JSONled'); + const maxNoOfColorsInCommandSting = document.getElementById('colorLimitNumber').value; + + let hybridAddressing = false; + let selectedIndex = -1; + + let selector = document.getElementById("formatSelector"); + selectedIndex = selector.selectedIndex; + const formatSelection = selector.options[selectedIndex].value; + + selector = document.getElementById("ledSetupSelector"); + selectedIndex = selector.selectedIndex; + const ledSetupSelection = selector.options[selectedIndex].value; + + selector = document.getElementById("colorFormatSelector"); + selectedIndex = selector.selectedIndex; + let hexValueCheck = true; + if (selector.options[selectedIndex].value == 'dec'){ + hexValueCheck = false + } + + selector = document.getElementById("addressingSelector"); + selectedIndex = selector.selectedIndex; + let segmentValueCheck = true; //If Range or Hybrid + if (selector.options[selectedIndex].value == 'single'){ + segmentValueCheck = false + } else if (selector.options[selectedIndex].value == 'hybrid'){ + hybridAddressing = true; + } + + let segmentString = '' + let curlString = '' + let haString = '' + let haCommandCurlString = ''; + + + let colorSeparatorStart = '\''; + let colorSeparatorEnd = '\''; + if (!hexValueCheck){ + colorSeparatorStart = '['; + colorSeparatorEnd = ']'; + } + // Warnings + let hasTransparency = false; //If alpha < 255 is detected on any pixel, this is set to true in code below + let imageInfo = ''; + + // Create an off-screen canvas + var canvas = document.createElement('canvas'); + var context = canvas.getContext('2d'); + + // Create an image element and set its src to the base64 image + var image = new Image(); + image.src = base64Image; + + // Wait for the image to load before drawing it onto the canvas + image.onload = function() { + + let scalePath = document.getElementById("scalePath"); + let color = scalePath.getAttribute("fill"); + let sizeX = document.getElementById("sizeX").value; + let sizeY = document.getElementById("sizeY").value; + + if (color != accentColor || sizeX < 1 || sizeY < 1){ + //image will not be rezised Set desitred size to original size + sizeX = image.width; + sizeY = image.height; + } + + // Set the canvas size to the same as the desired image size + canvas.width = sizeX; + canvas.height = sizeY; + + imageInfo = '

Width: ' + sizeX + ', Height: ' + sizeY + ' (make sure this matches your led matrix setup)

' + + // Draw the image onto the canvas + context.drawImage(image, 0, 0, sizeX, sizeY); + + // Get the pixel data from the canvas + var pixelData = context.getImageData(0, 0, sizeX, sizeY).data; + + // Create an array to hold the RGB values of each pixel + var pixelRGBValues = []; + + // If the first row of the led matrix is right -> left + let right2leftAdjust = 1; + + if (ledSetupSelection == 'l2r'){ + right2leftAdjust = 0; + } + + // Loop through the pixel data and get the RGB values of each pixel + for (var i = 0; i < pixelData.length; i += 4) { + var r = pixelData[i]; + var g = pixelData[i + 1]; + var b = pixelData[i + 2]; + var a = pixelData[i + 3]; + + let pixel = i/4 + let row = Math.floor(pixel/sizeX); + let led = pixel; + if (ledSetupSelection == 'matrix'){ + //Do nothing, the matrix is set upp like the index in the image + //Every row starts from the left, i.e. no zigzagging + } + else if ((row + right2leftAdjust) % 2 === 0) { + //Setup is traditional zigzag + //right2leftAdjust basically flips the row order if = 1 + //Row is left to right + //Leave led index as pixel index + + } else { + //Setup is traditional zigzag + //Row is right to left + //Invert index of row for led + let indexOnRow = led - (row * sizeX); + let maxIndexOnRow = sizeX - 1; + let reversedIndexOnRow = maxIndexOnRow - indexOnRow; + led = (row * sizeX) + reversedIndexOnRow; + } + + // Add the RGB values to the pixel RGB values array + pixelRGBValues.push([r, g, b, a, led, pixel, row]); + } + + pixelRGBValues.sort((a, b) => a[5] - b[5]); + + //Copy the values to a new array for resorting + let ledRGBValues = [... pixelRGBValues]; + + //Sort the array based on led index + ledRGBValues.sort((a, b) => a[4] - b[4]); + + //Generate JSON in WLED format + let JSONledString = ''; + let JSONledStringShort = ''; + + //Set starting values for the segment check to something that is no color + let segmentStart = -1; + let maxi = ledRGBValues.length; + let curentColorIndex = 0 + let commandArray = []; + + //For evry pixel in the LED array + for (let i = 0; i < maxi; i++) { + let pixel = ledRGBValues[i]; + let r = pixel[0]; + let g = pixel[1]; + let b = pixel[2]; + let a = pixel[3]; + let segmentString = ''; + let segmentEnd = -1; + + if(segmentValueCheck){ + if (segmentStart < 0){ + //This is the first led of a new segment + segmentStart = i; + } //Else we allready have a start index + + if (i < maxi - 1){ + + let iNext = i + 1; + let nextPixel = ledRGBValues[iNext]; + + if (nextPixel[0] != r || nextPixel[1] != g || nextPixel[2] != b ){ + //Next pixel has new color + //The current segment ends with this pixel + segmentEnd = i + 1 //WLED wants the NEXT LED as the stop led... + if (segmentStart == i && hybridAddressing){ + //If only one led/pixel, no segment info needed + if (JSONledString == ''){ + //If addressing is single, we need to start every command with a starting possition + segmentString = '' + i + ','; + //Fixed to b2 + } else{ + segmentString = '' + } + } + else { + segmentString = segmentStart + ',' + segmentEnd + ','; + } + } + + } else { + //This is the last pixel, so the segment must end + segmentEnd = i + 1; + + if (segmentStart + 1 == segmentEnd && hybridAddressing){ + //If only one led/pixel, no segment info needed + if (JSONledString == ''){ + //If addressing is single, we need to start every command with a starting possition + segmentString = '' + i + ','; + //Fixed to b2 + } else{ + segmentString = '' + } + } + else { + segmentString = segmentStart + ',' + segmentEnd + ','; + } + } + } else{ + //Write every pixel + if (JSONledString == ''){ + //If addressing is single, we need to start every command with a starting possition + JSONledString = i + //Fixed to b2 + } + + segmentStart = i + segmentEnd = i + //Segment string should be empty for when addressing single. So no need to set it again. + } + + if (a < 255){ + hasTransparency = true; //If ANY pixel has alpha < 255 then this is set to true to warn the user + } + + if (segmentEnd > -1){ + //This is the last pixel in the segment, write to the JSONledString + //Return color value in selected format + let colorValueString = r + ',' + g + ',' + b ; + + if (hexValueCheck){ + const [red, green, blue] = [r, g, b]; + colorValueString = `${[red, green, blue].map(x => x.toString(16).padStart(2, '0')).join('')}`; + } else{ + //do nothing, allready set + } + + // Check if start and end is the same, in which case remove + + JSONledString = JSONledString + segmentString + colorSeparatorStart + colorValueString + colorSeparatorEnd; + fileJSON = JSONledString + segmentString + colorSeparatorStart + colorValueString + colorSeparatorEnd; + + curentColorIndex = curentColorIndex + 1; // We've just added a new color to the string so up the count with one + + if (curentColorIndex % maxNoOfColorsInCommandSting === 0 || i == maxi - 1) { + + //If we have accumulated the max number of colors to send in a single command or if this is the last pixel, we should write the current colorstring to the array + commandArray.push(JSONledString); + JSONledString = ''; //Start on an new command string + } else + { + //Add a comma to continue the command string + JSONledString = JSONledString + ',' + } + //Reset segment values + segmentStart = - 1; + } + } + + JSONledString = '' + + //For evry commandString in the array + for (let i = 0; i < commandArray.length; i++) { + let thisJSONledString = JSONledStringStart + document.getElementById('brightnessNumber').value + JSONledStringMid1 + document.getElementById('targetSegment').value + JSONledStringMid2 + commandArray[i] + JSONledStringEnd; + httpArray.push(thisJSONledString); + + let thiscurlString = curlStart + document.getElementById('curlUrl').value + curlMid1 + thisJSONledString + curlEnd; + + //Aggregated Strings That should be returned to the user + if (i > 0){ + JSONledString = JSONledString + '\n'; + curlString = curlString + ' && '; + } + JSONledString = JSONledString + thisJSONledString; + curlString = curlString + thiscurlString; + } + + + haString = haStart + document.getElementById('haID').value + haMid1 + document.getElementById('haName').value + haMid2 + document.getElementById('haUID').value + haMid3 +curlString + haMid3 + document.getElementById('curlUrl').value + haEnd; + + if (formatSelection == 'wled'){ + JSONled.value = JSONledString; + } else if (formatSelection == 'curl'){ + JSONled.value = curlString; + } else if (formatSelection == 'ha'){ + JSONled.value = haString; + } else { + JSONled.value = 'ERROR!/n' + formatSelection + ' is an unknown format.' + } + + fileJSON = fileJSON + JSONledStringEnd; + + let infoDiv = document.getElementById('image-info'); + let canvasDiv = document.getElementById('image-info'); + if (hasTransparency){ + imageInfo = imageInfo + '

WARNING! Transparency info detected in image. Transparency (alpha) has been ignored. To ensure you get the result you desire, use only solid colors in your image.

' + } + + infoDiv.innerHTML = imageInfo; + canvasDiv.style.display = "block" + + + //Drawing the image + drawBoxes(pixelRGBValues, sizeX, sizeY); + } +} \ No newline at end of file diff --git a/wled00/data/pixart/pixart.css b/wled00/data/pixart/pixart.css new file mode 100644 index 000000000..e2fd330b8 --- /dev/null +++ b/wled00/data/pixart/pixart.css @@ -0,0 +1,266 @@ + +.box { + border: 2px solid white; +} +body { + font-family: 'Arcade', Arial, sans-serif; + background-color: #151515; +} + +.top-part { + width: 600px; + margin: 0 auto; +} +.container { + max-width: 100% -40px; + border-radius: 0px; + padding: 20px; + text-align: center; +} +h1 { + font-size: 2.3em; + color: rgb(126, 76, 128); + margin: 1px 0; + font-family: 'Arcade', Arial, sans-serif; + line-height: 0.5; + /*text-align: center;*/ +} +h2 { + font-size: 1.1em; + color: rgba(126, 76, 128, 0.61); + margin: 1px 0; + font-family: 'Arcade', Arial, sans-serif; + line-height: 0.5; + text-align: center; +} +h3 { + font-size: 0.7em; + color: rgba(126, 76, 128, 0.61); + margin: 1px 0; + font-family: 'Arcade', Arial, sans-serif; + line-height: 1.4; + text-align: center; + align-items: center; + justify-content: center; + display: flex; +} + +p { + font-size: 1.2em; + color: rgb(119, 119, 119); + line-height: 1.5; + font-family: 'Arcade', Arial, sans-serif; +} + +#fieldTable { + font-size: 1 em; + color: #777; + line-height: 1; + font-family: 'Arcade', Arial, sans-serif; +} + +#scaleTable { + font-size: 1 em; + color: #777; + line-height: 1; + font-family: 'Arcade', Arial, sans-serif; +} + +#drop-zone { + display: block; + width: 100%-40px; + border: 3px dashed #7E4C80; + border-radius: 0px; + text-align: center; + padding: 20px; + margin: 0px; + cursor: pointer; + + font-family: 'Arcade', Arial, sans-serif; + font-size: 15px; + color: #777; +} + +#file-picker { + display: none; +} + +* select { + background-color: #333333; + color: #C0C0C0; + border: 1px solid #C0C0C0; + margin-top: 0.5em; + margin-bottom: 0.5em; + padding: 0em; + width: 100%; + height: 27px; + font-size: 15px; + color: rgb(119, 119, 119); + border-radius: 0; +} + +* input[type=range] { + -webkit-appearance:none; + flex-grow: 1; + border-radius: 0px; + background: linear-gradient(to right, #333333 0%, #333333 100%); + color: #C0C0C0; + border: 1px solid #C0C0C0; + margin-top: 0.5em; + margin-left: 0em; +} + +input[type="range"]::-webkit-slider-thumb{ + -webkit-appearance:none; + width: 25px; + height:25px; + background:#7E4C80; + position:relative; + z-index:3; +} + +.rangeNumber{ + width: 20px; + vertical-align: middle; +} + +.fullTextField[type=text] { + background-color: #333333; + border: 1px solid #C0C0C0; + padding-inline-start: 5px; + margin-top: 10px; + width: 100%; + height: 24px; + border-radius: 0px; + font-family: 'Arcade', Arial, sans-serif; + font-size: 15px; + color: rgb(119, 119, 119); +} + +* input[type=submit] { + background-color: #333333; + border: 1px solid #C0C0C0; + padding: 0.5em; + width: 100%; + border-radius: 0px; + font-family: 'Arcade', Arial, sans-serif; + font-size: 1.3em; + color: rgb(119, 119, 119); +} + +* button { + background-color: #333333; + border: 1px solid #C0C0C0; + padding-inline: 5px; + width: 100%; + border-radius: 0px; + font-family: 'Arcade', Arial, sans-serif; + font-size: 1em; + color: rgb(119, 119, 119); + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; +} + +textarea { + grid-row: 1 / 2; + width: 100%; + height: 200px; + background-color: #333333; + border: 1px solid #C0C0C0; + + color: #777; +} +.hide { + display: none; +} +.grids-class{ + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + display: grid; + grid-template-columns: repeat(auto-fill, 20px); + grid-template-rows: repeat(auto-fill, 20px); + grid-gap: 0px; +} +.svg-icon { + vertical-align: middle; +} +.buttondiv-class { + flex: 1; + display: inline-block; +} + +.buttondivmid-class { + width: 10px; + display: inline-block; +} +#image-container { + display: grid; + grid-template-rows: 1fr 1fr; +} +#button-container { + display: flex; + padding-bottom: 10px; + padding-top: 10px; +} + +.buttonclass { + flex: 1; + padding-top: 5px; + padding-bottom: 5px; +} + +.gap { + width: 10px; +} + +#submitConvert::before { + content: ""; + display: inline-block; + background-image: url('data:image/svg+xml;utf8, '); + width: 36px; + height: 36px; +} + +#sizeDiv * { + display: inline-block; +} +.sizeInputFields{ + width: 50px; + background-color: #333333; + border: 1px solid #C0C0C0; + padding-inline-start: 5px; + margin-top: -5px; + height: 24px; + border-radius: 0px; + font-family: 'Arcade', Arial, sans-serif; + font-size: 15px; + color: rgb(119, 119, 119); +} +a:link { + color: rgba(126, 76, 128, 0.61); + background-color: transparent; + text-decoration: none; +} + +a:visited { + color: rgba(126, 76, 128, 0.61); + background-color: transparent; + text-decoration: none; +} + +a:hover { + color: rgb(126, 76, 128); + background-color: transparent; + text-decoration: none; +} + +a:active { + color: rgba(126, 76, 128, 0.61); + background-color: transparent; + text-decoration: none; +} \ No newline at end of file diff --git a/wled00/data/pixart/pixart.htm b/wled00/data/pixart/pixart.htm new file mode 100644 index 000000000..ea989a324 --- /dev/null +++ b/wled00/data/pixart/pixart.htm @@ -0,0 +1,214 @@ + + + + + + + WLED Pixel Art Converter + + + + + +
+
+

+ + + + + + + + + + + + WLED Pixel Art Converter +

+
+

Convert image to WLED JSON (pixel art on WLED matrix)

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + + 255 +
+ + + + 256 +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + + + +
+
+ + + +     + + + +
+
+ +
+

+ +

+

+ Drop image here
or
+ Click to select a file +
+ +

+ +

+ +

+ +
+
+ + + + + +

+ + + + +
+

Version 1.0.4
 -  Help/About

+
+
+ + + + + + + + + \ No newline at end of file diff --git a/wled00/data/pixart/pixart.js b/wled00/data/pixart/pixart.js new file mode 100644 index 000000000..44415fafc --- /dev/null +++ b/wled00/data/pixart/pixart.js @@ -0,0 +1,320 @@ +//Start up code +document.getElementById('curlUrl').value = location.host; + +let devMode = false; +const urlParams = new URLSearchParams(window.location.search); +if(urlParams.has('dev')){ + devMode = true; +} +if(devMode){ + console.log('Developer mode active. Experimental and unstable functions active.') +} else{ +console.log('Developer mode inactive. Append "?dev" to the URL.') +} + +if(devMode){ + document.getElementById("fileJSONledbutton").style.display = 'buttonclass' + document.getElementById("gap2").style.display = 'gap' +} else { + document.getElementById("fileJSONledbutton").style.display = 'none' + document.getElementById("gap2").style.display = 'none' +} + + +let httpArray = []; +let fileJSON = ''; + + +//On submit button pressed ======================= + + +document.getElementById("convertbutton").addEventListener("click", function() { + + let base64Image = document.getElementById('preview').src; + if (isValidBase64Gif(base64Image)) { + document.getElementById('image').src = base64Image; + getPixelRGBValues(base64Image); + document.getElementById('image-container').style.display = "block" + document.getElementById("button-container").style.display = ""; + + } + else { + let infoDiv = document.getElementById('image-info'); + let imageInfo = '

WARNING! File does not appear to be a valid image

' + infoDiv.innerHTML = imageInfo; + infoDiv.style.display = "block" + document.getElementById('image-container').style.display = "none"; + document.getElementById('JSONled').value = ''; + console.log("The string '" + base64Image + "' is not a valid base64 image."); + } + +}); + +// Code for copying the generated string to clipboard + +copyJSONledbutton.addEventListener('click', async () => { + let JSONled = document.getElementById('JSONled'); + JSONled.select(); + try { + await navigator.clipboard.writeText(JSONled.value); + } catch (err) { + try { + await document.execCommand("copy"); + } catch (err) { + console.error('Failed to copy text: ', err); + } + } +}); + +sendJSONledbutton.addEventListener('click', async () => { + if (window.location.protocol === "https:") { + alert('Will only be available when served over http (or WLED is run over https)'); + } else { + postPixels(); + } +}); + +fileJSONledbutton.addEventListener('click', async () => { + if (window.location.protocol === "https:") { + alert('Will only be available when served over http (or WLED is run over https)'); + } else { + let JSONFileName = 'TheName.json' + let urlString = 'http://'+document.getElementById('curlUrl').value+'/upload' + + sendAsFile(fileJSON, JSONFileName, urlString); + } +}); + +async function postPixels() { + for (let i of httpArray) { + try { + console.log(i); + console.log(i.length); + const response = await fetch('http://'+document.getElementById('curlUrl').value+'/json/state', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + //'Content-Type': 'text/html; charset=UTF-8' + }, + body: i + }); + const data = await response.json(); + console.log(data); + } catch (error) { + console.error(error); + } + } +} +//File uploader code +const dropZone = document.getElementById('drop-zone'); +const filePicker = document.getElementById('file-picker'); +const preview = document.getElementById('preview'); + +// Listen for dragenter, dragover, and drop events +dropZone.addEventListener('dragenter', dragEnter); +dropZone.addEventListener('dragover', dragOver); +dropZone.addEventListener('drop', dropped); +dropZone.addEventListener('click', zoneClicked); + +// Listen for change event on file picker +filePicker.addEventListener('change', filePicked); + +// Handle zone click +function zoneClicked(e) { + e.preventDefault(); + //this.classList.add('drag-over'); + //alert('Hej'); + filePicker.click(); +} + +// Handle dragenter +function dragEnter(e) { + e.preventDefault(); + this.classList.add('drag-over'); +} + +// Handle dragover +function dragOver(e) { + e.preventDefault(); +} + +// Handle drop +function dropped(e) { + e.preventDefault(); + this.classList.remove('drag-over'); + + // Get the dropped file + const file = e.dataTransfer.files[0]; + updatePreview(file); +} + +// Handle file picked +function filePicked(e) { + // Get the picked file + const file = e.target.files[0]; + updatePreview(file); +} + +// Update the preview image +function updatePreview(file) { + // Use FileReader to read the file + const reader = new FileReader(); + reader.onload = function() { + // Update the preview image + preview.src = reader.result; + document.getElementById("submitConvertDiv").style.display = ""; + }; + reader.readAsDataURL(file); +} + +function isValidBase64Gif(string) { + // Use a regular expression to check that the string is a valid base64 string + /* + const base64gifPattern = /^data:image\/gif;base64,([A-Za-z0-9+/:]{4})*([A-Za-z0-9+/:]{3}=|[A-Za-z0-9+/:]{2}==)?$/; + const base64pngPattern = /^data:image\/png;base64,([A-Za-z0-9+/:]{4})*([A-Za-z0-9+/:]{3}=|[A-Za-z0-9+/:]{2}==)?$/; + const base64jpgPattern = /^data:image\/jpg;base64,([A-Za-z0-9+/:]{4})*([A-Za-z0-9+/:]{3}=|[A-Za-z0-9+/:]{2}==)?$/; + const base64webpPattern = /^data:image\/webp;base64,([A-Za-z0-9+/:]{4})*([A-Za-z0-9+/:]{3}=|[A-Za-z0-9+/:]{2}==)?$/; + */ + //REMOVED, Any image appear to work as long as it can be drawn to the canvas. Leaving code in for future use, possibly + if (1==1 || base64gifPattern.test(string) || base64pngPattern.test(string) || base64jpgPattern.test(string) || base64webpPattern.test(string)) { + return true; + } + else { + //Not OK + return false; + } +} + +document.getElementById("brightnessNumber").oninput = function() { + document.getElementById("brightnessValue").textContent = this.value; +} + +document.getElementById("colorLimitNumber").oninput = function() { + document.getElementById("colorLimitValue").textContent = this.value; +} + +var formatSelector = document.getElementById("formatSelector"); +var hideableRows = document.querySelectorAll(".ha-hide"); +for (var i = 0; i < hideableRows.length; i++) { + hideableRows[i].classList.add("hide"); +} +formatSelector.addEventListener("change", function() { + for (var i = 0; i < hideableRows.length; i++) { + hideableRows[i].classList.toggle("hide", this.value !== "ha"); + } + }); + +function switchScale() { + let scalePath = document.getElementById("scalePath"); + let scaleTogglePath = document.getElementById("scaleTogglePath"); + let color = scalePath.getAttribute("fill"); + let d = '' + if (color === accentColor) { + color = accentTextColor; + d = scaleToggleOffd + document.getElementById("sizeDiv").style.display = "none"; + // Set values to actual XY of image, if possible + } else { + color = accentColor; + d = scaleToggleOnd + document.getElementById("sizeDiv").style.display = ""; + } + scalePath.setAttribute("fill", color); + scaleTogglePath.setAttribute("fill", color); + scaleTogglePath.setAttribute("d", d); +} + + +function sendAsFile(jsonStringInput, fileName, urlString) { + //var jsonString = JSON.stringify({name: "value"}); + var file = new Blob([jsonStringInput], {type: 'application/json'}); + console.log(jsonStringInput) + console.log(fileName); + console.log(urlString); + + var formData = new FormData(); + formData.append('file', file, fileName); + + var xhr = new XMLHttpRequest(); + xhr.open('POST', urlString, true); + xhr.onload = function() { + if (xhr.status === 200) { + console.log('File uploaded successfully!'); + } else { + console.log('File upload failed!'); + } + }; + xhr.send(formData); +} + +function generateSegmentOptions(array) { + //This function is prepared for a name property on each segment for easier selection + //Currently the name is generated generically based on index + var select = document.getElementById("targetSegment"); + select.innerHTML = ""; + for (var i = 0; i < array.length; i++) { + var option = document.createElement("option"); + option.value = array[i].value; + option.text = array[i].text; + select.appendChild(option); + if(i === 0) { + option.selected = true; + } + } +} + +//Initial population of segment selection +function generateSegmentArray(noOfSegments) { + var arr = []; + for (var i = 0; i < noOfSegments; i++) { + arr.push({ + value: i, + text: "Segment index " + i + }); + } + return arr; +} + + +//Animate matrix +var matrixcircles = document.querySelectorAll("#logomatrix path"); +var intervalId; +// Function that changes the color of a random circle to a lighter purple +function changeColorOfDot() { + // Get a random number between 0 and the number of circles + var randomIndex = Math.floor(Math.random() * matrixcircles.length); + // Get the circle at the random index + var randomCircle = matrixcircles[randomIndex]; + + + // Store the current fill color + var currentColor = randomCircle.getAttribute("fill"); + // Change the color of the circle + randomCircle.setAttribute("fill", "#bb8fbc"); + setTimeout(() => { + randomCircle.setAttribute("fill", currentColor); + clearInterval(intervalId); + intervalId = setInterval(changeColorOfDot, randomInterval()); + }, 500); +} + +function randomInterval() { + var interval = Math.floor(Math.random() * (5 - 1 + 1)) + 1; + return interval * 1000; +} + +// call the function changeColorOfDot every 10 seconds +intervalId = setInterval(changeColorOfDot, randomInterval()); + +var segmentData = generateSegmentArray(10); + +generateSegmentOptions(segmentData); + +document.getElementById("fileJSONledbutton").innerHTML = +'  File to device' + document.getElementById("convertbutton").innerHTML = + '   Convert to WLED JSON '; + document.getElementById("copyJSONledbutton").innerHTML = + '   Copy to clipboard'; + document.getElementById("sendJSONledbutton").innerHTML = +'   Send to device'; \ No newline at end of file diff --git a/wled00/data/pixart/site.webmanifest b/wled00/data/pixart/site.webmanifest new file mode 100644 index 000000000..82452af2e --- /dev/null +++ b/wled00/data/pixart/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "WLED Pixel Art Convertor", + "short_name": "ledconv", + "icons": [ + { + "src": "/favicon-32x32.png", + "sizes": "32x322", + "type": "image/png" + }, + { + "src": "/favicon-32x32.png", + "sizes": "32x32", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" + } \ No newline at end of file diff --git a/wled00/data/pixart/statics.js b/wled00/data/pixart/statics.js new file mode 100644 index 000000000..15607cb9b --- /dev/null +++ b/wled00/data/pixart/statics.js @@ -0,0 +1,25 @@ +var curlStart = 'curl -X POST "http://'; +var curlMid1 = '/json/state" -d \''; +var curlEnd = '\' -H "Content-Type: application/json"'; + +const haStart = '#Uncomment if you don\'t allready have these defined in your switch section of your configuration.yaml\n#- platform: command_line\n #switches:\n '; +const haMid1 = '\n friendly_name: '; +const haMid2 = '\n unique_id: '; +const haMid3= '\n command_on: >\n '; +const haMid4 = '\n command_off: >\n curl -X POST "http://'; +const haEnd = '/json/state" -d \'{"on":false}\' -H "Content-Type: application/json"'; +const haCommandLeading = ' '; + +const JSONledStringStart = '{"on":true,"bri":'; +const JSONledStringMid1 = ',"seg":{"id":'; +const JSONledStringMid2 = ',"i":['; +// const JSONledShortStringStart = '{'; +// const JSONledShortStringMid1 = '"seg":{"i":['; +const JSONledStringEnd = ']}}'; + +var accentColor = '#7E4C80'; +var accentTextColor = '#777'; + +var scaleToggleOffd = "M17,7H7A5,5 0 0,0 2,12A5,5 0 0,0 7,17H17A5,5 0 0,0 22,12A5,5 0 0,0 17,7M7,15A3,3 0 0,1 4,12A3,3 0 0,1 7,9A3,3 0 0,1 10,12A3,3 0 0,1 7,15Z"; +var scaleToggleOnd = "M17,7H7A5,5 0 0,0 2,12A5,5 0 0,0 7,17H17A5,5 0 0,0 22,12A5,5 0 0,0 17,7M17,15A3,3 0 0,1 14,12A3,3 0 0,1 17,9A3,3 0 0,1 20,12A3,3 0 0,1 17,15Z"; + diff --git a/wled00/html_pixart.h b/wled00/html_pixart.h new file mode 100644 index 000000000..f8f8e35ae --- /dev/null +++ b/wled00/html_pixart.h @@ -0,0 +1,519 @@ +/* + * Binary array for the Web UI. + * gzip is used for smaller size and improved speeds. + * + * Please see https://kno.wled.ge/advanced/custom-features/#changing-web-ui + * to find out how to easily modify the web UI source! + */ + +// Autogenerated from wled00/data/pixart/pixart.htm, do not edit!! +const uint16_t PAGE_pixart_L = 8106; +const uint8_t PAGE_pixart[] PROGMEM = { + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xe5, 0x3c, 0xf9, 0x73, 0xda, 0x48, + 0xb3, 0xbf, 0xfb, 0xaf, 0x98, 0x28, 0xf5, 0xc5, 0x28, 0x08, 0x21, 0x89, 0xd3, 0x60, 0x39, 0x85, + 0x31, 0x36, 0x4e, 0x7c, 0x5f, 0xb1, 0xe3, 0x75, 0x6d, 0x09, 0x34, 0x80, 0x6c, 0x21, 0x11, 0x49, + 0x80, 0xb1, 0xc3, 0xff, 0xfe, 0xba, 0x67, 0x24, 0x10, 0x97, 0x8f, 0x6c, 0xf6, 0x7b, 0xaf, 0xea, + 0x6d, 0xd6, 0x20, 0x8d, 0x7a, 0x7a, 0xfa, 0x9a, 0x9e, 0xee, 0x9e, 0x11, 0x9b, 0x1f, 0x76, 0x8e, + 0xab, 0x17, 0x37, 0x27, 0x35, 0xd2, 0x09, 0xba, 0xf6, 0x16, 0xd9, 0x8c, 0xbe, 0xa8, 0x61, 0xc2, + 0x57, 0x97, 0x06, 0x06, 0x3c, 0x09, 0x7a, 0x29, 0xfa, 0xb3, 0x6f, 0x0d, 0x74, 0xa1, 0x6a, 0x34, + 0x3b, 0x34, 0x55, 0x75, 0x9d, 0xc0, 0x73, 0x6d, 0x81, 0xac, 0x35, 0xe1, 0x8a, 0x3a, 0x81, 0x2e, + 0x38, 0x6e, 0xaa, 0x89, 0xcf, 0x24, 0x02, 0x57, 0x7e, 0xe0, 0x7a, 0x70, 0xd5, 0xed, 0xfb, 0x41, + 0xca, 0xa3, 0x03, 0xc3, 0xb6, 0x4c, 0x23, 0xa0, 0xc2, 0x32, 0x84, 0x27, 0x9e, 0xd1, 0xee, 0x1a, + 0xcb, 0x30, 0x2d, 0x05, 0xaf, 0x3d, 0xf6, 0x2c, 0x8f, 0xfa, 0x02, 0x99, 0x80, 0x2b, 0x08, 0x17, + 0x58, 0x81, 0x4d, 0xb7, 0xd6, 0xbe, 0x1f, 0xd4, 0x76, 0xc8, 0x89, 0xf5, 0x48, 0x6d, 0x52, 0xf1, + 0x02, 0x02, 0x64, 0x0e, 0xa8, 0x17, 0x50, 0x6f, 0x33, 0xcd, 0x01, 0xc8, 0xa6, 0x1f, 0x8c, 0x10, + 0x50, 0x6e, 0xb8, 0x8f, 0xcf, 0x0d, 0xd7, 0x33, 0xa9, 0x57, 0xd2, 0x7a, 0x8f, 0xc4, 0x77, 0x81, + 0x44, 0xf2, 0xb1, 0xd5, 0x6a, 0x8d, 0x1b, 0xae, 0x39, 0x7a, 0x6e, 0x01, 0xf6, 0x54, 0xcb, 0xe8, + 0x5a, 0xf6, 0xa8, 0x54, 0xf1, 0x9a, 0x86, 0x49, 0xa5, 0x8a, 0x67, 0x19, 0xb6, 0xe4, 0x1b, 0x8e, + 0x9f, 0xf2, 0xa9, 0x67, 0xb5, 0xca, 0x0d, 0xa3, 0xf9, 0xd0, 0xf6, 0xdc, 0xbe, 0x63, 0xa6, 0x9a, + 0xae, 0xed, 0x7a, 0xa5, 0x8f, 0x6a, 0x0e, 0xff, 0x8d, 0xe5, 0xc0, 0xed, 0xa5, 0x7a, 0x86, 0x17, + 0x3c, 0x0f, 0x2d, 0x33, 0xe8, 0x94, 0xf2, 0x8a, 0xd2, 0x7b, 0x2c, 0x77, 0x0d, 0xaf, 0x6d, 0x39, + 0x25, 0x85, 0x18, 0xfd, 0xc0, 0x1d, 0xcb, 0x48, 0xbf, 0x61, 0x39, 0xd4, 0x7b, 0xee, 0x1a, 0x8f, + 0x29, 0x0e, 0xa8, 0x2a, 0xca, 0x7f, 0x48, 0x2a, 0x8b, 0xd0, 0x9c, 0xb6, 0x94, 0x67, 0x98, 0x56, + 0xdf, 0x2f, 0x29, 0xe5, 0x9e, 0x61, 0x9a, 0x96, 0xd3, 0x2e, 0x69, 0xf8, 0x30, 0xa0, 0x8f, 0x41, + 0x0a, 0x84, 0xda, 0x76, 0x4a, 0x4d, 0x90, 0x01, 0xf5, 0xc6, 0x1d, 0x95, 0x93, 0xec, 0x5b, 0x4f, + 0xb4, 0xa4, 0xc9, 0x19, 0xda, 0x2d, 0x87, 0x34, 0x15, 0x68, 0xb6, 0x59, 0x54, 0xa2, 0xd1, 0x55, + 0xe0, 0x55, 0x29, 0xbf, 0x85, 0x3b, 0x1b, 0x68, 0x4b, 0x75, 0xa8, 0xd5, 0xee, 0x04, 0x25, 0x39, + 0x37, 0xee, 0x68, 0xb1, 0x01, 0x54, 0x59, 0x9d, 0x0c, 0xe0, 0xb5, 0x1b, 0x46, 0x42, 0xd5, 0xf2, + 0x52, 0x21, 0x2f, 0xa9, 0x5a, 0x51, 0x92, 0xf3, 0xaa, 0xf8, 0x4f, 0x47, 0x5b, 0xc6, 0x60, 0x26, + 0x36, 0xbe, 0x5c, 0xf8, 0x17, 0x87, 0x57, 0xe5, 0xec, 0xe2, 0xf8, 0x65, 0x76, 0x93, 0xb2, 0x02, + 0xda, 0xf5, 0xa3, 0xa6, 0x7b, 0xb0, 0x6e, 0xab, 0x35, 0x4a, 0x85, 0x96, 0x18, 0x35, 0x9b, 0x96, + 0xdf, 0xb3, 0x8d, 0x51, 0xa9, 0x65, 0xd3, 0xc7, 0x71, 0x6f, 0x46, 0x6a, 0x5a, 0x4c, 0x2d, 0x85, + 0xc2, 0xdc, 0xa8, 0xb9, 0xb7, 0x50, 0x3a, 0xfe, 0xd8, 0xb2, 0xa8, 0x6d, 0x5e, 0x18, 0x0d, 0x9b, + 0xc6, 0x51, 0x93, 0x17, 0x30, 0xbf, 0x0d, 0xaf, 0xdf, 0x34, 0x6c, 0xfa, 0x2f, 0xe0, 0x35, 0x3d, + 0x98, 0x0c, 0x4f, 0xae, 0x43, 0x9f, 0x23, 0xc1, 0x34, 0x6c, 0xb7, 0xf9, 0x50, 0x9e, 0x5a, 0x7c, + 0xdc, 0xe0, 0x4b, 0x19, 0xd0, 0x99, 0x69, 0xf8, 0x1d, 0x0a, 0xb3, 0x31, 0x34, 0xdd, 0xf9, 0xa9, + 0xb0, 0xa8, 0x9c, 0x99, 0xc9, 0x11, 0xcd, 0xb3, 0x72, 0xb3, 0xef, 0xf9, 0x40, 0x78, 0xcf, 0xb5, + 0x18, 0xd0, 0x5b, 0xec, 0x20, 0xc6, 0x79, 0x0e, 0x50, 0x4d, 0x39, 0x47, 0xb9, 0xdb, 0x34, 0xd5, + 0xb3, 0x9a, 0x0f, 0x30, 0x63, 0x23, 0x4e, 0x1c, 0x60, 0x6b, 0xfc, 0x99, 0xf8, 0xd4, 0xa6, 0xcd, + 0xe0, 0x79, 0xd1, 0x1f, 0x64, 0x32, 0x99, 0x10, 0x87, 0x6f, 0xd9, 0xe0, 0x89, 0x22, 0x26, 0xd5, + 0x89, 0xc7, 0x09, 0xdb, 0x39, 0xcd, 0x29, 0xf0, 0x1b, 0x60, 0xfd, 0x20, 0xf2, 0xf0, 0xbe, 0xe1, + 0x06, 0x81, 0xdb, 0xe5, 0x4d, 0x11, 0x8f, 0x4a, 0x4c, 0x72, 0xe5, 0x50, 0x15, 0x5a, 0x01, 0x88, + 0x5d, 0x49, 0xfb, 0xbc, 0x00, 0x81, 0x62, 0xcb, 0xe9, 0xf5, 0x83, 0xdb, 0x60, 0xd4, 0xa3, 0xba, + 0x67, 0x38, 0x6d, 0x7a, 0xf7, 0x9c, 0x1a, 0xd2, 0xc6, 0x83, 0x05, 0x72, 0xed, 0xf5, 0xa8, 0x01, + 0x6d, 0x4d, 0xca, 0xb8, 0x2b, 0xa3, 0x15, 0xa7, 0x80, 0xab, 0x21, 0xe8, 0x7b, 0x5e, 0x11, 0x53, + 0x86, 0x4b, 0x68, 0x18, 0x86, 0x07, 0x80, 0xf0, 0x0c, 0x74, 0x92, 0x08, 0x5c, 0xe2, 0x21, 0x69, + 0x12, 0xca, 0x80, 0x28, 0xfc, 0x0b, 0x49, 0x16, 0xff, 0x91, 0x40, 0x6c, 0xda, 0x0a, 0x80, 0x81, + 0x05, 0xf2, 0x4b, 0xa5, 0x88, 0x7e, 0x1f, 0x90, 0x00, 0x8d, 0x41, 0xa7, 0xdf, 0x6d, 0xac, 0x64, + 0x8a, 0x4b, 0x50, 0x43, 0x31, 0x45, 0x12, 0xc4, 0xeb, 0x18, 0x3f, 0x91, 0xed, 0xf5, 0x5c, 0xdf, + 0x0a, 0x2c, 0xd7, 0x29, 0x79, 0xd4, 0x36, 0x02, 0x6b, 0x40, 0xcb, 0x4f, 0x29, 0xcb, 0x31, 0xe9, + 0x63, 0x29, 0x33, 0x96, 0xd9, 0xd8, 0x47, 0x30, 0x10, 0x98, 0x44, 0x88, 0x12, 0x0d, 0x10, 0x97, + 0x1c, 0x0b, 0x66, 0x53, 0x68, 0xa3, 0x5d, 0xcb, 0x34, 0x6d, 0x3a, 0x96, 0x5b, 0x7d, 0xdb, 0xbe, + 0x00, 0xd3, 0xdd, 0xc5, 0x09, 0xcc, 0x89, 0x47, 0x4b, 0xbe, 0x5b, 0x61, 0x37, 0xab, 0x24, 0x13, + 0xda, 0x01, 0x50, 0xc1, 0x26, 0xa3, 0x1f, 0xc0, 0x3a, 0x53, 0xca, 0x4d, 0xec, 0x9e, 0x89, 0x4c, + 0x45, 0x32, 0x96, 0x98, 0x49, 0x76, 0xc9, 0xc2, 0xf2, 0xcf, 0xa6, 0xc5, 0x8c, 0x29, 0xf9, 0xfd, + 0x46, 0xd7, 0xfa, 0x5d, 0x86, 0xb8, 0x9e, 0x63, 0x44, 0xff, 0x43, 0x42, 0x67, 0xd6, 0x40, 0x46, + 0x69, 0xa3, 0x0f, 0xb3, 0xc9, 0xf9, 0x47, 0xe2, 0x66, 0x82, 0xfe, 0x73, 0x34, 0xce, 0x3a, 0xd7, + 0xf8, 0xc2, 0xf1, 0x8e, 0xf5, 0x66, 0xd6, 0xcd, 0x8d, 0xd1, 0xa6, 0x0c, 0x8f, 0x1a, 0xcf, 0x6d, + 0xcf, 0x32, 0x53, 0x6c, 0xe2, 0xa6, 0xb5, 0x65, 0xc6, 0xc0, 0x82, 0x92, 0xf7, 0x09, 0x23, 0x26, + 0x4e, 0xb9, 0x03, 0xf3, 0x6c, 0xd6, 0x11, 0xca, 0x38, 0xa2, 0x9f, 0x6a, 0xda, 0x86, 0xef, 0x3f, + 0x4f, 0x26, 0x4e, 0x0b, 0xa2, 0x31, 0xb3, 0x8c, 0x56, 0xa9, 0x94, 0xf9, 0xf4, 0x9d, 0x12, 0x33, + 0x18, 0x46, 0xd4, 0xe0, 0x4d, 0x67, 0x22, 0x01, 0x44, 0x54, 0x66, 0xf4, 0x03, 0xff, 0xd0, 0x12, + 0x50, 0xa4, 0xae, 0xdf, 0x75, 0x7c, 0x98, 0x87, 0x30, 0x95, 0x83, 0x04, 0xc6, 0x50, 0x29, 0x70, + 0xc9, 0xb6, 0x84, 0x53, 0x4e, 0x9c, 0x03, 0x06, 0xae, 0x5f, 0x86, 0x6c, 0x1b, 0x40, 0xce, 0x58, + 0xf6, 0x07, 0xa0, 0x58, 0x10, 0xe7, 0xf3, 0x8a, 0x29, 0xcb, 0x2d, 0xc6, 0xb4, 0x06, 0x21, 0x53, + 0xa8, 0x19, 0xf0, 0x83, 0x11, 0x99, 0xe1, 0x14, 0x64, 0xeb, 0x59, 0x0c, 0x18, 0x7a, 0x87, 0xf0, + 0x11, 0xa3, 0x20, 0xe8, 0xa5, 0x7d, 0x3e, 0x5a, 0x5d, 0xa3, 0x4d, 0x53, 0xd3, 0x50, 0xf0, 0x05, + 0x01, 0x30, 0x9e, 0xd4, 0x96, 0x47, 0xe0, 0x6f, 0xfc, 0x91, 0x0f, 0xb6, 0xa4, 0x27, 0x33, 0x9e, + 0xc8, 0x68, 0xc3, 0xf5, 0x83, 0x11, 0x10, 0xb5, 0x45, 0xfe, 0x21, 0x22, 0x78, 0x86, 0xb3, 0x38, + 0x50, 0xae, 0xb7, 0x80, 0x28, 0x87, 0xdd, 0x40, 0x76, 0x31, 0xc6, 0x20, 0x70, 0x60, 0xb3, 0x3e, + 0x0c, 0xb5, 0x4b, 0xa5, 0x06, 0x6d, 0x41, 0xec, 0xff, 0x1c, 0x19, 0xa9, 0x20, 0x2c, 0x65, 0x3d, + 0x6e, 0x78, 0x4c, 0x08, 0xa5, 0xbe, 0x67, 0x27, 0xd6, 0x21, 0x4b, 0x30, 0x4a, 0xec, 0x3e, 0x0d, + 0xba, 0x49, 0x3e, 0x76, 0xed, 0x72, 0x3f, 0x68, 0x15, 0x25, 0x88, 0xdb, 0x07, 0x6d, 0xc2, 0x62, + 0x77, 0x5d, 0x08, 0x5d, 0x6d, 0x36, 0xe6, 0xbd, 0xe1, 0x5a, 0x20, 0x03, 0x8b, 0x0e, 0xb7, 0xdd, + 0x47, 0xc8, 0x08, 0x88, 0x42, 0xb4, 0x2c, 0xfc, 0x2f, 0x90, 0xcd, 0x9e, 0x11, 0x74, 0x08, 0xaa, + 0x5f, 0x17, 0x60, 0xa2, 0x78, 0x40, 0x52, 0x15, 0x8d, 0x58, 0x20, 0xa6, 0x2e, 0x1c, 0xaa, 0x9a, + 0x94, 0xbf, 0xda, 0x38, 0x50, 0xf3, 0x52, 0xee, 0x00, 0xae, 0xd5, 0xab, 0x6c, 0xa5, 0x28, 0x15, + 0xa1, 0xb7, 0x22, 0x29, 0x24, 0x0b, 0xf1, 0x64, 0x15, 0x3e, 0x32, 0x72, 0xae, 0x40, 0xb2, 0x72, + 0x16, 0xe2, 0xcb, 0x9c, 0xac, 0x64, 0x48, 0x4e, 0xd6, 0xa0, 0x35, 0x2f, 0x6b, 0xf9, 0x83, 0xbc, + 0x5c, 0x90, 0xd4, 0xac, 0x5c, 0xac, 0xc2, 0x5d, 0x0e, 0x21, 0x37, 0x0a, 0x04, 0xc0, 0x32, 0xf8, + 0xa1, 0x55, 0xf2, 0x52, 0x9e, 0xa1, 0x52, 0x09, 0x8e, 0x73, 0xa8, 0x16, 0x65, 0x88, 0x51, 0x0b, + 0x72, 0x21, 0x7b, 0xa0, 0x16, 0xe4, 0x8c, 0xb4, 0x21, 0x6b, 0x55, 0x15, 0x6f, 0x25, 0x55, 0x91, + 0x95, 0x2c, 0x51, 0x8b, 0x92, 0xaa, 0xb2, 0xcf, 0xb9, 0xae, 0x6a, 0xf1, 0x4a, 0xcd, 0x1d, 0x40, + 0xfb, 0x06, 0x12, 0xa9, 0x65, 0xae, 0x34, 0x25, 0x46, 0xa6, 0xa6, 0x20, 0x9d, 0xf8, 0xa9, 0xc8, + 0x59, 0x58, 0x63, 0x37, 0xe4, 0x5c, 0x56, 0x2a, 0x22, 0x25, 0xd3, 0x01, 0x7f, 0x08, 0x24, 0xbd, + 0xb5, 0x89, 0x22, 0xdd, 0x5a, 0x17, 0xc3, 0xe9, 0x97, 0xc9, 0x4f, 0xe5, 0x87, 0xd7, 0xa0, 0x48, + 0xf0, 0x49, 0x3b, 0xd6, 0x80, 0x7c, 0x7e, 0x5e, 0x6e, 0xe0, 0xf8, 0x7c, 0x1f, 0xbd, 0x3d, 0x5b, + 0xc1, 0x22, 0xeb, 0xce, 0xbd, 0xdf, 0x8d, 0xbc, 0x65, 0x09, 0x4b, 0xe5, 0x66, 0xd5, 0xfb, 0x87, + 0xd7, 0x2d, 0x03, 0x23, 0x96, 0x87, 0xe7, 0x17, 0x72, 0x88, 0x05, 0x96, 0x02, 0x58, 0xee, 0x7d, + 0xc8, 0xea, 0xc0, 0x84, 0x78, 0x08, 0x6a, 0xd2, 0xa6, 0xeb, 0x19, 0xcc, 0xc9, 0x31, 0xff, 0x67, + 0x94, 0x06, 0x16, 0x38, 0x3d, 0x6a, 0xfe, 0x69, 0xb4, 0x1d, 0x17, 0xa4, 0xf6, 0x3c, 0x9b, 0xcf, + 0xfd, 0x0e, 0x1e, 0xa3, 0x89, 0x11, 0xcc, 0x9f, 0xa5, 0x6e, 0x0d, 0xcc, 0x8a, 0xa5, 0xd4, 0x64, + 0x13, 0x25, 0x4a, 0x20, 0x4e, 0xd2, 0x05, 0xbf, 0xe3, 0x7a, 0x41, 0xb3, 0x1f, 0x10, 0x74, 0xae, + 0x90, 0xda, 0x77, 0x3c, 0xda, 0xd2, 0x85, 0xd8, 0xe4, 0xee, 0x39, 0x6d, 0x18, 0xcb, 0xa7, 0xf9, + 0xac, 0x64, 0x5d, 0x6d, 0x1f, 0x9f, 0x0d, 0x95, 0x6f, 0x7b, 0x6d, 0xb7, 0x02, 0xff, 0x1d, 0x9d, + 0x5f, 0x76, 0x6a, 0x97, 0x6d, 0xb8, 0xda, 0xc6, 0xdb, 0xca, 0x69, 0xb5, 0x72, 0x83, 0xdf, 0xad, + 0x62, 0x7a, 0xa3, 0xc3, 0x5a, 0xae, 0x8f, 0xce, 0xcf, 0x94, 0xfd, 0x8a, 0xe7, 0x67, 0x9b, 0xf9, + 0x53, 0xb8, 0x7f, 0x38, 0xfa, 0x7a, 0x56, 0xdb, 0xbd, 0x3c, 0xae, 0x25, 0xed, 0x4b, 0x3f, 0x38, + 0xd6, 0xd4, 0xca, 0xa5, 0x53, 0x3f, 0xf2, 0x77, 0x95, 0xab, 0xa4, 0x52, 0xbb, 0xbe, 0xb2, 0x06, + 0x95, 0xeb, 0x56, 0x85, 0x16, 0x7e, 0xda, 0x07, 0x85, 0xda, 0x8f, 0x5a, 0xf3, 0x34, 0xd7, 0x3c, + 0x2d, 0x3a, 0xd5, 0xfd, 0x6a, 0x63, 0xe7, 0xeb, 0x6e, 0xe1, 0xc2, 0x1b, 0x74, 0x0c, 0x3f, 0x7f, + 0xd3, 0x18, 0xed, 0x98, 0xdb, 0x7d, 0xad, 0x73, 0xfe, 0x50, 0x78, 0xb0, 0x3a, 0x7e, 0xf3, 0x9b, + 0xda, 0xba, 0xdc, 0x50, 0xeb, 0x67, 0xdf, 0xbe, 0x19, 0xbb, 0x2d, 0xf5, 0xb1, 0xe3, 0x9d, 0x14, + 0xe9, 0xfd, 0xa1, 0x53, 0xad, 0x17, 0x73, 0xca, 0x49, 0x3a, 0x39, 0x48, 0x37, 0xab, 0xda, 0xcf, + 0xe6, 0xcf, 0x61, 0xb6, 0xed, 0xef, 0xed, 0x64, 0xea, 0x0f, 0xe9, 0x3d, 0x2d, 0x93, 0x6c, 0x0c, + 0xce, 0xcd, 0x61, 0xc1, 0x79, 0x50, 0xbf, 0x15, 0x8b, 0x85, 0x6d, 0x5a, 0x3d, 0xcd, 0x56, 0xf6, + 0x0e, 0x2b, 0x56, 0xed, 0xbe, 0xb9, 0x67, 0x6c, 0x17, 0xda, 0x8e, 0x59, 0x6b, 0x75, 0xce, 0x7e, + 0x9a, 0x67, 0xa7, 0xe7, 0xd5, 0x0d, 0xa7, 0x79, 0x6a, 0x3d, 0x54, 0xae, 0x2c, 0xbf, 0xf2, 0x7d, + 0x6f, 0x7b, 0xb7, 0xdd, 0x3e, 0xcb, 0x9d, 0x0e, 0x4e, 0x0b, 0x97, 0xcd, 0x8b, 0x23, 0x73, 0xa3, + 0x7b, 0x30, 0xd8, 0x31, 0xab, 0x5a, 0x4f, 0xf3, 0x3a, 0xfb, 0x47, 0xda, 0x5e, 0xf6, 0x32, 0x3d, + 0x38, 0x6b, 0x38, 0x74, 0x34, 0x72, 0x9e, 0x3a, 0x3d, 0xbf, 0xa0, 0xb8, 0x95, 0x13, 0xbb, 0x73, + 0x74, 0x72, 0x70, 0xff, 0xc3, 0x31, 0xd4, 0x41, 0x36, 0xfd, 0x78, 0xd5, 0x0d, 0x4e, 0xeb, 0x97, + 0xc5, 0xe0, 0xe9, 0xf4, 0xfa, 0x38, 0x53, 0xad, 0x3e, 0x64, 0x1d, 0xef, 0x64, 0xa7, 0x78, 0x78, + 0x70, 0x94, 0xcc, 0xff, 0x34, 0x8b, 0xb4, 0x55, 0xa4, 0xde, 0x70, 0xfb, 0xdb, 0xa0, 0x5e, 0xc8, + 0x29, 0xd7, 0xdf, 0xd4, 0xeb, 0x51, 0xd6, 0xb6, 0x36, 0xd2, 0xad, 0xd3, 0x5d, 0x6f, 0xb8, 0x71, + 0x52, 0xd9, 0x3b, 0xdf, 0x69, 0x17, 0x8d, 0xa7, 0xfe, 0xf0, 0xeb, 0xce, 0x51, 0xfe, 0xbe, 0xd1, + 0xa7, 0xbd, 0x82, 0x91, 0xdc, 0xdb, 0xdd, 0xcd, 0xd0, 0xa7, 0x23, 0x85, 0x3a, 0xb9, 0xd6, 0xce, + 0xcf, 0xe2, 0x69, 0xcb, 0x49, 0x5e, 0xfe, 0xbc, 0x6a, 0xdf, 0x77, 0xbe, 0xe7, 0x1a, 0xf4, 0xa4, + 0x37, 0xac, 0x7e, 0x1b, 0x5e, 0xd6, 0xef, 0xf3, 0x86, 0x56, 0xa9, 0xde, 0x14, 0x9e, 0xbc, 0xaa, + 0x59, 0xad, 0x66, 0xb2, 0x97, 0xf7, 0xde, 0x53, 0x3f, 0xb8, 0x3f, 0xf8, 0x61, 0x9d, 0x56, 0xd3, + 0x0f, 0x1d, 0xa5, 0x6e, 0x8f, 0x4e, 0x46, 0xfd, 0x8d, 0xe0, 0xdb, 0xd3, 0x61, 0xd6, 0xda, 0x3b, + 0x69, 0x15, 0xfa, 0x7b, 0x39, 0x7f, 0xa7, 0x36, 0xfc, 0xde, 0xbb, 0xf9, 0x3e, 0xf0, 0x3a, 0xc5, + 0xdc, 0xd9, 0x8f, 0x1b, 0xd0, 0xee, 0x7e, 0xaf, 0x90, 0xbc, 0x36, 0x46, 0x47, 0xc1, 0xcf, 0x51, + 0x70, 0x4d, 0x0f, 0x7e, 0x7e, 0x6f, 0xdc, 0x5f, 0x5e, 0x1e, 0x35, 0x0f, 0xaa, 0xc9, 0x56, 0x7f, + 0x4f, 0xeb, 0xf6, 0x0e, 0xfa, 0x85, 0xe0, 0xc4, 0xce, 0xf9, 0x3f, 0x76, 0x2a, 0x4e, 0xef, 0xe0, + 0x41, 0xe9, 0x3e, 0xed, 0xee, 0x58, 0x5e, 0x72, 0x7b, 0xf7, 0xab, 0xfd, 0x50, 0xad, 0x55, 0x8d, + 0x6f, 0xbb, 0xfd, 0xf3, 0xed, 0x9b, 0x73, 0xbb, 0x92, 0xed, 0x1d, 0x7c, 0x0f, 0xac, 0xb3, 0xfb, + 0xda, 0xa8, 0xbd, 0x3f, 0xaa, 0x79, 0xbb, 0x4f, 0xa3, 0xfd, 0x6f, 0xf7, 0x1e, 0xbd, 0xb9, 0xb0, + 0x1b, 0x3f, 0xbe, 0xb5, 0x8d, 0xba, 0x77, 0x66, 0x3f, 0xb9, 0x75, 0x37, 0x18, 0xd2, 0x6b, 0x5a, + 0xe9, 0xd4, 0x3a, 0xfb, 0x8f, 0x27, 0xdb, 0x17, 0x3b, 0xdb, 0x9d, 0xd3, 0x9b, 0x76, 0xed, 0xa6, + 0x73, 0xd4, 0x18, 0x35, 0xf6, 0x8f, 0x3a, 0x8f, 0x37, 0xaa, 0xdf, 0x38, 0x1f, 0x0e, 0x1f, 0x1a, + 0xf5, 0xe3, 0x1f, 0xde, 0x93, 0x9f, 0xb9, 0x3a, 0xeb, 0xde, 0x77, 0x9d, 0xe3, 0x87, 0x7c, 0xe3, + 0xf8, 0xc1, 0xfb, 0xf9, 0x78, 0x58, 0xbf, 0xd8, 0x18, 0x55, 0x7f, 0x8e, 0x1e, 0x8f, 0x46, 0x8d, + 0xca, 0xee, 0x61, 0x5b, 0xed, 0x7e, 0x3f, 0xdb, 0xde, 0xbb, 0xb1, 0xdb, 0x1a, 0x6d, 0xb8, 0xc7, + 0xe7, 0xbb, 0x7b, 0xe6, 0x45, 0x72, 0x7f, 0x78, 0x98, 0xa9, 0x59, 0x76, 0xfe, 0x69, 0x7b, 0x78, + 0xfd, 0x63, 0x57, 0x7d, 0x7c, 0x38, 0xff, 0xfe, 0x70, 0x6c, 0xe4, 0x7f, 0x06, 0x75, 0x48, 0x14, + 0x69, 0xff, 0x74, 0x50, 0x4d, 0xb6, 0xb3, 0xbd, 0x1f, 0xd7, 0x96, 0x71, 0x1c, 0x6c, 0xdc, 0x8f, + 0x76, 0x1a, 0x5a, 0xf6, 0x54, 0xfb, 0xf9, 0xad, 0x9a, 0xbb, 0xbe, 0x38, 0x1f, 0x78, 0xf6, 0xb7, + 0xcc, 0x8f, 0xfa, 0xe1, 0x77, 0x25, 0xeb, 0x1c, 0x98, 0x87, 0x27, 0xdf, 0x82, 0xd3, 0xe3, 0xc3, + 0x27, 0x77, 0xef, 0xe2, 0xe9, 0xe4, 0x29, 0xbf, 0x71, 0x73, 0x74, 0xa2, 0x0d, 0xac, 0xc2, 0x8e, + 0xaa, 0xb6, 0x82, 0xc1, 0xe9, 0xf7, 0x9b, 0xea, 0xd3, 0x28, 0x28, 0xdc, 0xb7, 0x86, 0xc7, 0xaa, + 0x72, 0x71, 0xda, 0x3e, 0xc8, 0x75, 0x2e, 0xd8, 0x9c, 0xa8, 0x6c, 0x7f, 0x3d, 0xbb, 0xcc, 0xd5, + 0xbc, 0x87, 0xaf, 0xed, 0x76, 0x5b, 0xd7, 0x85, 0xad, 0x35, 0xb2, 0x99, 0x0e, 0x4b, 0x7a, 0x58, + 0xdf, 0x9a, 0x7e, 0x41, 0xbc, 0x42, 0x58, 0x08, 0xa0, 0x0b, 0x51, 0xd5, 0x4a, 0x08, 0x9b, 0xd7, + 0xc2, 0xf5, 0x76, 0x26, 0xb4, 0x58, 0x1e, 0x84, 0x62, 0x97, 0x8e, 0xba, 0xbc, 0xc7, 0x62, 0x24, + 0x8b, 0xd0, 0x0b, 0xeb, 0xf9, 0xfc, 0x7a, 0x04, 0x6e, 0x63, 0xc9, 0x82, 0xbe, 0x15, 0x5f, 0xd0, + 0x43, 0x5f, 0x08, 0x90, 0xb8, 0x98, 0xe7, 0x49, 0xce, 0xd0, 0x88, 0x06, 0xa0, 0x2a, 0xfc, 0x65, + 0xb1, 0x4b, 0x74, 0x97, 0x82, 0x3b, 0x58, 0xec, 0x5f, 0x03, 0x28, 0xbe, 0x02, 0x90, 0x27, 0xaa, + 0xfa, 0xda, 0x10, 0xaf, 0x41, 0x14, 0x5f, 0x83, 0x80, 0x41, 0x0a, 0xaf, 0x0e, 0x52, 0x78, 0x75, + 0x90, 0x17, 0x21, 0x84, 0xf4, 0xd6, 0x1a, 0x0f, 0x07, 0xc8, 0xaa, 0x8a, 0x29, 0xda, 0x8b, 0x0a, + 0x7a, 0x4a, 0x83, 0x25, 0xa0, 0x72, 0xb5, 0xad, 0xb5, 0xf0, 0x19, 0x61, 0x2e, 0x9c, 0x40, 0x86, + 0xcf, 0xfa, 0x7e, 0x3d, 0x3f, 0x3e, 0x22, 0x89, 0x1e, 0xc3, 0x00, 0xc6, 0x43, 0x5c, 0x87, 0xb7, + 0x77, 0x8d, 0xc0, 0xb3, 0x1e, 0x45, 0x40, 0xa3, 0x41, 0xff, 0x1e, 0xd6, 0x68, 0xb1, 0xb8, 0x44, + 0xd6, 0x2c, 0x50, 0xd6, 0xb4, 0x88, 0x25, 0xcc, 0x5a, 0x01, 0xcb, 0x50, 0x18, 0x60, 0x0a, 0x0c, + 0xc8, 0xed, 0x07, 0x61, 0xfe, 0xc0, 0x8d, 0x68, 0xd1, 0xe8, 0x02, 0x0f, 0x4d, 0x3b, 0x30, 0x23, + 0x2c, 0x4b, 0x03, 0x79, 0x04, 0xb4, 0x8d, 0x06, 0x10, 0x08, 0xa1, 0xa9, 0x2e, 0xd8, 0xd4, 0x3c, + 0xa7, 0x41, 0xbf, 0x77, 0xce, 0xca, 0x36, 0x10, 0x0b, 0x6e, 0x1d, 0x50, 0x40, 0x80, 0x4d, 0x25, + 0x10, 0x0b, 0x83, 0x44, 0xce, 0x03, 0x9c, 0x2d, 0x6f, 0x40, 0xcd, 0xcb, 0x3f, 0x04, 0xf9, 0x5a, + 0x44, 0x0d, 0xd4, 0xb9, 0x3d, 0x5c, 0x2e, 0xc9, 0xc0, 0xb0, 0xfb, 0x80, 0x86, 0xcb, 0x45, 0x08, + 0x8b, 0x46, 0x14, 0x3a, 0x45, 0x57, 0xc2, 0x96, 0xb6, 0x43, 0x0e, 0xd9, 0xe3, 0xcd, 0x34, 0xef, + 0xb4, 0x35, 0xe9, 0xbd, 0x16, 0x76, 0xf7, 0x34, 0x5b, 0xd8, 0x3a, 0xa7, 0x5e, 0x0f, 0x44, 0x00, + 0xc1, 0x93, 0x04, 0x53, 0xc1, 0xf3, 0x03, 0x02, 0xd9, 0x01, 0x2f, 0xb8, 0xa0, 0x5e, 0x30, 0xcd, + 0x22, 0x9f, 0xec, 0xa0, 0x9c, 0x5a, 0x8d, 0xc7, 0xd6, 0xbc, 0x55, 0x78, 0x58, 0xf7, 0xa8, 0x80, + 0x43, 0x52, 0x9f, 0xda, 0x41, 0x39, 0x86, 0x27, 0xcd, 0xc9, 0x8d, 0x04, 0x04, 0x02, 0x03, 0x1d, + 0x30, 0x45, 0xbc, 0x57, 0x0f, 0xf0, 0x01, 0xc2, 0x88, 0x89, 0xea, 0xb8, 0x1f, 0x40, 0x74, 0x49, + 0x78, 0x7b, 0xe9, 0xf7, 0x35, 0xc1, 0x4d, 0x6c, 0x0e, 0xfb, 0xbc, 0x1e, 0x86, 0xa0, 0xab, 0xe5, + 0x5a, 0x98, 0x98, 0xf5, 0x84, 0xeb, 0x05, 0x25, 0x42, 0x2a, 0x01, 0x6a, 0xa8, 0x5e, 0x9e, 0x1d, + 0x2c, 0x4a, 0x38, 0x04, 0xe9, 0x18, 0xc2, 0x56, 0xdd, 0xed, 0x52, 0x52, 0xf1, 0x7d, 0x0b, 0x42, + 0x5c, 0x27, 0x20, 0x37, 0x95, 0xc3, 0x83, 0xb5, 0xd5, 0xa2, 0xfc, 0x2d, 0x49, 0xae, 0x31, 0x51, + 0xb2, 0x60, 0x6d, 0x77, 0x8e, 0x63, 0x96, 0xe8, 0x90, 0xa6, 0x6b, 0xd2, 0x17, 0x44, 0xba, 0xf6, + 0x0e, 0xeb, 0x5e, 0x3a, 0xca, 0x82, 0x65, 0x75, 0xe8, 0x0a, 0xeb, 0xae, 0xd7, 0xae, 0x49, 0xe2, + 0x63, 0x2b, 0x8b, 0xff, 0xc4, 0x95, 0x72, 0x83, 0x00, 0x13, 0x4c, 0x61, 0xa7, 0x56, 0x25, 0x09, + 0x2d, 0x9b, 0x95, 0xc2, 0x3f, 0xf1, 0xcd, 0x62, 0x5b, 0x7b, 0x87, 0x05, 0x42, 0x1e, 0xe2, 0x51, + 0x50, 0x8f, 0xd3, 0x9e, 0xf2, 0x53, 0x99, 0xb4, 0xfd, 0x13, 0x67, 0xc0, 0x4c, 0x70, 0x19, 0xfa, + 0x05, 0x33, 0x19, 0x35, 0x20, 0xcd, 0x5f, 0x2e, 0xb0, 0xb5, 0x3a, 0x7b, 0x88, 0x42, 0x53, 0xf0, + 0x1f, 0xa4, 0x78, 0x12, 0x78, 0x76, 0x89, 0xbc, 0x2a, 0x44, 0x56, 0x99, 0x04, 0x04, 0x67, 0xf8, + 0x4d, 0x12, 0x6f, 0xee, 0x87, 0xb4, 0x22, 0x1f, 0xe7, 0xec, 0x7b, 0xaa, 0xad, 0x7f, 0xc7, 0x6a, + 0x1b, 0xcc, 0xc3, 0x38, 0x20, 0x22, 0x5e, 0x44, 0x15, 0xb6, 0xb6, 0x27, 0x2d, 0xef, 0xb6, 0xd5, + 0xf2, 0x1b, 0x82, 0x0e, 0x56, 0xab, 0x24, 0x6b, 0xac, 0x58, 0x19, 0xca, 0x88, 0x19, 0xf6, 0x02, + 0x21, 0xa4, 0x6b, 0x39, 0xba, 0xa0, 0xc2, 0xb7, 0x01, 0xe1, 0x87, 0x96, 0xcb, 0x09, 0x91, 0x84, + 0xf0, 0x1a, 0xd5, 0xdc, 0x33, 0x1c, 0xae, 0xe4, 0x69, 0xdf, 0x2b, 0x84, 0x00, 0x27, 0x9e, 0xcb, + 0x81, 0x8c, 0xe0, 0xf9, 0x1f, 0x30, 0x50, 0x36, 0xe3, 0x0e, 0xac, 0xae, 0x15, 0x44, 0x12, 0x5a, + 0x3b, 0x34, 0x1e, 0x89, 0xe3, 0x12, 0xb7, 0x45, 0xd8, 0x43, 0x3f, 0x8d, 0x9e, 0xea, 0xbf, 0x2a, + 0xad, 0x05, 0xa2, 0x66, 0xa5, 0x95, 0x53, 0xb5, 0x98, 0xb4, 0xf2, 0xb3, 0xd2, 0x9a, 0xf6, 0x9d, + 0x48, 0x2b, 0xbf, 0x42, 0x5a, 0x51, 0x58, 0xda, 0x31, 0x52, 0x58, 0x6b, 0x14, 0xde, 0x2f, 0xbd, + 0x8e, 0xb1, 0xbf, 0x03, 0x6e, 0xa7, 0x42, 0x76, 0xe8, 0xc0, 0x6a, 0x52, 0xb2, 0xbf, 0xb3, 0x44, + 0x4e, 0x6b, 0xaf, 0x9a, 0x2c, 0x97, 0x43, 0x48, 0xcd, 0x4c, 0x15, 0x5f, 0x20, 0x5c, 0x38, 0x98, + 0x19, 0x0b, 0x9c, 0x41, 0x36, 0x66, 0xc4, 0x3e, 0x8b, 0x8a, 0xfe, 0x86, 0xa8, 0xe8, 0xef, 0x26, + 0xdf, 0x30, 0xb7, 0xa9, 0xf7, 0xb7, 0xa2, 0xa8, 0xc2, 0xdb, 0x98, 0x5d, 0x23, 0xef, 0x62, 0xf6, + 0x72, 0x96, 0xdb, 0x4b, 0xc7, 0xfa, 0xd9, 0x9f, 0x65, 0x7a, 0xed, 0xed, 0x7e, 0xec, 0x25, 0xa6, + 0xd7, 0xe2, 0x5c, 0x73, 0xa6, 0x2f, 0xdf, 0xc0, 0xb5, 0xb1, 0x84, 0xed, 0xb5, 0xa5, 0x4a, 0x7e, + 0x17, 0xdb, 0x47, 0x46, 0x17, 0x5d, 0xdd, 0x94, 0x71, 0x6c, 0xf8, 0x9d, 0xe8, 0x21, 0xb4, 0xf7, + 0xd7, 0x15, 0xcd, 0x59, 0x66, 0xe3, 0x46, 0x3c, 0x4f, 0x23, 0xe8, 0x6f, 0x56, 0xd0, 0xec, 0x50, + 0x47, 0xf8, 0x03, 0x01, 0x12, 0x46, 0x19, 0x97, 0x18, 0x68, 0xac, 0x45, 0x06, 0x7c, 0x92, 0xee, + 0xb8, 0x10, 0xa5, 0x39, 0xff, 0x0d, 0x0e, 0xa3, 0xd1, 0x39, 0x8b, 0x7f, 0xc0, 0x99, 0x05, 0x86, + 0xd7, 0xa6, 0x10, 0x39, 0xb4, 0xbb, 0xe0, 0x62, 0x84, 0xad, 0x0b, 0x76, 0x0b, 0x0b, 0x1f, 0xbb, + 0x87, 0x21, 0xff, 0x69, 0xf0, 0x3d, 0x87, 0x1f, 0x25, 0xbf, 0x74, 0xa9, 0x4a, 0xb3, 0xfc, 0x62, + 0x92, 0x90, 0x84, 0xd2, 0x98, 0xee, 0x7f, 0x57, 0xb1, 0x81, 0xcb, 0x60, 0xda, 0x28, 0x4c, 0x58, + 0xfd, 0xed, 0x44, 0xe5, 0x6d, 0x02, 0xc3, 0xcc, 0x7b, 0x32, 0xf4, 0x8e, 0x35, 0x88, 0x92, 0xe5, + 0xb5, 0x57, 0xb2, 0xe5, 0x65, 0xd5, 0x6f, 0xac, 0xee, 0x5b, 0xcd, 0x07, 0x40, 0x36, 0x44, 0xab, + 0x3c, 0x47, 0x94, 0x09, 0x31, 0x4c, 0xa2, 0xd7, 0x96, 0x96, 0xc5, 0x59, 0x2a, 0xad, 0x16, 0x48, + 0xa1, 0x5e, 0x30, 0x72, 0x24, 0x87, 0x45, 0x66, 0xc8, 0x19, 0xf1, 0x6a, 0x72, 0x87, 0x57, 0x1d, + 0x55, 0x31, 0x62, 0x0d, 0xa9, 0xd8, 0xe3, 0x14, 0xdc, 0x1d, 0x16, 0x88, 0x9a, 0x33, 0x32, 0x24, + 0xc3, 0x9a, 0xd4, 0x54, 0x26, 0x85, 0xd7, 0xe1, 0x1d, 0x99, 0xbb, 0x23, 0xb1, 0x3b, 0x7c, 0xf2, + 0x14, 0x4b, 0x4f, 0x3f, 0x39, 0x0d, 0xbf, 0x57, 0x8e, 0x7f, 0xfe, 0x76, 0xe9, 0xe0, 0x65, 0x69, + 0xac, 0x16, 0x86, 0xa6, 0x02, 0x2f, 0x1d, 0x6d, 0xa0, 0x75, 0x52, 0xda, 0x20, 0xa5, 0x75, 0x21, + 0x83, 0x8e, 0xdd, 0x69, 0xa4, 0x88, 0x57, 0x5a, 0x13, 0x13, 0x6d, 0x2d, 0xa5, 0xc2, 0x9f, 0x76, + 0xa8, 0x02, 0x17, 0x21, 0xcc, 0x55, 0xa6, 0x5b, 0x24, 0x51, 0x87, 0xab, 0x02, 0xf6, 0x86, 0x4b, + 0xad, 0xa9, 0xa4, 0x54, 0xf8, 0xa7, 0xa5, 0x18, 0x38, 0x29, 0x20, 0x40, 0x5d, 0x85, 0xe7, 0x6a, + 0x7e, 0x82, 0x1e, 0xba, 0x82, 0x44, 0xf2, 0xd3, 0xc1, 0x0e, 0x01, 0x6d, 0x55, 0x03, 0x51, 0xa9, + 0x90, 0xd2, 0xab, 0xa0, 0x04, 0x04, 0xc9, 0x13, 0x85, 0x75, 0xde, 0xb8, 0xca, 0x1c, 0xe6, 0xf8, + 0xb0, 0xf5, 0x1c, 0xb4, 0x43, 0x9e, 0x5f, 0x1c, 0x14, 0xc3, 0x2a, 0x80, 0xc2, 0x2b, 0x00, 0x1d, + 0x55, 0xbb, 0x52, 0xd5, 0xba, 0x8a, 0x54, 0xdb, 0x9a, 0x9c, 0x4b, 0x65, 0x64, 0xe4, 0x4e, 0x2e, + 0x6c, 0x10, 0x4d, 0x56, 0x73, 0x24, 0x6c, 0xd2, 0x0e, 0x54, 0xdc, 0x48, 0xa8, 0xcf, 0x68, 0x22, + 0xaa, 0x04, 0xbc, 0x79, 0x66, 0x4e, 0x0c, 0x99, 0x6f, 0x2b, 0x08, 0x0b, 0xd5, 0x21, 0xac, 0x1f, + 0xcf, 0xb9, 0x08, 0x84, 0xbd, 0x16, 0xb6, 0xae, 0x49, 0x89, 0x4c, 0x7c, 0x01, 0x57, 0xfb, 0x9c, + 0xef, 0x9a, 0xdb, 0x8b, 0x88, 0xbc, 0x97, 0x13, 0x06, 0x24, 0xd1, 0xb8, 0xd7, 0x13, 0x07, 0x8d, + 0xa7, 0xc4, 0x96, 0x18, 0xd3, 0xda, 0xfc, 0xe8, 0x37, 0xc2, 0xd6, 0xcd, 0xca, 0xd1, 0x57, 0x0d, + 0xbe, 0xb6, 0x7c, 0xf4, 0x9b, 0x99, 0xd1, 0x67, 0x05, 0x38, 0xe7, 0x8a, 0xd2, 0xbd, 0xb0, 0x48, + 0x12, 0x8f, 0x8f, 0x63, 0x47, 0x4e, 0xe2, 0x02, 0x9d, 0x9c, 0xa8, 0x81, 0xc6, 0x1d, 0xb8, 0x0e, + 0x0b, 0x32, 0x1d, 0xea, 0x51, 0xb2, 0xd9, 0xf0, 0xb6, 0x20, 0xe9, 0xc3, 0xaf, 0x35, 0x52, 0x45, + 0x73, 0xc7, 0x4c, 0x3e, 0x74, 0x92, 0x06, 0x1a, 0x39, 0x9d, 0x12, 0x32, 0x71, 0xb6, 0xd1, 0xe0, + 0x9c, 0x4b, 0xce, 0x0c, 0x82, 0x0a, 0x51, 0xb5, 0x66, 0x4a, 0x07, 0x59, 0xa1, 0x44, 0xc0, 0x31, + 0x53, 0x34, 0x8c, 0x7b, 0xc9, 0xf9, 0xf3, 0x3a, 0x6c, 0x29, 0xea, 0xb6, 0x19, 0x33, 0x3d, 0x8f, + 0xe2, 0x5c, 0x5d, 0xb4, 0x0e, 0xbe, 0x4d, 0x38, 0x73, 0x68, 0x0e, 0x06, 0xf7, 0x9a, 0xe1, 0x3e, + 0x02, 0x22, 0x4d, 0xe3, 0x59, 0xc5, 0x68, 0x1f, 0x21, 0x42, 0xca, 0x28, 0x76, 0xe8, 0x90, 0x09, + 0x65, 0x81, 0xdc, 0xf7, 0x63, 0x5d, 0x43, 0x59, 0x4e, 0x64, 0x36, 0x31, 0xea, 0xf8, 0xa6, 0x27, + 0xb3, 0xee, 0x15, 0x72, 0xe1, 0x9b, 0xac, 0x51, 0xf0, 0xcb, 0xc0, 0x79, 0x93, 0x10, 0x59, 0x53, + 0x6c, 0x1b, 0x16, 0x7c, 0x51, 0x9a, 0xdf, 0xce, 0x8e, 0xc8, 0x7a, 0x7b, 0xc6, 0x30, 0x35, 0xb7, + 0x5f, 0xbc, 0x72, 0xd4, 0x48, 0xba, 0xa1, 0x10, 0xd6, 0x5e, 0xe2, 0x90, 0x18, 0x76, 0xa0, 0x0b, + 0x67, 0xc6, 0x70, 0x9f, 0x99, 0x11, 0xef, 0x32, 0x1d, 0x1f, 0xf4, 0xca, 0xec, 0x63, 0x42, 0xc7, + 0x5b, 0x69, 0x88, 0x44, 0xc5, 0xe1, 0x2d, 0xa7, 0xe5, 0xae, 0x72, 0x01, 0xd1, 0x50, 0xd1, 0xd1, + 0x05, 0xd6, 0x0d, 0xd3, 0x1a, 0x2c, 0xd1, 0xc0, 0xd3, 0xa8, 0x7d, 0x89, 0x50, 0xe6, 0xf7, 0xc1, + 0x5f, 0xd3, 0x03, 0x57, 0x43, 0x6f, 0x14, 0x62, 0x8f, 0x54, 0xb1, 0xf6, 0x8a, 0x2e, 0x22, 0x5e, + 0xda, 0x46, 0x4f, 0x9d, 0x28, 0x0e, 0x6e, 0xa6, 0xb4, 0xc7, 0xf5, 0xec, 0x53, 0xc7, 0x9c, 0x1b, + 0xe0, 0xed, 0xf8, 0xb5, 0x59, 0xfc, 0x6b, 0x73, 0x03, 0x44, 0xf3, 0xf1, 0x7d, 0xf8, 0xa7, 0x62, + 0xc3, 0x5a, 0x56, 0x27, 0xb3, 0x35, 0x19, 0x11, 0x0c, 0xd2, 0x87, 0xbc, 0x5e, 0xd8, 0xba, 0xe2, + 0x17, 0xb0, 0x1a, 0x28, 0x72, 0x96, 0x77, 0xe0, 0xbe, 0x2f, 0x15, 0xad, 0xbb, 0x46, 0xb4, 0x91, + 0x87, 0xe7, 0x71, 0xfd, 0x52, 0x3a, 0xdd, 0xb6, 0x82, 0x4e, 0xbf, 0x21, 0x37, 0xdd, 0x6e, 0x7a, + 0x48, 0xbd, 0x07, 0x1f, 0x62, 0xfd, 0x6e, 0x1a, 0xab, 0x67, 0x29, 0x16, 0x0e, 0x43, 0x34, 0x3c, + 0x29, 0x27, 0xa7, 0x61, 0xe2, 0x35, 0xd2, 0x5d, 0xd0, 0x51, 0xfa, 0xac, 0x56, 0xd9, 0x39, 0xac, + 0xc9, 0x5d, 0x96, 0x48, 0xb0, 0x90, 0x4d, 0x17, 0xfe, 0x6e, 0xd8, 0x86, 0xf3, 0x00, 0xd9, 0x0b, + 0xb5, 0x7b, 0xe9, 0x4a, 0x03, 0xc2, 0xa9, 0xcd, 0xb4, 0x01, 0x0c, 0x00, 0xa5, 0x53, 0x77, 0x35, + 0x3b, 0x03, 0xf9, 0x91, 0x04, 0xbe, 0x61, 0xb1, 0xdc, 0xae, 0x26, 0x42, 0x89, 0x41, 0x4e, 0xf4, + 0xd5, 0x34, 0x9c, 0x81, 0xe1, 0x73, 0x17, 0x84, 0xc4, 0x56, 0xd9, 0x3d, 0x93, 0x37, 0x7f, 0x84, + 0x61, 0x57, 0xd3, 0xb3, 0x7a, 0x41, 0x2c, 0x30, 0x4e, 0xdf, 0x1b, 0xf0, 0x84, 0xb5, 0x02, 0xe4, + 0xc0, 0x80, 0xb4, 0x0d, 0x82, 0xe4, 0x73, 0xdc, 0xbf, 0xd6, 0xd7, 0xf1, 0x92, 0xa4, 0xae, 0xc9, + 0xc9, 0xf1, 0xf9, 0x05, 0x61, 0x32, 0x02, 0x11, 0xad, 0x4b, 0xd8, 0x7c, 0x68, 0x99, 0xaa, 0x2e, + 0xa4, 0xef, 0x7d, 0xd7, 0x49, 0xfb, 0x81, 0x11, 0xd0, 0xbf, 0x04, 0x92, 0x32, 0xc9, 0xba, 0xc0, + 0x9e, 0xd6, 0x1c, 0x53, 0x5f, 0xff, 0x6b, 0x9d, 0xa4, 0xea, 0x44, 0xa8, 0xf2, 0xc0, 0x31, 0x75, + 0x01, 0x63, 0x96, 0x88, 0xd1, 0xeb, 0x81, 0x0b, 0x67, 0xbb, 0xad, 0xac, 0xb3, 0xb0, 0x5e, 0x06, + 0x4b, 0x87, 0x04, 0xa0, 0x63, 0xf0, 0x41, 0x85, 0x8f, 0x97, 0x0e, 0x88, 0x9f, 0x07, 0xd0, 0x2d, + 0x02, 0x71, 0x28, 0x31, 0x5d, 0x67, 0x1d, 0x5c, 0xbd, 0x6d, 0xc3, 0x84, 0x31, 0x47, 0x00, 0x39, + 0xa0, 0x24, 0xe8, 0x50, 0x9f, 0x12, 0x93, 0xb6, 0x60, 0x8a, 0x98, 0xc4, 0x72, 0x10, 0xd0, 0x23, + 0x3c, 0x0c, 0x82, 0xc5, 0xa1, 0xc9, 0x4a, 0x40, 0x6e, 0x8b, 0x37, 0xc3, 0x08, 0x2d, 0xab, 0xdd, + 0xe7, 0x9b, 0xbc, 0xf2, 0xc8, 0xe8, 0xda, 0x7f, 0x39, 0x1f, 0x53, 0x04, 0x4f, 0xa1, 0x60, 0x19, + 0xb1, 0x44, 0x70, 0x40, 0xc3, 0x31, 0xff, 0xc6, 0xcd, 0xfb, 0xbf, 0x1c, 0x42, 0x3e, 0x72, 0x44, + 0xd4, 0x2f, 0xe1, 0x1d, 0x21, 0x82, 0xd4, 0x31, 0x38, 0xc7, 0xfc, 0x9e, 0x90, 0x96, 0x67, 0xc1, + 0x94, 0xb0, 0x47, 0x7f, 0xb3, 0xc4, 0x25, 0x02, 0xd0, 0xa6, 0x00, 0x7d, 0x96, 0xab, 0xfe, 0x0d, + 0x39, 0x40, 0xf4, 0x30, 0x33, 0x7d, 0x18, 0x8d, 0xe7, 0x3a, 0x25, 0xb2, 0x15, 0x35, 0x4e, 0x86, + 0xc9, 0x82, 0xec, 0xe6, 0x01, 0x5b, 0xad, 0x19, 0xc8, 0x15, 0x9a, 0xe9, 0x18, 0x4c, 0xf2, 0x31, + 0xb5, 0x30, 0xad, 0xfc, 0xb5, 0xfe, 0x2c, 0x80, 0xa8, 0x4b, 0x2d, 0xc3, 0xf6, 0xe9, 0xf8, 0x8d, + 0x7a, 0x01, 0x64, 0x55, 0x3e, 0xfa, 0x01, 0x88, 0xdd, 0x72, 0xda, 0xba, 0x30, 0xa5, 0x33, 0x9c, + 0xab, 0xe7, 0x81, 0x87, 0xa5, 0x40, 0x6e, 0x2d, 0x7c, 0x8c, 0xc0, 0xeb, 0x53, 0x09, 0x4b, 0x48, + 0x42, 0x69, 0x7d, 0x16, 0x8c, 0x09, 0x70, 0x5d, 0x02, 0x5f, 0xd2, 0x16, 0x4a, 0xcf, 0x82, 0x65, + 0x2e, 0x83, 0xd0, 0x10, 0x02, 0xfa, 0xde, 0xce, 0x3d, 0x42, 0xbe, 0x84, 0xbb, 0xf1, 0x58, 0x28, + 0xa3, 0x8d, 0x1a, 0xcd, 0x66, 0x14, 0xd2, 0xe2, 0x9e, 0x59, 0x2d, 0x5b, 0x2d, 0x2a, 0x82, 0xc4, + 0x5b, 0x31, 0xff, 0x9b, 0x3c, 0x29, 0x14, 0x04, 0x89, 0x67, 0x3c, 0x6e, 0xbb, 0x6d, 0xd3, 0xe3, + 0x56, 0x8b, 0x27, 0x03, 0x12, 0x24, 0x03, 0x95, 0x9c, 0x94, 0x8b, 0x4e, 0x9c, 0xe0, 0x09, 0x95, + 0xe9, 0x6d, 0x41, 0x52, 0x0b, 0x75, 0x75, 0x06, 0x60, 0x0e, 0x02, 0x31, 0x1c, 0x02, 0x58, 0xae, + 0x92, 0x91, 0x32, 0xe1, 0xb9, 0x16, 0x3c, 0x5d, 0x13, 0xbb, 0x2d, 0x48, 0x1b, 0xb1, 0x3b, 0x55, + 0x99, 0x7f, 0xaa, 0xe6, 0x7e, 0xcc, 0xd2, 0xe6, 0xfc, 0x41, 0xd2, 0xd4, 0x39, 0xda, 0xd4, 0x39, + 0xe2, 0xd4, 0x59, 0xea, 0x34, 0x65, 0xe1, 0x31, 0x92, 0x87, 0x81, 0x32, 0x73, 0x0d, 0xaf, 0x7b, + 0x8e, 0x56, 0xdf, 0xe1, 0x73, 0x0e, 0x9c, 0x1f, 0x73, 0x95, 0x67, 0x7b, 0xdb, 0xac, 0x1e, 0xe6, + 0x27, 0xa8, 0xf8, 0x8c, 0x06, 0x5a, 0xf1, 0x3c, 0x63, 0xa4, 0xdf, 0xde, 0x49, 0x91, 0xaf, 0xd7, + 0x17, 0x8d, 0x28, 0x69, 0xba, 0xcd, 0x3e, 0x4e, 0x7d, 0x19, 0xd0, 0xd4, 0x6c, 0x8a, 0x97, 0xdb, + 0xa3, 0x7d, 0x33, 0xb1, 0x58, 0xcf, 0x14, 0x65, 0x16, 0x88, 0x26, 0x17, 0x4c, 0x6c, 0x35, 0x8e, + 0xd9, 0x6c, 0x7a, 0x15, 0x02, 0x2d, 0x74, 0x48, 0x81, 0xbe, 0x12, 0x51, 0xb4, 0x90, 0x8b, 0x92, + 0xbd, 0x1a, 0x68, 0xa1, 0xa6, 0x18, 0x0e, 0x58, 0xb6, 0x69, 0x40, 0x1c, 0xfd, 0x83, 0x2a, 0x99, + 0x7a, 0x4a, 0x95, 0x8c, 0xd5, 0x18, 0xe6, 0xf6, 0x7b, 0xc4, 0xb2, 0xa9, 0x1b, 0x72, 0x54, 0x4b, + 0xdf, 0xc7, 0x23, 0xbb, 0x21, 0xa9, 0x2e, 0xb4, 0xf3, 0x62, 0xb6, 0x7f, 0x6b, 0xde, 0x85, 0xc3, + 0xbc, 0x80, 0x78, 0x61, 0x4f, 0x4f, 0x94, 0x56, 0xa1, 0xf6, 0xde, 0x89, 0x7a, 0xd9, 0x86, 0xca, + 0x32, 0xec, 0x28, 0x04, 0x4b, 0xff, 0xa0, 0x94, 0xd9, 0xee, 0x88, 0xbe, 0x64, 0x94, 0x4f, 0x9f, + 0x12, 0x00, 0xa0, 0x8a, 0x2f, 0x49, 0x68, 0xc9, 0x76, 0xc4, 0xaa, 0xc1, 0xfa, 0x6c, 0xb0, 0x70, + 0x37, 0x60, 0xd9, 0x78, 0x5f, 0x00, 0x42, 0x2d, 0x45, 0xbb, 0x17, 0x2b, 0x28, 0x02, 0xbd, 0x29, + 0x22, 0xc3, 0xd7, 0xd5, 0x05, 0x58, 0xeb, 0xf0, 0x03, 0x1c, 0x23, 0x2c, 0x7b, 0x3e, 0x7e, 0x96, + 0xad, 0x5f, 0xbf, 0x12, 0x70, 0x7f, 0xcb, 0xee, 0xef, 0x04, 0x0e, 0xda, 0x41, 0x65, 0x9f, 0x03, + 0x28, 0xf3, 0x5d, 0xa3, 0x29, 0x3b, 0x4d, 0x58, 0xd0, 0x02, 0x1a, 0x72, 0x04, 0xb2, 0xe3, 0x0b, + 0xb6, 0x28, 0xed, 0xeb, 0x23, 0x64, 0x95, 0x79, 0xe8, 0x47, 0x78, 0xa0, 0xa1, 0xa9, 0xd5, 0x74, + 0x48, 0x01, 0x08, 0x8b, 0x68, 0xcb, 0x35, 0x19, 0xc3, 0x5f, 0x2a, 0xd5, 0x64, 0xd7, 0xb1, 0x5d, + 0xc3, 0xd4, 0xa3, 0xe9, 0x97, 0x10, 0x9f, 0x71, 0x44, 0xba, 0x5a, 0x64, 0xcc, 0xe3, 0x9c, 0x18, + 0x41, 0x07, 0xec, 0x11, 0x9e, 0x55, 0x02, 0xb0, 0x7b, 0x08, 0xaa, 0x68, 0x02, 0x63, 0x30, 0x9b, + 0x89, 0x6f, 0x75, 0x5f, 0x96, 0x7f, 0x86, 0x76, 0xfc, 0x92, 0x5e, 0x78, 0xaa, 0x18, 0x19, 0x7c, + 0x82, 0x7e, 0xd0, 0x63, 0x1e, 0xfb, 0xd7, 0x2f, 0x73, 0x53, 0xfd, 0xf5, 0xcb, 0xd8, 0x54, 0x45, + 0x90, 0xa8, 0xa9, 0xd7, 0x64, 0x96, 0x59, 0x01, 0xbe, 0x9a, 0xcc, 0x4b, 0x1e, 0xa2, 0x34, 0xe2, + 0x6d, 0xba, 0x09, 0x57, 0xbc, 0x4d, 0x37, 0x50, 0x84, 0x10, 0xbb, 0x7f, 0x67, 0x69, 0x18, 0x11, + 0x92, 0x66, 0x52, 0x90, 0x48, 0x9d, 0xd7, 0x48, 0xe0, 0xd6, 0x48, 0x0a, 0x24, 0xd1, 0x35, 0x1e, + 0x28, 0xf1, 0xfb, 0x1e, 0x06, 0x08, 0x96, 0x8f, 0x3b, 0xf6, 0xb8, 0x8a, 0xf3, 0x28, 0x00, 0xac, + 0x3e, 0xdc, 0xc2, 0xe7, 0x3b, 0xe3, 0x22, 0x66, 0x01, 0x82, 0xb4, 0x2f, 0x9b, 0x5e, 0x98, 0x29, + 0x24, 0x6a, 0x12, 0x78, 0x50, 0xc9, 0x94, 0x0c, 0x91, 0xa9, 0x6a, 0xa0, 0xef, 0x23, 0x6b, 0xec, + 0xd9, 0x0e, 0xa4, 0x1a, 0x89, 0xe8, 0xa9, 0x8c, 0x89, 0x87, 0xd4, 0x03, 0x6f, 0xc6, 0x14, 0xbc, + 0xad, 0xab, 0x65, 0xb6, 0xfd, 0xac, 0xeb, 0x1e, 0xb0, 0xb4, 0xad, 0x83, 0x8d, 0xc0, 0xe4, 0x4d, + 0x20, 0x8e, 0x96, 0xae, 0x94, 0x5b, 0x9b, 0x03, 0xd9, 0xa6, 0x4e, 0x3b, 0xe8, 0x94, 0x5b, 0x49, + 0x3d, 0x2b, 0x3e, 0xe3, 0x83, 0x23, 0x7d, 0x70, 0xdb, 0xba, 0x93, 0x8e, 0xf1, 0x2b, 0xa9, 0xde, + 0x49, 0x5f, 0xd9, 0x85, 0x76, 0x27, 0x35, 0xd8, 0x45, 0x86, 0xa3, 0xa6, 0x7a, 0x2b, 0x9d, 0x95, + 0x02, 0xfd, 0x10, 0x34, 0x26, 0xb7, 0x6c, 0x17, 0xb0, 0xd2, 0xb4, 0x89, 0x8e, 0x87, 0x96, 0xad, + 0x56, 0x22, 0xda, 0x7b, 0x87, 0x81, 0xc5, 0x32, 0x85, 0xd5, 0x1d, 0x62, 0xa6, 0x44, 0x22, 0x48, + 0x6e, 0x8b, 0xff, 0xd1, 0x74, 0x24, 0x03, 0xdb, 0x9e, 0x6d, 0x3d, 0xf8, 0x6c, 0x26, 0x13, 0x66, + 0x4a, 0x4d, 0x25, 0xec, 0x14, 0x5c, 0x8b, 0xe2, 0xb8, 0x27, 0xf7, 0xfa, 0x7e, 0x27, 0x71, 0x7b, + 0x24, 0x1d, 0x4b, 0x5f, 0xa5, 0x86, 0x64, 0x4b, 0x54, 0x0a, 0xee, 0xb0, 0xdd, 0x77, 0xbd, 0x20, + 0x91, 0x80, 0x3b, 0x51, 0xdf, 0xa2, 0xb7, 0xb9, 0xbb, 0x54, 0x00, 0x1f, 0xdc, 0x92, 0x0f, 0xf5, + 0x5b, 0x59, 0x96, 0x7b, 0x77, 0xe5, 0xc3, 0x39, 0xa8, 0x2c, 0x42, 0x65, 0x43, 0xa8, 0x47, 0x9c, + 0x15, 0x43, 0x74, 0x6e, 0x67, 0xfa, 0x61, 0xc8, 0xb8, 0x54, 0xd1, 0x15, 0xe9, 0x02, 0x05, 0x86, + 0x82, 0xe1, 0x9c, 0x29, 0x65, 0xba, 0x79, 0x56, 0xa6, 0xc9, 0x24, 0x37, 0x5a, 0x60, 0xf2, 0x96, + 0xde, 0x81, 0xfd, 0x05, 0xb7, 0xca, 0x1d, 0x58, 0x43, 0x70, 0x0b, 0x52, 0x71, 0xe1, 0x0b, 0x64, + 0xe2, 0xc1, 0x57, 0xe6, 0x4e, 0x0a, 0x27, 0x5d, 0x4a, 0x45, 0xde, 0xfb, 0x22, 0x7c, 0x0c, 0x37, + 0x15, 0x90, 0xf8, 0x50, 0xa7, 0xa2, 0x04, 0xc8, 0x52, 0x6a, 0x0c, 0x15, 0x08, 0xb5, 0x8c, 0xa8, + 0x74, 0xdd, 0xfc, 0xf4, 0x09, 0x91, 0xc1, 0x9c, 0xc6, 0x0b, 0x0d, 0x2e, 0x5c, 0x98, 0xa7, 0x30, + 0x81, 0x92, 0x2a, 0xa0, 0x1c, 0xea, 0x3a, 0x4c, 0x6d, 0xe7, 0x8b, 0x00, 0x52, 0x7c, 0xfc, 0x42, + 0xc1, 0xaa, 0x84, 0x92, 0x20, 0x94, 0x86, 0x78, 0x91, 0x6c, 0xe2, 0xa7, 0x38, 0x66, 0xa2, 0x9d, + 0x74, 0x48, 0xaa, 0xba, 0xde, 0x7c, 0xb9, 0x0b, 0x13, 0x3c, 0x7b, 0x0c, 0xe4, 0x3d, 0x22, 0x79, + 0x40, 0x23, 0x90, 0xce, 0xb4, 0xe6, 0x6d, 0x6a, 0xb9, 0x1c, 0xb4, 0x77, 0xd0, 0x9b, 0x48, 0xcd, + 0xad, 0x29, 0xd9, 0x26, 0xc3, 0x60, 0xb0, 0x4f, 0x17, 0x41, 0x2d, 0xf1, 0x99, 0x39, 0xe2, 0x5b, + 0x0a, 0x1a, 0x72, 0xee, 0xf4, 0x5b, 0x30, 0x3f, 0xc9, 0x05, 0xc6, 0x40, 0x12, 0xc9, 0xb0, 0x51, + 0xee, 0x1a, 0xbd, 0x04, 0x05, 0x35, 0xc8, 0x81, 0xcb, 0x97, 0xb1, 0x84, 0x9a, 0x17, 0xe5, 0x9e, + 0x61, 0xb2, 0x45, 0x35, 0xa1, 0x49, 0x82, 0x22, 0x88, 0xa2, 0x7c, 0xef, 0x5a, 0x4e, 0x42, 0x00, + 0x6e, 0x1e, 0xf5, 0xc7, 0x64, 0x37, 0xd9, 0x4e, 0x06, 0x49, 0x7f, 0xba, 0x1a, 0x4f, 0x9b, 0x2a, + 0x49, 0x5d, 0x95, 0x2a, 0xff, 0xb1, 0xc1, 0x80, 0x7e, 0xfd, 0xa2, 0xba, 0x0e, 0x62, 0xfd, 0x92, + 0xb8, 0xe0, 0xf6, 0xf2, 0x28, 0x4a, 0xa8, 0x5e, 0xb1, 0xf4, 0x98, 0xd4, 0x81, 0x48, 0xa6, 0xe6, + 0xf1, 0x18, 0x9b, 0xe6, 0x14, 0x7b, 0x11, 0x59, 0x7c, 0x4c, 0xbf, 0xff, 0x47, 0x17, 0xfc, 0xe4, + 0x05, 0xd8, 0x5d, 0x72, 0x3e, 0xdc, 0x2c, 0x4f, 0x82, 0x16, 0xce, 0x79, 0xc0, 0x8d, 0xdb, 0xd6, + 0x27, 0x09, 0xd2, 0xea, 0x81, 0xa3, 0x8d, 0x86, 0x68, 0xc8, 0x28, 0x63, 0x02, 0xf1, 0x86, 0xe9, + 0x51, 0x99, 0x6e, 0xa1, 0xe1, 0xa2, 0x14, 0xff, 0x72, 0x04, 0xa9, 0x0b, 0xdf, 0xe4, 0xd3, 0x27, + 0x02, 0xfe, 0x17, 0x9a, 0x02, 0xbc, 0xb7, 0xc7, 0x4d, 0x3d, 0x4c, 0x8a, 0x56, 0x0f, 0xc4, 0xf6, + 0xe6, 0xa2, 0x51, 0x78, 0x8e, 0xf2, 0x12, 0x30, 0xdb, 0xe0, 0x99, 0x01, 0xd7, 0x5e, 0x02, 0xbf, + 0x9c, 0x47, 0x9e, 0x01, 0x1b, 0x09, 0x2f, 0xde, 0xcc, 0x3b, 0xcb, 0x49, 0xa4, 0x40, 0x8e, 0x1f, + 0x52, 0x81, 0x09, 0xf8, 0xe5, 0xb1, 0xc4, 0xcf, 0x9c, 0xe0, 0x75, 0xb7, 0x84, 0x87, 0x4b, 0xf0, + 0xaa, 0x59, 0x12, 0x6a, 0x67, 0x67, 0xc7, 0x67, 0x1f, 0xd2, 0x0e, 0xcc, 0x00, 0x70, 0xe9, 0xe0, + 0xc5, 0x0d, 0x07, 0xb2, 0xa9, 0x07, 0xc7, 0x1d, 0x3a, 0xe1, 0xa9, 0x0f, 0x59, 0x98, 0x98, 0x6d, + 0x52, 0x5f, 0xd0, 0x1b, 0x6a, 0xe9, 0x61, 0xf5, 0xda, 0x14, 0x2b, 0xde, 0x88, 0xd2, 0xce, 0xdb, + 0xe0, 0xca, 0x1d, 0xd0, 0xd5, 0x79, 0x92, 0xad, 0x3f, 0x9b, 0x8d, 0xad, 0xef, 0x95, 0xb3, 0xa3, + 0xfd, 0xa3, 0xbd, 0x0f, 0x9b, 0xe9, 0xc6, 0x16, 0xb9, 0x98, 0x9c, 0x27, 0x6e, 0x8e, 0x08, 0x82, + 0x43, 0x56, 0x1a, 0xb0, 0xe0, 0x03, 0xd3, 0x52, 0x86, 0x45, 0x9e, 0x05, 0x4a, 0x18, 0x76, 0xaf, + 0x63, 0x88, 0x90, 0xc8, 0xfa, 0xa4, 0x41, 0x29, 0x00, 0xb5, 0x1d, 0xd7, 0xa3, 0x26, 0x80, 0xb9, + 0x84, 0x3a, 0x6c, 0xf9, 0xc2, 0xbc, 0x17, 0xf7, 0x92, 0x20, 0xcf, 0x25, 0x10, 0xe2, 0xf4, 0xed, + 0x80, 0xa7, 0xc2, 0xd4, 0xb7, 0xf0, 0x35, 0xe4, 0x3e, 0xb8, 0x23, 0x58, 0xfa, 0x47, 0xe1, 0x29, + 0x74, 0xbe, 0x6f, 0x3e, 0x49, 0x83, 0xf9, 0xa0, 0x6c, 0x79, 0x13, 0xa5, 0x07, 0xd9, 0x72, 0x1c, + 0xea, 0xd5, 0x2f, 0x0e, 0x0f, 0xf4, 0x73, 0x69, 0x47, 0x66, 0x75, 0x05, 0x39, 0x2c, 0x2b, 0xe8, + 0x02, 0x2b, 0x1f, 0x0a, 0x12, 0xae, 0x81, 0xdb, 0xee, 0x23, 0x84, 0xeb, 0x3d, 0xb6, 0xc2, 0x8d, + 0xc7, 0xbf, 0x13, 0xfc, 0x4f, 0xb1, 0x04, 0xb0, 0x9c, 0x38, 0x7c, 0xa1, 0x73, 0x57, 0xcb, 0x38, + 0x5e, 0xa7, 0xc0, 0xc8, 0xc3, 0x5d, 0x08, 0x7b, 0xca, 0x43, 0xcb, 0x31, 0xdd, 0x61, 0xc8, 0x03, + 0x5b, 0xec, 0x37, 0xe3, 0x4d, 0x2c, 0x1a, 0xf8, 0xe2, 0x86, 0xe1, 0x42, 0x6c, 0x95, 0x94, 0x37, + 0x8a, 0x9f, 0x17, 0xfb, 0x8a, 0xa5, 0x37, 0x80, 0x32, 0x9c, 0x62, 0x18, 0xa2, 0xc6, 0xe0, 0xc2, + 0xae, 0x69, 0x2a, 0x96, 0xdd, 0x28, 0x2a, 0xb1, 0x3e, 0x3b, 0x49, 0x55, 0x99, 0xf8, 0x3e, 0x17, + 0x7c, 0x9f, 0xbb, 0xe9, 0x94, 0x5d, 0x70, 0x7a, 0x51, 0x9b, 0x03, 0x6d, 0xce, 0x26, 0x2d, 0x3b, + 0x91, 0x23, 0x84, 0xe5, 0xf8, 0xd6, 0xfd, 0x4c, 0x93, 0x0e, 0xae, 0x6b, 0x82, 0xd7, 0x6e, 0x24, + 0x84, 0xa4, 0x0d, 0x0b, 0x15, 0xc6, 0x33, 0x78, 0xa5, 0x4e, 0xae, 0x34, 0xb8, 0x12, 0x21, 0xb1, + 0xd5, 0x13, 0xf8, 0x5c, 0xc2, 0x47, 0x12, 0xb6, 0xc2, 0x07, 0x2c, 0xb6, 0x18, 0x7e, 0x62, 0x6f, + 0x3c, 0xeb, 0x1e, 0xfe, 0x89, 0x42, 0xd9, 0x94, 0x31, 0x90, 0x3b, 0x67, 0xd5, 0x23, 0x4f, 0xe2, + 0x77, 0x67, 0x60, 0x8f, 0x09, 0xe7, 0xb3, 0x25, 0xb9, 0xf0, 0x07, 0xff, 0x40, 0xd6, 0x32, 0xd6, + 0xb6, 0x1e, 0x28, 0x87, 0x13, 0x3e, 0x16, 0xd9, 0x7f, 0x60, 0x07, 0x32, 0xd6, 0x40, 0x98, 0x04, + 0x60, 0x11, 0x88, 0xa0, 0x96, 0xf5, 0xc7, 0x37, 0x11, 0x74, 0x01, 0x5f, 0x98, 0x21, 0xec, 0x2d, + 0x05, 0x41, 0x8a, 0x8f, 0xdc, 0x84, 0x3b, 0xd4, 0x62, 0x05, 0x8b, 0xe4, 0xba, 0x10, 0x56, 0xc9, + 0xc3, 0xc6, 0x6d, 0x03, 0xe2, 0x73, 0x18, 0x46, 0x17, 0xc2, 0xbd, 0x95, 0xb0, 0x2b, 0xa6, 0xee, + 0x09, 0x03, 0xd6, 0x58, 0x18, 0x2a, 0x69, 0xa5, 0x35, 0x1c, 0x0e, 0xbf, 0xc1, 0x1a, 0x67, 0x4d, + 0x6c, 0x72, 0xa6, 0x3f, 0x11, 0x2e, 0x8f, 0xf1, 0x6c, 0x6d, 0x2e, 0xaa, 0x36, 0xad, 0x01, 0x98, + 0x51, 0x20, 0xb3, 0x62, 0x24, 0x86, 0xf6, 0xe0, 0x8b, 0x58, 0x19, 0xed, 0xc0, 0xf2, 0x03, 0x19, + 0x32, 0x88, 0x04, 0x6b, 0xe6, 0xef, 0x37, 0x81, 0x15, 0x06, 0xe1, 0x0c, 0x69, 0xfa, 0x3e, 0xd2, + 0x83, 0x2b, 0x1b, 0x1f, 0x82, 0x72, 0x5b, 0x68, 0x52, 0xcb, 0x4e, 0x2c, 0x98, 0x4b, 0x5a, 0x53, + 0xc4, 0xcf, 0xcb, 0x9f, 0x73, 0xcb, 0x43, 0x80, 0xf2, 0x52, 0x93, 0x88, 0xb0, 0xbf, 0xcc, 0x00, + 0x9d, 0x27, 0xba, 0xe1, 0x3e, 0x02, 0xb5, 0x34, 0xa4, 0x76, 0xfa, 0x9a, 0x03, 0xaf, 0x7d, 0xc0, + 0x3c, 0x3a, 0x33, 0x80, 0x86, 0x2e, 0xbb, 0x4d, 0x20, 0x5b, 0xf8, 0xca, 0x28, 0x3c, 0xee, 0x58, + 0xb6, 0x09, 0x39, 0xf9, 0x38, 0xe2, 0xf3, 0x89, 0xe5, 0x48, 0x18, 0xad, 0x4d, 0x08, 0xc0, 0x83, + 0xd4, 0x33, 0xe0, 0x81, 0x38, 0x8e, 0x27, 0xf8, 0x33, 0x98, 0xc3, 0xb5, 0x5d, 0x60, 0x6f, 0x5f, + 0xcc, 0x47, 0x01, 0x19, 0xb6, 0xfc, 0x07, 0xc9, 0xf8, 0x34, 0xd2, 0x72, 0x79, 0x2e, 0x29, 0x8f, + 0xa1, 0x49, 0x88, 0x22, 0x0b, 0x98, 0x3c, 0x88, 0xc9, 0x3d, 0x87, 0x00, 0xac, 0xa0, 0xc8, 0x4a, + 0x0e, 0xcc, 0x3e, 0x18, 0x87, 0x62, 0x9c, 0xd5, 0xb9, 0x3e, 0x7b, 0xfb, 0x0e, 0x3f, 0xf5, 0xd6, + 0x35, 0x4b, 0x07, 0x9f, 0xc8, 0x6b, 0x85, 0x78, 0x36, 0x81, 0x39, 0x02, 0x93, 0x0e, 0x0e, 0x5d, + 0x93, 0x42, 0x26, 0x17, 0x5a, 0x03, 0xf4, 0x38, 0x31, 0x3c, 0xa3, 0xeb, 0xb3, 0xb4, 0xec, 0xf2, + 0xec, 0xe0, 0x9c, 0x1a, 0x5e, 0xb3, 0xc3, 0xdb, 0x22, 0xfd, 0x4f, 0xf0, 0xf8, 0xec, 0xa1, 0x58, + 0x9e, 0xf4, 0x92, 0xc1, 0xf9, 0x83, 0x6a, 0x29, 0xa8, 0x16, 0x93, 0xa0, 0x08, 0x3b, 0x84, 0x83, + 0xe1, 0xf5, 0x17, 0x1c, 0xc6, 0x05, 0xfd, 0xd8, 0x6e, 0x3b, 0x21, 0xec, 0xd0, 0x01, 0xb5, 0xdd, + 0x1e, 0xf5, 0x48, 0x17, 0x0f, 0x3f, 0xf2, 0xd7, 0x5e, 0x64, 0x52, 0x7b, 0x84, 0x26, 0x0b, 0xf9, + 0x30, 0x6c, 0x58, 0x26, 0x4d, 0x58, 0x27, 0x7d, 0x7e, 0x04, 0x20, 0x52, 0x97, 0x1f, 0xc1, 0x42, + 0xc8, 0x16, 0xc7, 0xb8, 0x3e, 0x87, 0xd1, 0x72, 0x22, 0x9c, 0x15, 0xa6, 0x77, 0x22, 0x7c, 0x41, + 0xe2, 0x70, 0xab, 0x0d, 0x97, 0x20, 0xe0, 0x4f, 0x5e, 0x9f, 0xd2, 0x96, 0x58, 0x5d, 0xb3, 0x58, + 0x28, 0xe4, 0x8b, 0x0b, 0x2b, 0x4e, 0xac, 0xa2, 0x2f, 0xad, 0x44, 0xc4, 0xf6, 0x0d, 0x16, 0xfa, + 0xe2, 0x06, 0x82, 0x58, 0xfa, 0x47, 0xc3, 0xb3, 0x42, 0xfa, 0x7b, 0xc7, 0x65, 0x9d, 0xc2, 0x6c, + 0x7e, 0x69, 0x2d, 0x0b, 0xbc, 0x84, 0xe1, 0x8f, 0x9c, 0xe6, 0x44, 0xf0, 0xa4, 0x07, 0xa6, 0xc3, + 0x2a, 0x61, 0x3e, 0xcc, 0x91, 0xc9, 0xac, 0xc0, 0x9a, 0xf4, 0x04, 0x83, 0x18, 0x78, 0xa3, 0xe7, + 0xb8, 0x56, 0x20, 0x4d, 0x98, 0xb9, 0x0d, 0x63, 0x68, 0x71, 0x52, 0x92, 0x32, 0x86, 0x86, 0x15, + 0x90, 0x16, 0x85, 0xb4, 0x36, 0x11, 0x95, 0x7d, 0x85, 0xb7, 0xc7, 0x62, 0xf1, 0x82, 0xbd, 0x20, + 0x3d, 0x77, 0x69, 0xd0, 0x71, 0xcd, 0x92, 0x80, 0x55, 0x64, 0x41, 0xc2, 0x97, 0x29, 0xa8, 0xe7, + 0x97, 0x9e, 0x67, 0x4a, 0xc3, 0x90, 0xd8, 0x2c, 0xd4, 0x86, 0xc7, 0x12, 0x7a, 0x88, 0x12, 0x1d, + 0x8b, 0x92, 0x13, 0x92, 0x14, 0xc8, 0xf8, 0x24, 0xc1, 0x29, 0x8d, 0xe8, 0x77, 0xc4, 0x71, 0x13, + 0x33, 0x70, 0x2c, 0x01, 0x46, 0xed, 0xd4, 0xf3, 0x30, 0x87, 0x05, 0x97, 0xfe, 0x42, 0x0d, 0x29, + 0xbe, 0xa9, 0x28, 0xa2, 0xbb, 0xab, 0x0d, 0xe0, 0x29, 0xfa, 0x3e, 0x0a, 0x0e, 0x15, 0x20, 0x70, + 0x1b, 0x58, 0x90, 0x12, 0x6f, 0x2f, 0x7b, 0x44, 0x9b, 0xb2, 0x22, 0x56, 0x4e, 0x58, 0x62, 0x85, + 0x87, 0x1b, 0x2d, 0x73, 0x9b, 0x6d, 0x19, 0xee, 0x41, 0x03, 0x15, 0xc5, 0x97, 0x63, 0x41, 0xde, + 0x17, 0xb2, 0xb8, 0x65, 0x25, 0x4e, 0xe9, 0x95, 0x38, 0x72, 0xba, 0x9d, 0x27, 0xae, 0x8a, 0xc0, + 0x56, 0x66, 0x42, 0xf3, 0x1b, 0x82, 0x0b, 0x18, 0x84, 0x30, 0xcd, 0xa7, 0x2f, 0x56, 0x2d, 0x67, + 0x02, 0x5f, 0x67, 0x69, 0x2c, 0xbb, 0x8b, 0x9b, 0xe9, 0xa6, 0x4b, 0x7d, 0xe2, 0xb8, 0x01, 0xe1, + 0xbf, 0x31, 0x80, 0x2e, 0xa0, 0x01, 0x2e, 0x87, 0xb0, 0xdf, 0xbc, 0xe1, 0xb1, 0x25, 0x0b, 0x2d, + 0x71, 0x4d, 0x9d, 0x44, 0x96, 0xce, 0x64, 0xdd, 0x7c, 0x33, 0x5f, 0xaf, 0x0a, 0xe6, 0x95, 0x99, + 0x3a, 0xa9, 0xc2, 0x46, 0xa9, 0x85, 0x30, 0x33, 0x79, 0x84, 0x0b, 0xf0, 0x5b, 0x3e, 0xcb, 0x0a, + 0xc8, 0xba, 0x90, 0x04, 0xe3, 0x5f, 0xc7, 0x64, 0x82, 0x31, 0x16, 0xf2, 0xc2, 0xf7, 0x8b, 0xc3, + 0x70, 0x19, 0xf2, 0xe2, 0xb1, 0x88, 0xf3, 0x6f, 0x6e, 0x2b, 0x75, 0xb5, 0xf9, 0xb1, 0x09, 0x9f, + 0x10, 0xf5, 0xad, 0xd7, 0x8c, 0x6f, 0x42, 0x29, 0xac, 0xe2, 0xbc, 0x32, 0x09, 0x13, 0x05, 0xe7, + 0x3e, 0x9f, 0x3b, 0x8e, 0x31, 0xb0, 0xda, 0x46, 0xe0, 0x7a, 0xb0, 0xc4, 0x5b, 0xbd, 0x86, 0x6b, + 0x78, 0xa6, 0x3c, 0xf4, 0xac, 0x80, 0xb2, 0x78, 0x88, 0x72, 0xf6, 0x62, 0x53, 0x69, 0xda, 0x73, + 0x32, 0x22, 0x7d, 0xa4, 0xcd, 0x70, 0xb7, 0x26, 0xc1, 0x76, 0x83, 0x85, 0x95, 0x53, 0x4f, 0xd8, + 0x35, 0x2c, 0x2c, 0x85, 0x81, 0x5a, 0x11, 0x90, 0xe0, 0x32, 0x89, 0x7b, 0x54, 0x38, 0x25, 0x61, + 0x42, 0x2f, 0xec, 0xf4, 0xbe, 0x85, 0xff, 0x70, 0xff, 0x14, 0x32, 0x38, 0x7d, 0x7e, 0xe5, 0xeb, + 0x79, 0x6e, 0xe0, 0x42, 0x7e, 0xf2, 0xc5, 0xb0, 0x61, 0x4e, 0x27, 0x84, 0xef, 0x10, 0xe7, 0xf1, + 0xd4, 0x05, 0x8d, 0x6a, 0x00, 0xb4, 0xb0, 0xf5, 0x6a, 0xd8, 0x81, 0x3c, 0xc8, 0xa7, 0xde, 0x00, + 0x28, 0xc3, 0x77, 0x43, 0x99, 0x93, 0x24, 0x09, 0xd7, 0xe3, 0xaf, 0xde, 0x80, 0xe2, 0xbc, 0xbe, + 0x33, 0x7d, 0xe2, 0x8b, 0xb0, 0x0c, 0xc4, 0x3d, 0x2c, 0x50, 0xbe, 0xe0, 0xfb, 0xdf, 0x42, 0x39, + 0xd6, 0xd0, 0x5e, 0x27, 0x5e, 0xfc, 0xe3, 0xc4, 0x4f, 0x67, 0x2c, 0x18, 0x2e, 0x58, 0x2a, 0x66, + 0xe6, 0xcc, 0x85, 0x42, 0xd8, 0xa3, 0xff, 0x96, 0x67, 0xef, 0xf7, 0xb0, 0x12, 0x2c, 0x94, 0x51, + 0x81, 0x15, 0x1f, 0x67, 0x72, 0x22, 0x92, 0x08, 0x96, 0xf6, 0xd0, 0xba, 0xc3, 0x65, 0x04, 0x4f, + 0xdb, 0xfc, 0x80, 0xb9, 0xb5, 0xda, 0x60, 0xa7, 0xe7, 0x71, 0xb8, 0x58, 0x4f, 0xd8, 0x49, 0x19, + 0xfd, 0xc5, 0x65, 0x37, 0x3a, 0x4e, 0x23, 0x4a, 0xa1, 0xaf, 0x7d, 0x83, 0x33, 0x2e, 0x4f, 0x56, + 0x4b, 0x1c, 0x8c, 0x1d, 0xee, 0xa1, 0x18, 0x9c, 0x3e, 0x53, 0x19, 0x61, 0xa0, 0xc3, 0x0e, 0x6d, + 0x19, 0x90, 0xfc, 0x26, 0xe2, 0x74, 0xc8, 0x4c, 0x8b, 0x09, 0x71, 0x26, 0x29, 0x80, 0xd4, 0x1f, + 0x32, 0x8c, 0x15, 0x7d, 0xb1, 0x18, 0x3c, 0x1f, 0x3f, 0x63, 0x9f, 0x14, 0xea, 0x44, 0x98, 0x43, + 0x74, 0x3c, 0x58, 0x85, 0x27, 0x0e, 0xe7, 0x82, 0x73, 0x34, 0xdf, 0x36, 0x9c, 0x47, 0xbb, 0x30, + 0xce, 0xcc, 0x88, 0xe5, 0x7e, 0x0f, 0x7f, 0x3e, 0xec, 0x84, 0x0b, 0x02, 0xe6, 0x38, 0x16, 0x94, + 0x59, 0x91, 0xa0, 0x05, 0xfc, 0x21, 0xab, 0x3e, 0x24, 0x7c, 0xb1, 0x01, 0x27, 0xdc, 0xb3, 0x31, + 0xe7, 0x7b, 0xf3, 0x42, 0xd7, 0xb2, 0x7e, 0x73, 0x90, 0xd3, 0x74, 0x09, 0xa3, 0x56, 0x34, 0x92, + 0x33, 0xb6, 0xea, 0x83, 0x2f, 0x5f, 0xdc, 0x49, 0x08, 0xd5, 0xc4, 0x56, 0x3d, 0xe4, 0x02, 0xab, + 0x10, 0xab, 0xdd, 0xf1, 0xc2, 0xf9, 0xa1, 0xc5, 0x65, 0x6a, 0x2c, 0x21, 0x1a, 0x03, 0xcc, 0x13, + 0xab, 0xe9, 0x10, 0x53, 0x62, 0x1c, 0x30, 0x21, 0x75, 0xc9, 0x8a, 0xfc, 0xcc, 0x93, 0x82, 0x0f, + 0xca, 0x38, 0xb2, 0xd9, 0x25, 0x73, 0x1a, 0xc5, 0x1a, 0xa5, 0x97, 0x91, 0x1d, 0xc0, 0x7a, 0xfc, + 0x72, 0x07, 0xa6, 0x06, 0x29, 0x52, 0xf7, 0x2b, 0xe0, 0x6e, 0x4f, 0x90, 0x42, 0x8d, 0xbf, 0x08, + 0x19, 0x7a, 0x97, 0x98, 0x2d, 0xcf, 0x98, 0xed, 0x92, 0x0e, 0x1d, 0xf6, 0x0e, 0xc2, 0x14, 0xc8, + 0x7c, 0x21, 0x90, 0x58, 0x52, 0x11, 0x75, 0x1d, 0x76, 0xbe, 0x2d, 0xae, 0xb4, 0x37, 0x74, 0xe7, + 0xef, 0x29, 0x88, 0x2c, 0x15, 0x0f, 0x43, 0x3d, 0x9d, 0x99, 0x2c, 0x73, 0x25, 0x63, 0xe9, 0x3d, + 0x5b, 0x9a, 0xef, 0xa1, 0x60, 0xfe, 0x4d, 0x89, 0x95, 0x14, 0x4c, 0x37, 0x4f, 0x66, 0x36, 0x12, + 0xdf, 0xbe, 0x53, 0x2a, 0xe1, 0xc9, 0x7b, 0x74, 0xcd, 0x67, 0xee, 0xd0, 0x9f, 0x76, 0xfb, 0xd9, + 0xa7, 0xde, 0x28, 0x82, 0xaa, 0xd8, 0x76, 0x42, 0x90, 0xa3, 0x53, 0xfa, 0xa2, 0x64, 0x41, 0xc2, + 0x6a, 0x6d, 0xc6, 0x3b, 0x46, 0x15, 0x6c, 0x0b, 0x52, 0xd8, 0x78, 0xfb, 0xad, 0x75, 0x37, 0xef, + 0x4c, 0x38, 0x8e, 0xa9, 0x3b, 0x9b, 0x39, 0x8f, 0xfb, 0x8e, 0x2d, 0x39, 0x29, 0x78, 0x05, 0x8c, + 0x9f, 0x15, 0x08, 0x81, 0x1d, 0x9d, 0x2e, 0xdf, 0xc3, 0x73, 0x31, 0x26, 0x74, 0x60, 0x41, 0x8b, + 0x6d, 0xbb, 0x7d, 0x49, 0x38, 0xfa, 0xdc, 0x09, 0x09, 0x80, 0x9b, 0x3b, 0x1c, 0x21, 0xbd, 0xb8, + 0xa5, 0xb7, 0x74, 0x56, 0xf3, 0xd4, 0xa8, 0x34, 0xc1, 0xbe, 0x0c, 0xb3, 0xf3, 0x3b, 0x88, 0x79, + 0x75, 0x63, 0x91, 0x3d, 0xc9, 0x61, 0x45, 0x9a, 0xb7, 0x3d, 0x30, 0x05, 0xc9, 0x8d, 0xf9, 0x98, + 0xd8, 0xe2, 0x08, 0x6b, 0xe2, 0xb4, 0x42, 0x89, 0xde, 0x70, 0xdb, 0x76, 0x1b, 0x09, 0xdc, 0x81, + 0x7a, 0xc6, 0xfa, 0xc1, 0xb2, 0xb4, 0x67, 0x36, 0xbb, 0x99, 0x4b, 0xd6, 0x82, 0xd9, 0x5b, 0x87, + 0x6f, 0x21, 0xda, 0xdc, 0xd1, 0x82, 0x7d, 0xa2, 0xcb, 0x2b, 0xdb, 0x61, 0x59, 0x85, 0x2f, 0x99, + 0x40, 0x1b, 0x2c, 0xcc, 0xfc, 0x44, 0x0b, 0x83, 0xbb, 0x3e, 0x3c, 0xa8, 0xc3, 0xd2, 0x7f, 0x46, + 0xc1, 0x52, 0xfd, 0xa0, 0x8c, 0x5b, 0xd0, 0xd4, 0x49, 0x84, 0xf9, 0x99, 0x23, 0x61, 0x79, 0xc0, + 0x58, 0xe2, 0xa8, 0x35, 0x45, 0x41, 0x5d, 0xcb, 0x98, 0xd7, 0xf5, 0xfd, 0xd9, 0xca, 0x01, 0x0b, + 0xe9, 0x79, 0x6c, 0x80, 0xaf, 0x04, 0xf7, 0x41, 0x47, 0xbe, 0x8f, 0xef, 0x49, 0x8c, 0x3e, 0xcc, + 0x95, 0x04, 0xe2, 0xa0, 0xa4, 0xc5, 0x82, 0x44, 0x00, 0x19, 0x4b, 0xb8, 0x9b, 0x0e, 0x14, 0xdb, + 0x33, 0x35, 0x20, 0x70, 0x5f, 0xb0, 0xae, 0x84, 0x5b, 0x2b, 0xc7, 0x7c, 0xa3, 0x1c, 0x1d, 0x36, + 0xf2, 0xf2, 0x82, 0x0d, 0xcf, 0xed, 0xc8, 0xcc, 0xa4, 0x10, 0xe1, 0x16, 0x12, 0x62, 0x08, 0xeb, + 0x63, 0xd1, 0x04, 0x64, 0x65, 0xb2, 0xb9, 0x52, 0xf2, 0x5c, 0x91, 0x8c, 0xef, 0xd5, 0x0b, 0x58, + 0x99, 0xe5, 0xd9, 0x00, 0xbd, 0x75, 0xc2, 0x6d, 0x7b, 0xc9, 0x65, 0x7e, 0x86, 0xb7, 0xe0, 0xd5, + 0x5c, 0x2d, 0xcc, 0x15, 0x25, 0x14, 0x9f, 0xf3, 0xe9, 0x53, 0xc2, 0x9d, 0x1c, 0x1c, 0xc0, 0x52, + 0xcc, 0x78, 0x25, 0xc3, 0x2c, 0x7b, 0x47, 0x76, 0x23, 0x82, 0x03, 0x2c, 0x06, 0xc4, 0xab, 0x7a, + 0x01, 0xdf, 0x34, 0x7a, 0x66, 0x14, 0x94, 0x20, 0x3b, 0xc2, 0x28, 0x5b, 0x38, 0x8f, 0xde, 0x0c, + 0xc1, 0x92, 0x1b, 0x11, 0x92, 0x0e, 0x98, 0x54, 0x54, 0xf7, 0x1a, 0xcf, 0x3a, 0xb1, 0x17, 0x56, + 0x8b, 0x78, 0xda, 0x1b, 0x11, 0xc0, 0xcb, 0x6d, 0xcb, 0xbc, 0x17, 0x9d, 0xf7, 0x5e, 0x34, 0xee, + 0xbd, 0x02, 0x36, 0x41, 0x43, 0x07, 0x26, 0xe1, 0x2e, 0xcc, 0x07, 0x3d, 0xe6, 0x8a, 0x21, 0xae, + 0xe6, 0xf6, 0xc9, 0x7e, 0x89, 0x0b, 0x9a, 0xf6, 0x4d, 0x89, 0x6f, 0x39, 0x37, 0x2d, 0xaf, 0x09, + 0xd1, 0xc6, 0x4b, 0xce, 0xf5, 0x23, 0x58, 0x95, 0x1b, 0xee, 0xb8, 0xf7, 0x98, 0xc7, 0x9a, 0x3a, + 0x48, 0xce, 0x0b, 0xf3, 0x15, 0xc7, 0xad, 0x1d, 0x17, 0xa2, 0xa6, 0x67, 0xce, 0x46, 0xac, 0x50, + 0x38, 0x53, 0x24, 0xfc, 0x3c, 0x33, 0x6c, 0x54, 0x18, 0x01, 0x7f, 0x39, 0xd3, 0x8e, 0xd3, 0xd7, + 0xd1, 0x83, 0xa5, 0x5e, 0xb1, 0xbc, 0xdc, 0x69, 0x08, 0x1f, 0x1b, 0x8d, 0x62, 0xab, 0xd1, 0x14, + 0x30, 0xf7, 0x09, 0x2e, 0xac, 0x2e, 0x75, 0xfb, 0x41, 0x82, 0x25, 0x07, 0x2b, 0xbd, 0x0c, 0x0c, + 0x65, 0x78, 0xfb, 0xa1, 0x48, 0x12, 0x53, 0xd9, 0xc0, 0x2a, 0x32, 0xb9, 0xd6, 0xa1, 0xef, 0x04, + 0x64, 0x9e, 0x5d, 0x89, 0xb3, 0x35, 0x79, 0x2e, 0xc2, 0x3c, 0xcb, 0x29, 0x4a, 0x6c, 0x8a, 0xcd, + 0x03, 0x84, 0xa1, 0x10, 0x51, 0x69, 0xe6, 0x73, 0x22, 0x26, 0xa4, 0xdc, 0x7c, 0x2d, 0x55, 0x15, + 0xc7, 0xbf, 0x4d, 0x04, 0x53, 0x75, 0xf8, 0xfa, 0x12, 0xfa, 0x2b, 0x7d, 0xa9, 0xdd, 0xab, 0x8a, + 0x58, 0x5e, 0xe1, 0x01, 0x62, 0x7d, 0x5f, 0x88, 0x64, 0x96, 0x55, 0xe9, 0xa6, 0x7e, 0x60, 0xfd, + 0x2d, 0xaf, 0xc3, 0xbc, 0xf6, 0x43, 0x1a, 0x8b, 0xbf, 0x8c, 0xa5, 0x29, 0x44, 0x2d, 0xd6, 0xb3, + 0x57, 0xc5, 0xba, 0xa6, 0xe0, 0x4d, 0xbe, 0xae, 0x6a, 0x07, 0xaa, 0x42, 0xb2, 0xf5, 0x6c, 0x25, + 0xfe, 0x4a, 0x49, 0xfe, 0x4a, 0x2d, 0xc6, 0x1a, 0x00, 0xb5, 0x02, 0x3d, 0xe2, 0x20, 0x1a, 0x20, + 0xba, 0x8a, 0xc3, 0x20, 0xb6, 0x43, 0x15, 0x7f, 0xe6, 0xa2, 0xae, 0x66, 0xaf, 0xd4, 0x4c, 0x5d, + 0x55, 0x0f, 0xd4, 0x1c, 0xd9, 0x38, 0x50, 0x37, 0x08, 0xde, 0xe5, 0x63, 0xbf, 0x56, 0x15, 0x1e, + 0x3d, 0x66, 0xbe, 0x36, 0xc0, 0xbd, 0x42, 0x7c, 0x0d, 0x6e, 0x5d, 0x7a, 0x73, 0x31, 0xec, 0x5f, + 0x97, 0xd3, 0xff, 0xab, 0x5f, 0x10, 0x23, 0x33, 0x4a, 0x89, 0x7e, 0x0e, 0x64, 0xe6, 0x87, 0x40, + 0x5e, 0xd4, 0xcd, 0xfc, 0xb1, 0xfb, 0x45, 0xfd, 0x44, 0x2f, 0xd8, 0x84, 0xbf, 0xcb, 0x27, 0xfc, + 0x8e, 0xc2, 0x5e, 0xfb, 0xcd, 0xb7, 0x0d, 0x49, 0x53, 0xeb, 0xc5, 0x2b, 0xb0, 0xbe, 0x0d, 0xbc, + 0xc9, 0xd5, 0xc1, 0x38, 0x25, 0x2d, 0x94, 0x05, 0x70, 0x7b, 0xa5, 0xa9, 0xb1, 0x86, 0x22, 0x88, + 0x0b, 0x20, 0x63, 0x2d, 0x9a, 0x0a, 0x08, 0xae, 0x0a, 0xb1, 0x16, 0xc4, 0x02, 0x16, 0x2d, 0xa9, + 0x38, 0x39, 0xa6, 0x70, 0x52, 0xe6, 0x0a, 0x6c, 0x3c, 0x7b, 0x85, 0x36, 0x7d, 0xa5, 0x2e, 0x95, + 0x20, 0x56, 0x94, 0x5c, 0x32, 0x29, 0x64, 0xbd, 0x20, 0xbd, 0xc5, 0x77, 0x0a, 0xfe, 0x57, 0xa4, + 0x97, 0x97, 0x73, 0x60, 0x2f, 0xa7, 0x59, 0x19, 0xe6, 0x35, 0x4c, 0x64, 0x4d, 0xce, 0xa3, 0xc1, + 0x31, 0xb3, 0x21, 0x60, 0xd1, 0xc5, 0x1c, 0x7e, 0x67, 0xe5, 0x5c, 0x11, 0xbf, 0xe1, 0x69, 0x06, + 0x5f, 0x2c, 0x03, 0x43, 0x52, 0x65, 0x95, 0x64, 0xe4, 0x0c, 0x4c, 0x73, 0x9c, 0x0b, 0x30, 0x01, + 0xf0, 0x0a, 0x66, 0x7d, 0x4e, 0x2e, 0x16, 0x09, 0xeb, 0x07, 0x56, 0x86, 0xb7, 0x80, 0x69, 0x03, + 0xbb, 0x81, 0x35, 0x6b, 0xf8, 0x91, 0x95, 0x37, 0xd8, 0x4d, 0x5e, 0xde, 0xc8, 0x03, 0x20, 0x5a, + 0xf9, 0x06, 0x29, 0xca, 0x4a, 0x01, 0xbf, 0x55, 0x3c, 0x8c, 0x2b, 0x17, 0x32, 0x88, 0x1f, 0xe8, + 0x51, 0xe5, 0x62, 0x1e, 0x47, 0x05, 0x12, 0xa1, 0x29, 0x23, 0x17, 0x8a, 0xec, 0x22, 0x17, 0x36, + 0xc0, 0x94, 0x29, 0x22, 0x50, 0x7e, 0x03, 0x49, 0x86, 0x4f, 0xe8, 0x8b, 0x2d, 0xe8, 0xea, 0x18, + 0x5b, 0x75, 0x35, 0x73, 0x0a, 0xdd, 0x55, 0xde, 0xa6, 0xca, 0xb9, 0x0d, 0x9c, 0x0c, 0x59, 0x95, + 0xb0, 0x59, 0x25, 0x17, 0x33, 0xfc, 0xe2, 0x0a, 0x60, 0x8a, 0xb9, 0x03, 0x78, 0x82, 0xe4, 0x65, + 0x0f, 0x80, 0xd7, 0x0c, 0xcc, 0x2b, 0xf4, 0x60, 0x79, 0x76, 0x99, 0x95, 0xf3, 0xfc, 0x09, 0xbe, + 0x46, 0x87, 0xb0, 0xe0, 0x24, 0xeb, 0x38, 0xc6, 0x29, 0xce, 0x2d, 0x10, 0x11, 0x0e, 0x20, 0x6b, + 0x05, 0x24, 0x09, 0x3e, 0x35, 0x26, 0x3a, 0x68, 0x67, 0x6f, 0x1a, 0xca, 0xfc, 0x1b, 0xba, 0xe7, + 0x22, 0xa8, 0x0c, 0x63, 0x91, 0x77, 0xcd, 0x70, 0x62, 0xd1, 0x51, 0x16, 0xae, 0x54, 0xf5, 0x14, + 0x84, 0x5b, 0x44, 0x11, 0x61, 0xc7, 0x2c, 0x08, 0x31, 0xcb, 0x86, 0x56, 0x40, 0xa8, 0x28, 0xc0, + 0x3c, 0x08, 0x13, 0x1e, 0xe6, 0x01, 0x06, 0x1e, 0xb0, 0xa7, 0x21, 0x3c, 0xea, 0xa4, 0x0e, 0xa3, + 0x9e, 0x82, 0x47, 0xca, 0x21, 0x5f, 0x59, 0xf4, 0x4c, 0x40, 0xad, 0x82, 0xef, 0x62, 0xc2, 0x90, + 0xd0, 0x9a, 0x61, 0xaa, 0x24, 0x0c, 0xf9, 0x46, 0x2e, 0x84, 0x40, 0xed, 0x29, 0x8c, 0x07, 0xb4, + 0x05, 0x60, 0x6c, 0x03, 0xbc, 0x09, 0xfb, 0x51, 0xa2, 0xcc, 0x12, 0x13, 0x3f, 0xc7, 0xdd, 0xb1, + 0xa9, 0xe7, 0x8e, 0x6f, 0x3f, 0xa6, 0xc3, 0x5f, 0xa0, 0xe2, 0xdf, 0x9b, 0xec, 0xa5, 0xa4, 0xad, + 0xff, 0x01, 0xe2, 0x4a, 0xd5, 0xc2, 0x8f, 0x5e, 0x00, 0x00 +}; diff --git a/wled00/wled_server.cpp b/wled00/wled_server.cpp index d235b61ed..9fd64b555 100644 --- a/wled00/wled_server.cpp +++ b/wled00/wled_server.cpp @@ -6,6 +6,9 @@ #endif #include "html_settings.h" #include "html_other.h" +#ifdef WLED_ENABLE_PIXART + #include "html_pixart.h" +#endif /* * Integrated HTTP web server page declarations @@ -345,6 +348,17 @@ void initServer() serveIndexOrWelcome(request); }); + #ifdef WLED_ENABLE_PIXART + server.on("/pixart.htm", HTTP_GET, [](AsyncWebServerRequest *request){ + if (handleFileRead(request, "/pixart.htm")) return; + if (handleIfNoneMatchCacheHeader(request)) return; + AsyncWebServerResponse *response = request->beginResponse_P(200, "text/html", PAGE_pixart, PAGE_pixart_L); + response->addHeader(FPSTR(s_content_enc),"gzip"); + setStaticContentCacheHeaders(response); + request->send(response); + }); + #endif + #ifdef WLED_ENABLE_WEBSOCKETS server.addHandler(&ws); #endif