From fc12549d5554d3c203fcfe252535f2df2290d980 Mon Sep 17 00:00:00 2001 From: Tommy Ettinger Date: Wed, 2 Jun 2021 21:08:35 -0700 Subject: [PATCH] Release 0.6.0! Former-commit-id: 2f89c5f772b09a72aec506db390027be3f20743a --- README.md | 55 +- .../apidocs/allclasses-index.html | 2 +- .../apidocs/allpackages-index.html | 2 +- .../colorful/pure/FloatColors.html | 32 +- .../colorful/pure/MathTools.html | 98 +- .../colorful/pure/class-use/FloatColors.html | 2 +- .../colorful/pure/class-use/MathTools.html | 2 +- .../colorful/pure/ipt/ColorTools.html | 107 +- .../colorful/pure/ipt/Palette.html | 26 +- .../pure/ipt/class-use/ColorTools.html | 2 +- .../colorful/pure/ipt/class-use/Palette.html | 2 +- .../colorful/pure/ipt/package-summary.html | 2 +- .../colorful/pure/ipt/package-tree.html | 4 +- .../colorful/pure/ipt/package-use.html | 2 +- .../colorful/pure/ipt_hq/ColorTools.html | 134 +- .../colorful/pure/ipt_hq/Palette.html | 26 +- .../colorful/pure/ipt_hq/SimplePalette.html | 38 +- .../pure/ipt_hq/class-use/ColorTools.html | 2 +- .../pure/ipt_hq/class-use/Palette.html | 2 +- .../pure/ipt_hq/class-use/SimplePalette.html | 2 +- .../colorful/pure/ipt_hq/package-summary.html | 2 +- .../colorful/pure/ipt_hq/package-tree.html | 4 +- .../colorful/pure/ipt_hq/package-use.html | 2 +- .../colorful/pure/oklab/ColorTools.html | 565 +++- .../colorful/pure/oklab/Palette.html | 26 +- .../colorful/pure/oklab/SimplePalette.html | 38 +- .../pure/oklab/class-use/ColorTools.html | 2 +- .../pure/oklab/class-use/Palette.html | 2 +- .../pure/oklab/class-use/SimplePalette.html | 2 +- .../colorful/pure/oklab/package-summary.html | 2 +- .../colorful/pure/oklab/package-tree.html | 4 +- .../colorful/pure/oklab/package-use.html | 2 +- .../colorful/pure/package-summary.html | 2 +- .../colorful/pure/package-tree.html | 4 +- .../colorful/pure/package-use.html | 2 +- .../colorful/pure/rgb/ColorTools.html | 100 +- .../colorful/pure/rgb/Palette.html | 26 +- .../colorful/pure/rgb/SimplePalette.html | 146 +- .../pure/rgb/class-use/ColorTools.html | 2 +- .../colorful/pure/rgb/class-use/Palette.html | 2 +- .../pure/rgb/class-use/SimplePalette.html | 2 +- .../colorful/pure/rgb/package-summary.html | 2 +- .../colorful/pure/rgb/package-tree.html | 4 +- .../colorful/pure/rgb/package-use.html | 2 +- .../colorful/pure/ycwcm/ColorTools.html | 106 +- .../colorful/pure/ycwcm/Palette.html | 26 +- .../pure/ycwcm/class-use/ColorTools.html | 2 +- .../pure/ycwcm/class-use/Palette.html | 2 +- .../colorful/pure/ycwcm/package-summary.html | 2 +- .../colorful/pure/ycwcm/package-tree.html | 4 +- .../colorful/pure/ycwcm/package-use.html | 2 +- .../apidocs/constant-values.html | 2 +- docs/colorful-pure/apidocs/help-doc.html | 18 +- docs/colorful-pure/apidocs/index-all.html | 108 +- docs/colorful-pure/apidocs/index.html | 4 +- .../apidocs/member-search-index.js | 2 +- .../apidocs/overview-summary.html | 2 +- docs/colorful-pure/apidocs/overview-tree.html | 4 +- docs/colorful-pure/apidocs/search.js | 2 +- .../colorful/pure/FloatColors.html | 46 +- .../colorful/pure/ipt/ColorTools.html | 247 +- .../colorful/pure/ipt_hq/ColorTools.html | 236 +- .../colorful/pure/ipt_hq/SimplePalette.html | 18 +- .../colorful/pure/oklab/ColorTools.html | 2372 ++++++++-------- .../colorful/pure/rgb/ColorTools.html | 177 +- .../colorful/pure/rgb/SimplePalette.html | 1724 ++++++------ .../colorful/pure/ycwcm/ColorTools.html | 203 +- docs/colorful/apidocs/allclasses-index.html | 4 +- docs/colorful/apidocs/allpackages-index.html | 2 +- .../tommyettinger/colorful/FloatColors.html | 32 +- .../tommyettinger/colorful/Shaders.html | 473 +++- .../tommyettinger/colorful/TrigTools.html | 98 +- .../colorful/class-use/FloatColors.html | 2 +- .../colorful/class-use/Shaders.html | 2 +- .../colorful/class-use/TrigTools.html | 2 +- .../colorful/ipt/ColorTools.html | 253 +- .../colorful/ipt/ColorfulBatch.html | 14 +- .../colorful/ipt/ColorfulSprite.html | 8 +- .../tommyettinger/colorful/ipt/Palette.html | 26 +- .../colorful/ipt/class-use/ColorTools.html | 2 +- .../colorful/ipt/class-use/ColorfulBatch.html | 2 +- .../ipt/class-use/ColorfulSprite.html | 2 +- .../colorful/ipt/class-use/Palette.html | 2 +- .../colorful/ipt/package-summary.html | 2 +- .../colorful/ipt/package-tree.html | 4 +- .../colorful/ipt/package-use.html | 2 +- .../colorful/ipt_hq/ColorTools.html | 265 +- .../colorful/ipt_hq/ColorfulBatch.html | 14 +- .../colorful/ipt_hq/ColorfulSprite.html | 8 +- .../colorful/ipt_hq/Palette.html | 26 +- .../colorful/ipt_hq/SimplePalette.html | 38 +- .../colorful/ipt_hq/class-use/ColorTools.html | 2 +- .../ipt_hq/class-use/ColorfulBatch.html | 2 +- .../ipt_hq/class-use/ColorfulSprite.html | 2 +- .../colorful/ipt_hq/class-use/Palette.html | 2 +- .../ipt_hq/class-use/SimplePalette.html | 2 +- .../colorful/ipt_hq/package-summary.html | 2 +- .../colorful/ipt_hq/package-tree.html | 4 +- .../colorful/ipt_hq/package-use.html | 2 +- .../colorful/oklab/ColorTools.html | 614 +++-- .../colorful/oklab/ColorfulBatch.html | 14 +- .../colorful/oklab/ColorfulSprite.html | 8 +- .../tommyettinger/colorful/oklab/Palette.html | 26 +- .../colorful/oklab/SimplePalette.html | 38 +- .../colorful/oklab/class-use/ColorTools.html | 2 +- .../oklab/class-use/ColorfulBatch.html | 2 +- .../oklab/class-use/ColorfulSprite.html | 2 +- .../colorful/oklab/class-use/Palette.html | 2 +- .../oklab/class-use/SimplePalette.html | 2 +- .../colorful/oklab/package-summary.html | 2 +- .../colorful/oklab/package-tree.html | 4 +- .../colorful/oklab/package-use.html | 2 +- .../colorful/package-summary.html | 4 +- .../tommyettinger/colorful/package-tree.html | 4 +- .../tommyettinger/colorful/package-use.html | 2 +- .../colorful/rgb/ColorTools.html | 328 ++- .../colorful/rgb/ColorfulBatch.html | 14 +- .../colorful/rgb/ColorfulSprite.html | 8 +- .../tommyettinger/colorful/rgb/Palette.html | 26 +- .../colorful/rgb/SimplePalette.html | 38 +- .../colorful/rgb/class-use/ColorTools.html | 2 +- .../colorful/rgb/class-use/ColorfulBatch.html | 2 +- .../rgb/class-use/ColorfulSprite.html | 2 +- .../colorful/rgb/class-use/Palette.html | 2 +- .../colorful/rgb/class-use/SimplePalette.html | 2 +- .../colorful/rgb/package-summary.html | 2 +- .../colorful/rgb/package-tree.html | 4 +- .../colorful/rgb/package-use.html | 2 +- .../colorful/ycwcm/ColorTools.html | 259 +- .../colorful/ycwcm/ColorfulBatch.html | 14 +- .../colorful/ycwcm/ColorfulSprite.html | 8 +- .../tommyettinger/colorful/ycwcm/Palette.html | 26 +- .../colorful/ycwcm/class-use/ColorTools.html | 2 +- .../ycwcm/class-use/ColorfulBatch.html | 2 +- .../ycwcm/class-use/ColorfulSprite.html | 2 +- .../colorful/ycwcm/class-use/Palette.html | 2 +- .../colorful/ycwcm/package-summary.html | 2 +- .../colorful/ycwcm/package-tree.html | 4 +- .../colorful/ycwcm/package-use.html | 2 +- docs/colorful/apidocs/constant-values.html | 78 +- docs/colorful/apidocs/help-doc.html | 18 +- docs/colorful/apidocs/index-all.html | 196 +- docs/colorful/apidocs/index.html | 4 +- docs/colorful/apidocs/member-search-index.js | 2 +- docs/colorful/apidocs/overview-summary.html | 2 +- docs/colorful/apidocs/overview-tree.html | 4 +- docs/colorful/apidocs/search.js | 2 +- .../tommyettinger/colorful/FloatColors.html | 48 +- .../tommyettinger/colorful/Shaders.html | 2132 ++++++++------- .../colorful/ipt/ColorTools.html | 1968 ++++++------- .../colorful/ipt_hq/ColorTools.html | 1809 ++++++------ .../colorful/ipt_hq/SimplePalette.html | 18 +- .../colorful/oklab/ColorTools.html | 2431 +++++++++-------- .../colorful/rgb/ColorTools.html | 1267 +++++---- .../colorful/rgb/SimplePalette.html | 4 +- .../colorful/ycwcm/ColorTools.html | 1749 ++++++------ gradle.properties | 2 +- jitpack.yml | 2 +- 158 files changed, 12209 insertions(+), 9107 deletions(-) diff --git a/README.md b/README.md index 2099d68f..897a0b5e 100644 --- a/README.md +++ b/README.md @@ -16,20 +16,21 @@ specifically how it handles color tinting with `setColor(float, float, float, fl We address this in colorful by representing tint colors differently. While there's some support here for HSLC tints (hue, saturation, lightness, contrast) via `Shaders.makeBatchHSLC()`, much more of the library focuses on four color spaces: RGB, YCwCm, IPT, and Oklab. Most of this library's users will only employ one of these color spaces at a time, -and the APIs for all the color spaces are extremely similar. +and the APIs for all the color spaces are extremely similar. You most likely want to use RGB (because it is the most +compatible with existing colors) and/or Oklab (because it is the most expressive and makes changing colors intuitive). ### RGB RGB is familiar to almost everyone who works with color on computers; it has a red, a green, and a blue channel, plus -alpha here. The difference between the way an RGB color tint works with a standard libGDX SpriteBatch and the way one -works here is that a SpriteBatch is neutral at the value `(1.0, 1.0, 1.0, 1.0)` and can only reduce channels as they go +alpha here. The difference between the way an RGB color tint works with a standard libGDX SpriteBatch, and the way one +works here, is that a SpriteBatch is neutral at the value `(1.0, 1.0, 1.0, 1.0)` and can only reduce channels as they go lower, while here, a ColorfulBatch is neutral at the value `(0.5, 0.5, 0.5, 1.0)` and can lower channels in the same way or raise channels if they go above 0.5. Typically, RGB is used with the `com.github.tommyettinger.colorful.rgb` package, with the `ColorfulBatch` class replacing `SpriteBatch`. The `ColorTools` class in the same package provides various RGB-specific color manipulation, while `FloatColors` in the parent package provides non-specific manipulation of colors as packed floats (which are the default here). `Palette` has 256 predefined colors from the DawnBringer Aurora palette, which is well-distributed for almost any pixel art or digital painting, as packed floats that have substantial -documentation; these colors can be accessed with their names via an ObjectFloatMap, `NAMED`, and those names in usefully' +documentation. These colors can be accessed with their names via an ObjectFloatMap, `NAMED`, and those names in usefully sorted orders as `NAMES_BY_LIGHTNESS` and `NAMES_BY_HUE`. There's also `SimplePalette`, which has fewer named colors predefined, but allows specifying edited and/or combined colors using simple `String`s; more on that later. @@ -39,7 +40,8 @@ int color, except that they never use or set one bit in alpha (so they really on significant ones), and the RGBA bytes are in reversed order. The conversion from int color to packed float color is very efficient thanks to how the JVM (and GWT, with a caveat) handle this operation. GWT, used for the HTML backend in libGDX, actually defaults to a very slow conversion between int bits and float, but provides a way for libGDX (or other -libraries) to convert quite efficiently; libGDX does this with its `NumberUtils` class. +libraries) to convert quite efficiently; libGDX does this with its `NumberUtils` class. The `ColorTools` class in each +color space's package provides many ways to manipulate and query packed floats. `ColorfulBatch` doesn't just provide the option for tints to brighten and darken. It effectively has two batch colors; one is multiplicative and is called the "tweak," while the regular color is now additive. The changes from the tweak can @@ -58,6 +60,13 @@ least get a bit closer to a leafy background. Because libGDX's `Sprite` class de color and its tweak, but otherwise can be treated like a Sprite. You can still use a `Sprite` with a `ColorfulBatch`, you just can't set its tweak. +If you don't want to use `ColorfulBatch`, then `Shaders` provides `ShaderProgram` generators and GLSL code for shaders +that handle various color spaces. There are convenient functions that produce ShaderPrograms, like `makeRGBAShader()` +and `makeGammaRGBAShader()`, from the GLSL sources `fragmentShaderRGBA` and `fragmentShaderGammaRGBA`, respectively. +With these, you still use 50% gray as the neutral value, tinting with white brightens, and tinting with black eliminates +all color. However, you don't have the "tweak" that `ColorfulBatch` has, so there's no contrast adjustment with this. +You can use these `ShaderProgram`s with a standard `SpriteBatch` + ### YCwCm Instead of red, green, blue, and alpha channels, YCwCm uses luma (also called lightness), chromatic warmth, chromatic @@ -157,17 +166,16 @@ introduced in [this recent blog post](https://bottosson.github.io/posts/oklab/), between hue and the other aspects of color comparison. It has the components L (lightness), A (one chromatic channel, roughly describing how cool or warm a color is, with high values closer to magenta and low values closer to green), and B (the other chromatic channel, also in a sense describing something like cool to warm, but with high values closer to -orange and low values closer to blue). It's like a slightly-rotated version of IPT, or YCwCm with the chromatic channels -in reversed order. The main benefits of Oklab are for comparing colors, where you can use a standard Euclidean distance -if you just halve L when measuring, and for making smooth gradients. It may also be a slight bit faster than IPT_HQ, -even though its calculations are extremely similar, because Oklab uses a fast approximation of cube root when it's -processed by Java, where IPT_HQ uses a slightly slower call to `Math.pow()` with 0.43 as the exponent. Going in reverse, -Oklab can just do `n * n * n` where IPT_HQ needs to use `Math.pow()` again but also preserve the sign of its argument. -This difference probably won't be noticeable in practice, since most color processing will be done on the GPU for the -most intensive applications. +orange and low values closer to blue). It's like a slightly-rotated version of IPT or YCwCm. The main benefits of Oklab +are for comparing colors, where you can use a standard Euclidean distance, and for making smooth gradients. It may also +be a slight bit faster than IPT_HQ, even though its calculations are extremely similar, because Oklab uses a fast +approximation of cube root when it's processed by Java, where IPT_HQ uses a slightly slower call to `Math.pow()` with +0.43 as the exponent. Going in reverse, Oklab can just do `n * n * n` where IPT_HQ needs to use `Math.pow()` again but +also preserve the sign of its argument. This difference probably won't be noticeable in practice, since most color +processing will be done on the GPU for the most intensive applications. The `com.github.tommyettinger.colorful.oklab` package has parallels to all the classes in the `ipt_hq` package, which -includes those in `ycwcm` and `ipt` as well. +includes those in `ycwcm` and `ipt` as well. Its `SimplePalette` is particularly adept at smoothly changing colors. ### Describing Colors @@ -183,6 +191,11 @@ colors in SimplePalette for Oklab can be previewed in [this list by hue](https://tommyettinger.github.io/colorful-gdx/ColorTableSimpleHueOklab.html), or [this list by lightness](https://tommyettinger.github.io/colorful-gdx/ColorTableSimpleValueOklab.html). +You can use [this small libGDX web app](https://tommyettinger.github.io/colorful-gdx/description/) to experiment with +different descriptions and what they produce. Use the `[` and `]` keys to change modes; there's an RGB, Oklab, IPT_HQ, +and comparison mode. The comparison mode may be the most useful; it has 3 bars that change color using different color +spaces and their SimplePalette transformations. + ### HSLC HSLC doesn't allow changing alpha, so it may be unsuitable for some tasks, but it does allow smooth hue rotations across @@ -245,12 +258,12 @@ Using the Maven Central dependency is recommended, and Gradle and Maven can both Gradle dependency (`implementation` should be changed to `api` if any other dependencies use `api`): ```groovy -implementation 'com.github.tommyettinger:colorful:0.5.1' +implementation 'com.github.tommyettinger:colorful:0.6.0' ``` Gradle dependency if also using GWT to make an HTML application: ```groovy -implementation 'com.github.tommyettinger:colorful:0.5.1:sources' +implementation 'com.github.tommyettinger:colorful:0.6.0:sources' ``` And also for GWT, in your application's `.gwt.xml` file (usually `GdxDefinition.gwt.xml`) @@ -263,7 +276,7 @@ If you don't use Gradle, here's the Maven dependency: com.github.tommyettinger colorful - 0.5.1 + 0.6.0 ``` @@ -271,12 +284,12 @@ Using colorful-pure is similar: Gradle dependency (`implementation` should be changed to `api` if any other dependencies use `api`): ```groovy -implementation 'com.github.tommyettinger:colorful-pure:0.5.1' +implementation 'com.github.tommyettinger:colorful-pure:0.6.0' ``` Gradle dependency if also using GWT to make an HTML application: ```groovy -implementation 'com.github.tommyettinger:colorful-pure:0.5.1:sources' +implementation 'com.github.tommyettinger:colorful-pure:0.6.0:sources' ``` And also for GWT, in your application's `.gwt.xml` file (usually `GdxDefinition.gwt.xml`) @@ -289,8 +302,8 @@ If you don't use Gradle, here's the Maven dependency: com.github.tommyettinger colorful-pure - 0.5.1 + 0.6.0 ``` -If you don't use Gradle or Maven, [there are jars here](https://github.com/tommyettinger/colorful-gdx/releases/tag/v0.5.1). +If you don't use Gradle or Maven, [there are jars here](https://github.com/tommyettinger/colorful-gdx/releases/tag/v0.6.0). diff --git a/docs/colorful-pure/apidocs/allclasses-index.html b/docs/colorful-pure/apidocs/allclasses-index.html index e4728c7a..6c6d2ec5 100644 --- a/docs/colorful-pure/apidocs/allclasses-index.html +++ b/docs/colorful-pure/apidocs/allclasses-index.html @@ -3,7 +3,7 @@ -All Classes (colorful-pure 0.5.2-SNAPSHOT API) +All Classes (colorful-pure 0.6.0 API) diff --git a/docs/colorful-pure/apidocs/allpackages-index.html b/docs/colorful-pure/apidocs/allpackages-index.html index 6601450f..c1c0068e 100644 --- a/docs/colorful-pure/apidocs/allpackages-index.html +++ b/docs/colorful-pure/apidocs/allpackages-index.html @@ -3,7 +3,7 @@ -All Packages (colorful-pure 0.5.2-SNAPSHOT API) +All Packages (colorful-pure 0.6.0 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/FloatColors.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/FloatColors.html index 296d3084..a3bc0bfb 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/FloatColors.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/FloatColors.html @@ -3,7 +3,7 @@ -FloatColors (colorful-pure 0.5.2-SNAPSHOT API) +FloatColors (colorful-pure 0.6.0 API) @@ -74,13 +74,13 @@
Package com.github.tommyettinger.colorful.pure

Class FloatColors

-
java.lang.Object +
java.lang.Object
com.github.tommyettinger.colorful.pure.FloatColors

public class FloatColors -extends Object
+extends Object
Various utility methods for working with colors encoded as packed floats in any of the formats this can use.
Created by Tommy Ettinger on 12/2/2019.
@@ -208,8 +208,8 @@

Method Summary

-

Methods inherited from class java.lang.Object

-clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+

Methods inherited from class java.lang.Object

+clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait @@ -347,10 +347,10 @@

lerpFloatColors

float end, float change)
Interpolates from the packed float color start towards end by change. Both start and end should be packed colors, - as from ColorTools.ycwcm(float, float, float, float) or + as from ColorTools.oklab(float, float, float, float) or ColorTools.ipt(float, float, float, float), and change can be between 0f (keep start) and 1f (only use end). Both start and end should use the same color space; that is, both - could be produced using YCwCm, both could be produced using IPT, or both could be libGDX-native RGB, but they + could be produced using Oklab, both could be produced using IPT, or both could be libGDX-native RGB, but they can't mix. This is a good way to reduce allocations of temporary Colors.
Parameters:
@@ -370,11 +370,11 @@

lerpFloatColorsBlended

float change)
Interpolates from the packed float color start towards end by change, but keeps the alpha of start and uses the alpha of end as an extra factor that can affect how much to change. Both start and end should be packed colors, - as from ColorTools.ycwcm(float, float, float, float) or - ColorTools.ipt(float, float, float, float), and change can be between 0f - (keep start) and 1f (only use end). Both start and end should use the same color space; that is, both could be - produced using YCwCm, or both could be produced using IPT, but not a mix of the two. This is a good way to - reduce allocations of temporary Colors.
+ as from ColorTools.ipt(float, float, float, float) or + ColorTools.ycwcm(float, float, float, float), and change can + be between 0f (keep start) and 1f (only use end). Both start and end should use the same color space; that is, + both could be produced using IPT_HQ, or both could be produced using YCwCm, but not a mix of the two. This is a + good way to reduce allocations of temporary Colors.
Parameters:
start - the starting color as a packed float; alpha will be preserved
@@ -454,14 +454,16 @@

mix

  • mix

    -
    public static float mix(float[] colors, +
    public static float mix(float[] colors, int offset, int size)
    Given several colors, this gets an even mix of all colors in equal measure. - If colors is null or has no items, this returns 0f (usually transparent in most color spaces).
    + If colors is null or has no items, this returns 0f (usually transparent in most color spaces). + This is mostly useful in conjunction with FloatList, using its items + for colors, typically 0 for offset, and its size for size.
    Parameters:
    -
    colors - an array or varargs of packed float colors; all should use the same color space
    +
    colors - an array of packed float colors; all should use the same color space
    offset - the index of the first item in colors to use
    size - how many items from colors to use
    Returns:
    diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/MathTools.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/MathTools.html index 2252b080..b9361a90 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/MathTools.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/MathTools.html @@ -3,7 +3,7 @@ -MathTools (colorful-pure 0.5.2-SNAPSHOT API) +MathTools (colorful-pure 0.6.0 API) @@ -74,13 +74,13 @@

    Class MathTools

    -
    java.lang.Object +
    java.lang.Object
    com.github.tommyettinger.colorful.pure.MathTools

    public class MathTools -extends Object
    +extends Object
    Some alternative approximations to sin(), cos(), asin(), acos(), atan(), and atan2(), including the option to measure most values in turns instead of radians (where 1 turn equals 2pi radians). The convention here is to have methods that take input in turns or produce output in turns use a _ suffix, like sin_(double), for turns to @@ -256,33 +256,33 @@

    Method Summary

    static double
    cos​(double radians)
    -
    A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x +
    A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x faster cos() calls in benchmarking; if you have access to libGDX you should consider its sometimes-more-precise and sometimes-faster MathUtils.cos() method.
    static float
    cos​(float radians)
    -
    A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x +
    A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x faster cos() calls in benchmarking, and both takes and returns floats; if you have access to libGDX you should consider its more-precise and sometimes-faster MathUtils.cos() method.
    static double
    cos_​(double turns)
    -
    A variation on Math.cos(double) that takes its input as a fraction of a turn instead of in radians; one +
    A variation on Math.cos(double) that takes its input as a fraction of a turn instead of in radians; one turn is equal to 360 degrees or two*PI radians.
    static float
    cos_​(float turns)
    -
    A variation on Math.cos(double) that takes its input as a fraction of a turn instead of in radians (it +
    A variation on Math.cos(double) that takes its input as a fraction of a turn instead of in radians (it also takes and returns a float); one turn is equal to 360 degrees or two*PI radians.
    static float
    cosDegrees​(float degrees)
    -
    A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x +
    A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x faster cos() calls in benchmarking, and both takes and returns floats; if you have access to libGDX, you should consider its more-precise and sometimes-faster MathUtils.cosDeg() method.
    @@ -296,33 +296,33 @@

    Method Summary

    static double
    sin​(double radians)
    -
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x +
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x faster sin() calls in benchmarking; if you have access to libGDX you should consider its sometimes-more-precise and sometimes-faster MathUtils.sin() method.
    static float
    sin​(float radians)
    -
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x +
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x faster sin() calls in benchmarking, and both takes and returns floats; if you have access to libGDX you should consider its more-precise and sometimes-faster MathUtils.sin() method.
    static double
    sin_​(double turns)
    -
    A variation on Math.sin(double) that takes its input as a fraction of a turn instead of in radians; one +
    A variation on Math.sin(double) that takes its input as a fraction of a turn instead of in radians; one turn is equal to 360 degrees or two*PI radians.
    static float
    sin_​(float turns)
    -
    A variation on Math.sin(double) that takes its input as a fraction of a turn instead of in radians (it +
    A variation on Math.sin(double) that takes its input as a fraction of a turn instead of in radians (it also takes and returns a float); one turn is equal to 360 degrees or two*PI radians.
    static float
    sinDegrees​(float degrees)
    -
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x +
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x faster sin() calls in benchmarking, and both takes and returns floats; if you have access to libGDX, you should consider its more-precise and sometimes-faster MathUtils.sinDeg() method.
    @@ -330,8 +330,8 @@

    Method Summary

    -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • @@ -361,15 +361,15 @@

    Method Details

    sin

    public static double sin(double radians)
    -
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x +
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x faster sin() calls in benchmarking; if you have access to libGDX you should consider its sometimes-more-precise and sometimes-faster MathUtils.sin() method. Because this method doesn't rely on a lookup table, where libGDX's MathUtils does, applications that have a bottleneck on memory may perform better with this method than with MathUtils. Takes the same arguments Math.sin() does, so one angle in radians, which may technically be any double (but this will lose precision on fairly large doubles, such as those that are - larger than Long.MAX_VALUE, because those doubles themselves will lose precision at that scale). This + larger than Long.MAX_VALUE, because those doubles themselves will lose precision at that scale). This is closely related to a cubic sway, but the shape of the output when graphed is almost identical to - sin(). The difference between the result of this method and Math.sin(double) should be under 0.0011 at + sin(). The difference between the result of this method and Math.sin(double) should be under 0.0011 at all points between -pi and pi, with an average difference of about 0.0005; not all points have been checked for potentially higher errors, though.
    @@ -394,15 +394,15 @@

    sin

    cos

    public static double cos(double radians)
    -
    A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x +
    A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x faster cos() calls in benchmarking; if you have access to libGDX you should consider its sometimes-more-precise and sometimes-faster MathUtils.cos() method. Because this method doesn't rely on a lookup table, where libGDX's MathUtils does, applications that have a bottleneck on memory may perform better with this method than with MathUtils. Takes the same arguments Math.cos() does, so one angle in radians, which may technically be any double (but this will lose precision on fairly large doubles, such as those that are - larger than Long.MAX_VALUE, because those doubles themselves will lose precision at that scale). This + larger than Long.MAX_VALUE, because those doubles themselves will lose precision at that scale). This is closely related to a cubic sway, but the shape of the output when graphed is almost identical to - cos(). The difference between the result of this method and Math.cos(double) should be under 0.0011 at + cos(). The difference between the result of this method and Math.cos(double) should be under 0.0011 at all points between -pi and pi, with an average difference of about 0.0005; not all points have been checked for potentially higher errors, though.
    @@ -427,15 +427,15 @@

    cos

    sin

    public static float sin(float radians)
    -
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x +
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x faster sin() calls in benchmarking, and both takes and returns floats; if you have access to libGDX you should consider its more-precise and sometimes-faster MathUtils.sin() method. Because this method doesn't rely on a lookup table, where libGDX's MathUtils does, applications that have a bottleneck on memory may perform better with this method than with MathUtils. Takes the same arguments Math.sin() does, so one angle in radians, which may technically be any float (but this will lose precision on fairly large floats, such as those that are - larger than Integer.MAX_VALUE, because those floats themselves will lose precision at that scale). This + larger than Integer.MAX_VALUE, because those floats themselves will lose precision at that scale). This is closely related to a cubic sway, but the shape of the output when graphed is almost identical to - sin(). The difference between the result of this method and Math.sin(double) should be under 0.0011 at + sin(). The difference between the result of this method and Math.sin(double) should be under 0.0011 at all points between -pi and pi, with an average difference of about 0.0005; not all points have been checked for potentially higher errors, though.
    @@ -460,15 +460,15 @@

    sin

    cos

    public static float cos(float radians)
    -
    A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x +
    A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x faster cos() calls in benchmarking, and both takes and returns floats; if you have access to libGDX you should consider its more-precise and sometimes-faster MathUtils.cos() method. Because this method doesn't rely on a lookup table, where libGDX's MathUtils does, applications that have a bottleneck on memory may perform better with this method than with MathUtils. Takes the same arguments Math.cos() does, so one angle in radians, which may technically be any float (but this will lose precision on fairly large floats, such as those that are - larger than Integer.MAX_VALUE, because those floats themselves will lose precision at that scale). This + larger than Integer.MAX_VALUE, because those floats themselves will lose precision at that scale). This is closely related to a cubic sway, but the shape of the output when graphed is almost identical to - cos(). The difference between the result of this method and Math.cos(double) should be under 0.0011 at + cos(). The difference between the result of this method and Math.cos(double) should be under 0.0011 at all points between -pi and pi, with an average difference of about 0.0005; not all points have been checked for potentially higher errors, though.
    @@ -493,14 +493,14 @@

    cos

    sinDegrees

    public static float sinDegrees(float degrees)
    -
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x +
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x faster sin() calls in benchmarking, and both takes and returns floats; if you have access to libGDX, you should consider its more-precise and sometimes-faster MathUtils.sinDeg() method. Because this method doesn't rely on a lookup table, where libGDX's MathUtils does, applications that have a bottleneck on memory may perform better with this method than with MathUtils. Takes one angle in degrees, which may technically be any float (but this will lose precision on fairly large floats, such as those that are - larger than Integer.MAX_VALUE, because those floats themselves will lose precision at that scale). The - difference between the result of this method and Math.sin(double) should be under 0.0011 at + larger than Integer.MAX_VALUE, because those floats themselves will lose precision at that scale). The + difference between the result of this method and Math.sin(double) should be under 0.0011 at all points between -360 and 360, with an average difference of about 0.0005; not all points have been checked for potentially higher errors, though.
    @@ -528,14 +528,14 @@

    sinDegrees

    cosDegrees

    public static float cosDegrees(float degrees)
    -
    A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x +
    A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x faster cos() calls in benchmarking, and both takes and returns floats; if you have access to libGDX, you should consider its more-precise and sometimes-faster MathUtils.cosDeg() method. Because this method doesn't rely on a lookup table, where libGDX's MathUtils does, applications that have a bottleneck on memory may perform better with this method than with MathUtils. Takes one angle in degrees, which may technically be any float (but this will lose precision on fairly large floats, such as those that are - larger than Integer.MAX_VALUE, because those floats themselves will lose precision at that scale). The - difference between the result of this method and Math.cos(double) should be under 0.0011 at + larger than Integer.MAX_VALUE, because those floats themselves will lose precision at that scale). The + difference between the result of this method and Math.cos(double) should be under 0.0011 at all points between -360 and 360, with an average difference of about 0.0005; not all points have been checked for potentially higher errors, though.
    @@ -563,7 +563,7 @@

    cosDegrees

    sin_

    public static double sin_(double turns)
    -
    A variation on Math.sin(double) that takes its input as a fraction of a turn instead of in radians; one +
    A variation on Math.sin(double) that takes its input as a fraction of a turn instead of in radians; one turn is equal to 360 degrees or two*PI radians. This can be useful as a building block for other measurements; to make a sine method that takes its input in grad (with 400 grad equal to 360 degrees), you would just divide the grad value by 400.0 (or multiply it by 0.0025) and pass it to this method. Similarly for binary degrees, also @@ -593,7 +593,7 @@

    sin_

    cos_

    public static double cos_(double turns)
    -
    A variation on Math.cos(double) that takes its input as a fraction of a turn instead of in radians; one +
    A variation on Math.cos(double) that takes its input as a fraction of a turn instead of in radians; one turn is equal to 360 degrees or two*PI radians. This can be useful as a building block for other measurements; to make a cosine method that takes its input in grad (with 400 grad equal to 360 degrees), you would just divide the grad value by 400.0 (or multiply it by 0.0025) and pass it to this method. Similarly for binary degrees, also @@ -623,7 +623,7 @@

    cos_

    sin_

    public static float sin_(float turns)
    -
    A variation on Math.sin(double) that takes its input as a fraction of a turn instead of in radians (it +
    A variation on Math.sin(double) that takes its input as a fraction of a turn instead of in radians (it also takes and returns a float); one turn is equal to 360 degrees or two*PI radians. This can be useful as a building block for other measurements; to make a sine method that takes its input in grad (with 400 grad equal to 360 degrees), you would just divide the grad value by 400.0 (or multiply it by 0.0025) and pass it to this @@ -654,7 +654,7 @@

    sin_

    cos_

    public static float cos_(float turns)
    -
    A variation on Math.cos(double) that takes its input as a fraction of a turn instead of in radians (it +
    A variation on Math.cos(double) that takes its input as a fraction of a turn instead of in radians (it also takes and returns a float); one turn is equal to 360 degrees or two*PI radians. This can be useful as a building block for other measurements; to make a cosine method that takes its input in grad (with 400 grad equal to 360 degrees), you would just divide the grad value by 400.0 (or multiply it by 0.0025) and pass it to this @@ -687,7 +687,7 @@

    atan

    public static double atan(double i)
    Arc tangent approximation with very low error, using an algorithm from the 1955 research study "Approximations for Digital Computers," by RAND Corporation (this is sheet 9's algorithm, which is the - second-fastest and second-least precise). This method is usually much faster than Math.atan(double), + second-fastest and second-least precise). This method is usually much faster than Math.atan(double), but is somewhat less precise than Math's implementation.
    Parameters:
    @@ -703,7 +703,7 @@

    atan

    public static float atan(float i)
    Arc tangent approximation with very low error, using an algorithm from the 1955 research study "Approximations for Digital Computers," by RAND Corporation (this is sheet 9's algorithm, which is the - second-fastest and second-least precise). This method is usually much faster than Math.atan(double), + second-fastest and second-least precise). This method is usually much faster than Math.atan(double), but is somewhat less precise than Math's implementation.
    Parameters:
    @@ -721,7 +721,7 @@

    atan2

    Close approximation of the frequently-used trigonometric method atan2, with higher precision than libGDX's atan2 approximation. Maximum error is below 0.00009 radians. Takes y and x (in that unusual order) as doubles, and returns the angle from the origin to that point in radians. - It is about 5 times faster than Math.atan2(double, double) (roughly 12 ns instead of roughly 62 ns for + It is about 5 times faster than Math.atan2(double, double) (roughly 12 ns instead of roughly 62 ns for Math, on Java 8 HotSpot). It is slightly faster than libGDX' MathUtils approximation of the same method; MathUtils seems to have worse average error, though.
    @@ -751,7 +751,7 @@

    atan2

    Close approximation of the frequently-used trigonometric method atan2, with higher precision than libGDX's atan2 approximation. Maximum error is below 0.00009 radians. Takes y and x (in that unusual order) as floats, and returns the angle from the origin to that point in radians. - It is about 5 times faster than Math.atan2(double, double) (roughly 12 ns instead of roughly 62 ns for + It is about 5 times faster than Math.atan2(double, double) (roughly 12 ns instead of roughly 62 ns for Math, on Java 8 HotSpot). It is slightly faster than libGDX' MathUtils approximation of the same method; MathUtils seems to have worse average error, though.
    @@ -837,7 +837,7 @@

    atanDegrees

    public static double atanDegrees(double i)
    Arc tangent approximation measured in degrees, using an algorithm from the 1955 research study "Approximations for Digital Computers," by RAND Corporation (this is sheet 9's algorithm, which is the - second-fastest and second-least precise). This method is usually much faster than Math.atan(double), + second-fastest and second-least precise). This method is usually much faster than Math.atan(double), but is somewhat less precise than Math's implementation. This implementation can return negative or positive results in degrees.
    @@ -854,7 +854,7 @@

    atanDegrees

    public static float atanDegrees(float i)
    Arc tangent approximation measured in degrees, using an algorithm from the 1955 research study "Approximations for Digital Computers," by RAND Corporation (this is sheet 9's algorithm, which is the - second-fastest and second-least precise). This method is usually much faster than Math.atan(double), + second-fastest and second-least precise). This method is usually much faster than Math.atan(double), but is somewhat less precise than Math's implementation. This implementation can return negative or positive results in degrees.
    @@ -873,7 +873,7 @@

    atan2Degrees

    Close approximation of the frequently-used trigonometric method atan2 measured in degrees, with higher precision than libGDX's atan2 approximation. The range for this is -180 to 180. Takes y and x (in that unusual order) as doubles, and returns the angle from the origin to that point in degrees. - It is about 5 times faster than Math.atan2(double, double) (roughly 12 ns instead of roughly 62 ns for + It is about 5 times faster than Math.atan2(double, double) (roughly 12 ns instead of roughly 62 ns for Math, on Java 8 HotSpot). It is slightly faster than libGDX' MathUtils approximation of the same method; MathUtils seems to have worse average error, as well.
    @@ -902,7 +902,7 @@

    atan2Degrees

    Close approximation of the frequently-used trigonometric method atan2 measured in degrees, with higher precision than libGDX's atan2 approximation. The range for this is -180 to 180. Takes y and x (in that unusual order) as floats, and returns the angle from the origin to that point in degrees. - It is about 5 times faster than Math.atan2(double, double) (roughly 12 ns instead of roughly 62 ns for + It is about 5 times faster than Math.atan2(double, double) (roughly 12 ns instead of roughly 62 ns for Math, on Java 8 HotSpot). It is slightly faster than libGDX' MathUtils approximation of the same method; MathUtils seems to have worse average error, as well.
    @@ -983,7 +983,7 @@

    asin

    public static float asin(float x)
    Arc sine approximation with very low error, using an algorithm from the 1955 research study "Approximations for Digital Computers," by RAND Corporation (this is sheet 35's algorithm, which is the fastest - and least precise). This method is usually much faster than Math.asin(double), but is somewhat less + and least precise). This method is usually much faster than Math.asin(double), but is somewhat less precise than Math's implementation. It is currently the same as libGDX's approximation in their MathUtils.
    Parameters:
    @@ -999,7 +999,7 @@

    acos

    public static float acos(float x)
    Arc cosine approximation with very low error, using an algorithm from the 1955 research study "Approximations for Digital Computers," by RAND Corporation (this is sheet 35's algorithm, which is the fastest - and least precise). This method is usually much faster than Math.acos(double), but is somewhat less + and least precise). This method is usually much faster than Math.acos(double), but is somewhat less precise than Math's implementation. It is currently the same as libGDX's approximation in their MathUtils.
    Accuracy: absolute error 0.000028450, relative error -0.000000011, max error 0.000067548 .
    @@ -1017,7 +1017,7 @@

    asin

    public static double asin(double x)
    Arc sine approximation with very low error, using an algorithm from the 1955 research study "Approximations for Digital Computers," by RAND Corporation (this is sheet 35's algorithm, which is the fastest - and least precise). This method is usually much faster than Math.asin(double), but is somewhat less + and least precise). This method is usually much faster than Math.asin(double), but is somewhat less precise than Math's implementation. It is currently the same as libGDX's approximation in their MathUtils, except that this takes a double and returns a double.
    @@ -1036,7 +1036,7 @@

    acos

    public static double acos(double x)
    Arc cosine approximation with very low error, using an algorithm from the 1955 research study "Approximations for Digital Computers," by RAND Corporation (this is sheet 35's algorithm, which is the fastest - and least precise). This method is usually much faster than Math.acos(double), but is somewhat less + and least precise). This method is usually much faster than Math.acos(double), but is somewhat less precise than Math's implementation. It is currently the same as libGDX's approximation in their MathUtils, except that this takes a double and returns a double.
    diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/FloatColors.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/FloatColors.html index 2805da87..dd0abb10 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/FloatColors.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/FloatColors.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.pure.FloatColors (colorful-pure 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.pure.FloatColors (colorful-pure 0.6.0 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/MathTools.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/MathTools.html index 3b47c66c..6ed40e7c 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/MathTools.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/MathTools.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.pure.MathTools (colorful-pure 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.pure.MathTools (colorful-pure 0.6.0 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt/ColorTools.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt/ColorTools.html index 9ccb15a1..a93e85de 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt/ColorTools.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt/ColorTools.html @@ -3,7 +3,7 @@ -ColorTools (colorful-pure 0.5.2-SNAPSHOT API) +ColorTools (colorful-pure 0.6.0 API) @@ -74,13 +74,13 @@

    Class ColorTools

    -
    java.lang.Object +
    java.lang.Object
    com.github.tommyettinger.colorful.pure.ipt.ColorTools

    public class ColorTools -extends Object
    +extends Object
    Contains code for manipulating colors as int and packed float values in the IPT color space. IPT has more perceptually-uniform handling of hue than some other color spaces, like YCwCm, and even though the version here gives up the complex exponential adjustments to various components that the original IPT @@ -162,6 +162,31 @@

    Method Summary

    Brings the chromatic components of start closer to grayscale by change (desaturating them).
    static float
    +
    editIPT​(float encoded, + float addI, + float addP, + float addT, + float addAlpha)
    +
    +
    Given a packed float IPT color, this edits its intensity, protan, tritan, and alpha channels by adding the + corresponding "add" parameter and then clamping.
    +
    +
    static float
    +
    editIPT​(float encoded, + float addI, + float addP, + float addT, + float addAlpha, + float mulI, + float mulP, + float mulT, + float mulAlpha)
    +
    +
    Given a packed float IPT color, this edits its intensity, protan, tritan, and alpha channels by first + multiplying each channel by the corresponding "mul" parameter and then adding the corresponding "add" parameter, + before clamping.
    +
    +
    static float
    enrich​(float start, float change)
    @@ -329,7 +354,7 @@

    Method Summary

    Interpolates from the packed float color start towards a warmer color (orange to magenta) by change.
    static float
    -
    randomColor​(Random random)
    +
    randomColor​(Random random)
    Produces a random packed float color that is always in-gamut and should be uniformly distributed.
    @@ -407,8 +432,8 @@

    Method Summary

    -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    @@ -1191,9 +1216,71 @@

    limitToGamut

  • +
    +

    editIPT

    +
    public static float editIPT(float encoded, + float addI, + float addP, + float addT, + float addAlpha)
    +
    Given a packed float IPT color, this edits its intensity, protan, tritan, and alpha channels by adding the + corresponding "add" parameter and then clamping. This returns a different float value (of course, the given float + can't be edited in-place). You can give a value of 0 for any "add" parameter you want to stay unchanged. This + clamps the resulting color to remain in-gamut, so it should be safe to convert it back to RGBA.
    +
    +
    Parameters:
    +
    encoded - a packed float IPT color
    +
    addI - how much to add to the intensity channel; typically in the -1 to 1 range
    +
    addP - how much to add to the protan channel; typically in the -2 to 2 range
    +
    addT - how much to add to the tritan channel; typically in the -2 to 2 range
    +
    addAlpha - how much to add to the alpha channel; typically in the -1 to 1 range
    +
    Returns:
    +
    a packed float IPT color with the requested edits applied to encoded
    +
    +
    +
  • +
  • +
    +

    editIPT

    +
    public static float editIPT(float encoded, + float addI, + float addP, + float addT, + float addAlpha, + float mulI, + float mulP, + float mulT, + float mulAlpha)
    +
    Given a packed float IPT color, this edits its intensity, protan, tritan, and alpha channels by first + multiplying each channel by the corresponding "mul" parameter and then adding the corresponding "add" parameter, + before clamping. This means the intensity value is multiplied by mulI, then has addI added, and + then is clamped to the normal range for intensity (0 to 1). This returns a different float value (of course, the + given float can't be edited in-place). You can give a value of 0 for any "add" parameter you want to stay + unchanged, or a value of 1 for any "mul" parameter that shouldn't change. Note that this manipulates protan and + tritan in the -1 to 1 range, so if you multiply by a small number like 0.25f, then this will produce a + less-saturated color, and if you multiply by a larger number like 4f, then you will get a much + more-saturated color. This clamps the resulting color to remain in-gamut, so it should be safe to convert it back + to RGBA.
    +
    +
    Parameters:
    +
    encoded - a packed float IPT color
    +
    addI - how much to add to the intensity channel; typically in the -1 to 1 range
    +
    addP - how much to add to the protan channel; typically in the -2 to 2 range
    +
    addT - how much to add to the tritan channel; typically in the -2 to 2 range
    +
    addAlpha - how much to add to the alpha channel; typically in the -1 to 1 range
    +
    mulI - how much to multiply the intensity channel by; should be non-negative
    +
    mulP - how much to multiply the protan channel by; usually non-negative (not always)
    +
    mulT - how much to multiply the tritan channel by; usually non-negative (not always)
    +
    mulAlpha - how much to multiply the alpha channel by; should be non-negative
    +
    Returns:
    +
    a packed float IPT color with the requested edits applied to encoded
    +
    +
    +
  • +
  • fromHSI

    -
    public static float fromHSI(float packed)
    +
    public static float fromHSI(float packed)
    Converts from a packed float in HSI format to a packed float in IPT format.
    Parameters:
    @@ -1206,7 +1293,7 @@

    fromHSI

  • fromHSI

    -
    public static float fromHSI(float hue, +
    public static float fromHSI(float hue, float saturation, float intensity, float alpha)
    @@ -1226,7 +1313,7 @@

    fromHSI

  • randomColor

    -
    public static float randomColor(Random random)
    +
    public static float randomColor(Random random)
    Produces a random packed float color that is always in-gamut and should be uniformly distributed.
    Parameters:
    @@ -1239,7 +1326,7 @@

    randomColor

  • subrandomColor

    -
    public static float subrandomColor(float r, +
    public static float subrandomColor(float r, float g, float b)
    Limited-use; like randomColor(Random) but for cases where you already have three floats (r, g, and b) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt/Palette.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt/Palette.html index c618113f..203991ed 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt/Palette.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt/Palette.html @@ -3,7 +3,7 @@ -Palette (colorful-pure 0.5.2-SNAPSHOT API) +Palette (colorful-pure 0.6.0 API) @@ -70,13 +70,13 @@

    Class Palette

    -
    java.lang.Object +
    java.lang.Object
    com.github.tommyettinger.colorful.pure.ipt.Palette

    public class Palette -extends Object
    +extends Object
    A palette of predefined colors as packed IPT floats, the kind ColorTools works with. You can access colors by their constant name, such as OCEAN_BLUE, by the NAMED map using NAMED.get("Ocean Blue", 0f), or by index in the FloatArray called LIST. Note that to access a float @@ -837,21 +837,21 @@

    Field Summary

    This color constant "Mush" has RGBA8888 code B1B10AFF, intensity 0.5411765, protan 0.4745098, tritan 0.80784315, alpha 1.0, hue 0.16913939, and saturation 0.6568773.
    -
    static com.github.tommyettinger.ds.ObjectFloatOrderedMap<String>
    +
    static com.github.tommyettinger.ds.ObjectFloatOrderedMap<String>
     
    -
    static com.github.tommyettinger.ds.ObjectList<String>
    +
    static com.github.tommyettinger.ds.ObjectList<String>
    All names for colors in this palette, in alphabetical order.
    -
    static com.github.tommyettinger.ds.ObjectList<String>
    +
    static com.github.tommyettinger.ds.ObjectList<String>
    All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to blue.
    -
    static com.github.tommyettinger.ds.ObjectList<String>
    +
    static com.github.tommyettinger.ds.ObjectList<String>
    All names for colors in this palette, sorted by lightness from black to white.
    @@ -1422,8 +1422,8 @@

    Constructor Summary

    Method Summary

    -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • @@ -1438,7 +1438,7 @@

    Field Details

  • NAMED

    -
    public static final com.github.tommyettinger.ds.ObjectFloatOrderedMap<String> NAMED
    +
    public static final com.github.tommyettinger.ds.ObjectFloatOrderedMap<String> NAMED
  • @@ -5802,7 +5802,7 @@

    RASPBERRY

  • NAMES

    -
    public static final com.github.tommyettinger.ds.ObjectList<String> NAMES
    +
    public static final com.github.tommyettinger.ds.ObjectList<String> NAMES
    All names for colors in this palette, in alphabetical order. You can fetch the corresponding packed float color by looking up a name in NAMED.
    @@ -5810,7 +5810,7 @@

    NAMES

  • NAMES_BY_HUE

    -
    public static final com.github.tommyettinger.ds.ObjectList<String> NAMES_BY_HUE
    +
    public static final com.github.tommyettinger.ds.ObjectList<String> NAMES_BY_HUE
    All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to blue. You can fetch the corresponding packed float color by looking up a name in NAMED.
    @@ -5818,7 +5818,7 @@

    NAMES_BY_HUE

  • NAMES_BY_LIGHTNESS

    -
    public static final com.github.tommyettinger.ds.ObjectList<String> NAMES_BY_LIGHTNESS
    +
    public static final com.github.tommyettinger.ds.ObjectList<String> NAMES_BY_LIGHTNESS
    All names for colors in this palette, sorted by lightness from black to white. You can fetch the corresponding packed float color by looking up a name in NAMED.
    diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt/class-use/ColorTools.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt/class-use/ColorTools.html index 41d7270b..c545f776 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt/class-use/ColorTools.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt/class-use/ColorTools.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.pure.ipt.ColorTools (colorful-pure 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.pure.ipt.ColorTools (colorful-pure 0.6.0 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt/class-use/Palette.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt/class-use/Palette.html index 8de35128..626b6825 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt/class-use/Palette.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt/class-use/Palette.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.pure.ipt.Palette (colorful-pure 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.pure.ipt.Palette (colorful-pure 0.6.0 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt/package-summary.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt/package-summary.html index d2577955..b81c799c 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt/package-summary.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt/package-summary.html @@ -3,7 +3,7 @@ -com.github.tommyettinger.colorful.pure.ipt (colorful-pure 0.5.2-SNAPSHOT API) +com.github.tommyettinger.colorful.pure.ipt (colorful-pure 0.6.0 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt/package-tree.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt/package-tree.html index 04f44060..c4f94640 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt/package-tree.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt/package-tree.html @@ -3,7 +3,7 @@ -com.github.tommyettinger.colorful.pure.ipt Class Hierarchy (colorful-pure 0.5.2-SNAPSHOT API) +com.github.tommyettinger.colorful.pure.ipt Class Hierarchy (colorful-pure 0.6.0 API) @@ -60,7 +60,7 @@

    Hierarchy For Package com.github.tommyettinger.colorful.pure.i

    Class Hierarchy

      -
    • java.lang.Object +
    • java.lang.Object
      • com.github.tommyettinger.colorful.pure.ipt.ColorTools
      • com.github.tommyettinger.colorful.pure.ipt.Palette
      • diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt/package-use.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt/package-use.html index c636e931..04a80fa2 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt/package-use.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt/package-use.html @@ -3,7 +3,7 @@ -Uses of Package com.github.tommyettinger.colorful.pure.ipt (colorful-pure 0.5.2-SNAPSHOT API) +Uses of Package com.github.tommyettinger.colorful.pure.ipt (colorful-pure 0.6.0 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/ColorTools.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/ColorTools.html index 2cb81606..f3f09747 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/ColorTools.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/ColorTools.html @@ -3,7 +3,7 @@ -ColorTools (colorful-pure 0.5.2-SNAPSHOT API) +ColorTools (colorful-pure 0.6.0 API) @@ -74,13 +74,13 @@

        Class ColorTools

  • -
    java.lang.Object +
    java.lang.Object
    com.github.tommyettinger.colorful.pure.ipt_hq.ColorTools

    public class ColorTools -extends Object
    +extends Object
    Contains code for manipulating colors as int and packed float values in the IPT color space. IPT has more perceptually-uniform handling of hue than some other color spaces, like YCwCm, and this version goes further than the IPT package by performing gamma correction and all the @@ -162,6 +162,31 @@

    Method Summary

    Brings the chromatic components of start closer to grayscale by change (desaturating them).
    static float
    +
    editIPT​(float encoded, + float addI, + float addP, + float addT, + float addAlpha)
    +
    +
    Given a packed float IPT_HQ color, this edits its intensity, protan, tritan, and alpha channels by adding the + corresponding "add" parameter and then clamping.
    +
    +
    static float
    +
    editIPT​(float encoded, + float addI, + float addP, + float addT, + float addAlpha, + float mulI, + float mulP, + float mulT, + float mulAlpha)
    +
    +
    Given a packed float IPT_HQ color, this edits its intensity, protan, tritan, and alpha channels by first + multiplying each channel by the corresponding "mul" parameter and then adding the corresponding "add" parameter, + before clamping.
    +
    +
    static float
    enrich​(float start, float change)
    @@ -270,7 +295,7 @@

    Method Summary

    static float
    limitToGamut​(float packed)
    -
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it +
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to grayscale if it isn't in-gamut, or returns it as soon as it is in-gamut.
    static float
    @@ -278,7 +303,7 @@

    Method Summary

    float p, float t)
    -
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it +
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to grayscale if it isn't in-gamut, or returns it as soon as it is in-gamut.
    static float
    @@ -287,7 +312,7 @@

    Method Summary

    float t, float a)
    -
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it +
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to grayscale if it isn't in-gamut, or returns it as soon as it is in-gamut.
    static float
    @@ -315,7 +340,7 @@

    Method Summary

    Interpolates from the packed float color start towards a warmer color (orange to magenta) by change.
    static float
    -
    randomColor​(Random random)
    +
    randomColor​(Random random)
    Produces a random packed float color that is always in-gamut and should be uniformly distributed.
    @@ -385,8 +410,8 @@

    Method Summary

  • -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    @@ -1137,14 +1162,15 @@

    inGamut

  • limitToGamut

    -
    public static float limitToGamut(float packed)
    -
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it - isn't in-gamut, or returns it as soon as it is in-gamut.
    +
    public static float limitToGamut(float packed)
    +
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to grayscale if it + isn't in-gamut, or returns it as soon as it is in-gamut. Maintains the intensity of the color, only bringing + protan and tritan closer to grayscale.
    Parameters:
    packed - a packed float color in IPT format; often this color is not in-gamut
    Returns:
    -
    the first color this finds that is between the given IPT color and 50% gray, and is in-gamut
    +
    the first color this finds that is between the given IPT color and grayscale, and is in-gamut
    See Also:
    You can use inGamut() if you just want to check whether a color is in-gamut.
    @@ -1153,18 +1179,19 @@

    limitToGamut

  • limitToGamut

    -
    public static float limitToGamut(float i, +
    public static float limitToGamut(float i, float p, float t)
    -
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it - isn't in-gamut, or returns it as soon as it is in-gamut. This always produces an opaque color.
    +
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to grayscale if it + isn't in-gamut, or returns it as soon as it is in-gamut. Maintains the intensity of the color, only bringing + protan and tritan closer to grayscale. This always produces an opaque color.
    Parameters:
    i - intensity component; will be clamped between 0 and 1 if it isn't already
    p - protan component; will be clamped between 0 and 1 if it isn't already
    t - tritan component; will be clamped between 0 and 1 if it isn't already
    Returns:
    -
    the first color this finds that is between the given IPT color and 50% gray, and is in-gamut
    +
    the first color this finds that is between the given IPT color and grayscale, and is in-gamut
    See Also:
    You can use inGamut() if you just want to check whether a color is in-gamut.
    @@ -1173,12 +1200,13 @@

    limitToGamut

  • limitToGamut

    -
    public static float limitToGamut(float i, +
    public static float limitToGamut(float i, float p, float t, float a)
    -
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it - isn't in-gamut, or returns it as soon as it is in-gamut.
    +
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to grayscale if it + isn't in-gamut, or returns it as soon as it is in-gamut. Maintains the intensity of the color, only bringing + protan and tritan closer to grayscale.
    Parameters:
    i - intensity component; will be clamped between 0 and 1 if it isn't already
    @@ -1186,16 +1214,78 @@

    limitToGamut

    t - tritan component; will be clamped between 0 and 1 if it isn't already
    a - alpha component; will be clamped between 0 and 1 if it isn't already
    Returns:
    -
    the first color this finds that is between the given IPT color and 50% gray, and is in-gamut
    +
    the first color this finds that is between the given IPT color and grayscale, and is in-gamut
    See Also:
    You can use inGamut() if you just want to check whether a color is in-gamut.
  • +
    +

    editIPT

    +
    public static float editIPT(float encoded, + float addI, + float addP, + float addT, + float addAlpha)
    +
    Given a packed float IPT_HQ color, this edits its intensity, protan, tritan, and alpha channels by adding the + corresponding "add" parameter and then clamping. This returns a different float value (of course, the given float + can't be edited in-place). You can give a value of 0 for any "add" parameter you want to stay unchanged. This + clamps the resulting color to remain in-gamut, so it should be safe to convert it back to RGBA.
    +
    +
    Parameters:
    +
    encoded - a packed float IPT_HQ color
    +
    addI - how much to add to the intensity channel; typically in the -1 to 1 range
    +
    addP - how much to add to the protan channel; typically in the -2 to 2 range
    +
    addT - how much to add to the tritan channel; typically in the -2 to 2 range
    +
    addAlpha - how much to add to the alpha channel; typically in the -1 to 1 range
    +
    Returns:
    +
    a packed float IPT_HQ color with the requested edits applied to encoded
    +
    +
    +
  • +
  • +
    +

    editIPT

    +
    public static float editIPT(float encoded, + float addI, + float addP, + float addT, + float addAlpha, + float mulI, + float mulP, + float mulT, + float mulAlpha)
    +
    Given a packed float IPT_HQ color, this edits its intensity, protan, tritan, and alpha channels by first + multiplying each channel by the corresponding "mul" parameter and then adding the corresponding "add" parameter, + before clamping. This means the intensity value is multiplied by mulI, then has addI added, and + then is clamped to the normal range for intensity (0 to 1). This returns a different float value (of course, the + given float can't be edited in-place). You can give a value of 0 for any "add" parameter you want to stay + unchanged, or a value of 1 for any "mul" parameter that shouldn't change. Note that this manipulates protan and + tritan in the -1 to 1 range, so if you multiply by a small number like 0.25f, then this will produce a + less-saturated color, and if you multiply by a larger number like 4f, then you will get a much + more-saturated color. This clamps the resulting color to remain in-gamut, so it should be safe to convert it back + to RGBA.
    +
    +
    Parameters:
    +
    encoded - a packed float IPT_HQ color
    +
    addI - how much to add to the intensity channel; typically in the -1 to 1 range
    +
    addP - how much to add to the protan channel; typically in the -2 to 2 range
    +
    addT - how much to add to the tritan channel; typically in the -2 to 2 range
    +
    addAlpha - how much to add to the alpha channel; typically in the -1 to 1 range
    +
    mulI - how much to multiply the intensity channel by; should be non-negative
    +
    mulP - how much to multiply the protan channel by; usually non-negative (not always)
    +
    mulT - how much to multiply the tritan channel by; usually non-negative (not always)
    +
    mulAlpha - how much to multiply the alpha channel by; should be non-negative
    +
    Returns:
    +
    a packed float IPT_HQ color with the requested edits applied to encoded
    +
    +
    +
  • +
  • randomColor

    -
    public static float randomColor(Random random)
    +
    public static float randomColor(Random random)
    Produces a random packed float color that is always in-gamut and should be uniformly distributed.
    Parameters:
    diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/Palette.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/Palette.html index 02af150d..f8913c96 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/Palette.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/Palette.html @@ -3,7 +3,7 @@ -Palette (colorful-pure 0.5.2-SNAPSHOT API) +Palette (colorful-pure 0.6.0 API) @@ -70,13 +70,13 @@

    Class Palette

  • -
    java.lang.Object +
    java.lang.Object
    com.github.tommyettinger.colorful.pure.ipt_hq.Palette

    public class Palette -extends Object
    +extends Object
    A palette of predefined colors as packed IPT floats, the kind ColorTools works with. You can access colors by their constant name, such as OCEAN_BLUE, by the NAMED map using NAMED.get("Ocean Blue", 0f), or by index in the FloatArray called LIST. Note that to access a float @@ -837,21 +837,21 @@

    Field Summary

    This color constant "Mush" has RGBA8888 code B1B10AFF, intensity 0.627451, protan 0.45882353, tritan 0.7372549, alpha 1.0, hue 0.16808262, and saturation 0.6667582.
    -
    static com.github.tommyettinger.ds.ObjectFloatOrderedMap<String>
    +
    static com.github.tommyettinger.ds.ObjectFloatOrderedMap<String>
     
    -
    static com.github.tommyettinger.ds.ObjectList<String>
    +
    static com.github.tommyettinger.ds.ObjectList<String>
    All names for colors in this palette, in alphabetical order.
    -
    static com.github.tommyettinger.ds.ObjectList<String>
    +
    static com.github.tommyettinger.ds.ObjectList<String>
    All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to blue.
    -
    static com.github.tommyettinger.ds.ObjectList<String>
    +
    static com.github.tommyettinger.ds.ObjectList<String>
    All names for colors in this palette, sorted by lightness from black to white.
    @@ -1422,8 +1422,8 @@

    Constructor Summary

    Method Summary

    -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • @@ -1438,7 +1438,7 @@

    Field Details

  • NAMED

    -
    public static final com.github.tommyettinger.ds.ObjectFloatOrderedMap<String> NAMED
    +
    public static final com.github.tommyettinger.ds.ObjectFloatOrderedMap<String> NAMED
  • @@ -5802,7 +5802,7 @@

    RASPBERRY

  • NAMES

    -
    public static final com.github.tommyettinger.ds.ObjectList<String> NAMES
    +
    public static final com.github.tommyettinger.ds.ObjectList<String> NAMES
    All names for colors in this palette, in alphabetical order. You can fetch the corresponding packed float color by looking up a name in NAMED.
    @@ -5810,7 +5810,7 @@

    NAMES

  • NAMES_BY_HUE

    -
    public static final com.github.tommyettinger.ds.ObjectList<String> NAMES_BY_HUE
    +
    public static final com.github.tommyettinger.ds.ObjectList<String> NAMES_BY_HUE
    All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to blue. You can fetch the corresponding packed float color by looking up a name in NAMED.
    @@ -5818,7 +5818,7 @@

    NAMES_BY_HUE

  • NAMES_BY_LIGHTNESS

    -
    public static final com.github.tommyettinger.ds.ObjectList<String> NAMES_BY_LIGHTNESS
    +
    public static final com.github.tommyettinger.ds.ObjectList<String> NAMES_BY_LIGHTNESS
    All names for colors in this palette, sorted by lightness from black to white. You can fetch the corresponding packed float color by looking up a name in NAMED.
    diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/SimplePalette.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/SimplePalette.html index da3d6250..0902e028 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/SimplePalette.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/SimplePalette.html @@ -3,7 +3,7 @@ -SimplePalette (colorful-pure 0.5.2-SNAPSHOT API) +SimplePalette (colorful-pure 0.6.0 API) @@ -74,13 +74,13 @@

    Class SimplePalette

  • -
    java.lang.Object +
    java.lang.Object
    com.github.tommyettinger.colorful.pure.ipt_hq.SimplePalette

    public class SimplePalette -extends Object
    +extends Object
    A palette of predefined colors as packed IPT floats, the kind ColorTools works with. You can access colors by their constant name, such as OCEAN_BLUE, by the NAMED map using NAMED.get("Ocean Blue", 0f), or by index in the FloatArray called LIST. Note that to access a float @@ -103,7 +103,7 @@

    Field Summary

    Modifier and Type
    Field
    Description
    -
    static com.github.tommyettinger.ds.ObjectFloatOrderedMap<String>
    +
    static com.github.tommyettinger.ds.ObjectFloatOrderedMap<String>
    Stores alternative names for colors in NAMED, like "grey" as an alias for GRAY or "gold" as an @@ -254,23 +254,23 @@

    Field Summary

    This color constant "moss" has RGBA8888 code 204608FF, intensity 0.25882354, protan 0.4392157, tritan 0.5882353, alpha 1.0, hue 0.27203476, and saturation 0.241091.
    -
    static com.github.tommyettinger.ds.ObjectFloatOrderedMap<String>
    +
    static com.github.tommyettinger.ds.ObjectFloatOrderedMap<String>
    You can look up colors by name here; the names are lower-case, and the colors are packed floats in rgba format.
    -
    static com.github.tommyettinger.ds.ObjectList<String>
    +
    static com.github.tommyettinger.ds.ObjectList<String>
    All names for colors in this palette, in alphabetical order.
    -
    static com.github.tommyettinger.ds.ObjectList<String>
    +
    static com.github.tommyettinger.ds.ObjectList<String>
    All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to blue.
    -
    static com.github.tommyettinger.ds.ObjectList<String>
    +
    static com.github.tommyettinger.ds.ObjectList<String>
    All names for colors in this palette, sorted by lightness from black to white.
    @@ -417,7 +417,7 @@

    Method Summary

    Modifier and Type
    Method
    Description
    -
    static String
    +
    static String
    bestMatch​(float ipt_hq, int mixCount)
    @@ -425,7 +425,7 @@

    Method Summary

    using at most mixCount colors to mix in.
    static float
    -
    parseDescription​(String description)
    +
    parseDescription​(String description)
    Parses a color description and returns the approximate color it describes, as a packed float color.
    @@ -433,8 +433,8 @@

    Method Summary

    -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    @@ -449,14 +449,14 @@

    Field Details

  • NAMED

    -
    public static final com.github.tommyettinger.ds.ObjectFloatOrderedMap<String> NAMED
    +
    public static final com.github.tommyettinger.ds.ObjectFloatOrderedMap<String> NAMED
    You can look up colors by name here; the names are lower-case, and the colors are packed floats in rgba format.
  • ALIASES

    -
    public static final com.github.tommyettinger.ds.ObjectFloatOrderedMap<String> ALIASES
    +
    public static final com.github.tommyettinger.ds.ObjectFloatOrderedMap<String> ALIASES
    Stores alternative names for colors in NAMED, like "grey" as an alias for GRAY or "gold" as an alias for SAFFRON. Currently, the list of aliases is as follows:
      @@ -1334,7 +1334,7 @@

      RASPBERRY

    • NAMES

      -
      public static final com.github.tommyettinger.ds.ObjectList<String> NAMES
      +
      public static final com.github.tommyettinger.ds.ObjectList<String> NAMES
      All names for colors in this palette, in alphabetical order. You can fetch the corresponding packed float color by looking up a name in NAMED.
      @@ -1342,7 +1342,7 @@

      NAMES

    • NAMES_BY_HUE

      -
      public static final com.github.tommyettinger.ds.ObjectList<String> NAMES_BY_HUE
      +
      public static final com.github.tommyettinger.ds.ObjectList<String> NAMES_BY_HUE
      All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to blue. You can fetch the corresponding packed float color by looking up a name in NAMED.
      @@ -1357,7 +1357,7 @@

      COLORS_BY_HUE

    • NAMES_BY_LIGHTNESS

      -
      public static final com.github.tommyettinger.ds.ObjectList<String> NAMES_BY_LIGHTNESS
      +
      public static final com.github.tommyettinger.ds.ObjectList<String> NAMES_BY_LIGHTNESS
      All names for colors in this palette, sorted by lightness from black to white. You can fetch the corresponding packed float color by looking up a name in NAMED.
      @@ -1387,7 +1387,7 @@

      Method Details

    • parseDescription

      -
      public static float parseDescription(String description)
      +
      public static float parseDescription(String description)
      Parses a color description and returns the approximate color it describes, as a packed float color. Color descriptions consist of one or more lower-case words, separated by non-alphabetical characters (typically spaces and/or hyphens). Any word that is the name of a color in this SimplePalette will be looked up in @@ -1414,7 +1414,7 @@

      parseDescription

    • bestMatch

      -
      public static String bestMatch(float ipt_hq, +
      public static String bestMatch(float ipt_hq, int mixCount)
      Given a color as a packed IPT_HQ float, this finds the closest description it can to match the given color while using at most mixCount colors to mix in. You should only use small numbers for mixCount, like 1 to 3; diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/class-use/ColorTools.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/class-use/ColorTools.html index 7b87012c..a21809be 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/class-use/ColorTools.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/class-use/ColorTools.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.pure.ipt_hq.ColorTools (colorful-pure 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.pure.ipt_hq.ColorTools (colorful-pure 0.6.0 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/class-use/Palette.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/class-use/Palette.html index 8f018e96..4af62556 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/class-use/Palette.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/class-use/Palette.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.pure.ipt_hq.Palette (colorful-pure 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.pure.ipt_hq.Palette (colorful-pure 0.6.0 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/class-use/SimplePalette.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/class-use/SimplePalette.html index 1f1b379c..ac48c3c5 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/class-use/SimplePalette.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/class-use/SimplePalette.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.pure.ipt_hq.SimplePalette (colorful-pure 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.pure.ipt_hq.SimplePalette (colorful-pure 0.6.0 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/package-summary.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/package-summary.html index bb24ad75..718205a3 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/package-summary.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/package-summary.html @@ -3,7 +3,7 @@ -com.github.tommyettinger.colorful.pure.ipt_hq (colorful-pure 0.5.2-SNAPSHOT API) +com.github.tommyettinger.colorful.pure.ipt_hq (colorful-pure 0.6.0 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/package-tree.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/package-tree.html index c31b5600..c2b2c5da 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/package-tree.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/package-tree.html @@ -3,7 +3,7 @@ -com.github.tommyettinger.colorful.pure.ipt_hq Class Hierarchy (colorful-pure 0.5.2-SNAPSHOT API) +com.github.tommyettinger.colorful.pure.ipt_hq Class Hierarchy (colorful-pure 0.6.0 API) @@ -60,7 +60,7 @@

      Hierarchy For Package com.github.tommyettinger.colorful.pure.i

      Class Hierarchy

        -
      • java.lang.Object +
      • java.lang.Object
        • com.github.tommyettinger.colorful.pure.ipt_hq.ColorTools
        • com.github.tommyettinger.colorful.pure.ipt_hq.Palette
        • diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/package-use.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/package-use.html index 5aa683d6..edc0f0e3 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/package-use.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ipt_hq/package-use.html @@ -3,7 +3,7 @@ -Uses of Package com.github.tommyettinger.colorful.pure.ipt_hq (colorful-pure 0.5.2-SNAPSHOT API) +Uses of Package com.github.tommyettinger.colorful.pure.ipt_hq (colorful-pure 0.6.0 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/ColorTools.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/ColorTools.html index 66c7f79d..8056b8df 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/ColorTools.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/ColorTools.html @@ -3,7 +3,7 @@ -ColorTools (colorful-pure 0.5.2-SNAPSHOT API) +ColorTools (colorful-pure 0.6.0 API) @@ -74,13 +74,13 @@

          Class ColorTools

      -
      java.lang.Object +
      java.lang.Object
      com.github.tommyettinger.colorful.pure.oklab.ColorTools

      -
      public class ColorTools -extends Object
      +
      public class ColorTools +extends Object
      Contains code for manipulating colors as int and packed float values in the Oklab color space. Oklab is a very new color space that builds on the same foundation as IPT, but seems to be better-calibrated for uniform lightness and colorfulness, instead of just the emphasis on uniform hue that IPT has. Relative to IPT, Oklab @@ -171,191 +171,255 @@

      Method Summary

      Gets the "chroma" or "colorfulness" of a given Oklab color.
      static float
      -
      darken​(float start, - float change)
      +
      chromaLimit​(float hue, + float lightness)
      -
      Interpolates from the packed float color start towards black by change.
      +
      Given a hue and lightness, this gets the (approximate) maximum chroma possible for that hue-lightness + combination.
      static float
      -
      differentiateLightness​(float mainColor, - float contrastingColor)
      +
      darken​(float start, + float change)
      +
      Interpolates from the packed float color start towards black by change.
      +
      +
      static float
      +
      differentiateLightness​(float mainColor, + float contrastingColor)
      +
      Given a packed float Oklab color mainColor and another Oklab color that it should be made to contrast with, gets a packed float Oklab color with L that should be quite different from contrastingColor's L, but the same chromatic channels and opacity (A and B are likely to be clamped if the result gets close to white or black).
      -
      static float
      -
      dullen​(float start, +
      static float
      +
      dullen​(float start, float change)
      -
      +
      Brings the chromatic components of start closer to grayscale by change (desaturating them).
      +
      static float
      +
      editOklab​(float encoded, + float addL, + float addA, + float addB, + float addAlpha)
      +
      +
      Given a packed float Oklab color, this edits its L, A, B, and alpha channels by adding the corresponding "add" + parameter and then clamping.
      +
      static float
      -
      enrich​(float start, - float change)
      +
      editOklab​(float encoded, + float addL, + float addA, + float addB, + float addAlpha, + float mulL, + float mulA, + float mulB, + float mulAlpha)
      -
      Pushes the chromatic components of start away from grayscale by change (saturating them).
      +
      Given a packed float Oklab color, this edits its L, A, B, and alpha channels by first multiplying each channel by + the corresponding "mul" parameter and then adding the corresponding "add" parameter, before clamping.
      static float
      -
      fade​(float start, +
      enrich​(float start, float change)
      -
      Interpolates from the packed float color start towards transparent by change.
      +
      Pushes the chromatic components of start away from grayscale by change (saturating them).
      static float
      -
      floatGetHSL​(float hue, +
      fade​(float start, + float change)
      +
      +
      Interpolates from the packed float color start towards transparent by change.
      +
      +
      static float
      +
      floatGetHSL​(float hue, float saturation, float lightness, float opacity)
      -
      +
      Gets a color as an Oklab packed float given floats representing hue, saturation, lightness, and opacity.
      -
      static float
      -
      fromRGBA​(float packed)
      -
      +
      static float
      +
      fromRGBA​(float packed)
      +
      Takes a color encoded as an RGBA8888 packed float and converts to a packed float in the Oklab format this uses.
      -
      static float
      -
      fromRGBA​(float r, +
      static float
      +
      fromRGBA​(float r, float g, float b, float a)
      -
      +
      Takes RGBA components from 0.0 to 1.0 each and converts to a packed float in the Oklab format this uses.
      -
      static float
      -
      fromRGBA8888​(int rgba)
      -
      +
      static float
      +
      fromRGBA8888​(int rgba)
      +
      Takes a color encoded as an RGBA8888 int and converts to a packed float in the Oklab format this uses.
      -
      static byte
      -
      getRawGamutValue​(int index)
      -
      +
      static byte
      +
      getRawGamutValue​(int index)
      +
      Given a 1D int index between 0 and 65535 (both inclusive), this treats the 1D index as two parts (lightness and hue angle, both from 0 to 255) and gets the distance from grayscale to the edge of the gamut at that lightness and hue.
      -
      static float
      -
      green​(float encoded)
      -
      +
      static float
      +
      green​(float encoded)
      +
      Gets the green channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
      -
      static int
      -
      greenInt​(float encoded)
      -
      +
      static int
      +
      greenInt​(float encoded)
      +
      Gets the green channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
      -
      static float
      -
      hue​(float encoded)
      -
      +
      static float
      +
      hue​(float encoded)
      +
      Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased) to 1f (exclusive, red and approaching purple if decreased).
      -
      static boolean
      -
      inGamut​(float packed)
      -
      +
      static boolean
      +
      inGamut​(float packed)
      +
      Returns true if the given packed float color, as Oklab, is valid to convert losslessly back to RGBA.
      -
      static boolean
      -
      inGamut​(float L, +
      static boolean
      +
      inGamut​(float L, float A, float B)
      -
      +
      Returns true if the given Oklab values are valid to convert losslessly back to RGBA.
      -
      static float
      -
      inverseLightness​(float mainColor, +
      static float
      +
      inverseLightness​(float mainColor, float contrastingColor)
      -
      +
      Given a packed float Oklab color mainColor and another Oklab color that it should be made to contrast with, gets a packed float Oklab color with roughly inverted L but the same chromatic channels and opacity (A and B are likely to be clamped if the result gets close to white or black).
      -
      static float
      -
      lessenChange​(float color, +
      static float
      +
      lessenChange​(float color, float fraction)
      -
      +
      Makes the additive Oklab color stored in color cause less of a change when used as a tint, as if it were mixed with neutral gray.
      -
      static float
      -
      lighten​(float start, - float change)
      -
      -
      Interpolates from the packed float color start towards white by change.
      -
      static float
      -
      lightness​(float encoded)
      +
      lighten​(float start, + float change)
      -
      Defined as per HSL; normally you only need channelL(float) to get accurate lightness for Oklab.
      +
      Interpolates from the packed float color start towards white by change.
      static float
      -
      limitToGamut​(float packed)
      +
      lightness​(float encoded)
      -
      Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside - the gamut at the same lightness, or if it is already in-gamut, returns the color as-is.
      +
      Defined as per HSL; normally you only need channelL(float) to get accurate lightness for Oklab.
      static float
      -
      limitToGamut​(float L, - float A, - float B)
      +
      limitToGamut​(float packed)
      Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside the gamut at the same lightness, or if it is already in-gamut, returns the color as-is.
      static float
      -
      limitToGamut​(float L, +
      limitToGamut​(float L, float A, - float B, - float alpha)
      + float B)
      Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside the gamut at the same lightness, or if it is already in-gamut, returns the color as-is.
      static float
      -
      lowerA​(float start, - float change)
      +
      limitToGamut​(float L, + float A, + float B, + float alpha)
      -
      Interpolates from the packed float color start towards a cooler color (green to blue) by change.
      +
      Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside + the gamut at the same lightness, or if it is already in-gamut, returns the color as-is.
      static float
      -
      lowerB​(float start, +
      lowerA​(float start, float change)
      -
      Interpolates from the packed float color start towards an "artificial" color (between blue and purple) by change.
      +
      Interpolates from the packed float color start towards a cooler color (green to blue) by change.
      static float
      -
      maximizeSaturation​(float packed)
      +
      lowerB​(float start, + float change)
      +
      Interpolates from the packed float color start towards an "artificial" color (between blue and purple) by change.
      +
      +
      static float
      +
      maximizeSaturation​(float packed)
      +
      Gets the color with the same L as the Oklab color stored in the given packed float, but the furthest A B from gray possible for that lightness while keeping the same hue as the given color.
      -
      static float
      -
      maximizeSaturation​(float L, +
      static float
      +
      maximizeSaturation​(float L, float A, float B, float alpha)
      -
      +
      Gets the color with the same L as the Oklab color stored in the given packed float, but the furthest A B from gray possible for that lightness while keeping the same hue as the given color.
      -
      static float
      -
      offsetLightness​(float mainColor)
      -
      +
      static float
      +
      offsetLightness​(float mainColor)
      +
      Pretty simple; adds 0.5 to the given color's L and wraps it around if it would go above 1.0, then averages that with the original L.
      -
      static float
      -
      oklab​(float l, +
      static float
      +
      oklab​(float l, float a, float b, float alpha)
      -
      +
      Gets a packed float representation of a color given as 4 float components, here, L (luminance or lightness), A (a chromatic component ranging from greenish to reddish, called protan in IPT), B (a chromatic component ranging from bluish to yellowish, called tritan in IPT), and alpha (or opacity).
      +
      static float
      +
      oklabByHCL​(float hue, + float chroma, + float lightness, + float alpha)
      +
      +
      A different way to specify an Oklab color, using hue, chroma, lightness, and alpha something like a normal HSL(A) + color but calculating them directly in the Oklab color space.
      +
      +
      static float
      +
      oklabByHSL​(float hue, + float saturation, + float lightness, + float alpha)
      +
      +
      A different way to specify an Oklab color, using hue, saturation, lightness, and alpha like a normal HSL(A) color + but calculating them directly in the Oklab color space.
      +
      +
      static float
      +
      oklabHue​(float packed)
      +
      +
      Gets the hue of the given Oklab float color, but as Oklab understands hue rather than how HSL does.
      +
      +
      static float
      +
      oklabLightness​(float packed)
      +
      +
      Gets the lightness of the given Oklab float color, but as Oklab understands lightness rather than how HSL does.
      +
      +
      static float
      +
      oklabSaturation​(float packed)
      +
      +
      Gets the saturation of the given Oklab float color, but as Oklab understands saturation rather than how HSL does.
      +
      static float
      raiseA​(float start, float change)
      @@ -369,7 +433,7 @@

      Method Summary

      Interpolates from the packed float color start towards a "natural" color (between green and orange) by change.
      static float
      -
      randomColor​(Random random)
      +
      randomColor​(Random random)
      Produces a random packed float color that is always in-gamut (and opaque) and should be uniformly distributed.
      @@ -422,8 +486,8 @@

      Method Summary

      -

      Methods inherited from class java.lang.Object

      -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      +

      Methods inherited from class java.lang.Object

      +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    @@ -438,7 +502,7 @@

    Constructor Details

  • ColorTools

    -
    public ColorTools()
    +
    public ColorTools()
  • @@ -452,7 +516,7 @@

    Method Details

  • oklab

    -
    public static float oklab(float l, +
    public static float oklab(float l, float a, float b, float alpha)
    @@ -488,7 +552,7 @@

    oklab

  • toRGBA8888

    -
    public static int toRGBA8888(float packed)
    +
    public static int toRGBA8888(float packed)
    Converts a packed float color in the format produced by oklab(float, float, float, float) to an RGBA8888 int. This format of int can be used with Pixmap and in some other places in libGDX.
    @@ -502,7 +566,7 @@

    toRGBA8888

  • toRGBA

    -
    public static float toRGBA(float packed)
    +
    public static float toRGBA(float packed)
    Converts a packed float color in the format produced by oklab(float, float, float, float) to a packed float in RGBA format. This format of float can be used with the standard SpriteBatch and in some other places in libGDX.
    @@ -517,7 +581,7 @@

    toRGBA

  • fromRGBA8888

    -
    public static float fromRGBA8888(int rgba)
    +
    public static float fromRGBA8888(int rgba)
    Takes a color encoded as an RGBA8888 int and converts to a packed float in the Oklab format this uses.
    Parameters:
    @@ -530,7 +594,7 @@

    fromRGBA8888

  • fromRGBA

    -
    public static float fromRGBA(float packed)
    +
    public static float fromRGBA(float packed)
    Takes a color encoded as an RGBA8888 packed float and converts to a packed float in the Oklab format this uses.
    Parameters:
    @@ -543,7 +607,7 @@

    fromRGBA

  • fromRGBA

    -
    public static float fromRGBA(float r, +
    public static float fromRGBA(float r, float g, float b, float a)
    @@ -562,7 +626,7 @@

    fromRGBA

  • redInt

    -
    public static int redInt(float encoded)
    +
    public static int redInt(float encoded)
    Gets the red channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    Parameters:
    @@ -575,7 +639,7 @@

    redInt

  • greenInt

    -
    public static int greenInt(float encoded)
    +
    public static int greenInt(float encoded)
    Gets the green channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    Parameters:
    @@ -588,7 +652,7 @@

    greenInt

  • blueInt

    -
    public static int blueInt(float encoded)
    +
    public static int blueInt(float encoded)
    Gets the blue channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    Parameters:
    @@ -601,7 +665,7 @@

    blueInt

  • alphaInt

    -
    public static int alphaInt(float encoded)
    +
    public static int alphaInt(float encoded)
    Gets the alpha channel value of the given encoded color, as an even int ranging from 0 to 254, inclusive. Because of how alpha is stored in libGDX, no odd-number values are possible for alpha.
    @@ -615,7 +679,7 @@

    alphaInt

  • red

    -
    public static float red(float encoded)
    +
    public static float red(float encoded)
    Gets the red channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -628,7 +692,7 @@

    red

  • green

    -
    public static float green(float encoded)
    +
    public static float green(float encoded)
    Gets the green channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -641,7 +705,7 @@

    green

  • blue

    -
    public static float blue(float encoded)
    +
    public static float blue(float encoded)
    Gets the blue channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -654,7 +718,7 @@

    blue

  • alpha

    -
    public static float alpha(float encoded)
    +
    public static float alpha(float encoded)
    Gets the alpha channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -667,27 +731,44 @@

    alpha

  • chroma

    -
    public static float chroma(float encoded)
    +
    public static float chroma(float encoded)
    Gets the "chroma" or "colorfulness" of a given Oklab color. Chroma is similar to saturation in that grayscale values have 0 saturation and 0 chroma, while brighter colors have high saturation and chroma. The difference is - that colors that are perceptually more-colorful have higher chroma that colors that are perceptually - less-colorful, regardless of hue, whereas saturation changes its range depending on how colorful a value can be - at its hue. That is, the most saturated color always has a saturation of 1, but if that color isn't perceptually - very colorful, it could have a chroma that is somewhat lower than 1. I don't yet know the range of this function, - other than it can't be negative, grayscale values have 0 chroma, and the most colorful values should be near 1, - maybe as high as the square root of 2.
    + that colors that are perceptually more-colorful have higher chroma than colors that are perceptually + less-colorful, regardless of hue, whereas saturation changes its meaning depending on the hue and lightness. That + is, the most saturated color for a given hue and lightness always has a saturation of 1, but if that color + isn't perceptually very colorful (as is the case for very dark and very light colors), it will have a chroma that + is much lower than the maximum. The result of this method can't be negative, grayscale values have very close to + 0 chroma, and the most colorful values (all very close to magenta) should have 0.31613f chroma.
  • Parameters:
    encoded - a color as a packed float that can be obtained by oklab(float, float, float, float)
    Returns:
    -
    a non-negative float that represents how colorful the given value is
    +
    a float between 0.0f and 0.31613f that represents how colorful the given value is
    +
    +
    +
  • +
  • +
    +

    chromaLimit

    +
    public static float chromaLimit(float hue, + float lightness)
    +
    Given a hue and lightness, this gets the (approximate) maximum chroma possible for that hue-lightness + combination. This is useful to know the bounds of chroma(float). This should be no greater + than 0.31613f .
    +
    +
    Parameters:
    +
    hue - the hue, typically between 0.0f and 1.0f, to look up
    +
    lightness - the lightness, clamped between 0.0f and 1.0f, to look up
    +
    Returns:
    +
    the maximum possible chroma for the given hue and lightness, between 0.0f and 0.31613f
  • floatGetHSL

    -
    public static float floatGetHSL(float hue, +
    public static float floatGetHSL(float hue, float saturation, float lightness, float opacity)
    @@ -698,7 +779,15 @@

    floatGetHSL

    a saturation of 1 is brightly colored, and values close to 1 will usually appear more distinct than values close to 0, especially if the hue is different. A lightness of 0.001f or less is always black (also using a shortcut if this is the case, respecting opacity), while a lightness of 1f is white. Very bright colors are mostly in a band - of high-saturation where lightness is 0.5f.
    + of high-saturation where lightness is 0.5f. +
    + This method considers its hue, saturation, and lightness parameters as the HSL color space does. You may instead + want the method oklabByHSL(float, float, float, float), which treats lightness exactly as Oklab does, + and handles hue and saturation with the Oklab color solid (which is shaped oddly) instead of the HSL color solid + (which is a bicone, with a wide cone pointing up attached at the base to another wide cone pointing down). + Using oklabByHSL() should be faster in many cases, and the lightness handling alone may be a reason to use it. + There is also oklabByHCL(float, float, float, float), which may be preferable if you want a specific + amount of chroma (colorful-ness) and no greater.
  • Parameters:
    hue - 0f to 1f, color wheel position
    @@ -713,9 +802,11 @@

    floatGetHSL

  • saturation

    -
    public static float saturation(float encoded)
    +
    public static float saturation(float encoded)
    Gets the saturation of the given encoded color as HSL would calculate it, as a float ranging from 0.0f to 1.0f, - inclusive. This is different from chroma(float); see that method's documentation for details.
    + inclusive. This is different from chroma(float); see that method's documentation for details. It is also + different from oklabSaturation(float), which gets the saturation as Oklab understands it rather than how + HSL understands it.
  • Parameters:
    encoded - a color as a packed float that can be obtained by oklab(float, float, float, float)
    @@ -727,9 +818,10 @@

    saturation

  • lightness

    -
    public static float lightness(float encoded)
    -
    Defined as per HSL; normally you only need channelL(float) to get accurate lightness for Oklab. - This ranges from 0.0f (black) to 1.0f (white).
    +
    public static float lightness(float encoded)
    +
    Defined as per HSL; normally you only need channelL(float) to get accurate lightness for Oklab. You can + also use oklabLightness(float), which is an alias for channelL(). This ranges from 0.0f (black) to 1.0f + (white).
    Parameters:
    encoded - a packed float Oklab color
    @@ -741,9 +833,11 @@

    lightness

  • hue

    -
    public static float hue(float encoded)
    +
    public static float hue(float encoded)
    Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased) - to 1f (exclusive, red and approaching purple if decreased).
    + to 1f (exclusive, red and approaching purple if decreased). You can also use oklabHue(float), which + positions the different hues at different values, somewhat, from this, but is more accurate to how Oklab handles + hues.
  • Parameters:
    encoded - a color as a packed float that can be obtained by oklab(float, float, float, float)
    @@ -756,7 +850,7 @@

    hue

  • channelL

    -
    public static float channelL(float encoded)
    +
    public static float channelL(float encoded)
    The "L" channel of the given packed float in Oklab format, which is its lightness; ranges from 0.0f to 1.0f . You can edit the L of a color with lighten(float, float) and darken(float, float).
    @@ -770,7 +864,7 @@

    channelL

  • channelA

    -
    public static float channelA(float encoded)
    +
    public static float channelA(float encoded)
    The "A" channel of the given packed float in Oklab format, which when combined with the B channel describes the hue and saturation of a color; ranges from 0f to 1f . If A is 0f, the color will be cooler, more green or blue; if A is 1f, the color will be warmer, from magenta to orange. You can edit the A of a color with @@ -786,7 +880,7 @@

    channelA

  • channelB

    -
    public static float channelB(float encoded)
    +
    public static float channelB(float encoded)
    The "B" channel of the given packed float in Oklab format, which when combined with the A channel describes the hue and saturation of a color; ranges from 0f to 1f . If B is 0f, the color will be more "artificial", more blue or purple; if B is 1f, the color will be more "natural", from green to yellow to orange. You can edit @@ -802,7 +896,7 @@

    channelB

  • toEditedFloat

    -
    public static float toEditedFloat(float basis, +
    public static float toEditedFloat(float basis, float hue, float saturation, float light, @@ -818,7 +912,10 @@

    toEditedFloat

    can't go above 1 or below 0, with an exception for hue, which can rotate around if lower or higher hues would be used. As an example, if you give this 0.4f for saturation, and the current color has saturation 0.7f, then the resulting color will have 1f for saturation. If you gave this -0.1f for saturation and the current color again - has saturation 0.7f, then resulting color will have 0.6f for saturation.
    + has saturation 0.7f, then resulting color will have 0.6f for saturation. +
    + You may want editOklab(float, float, float, float, float, float, float, float, float) instead, which + adjusts the L, A, B, and alpha channels directly instead of converting to HSL and back.
    Parameters:
    basis - a packed float color that will be used as the starting point to make the next color
    @@ -834,7 +931,7 @@

    toEditedFloat

  • lighten

    -
    public static float lighten(float start, +
    public static float lighten(float start, float change)
    Interpolates from the packed float color start towards white by change. While change should be between 0f (return start as-is) and 1f (return white), start should be a packed color, as from @@ -855,7 +952,7 @@

    lighten

  • darken

    -
    public static float darken(float start, +
    public static float darken(float start, float change)
    Interpolates from the packed float color start towards black by change. While change should be between 0f (return start as-is) and 1f (return black), start should be a packed color, as from @@ -876,7 +973,7 @@

    darken

  • raiseA

    -
    public static float raiseA(float start, +
    public static float raiseA(float start, float change)
    Interpolates from the packed float color start towards a warmer color (orange to magenta) by change. While change should be between 0f (return start as-is) and 1f (return fully warmed), start should be a packed color, as from @@ -898,7 +995,7 @@

    raiseA

  • lowerA

    -
    public static float lowerA(float start, +
    public static float lowerA(float start, float change)
    Interpolates from the packed float color start towards a cooler color (green to blue) by change. While change should be between 0f (return start as-is) and 1f (return fully cooled), start should be a packed color, as from @@ -920,7 +1017,7 @@

    lowerA

  • raiseB

    -
    public static float raiseB(float start, +
    public static float raiseB(float start, float change)
    Interpolates from the packed float color start towards a "natural" color (between green and orange) by change. While change should be between 0f (return start as-is) and 1f (return fully natural), start should be a packed color, as @@ -942,7 +1039,7 @@

    raiseB

  • lowerB

    -
    public static float lowerB(float start, +
    public static float lowerB(float start, float change)
    Interpolates from the packed float color start towards an "artificial" color (between blue and purple) by change. While change should be between 0f (return start as-is) and 1f (return fully artificial), start should be a packed color, as @@ -964,7 +1061,7 @@

    lowerB

  • blot

    -
    public static float blot(float start, +
    public static float blot(float start, float change)
    Interpolates from the packed float color start towards that color made opaque by change. While change should be between 0f (return start as-is) and 1f (return start with full alpha), start should be a packed color, as from @@ -985,7 +1082,7 @@

    blot

  • fade

    -
    public static float fade(float start, +
    public static float fade(float start, float change)
    Interpolates from the packed float color start towards transparent by change. While change should be between 0 (return start as-is) and 1f (return the color with 0 alpha), start should be a packed color, as from @@ -1006,7 +1103,7 @@

    fade

  • dullen

    -
    public static float dullen(float start, +
    public static float dullen(float start, float change)
    Brings the chromatic components of start closer to grayscale by change (desaturating them). While change should be between 0f (return start as-is) and 1f (return fully gray), start should be a packed color, as @@ -1026,7 +1123,7 @@

    dullen

  • enrich

    -
    public static float enrich(float start, +
    public static float enrich(float start, float change)
    Pushes the chromatic components of start away from grayscale by change (saturating them). While change should be between 0f (return start as-is) and 1f (return maximally saturated), start should be a packed color, as @@ -1048,7 +1145,7 @@

    enrich

  • inverseLightness

    -
    public static float inverseLightness(float mainColor, +
    public static float inverseLightness(float mainColor, float contrastingColor)
    Given a packed float Oklab color mainColor and another Oklab color that it should be made to contrast with, gets a packed float Oklab color with roughly inverted L but the same chromatic channels and opacity (A and B @@ -1074,7 +1171,7 @@

    inverseLightness

  • differentiateLightness

    -
    public static float differentiateLightness(float mainColor, +
    public static float differentiateLightness(float mainColor, float contrastingColor)
    Given a packed float Oklab color mainColor and another Oklab color that it should be made to contrast with, gets a packed float Oklab color with L that should be quite different from contrastingColor's L, @@ -1097,7 +1194,7 @@

    differentiateLightness

  • offsetLightness

    -
    public static float offsetLightness(float mainColor)
    +
    public static float offsetLightness(float mainColor)
    Pretty simple; adds 0.5 to the given color's L and wraps it around if it would go above 1.0, then averages that with the original L. This means light colors become darker, and dark colors become lighter, with almost all results in the middle-range of possible lightness.
    @@ -1112,7 +1209,7 @@

    offsetLightness

  • lessenChange

    -
    public static float lessenChange(float color, +
    public static float lessenChange(float color, float fraction)
    Makes the additive Oklab color stored in color cause less of a change when used as a tint, as if it were mixed with neutral gray. When fraction is 1.0, this returns color unchanged; when fraction is 0.0, it @@ -1130,7 +1227,7 @@

    lessenChange

  • randomEdit

    -
    public static float randomEdit(float color, +
    public static float randomEdit(float color, long seed, float variance)
    Makes a quasi-randomly-edited variant on the given color, allowing typically a small amount of @@ -1154,7 +1251,7 @@

    randomEdit

  • getRawGamutValue

    -
    public static byte getRawGamutValue(int index)
    +
    public static byte getRawGamutValue(int index)
    Given a 1D int index between 0 and 65535 (both inclusive), this treats the 1D index as two parts (lightness and hue angle, both from 0 to 255) and gets the distance from grayscale to the edge of the gamut at that lightness and hue. The index can be constructed from a lightness value L from 0 to 255, and a hue value H @@ -1187,7 +1284,7 @@

    getRawGamutValue

  • inGamut

    -
    public static boolean inGamut(float packed)
    +
    public static boolean inGamut(float packed)
    Returns true if the given packed float color, as Oklab, is valid to convert losslessly back to RGBA.
    Parameters:
    @@ -1200,7 +1297,7 @@

    inGamut

  • inGamut

    -
    public static boolean inGamut(float L, +
    public static boolean inGamut(float L, float A, float B)
    Returns true if the given Oklab values are valid to convert losslessly back to RGBA.
    @@ -1217,7 +1314,7 @@

    inGamut

  • maximizeSaturation

    -
    public static float maximizeSaturation(float packed)
    +
    public static float maximizeSaturation(float packed)
    Gets the color with the same L as the Oklab color stored in the given packed float, but the furthest A B from gray possible for that lightness while keeping the same hue as the given color. This is very similar to calling enrich(float, float) with a very large change value.
    @@ -1234,7 +1331,7 @@

    maximizeSaturation

  • maximizeSaturation

    -
    public static float maximizeSaturation(float L, +
    public static float maximizeSaturation(float L, float A, float B, float alpha)
    @@ -1255,9 +1352,120 @@

    maximizeSaturation

  • +
    +

    oklabHue

    +
    public static float oklabHue(float packed)
    +
    Gets the hue of the given Oklab float color, but as Oklab understands hue rather than how HSL does. + This is different from hue(float), which uses HSL. This gives a float between 0 (inclusive) + and 1 (exclusive).
    +
    +
    Parameters:
    +
    packed - a packed Oklab float color
    +
    Returns:
    +
    a float between 0 (inclusive) and 1 (exclusive) that represents hue in the Oklab color space
    +
    +
    +
  • +
  • +
    +

    oklabSaturation

    +
    public static float oklabSaturation(float packed)
    +
    Gets the saturation of the given Oklab float color, but as Oklab understands saturation rather than how HSL does. + Saturation here is a fraction of the chroma limit (see chromaLimit(float, float)) for a given hue and + lightness, and is between 0 and 1. This gives a float between 0 (inclusive) and 1 (inclusive).
    +
    +
    Parameters:
    +
    packed - a packed Oklab float color
    +
    Returns:
    +
    a float between 0 (inclusive) and 1 (inclusive) that represents saturation in the Oklab color space
    +
    +
    +
  • +
  • +
    +

    oklabLightness

    +
    public static float oklabLightness(float packed)
    +
    Gets the lightness of the given Oklab float color, but as Oklab understands lightness rather than how HSL does. + This is different from lightness(float), which uses HSL. This gives a float between 0 (inclusive) + and 1 (inclusive). +
    + This is the same as channelL(float).
    +
    +
    Parameters:
    +
    packed - a packed Oklab float color
    +
    Returns:
    +
    a float between 0 (inclusive) and 1 (inclusive) that represents lightness in the Oklab color space
    +
    +
    +
  • +
  • +
    +

    oklabByHSL

    +
    public static float oklabByHSL(float hue, + float saturation, + float lightness, + float alpha)
    +
    A different way to specify an Oklab color, using hue, saturation, lightness, and alpha like a normal HSL(A) color + but calculating them directly in the Oklab color space. This is more efficient than + floatGetHSL(float, float, float, float), but for colors with less than 0.5f lightness, it can be very + unpredictable in how it handles saturation. Most colors between 0.5 and 0.75 hue that also have less than 0.5 + lightness are extremely desaturated and close to gray, regardless of what you give for saturation, and these + colors suddenly jump to very saturated around 0.75 hue and higher. To avoid this issue, you may prefer using + oklabByHCL(float, float, float, float), which takes an absolute chroma as opposed to the saturation here + (which is a fraction of the maximum chroma). +
    + Note that this takes a different value for its hue that the method hue(float) produces, just + like its saturation and the method saturation(float), and lightness and the method + lightness(float). The hue is just distributed differently, and the lightness should be equivalent to + channelL(float), but the saturation here refers to what fraction the chroma should be of the maximum + chroma for the given hue and lightness. You can use oklabHue(float), oklabSaturation(float), + and oklabLightness(float) to get the hue, saturation, and lightness values from an existing color that + this will understand (alpha(float) too).
    +
    +
    Parameters:
    +
    hue - between 0 and 1, usually, but this will automatically wrap if too high or too low
    +
    saturation - will be clamped between 0 and 1
    +
    lightness - will be clamped between 0 and 1
    +
    alpha - will be clamped between 0 and 1
    +
    Returns:
    +
    a packed Oklab float color that tries to match the requested hue, saturation, and lightness
    +
    +
    +
  • +
  • +
    +

    oklabByHCL

    +
    public static float oklabByHCL(float hue, + float chroma, + float lightness, + float alpha)
    +
    A different way to specify an Oklab color, using hue, chroma, lightness, and alpha something like a normal HSL(A) + color but calculating them directly in the Oklab color space. This has you specify the desired chroma directly, + as obtainable with chroma(float), rather than the saturation, which is a fraction of the maximum chroma + (saturation is what oklabByHSL(float, float, float, float) uses). Note that this takes a different value + for its hue that the method hue(float) produces, just like lightness and the method + lightness(float). The hue is just distributed differently, and the lightness should be equivalent to + channelL(float). If you use this to get two colors with the same chroma and lightness, but different + hue, then the resulting colors should have similar colorfulness unless one or both chroma values exceeded the + gamut limit (you can get this limit with chromaLimit(float, float)). If a chroma value given is greater + than the chroma limit, this clamps chroma to that limit. You can use oklabHue(float), + chroma(float), and oklabLightness(float) to get the hue, chroma, and lightness values from an + existing color that this will understand (alpha(float) too).
    +
    +
    Parameters:
    +
    hue - between 0 and 1, usually, but this will automatically wrap if too high or too low
    +
    chroma - will be clamped between 0 and the maximum chroma possible for the given hue and lightness
    +
    lightness - will be clamped between 0 and 1
    +
    alpha - will be clamped between 0 and 1
    +
    Returns:
    +
    a packed Oklab float color that tries to match the requested hue, chroma, and lightness
    +
    +
    +
  • +
  • limitToGamut

    -
    public static float limitToGamut(float packed)
    +
    public static float limitToGamut(float packed)
    Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside the gamut at the same lightness, or if it is already in-gamut, returns the color as-is.
    @@ -1273,7 +1481,7 @@

    limitToGamut

  • limitToGamut

    -
    public static float limitToGamut(float L, +
    public static float limitToGamut(float L, float A, float B)
    Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside @@ -1294,7 +1502,7 @@

    limitToGamut

  • limitToGamut

    -
    public static float limitToGamut(float L, +
    public static float limitToGamut(float L, float A, float B, float alpha)
    @@ -1314,9 +1522,70 @@

    limitToGamut

  • +
    +

    editOklab

    +
    public static float editOklab(float encoded, + float addL, + float addA, + float addB, + float addAlpha)
    +
    Given a packed float Oklab color, this edits its L, A, B, and alpha channels by adding the corresponding "add" + parameter and then clamping. This returns a different float value (of course, the given float can't be edited + in-place). You can give a value of 0 for any "add" parameter you want to stay unchanged. This clamps the + resulting color to remain in-gamut, so it should be safe to convert it back to RGBA.
    +
    +
    Parameters:
    +
    encoded - a packed float Oklab color
    +
    addL - how much to add to the L channel; typically in the -1 to 1 range
    +
    addA - how much to add to the A channel; typically in the -1 to 1 range
    +
    addB - how much to add to the B channel; typically in the -1 to 1 range
    +
    addAlpha - how much to add to the alpha channel; typically in the -1 to 1 range
    +
    Returns:
    +
    a packed float Oklab color with the requested edits applied to encoded
    +
    +
    +
  • +
  • +
    +

    editOklab

    +
    public static float editOklab(float encoded, + float addL, + float addA, + float addB, + float addAlpha, + float mulL, + float mulA, + float mulB, + float mulAlpha)
    +
    Given a packed float Oklab color, this edits its L, A, B, and alpha channels by first multiplying each channel by + the corresponding "mul" parameter and then adding the corresponding "add" parameter, before clamping. This means + the lightness value L is multiplied by mulL, then has addL added, and then is clamped to + the normal range for L (0 to 1). This returns a different float value (of course, the given float can't be edited + in-place). You can give a value of 0 for any "add" parameter you want to stay unchanged, or a value of 1 for any + "mul" parameter that shouldn't change. Note that this manipulates A and B in the -0.5 to 0.5 range, so if you + multiply by a small number like 0.25f, then this will produce a less-saturated color, and if you multiply + by a larger number like 4f, then you will get a much more-saturated color. This clamps the resulting + color to remain in-gamut, so it should be safe to convert it back to RGBA.
    +
    +
    Parameters:
    +
    encoded - a packed float Oklab color
    +
    addL - how much to add to the L channel; typically in the -1 to 1 range
    +
    addA - how much to add to the A channel; typically in the -1 to 1 range
    +
    addB - how much to add to the B channel; typically in the -1 to 1 range
    +
    addAlpha - how much to add to the alpha channel; typically in the -1 to 1 range
    +
    mulL - how much to multiply the L channel by; should be non-negative
    +
    mulA - how much to multiply the A channel by; usually non-negative (not always)
    +
    mulB - how much to multiply the B channel by; usually non-negative (not always)
    +
    mulAlpha - how much to multiply the alpha channel by; should be non-negative
    +
    Returns:
    +
    a packed float Oklab color with the requested edits applied to encoded
    +
    +
    +
  • +
  • randomColor

    -
    public static float randomColor(Random random)
    +
    public static float randomColor(Random random)
    Produces a random packed float color that is always in-gamut (and opaque) and should be uniformly distributed.
    Parameters:
    diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/Palette.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/Palette.html index c4e6c0c0..d936ffac 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/Palette.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/Palette.html @@ -3,7 +3,7 @@ -Palette (colorful-pure 0.5.2-SNAPSHOT API) +Palette (colorful-pure 0.6.0 API) @@ -70,13 +70,13 @@

    Class Palette

  • -
    java.lang.Object +
    java.lang.Object
    com.github.tommyettinger.colorful.pure.oklab.Palette

    public class Palette -extends Object
    +extends Object
    A palette of predefined colors as packed IPT floats, the kind ColorTools works with. You can access colors by their constant name, such as OCEAN_BLUE, by the NAMED map using NAMED.get("Ocean Blue", 0f), or by index in the FloatArray called LIST. Note that to access a float @@ -837,21 +837,21 @@

    Field Summary

    This color constant "Mush" has RGBA8888 code B1B10AFF, L 0.7607843, A 0.47058824, B 0.5764706, alpha 1.0, hue 0.17038202, and saturation 0.62059957.
    -
    static com.github.tommyettinger.ds.ObjectFloatOrderedMap<String>
    +
    static com.github.tommyettinger.ds.ObjectFloatOrderedMap<String>
     
    -
    static com.github.tommyettinger.ds.ObjectList<String>
    +
    static com.github.tommyettinger.ds.ObjectList<String>
    All names for colors in this palette, in alphabetical order.
    -
    static com.github.tommyettinger.ds.ObjectList<String>
    +
    static com.github.tommyettinger.ds.ObjectList<String>
    All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to blue.
    -
    static com.github.tommyettinger.ds.ObjectList<String>
    +
    static com.github.tommyettinger.ds.ObjectList<String>
    All names for colors in this palette, sorted by lightness from black to white.
    @@ -1422,8 +1422,8 @@

    Constructor Summary

    Method Summary

    -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • @@ -1438,7 +1438,7 @@

    Field Details

  • NAMED

    -
    public static final com.github.tommyettinger.ds.ObjectFloatOrderedMap<String> NAMED
    +
    public static final com.github.tommyettinger.ds.ObjectFloatOrderedMap<String> NAMED
  • @@ -5802,7 +5802,7 @@

    RASPBERRY

  • NAMES

    -
    public static final com.github.tommyettinger.ds.ObjectList<String> NAMES
    +
    public static final com.github.tommyettinger.ds.ObjectList<String> NAMES
    All names for colors in this palette, in alphabetical order. You can fetch the corresponding packed float color by looking up a name in NAMED.
    @@ -5810,7 +5810,7 @@

    NAMES

  • NAMES_BY_HUE

    -
    public static final com.github.tommyettinger.ds.ObjectList<String> NAMES_BY_HUE
    +
    public static final com.github.tommyettinger.ds.ObjectList<String> NAMES_BY_HUE
    All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to blue. You can fetch the corresponding packed float color by looking up a name in NAMED.
    @@ -5818,7 +5818,7 @@

    NAMES_BY_HUE

  • NAMES_BY_LIGHTNESS

    -
    public static final com.github.tommyettinger.ds.ObjectList<String> NAMES_BY_LIGHTNESS
    +
    public static final com.github.tommyettinger.ds.ObjectList<String> NAMES_BY_LIGHTNESS
    All names for colors in this palette, sorted by lightness from black to white. You can fetch the corresponding packed float color by looking up a name in NAMED.
    diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/SimplePalette.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/SimplePalette.html index ad7df79e..e5649dbf 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/SimplePalette.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/SimplePalette.html @@ -3,7 +3,7 @@ -SimplePalette (colorful-pure 0.5.2-SNAPSHOT API) +SimplePalette (colorful-pure 0.6.0 API) @@ -74,13 +74,13 @@

    Class SimplePalette

  • -
    java.lang.Object +
    java.lang.Object
    com.github.tommyettinger.colorful.pure.oklab.SimplePalette

    public class SimplePalette -extends Object
    +extends Object
    A palette of predefined colors as packed IPT floats, the kind ColorTools works with. You can access colors by their constant name, such as OCEAN_BLUE, by the NAMED map using NAMED.get("Ocean Blue", 0f), or by index in the FloatArray called LIST. Note that to access a float @@ -103,7 +103,7 @@

    Field Summary

    Modifier and Type
    Field
    Description
    -
    static com.github.tommyettinger.ds.ObjectFloatOrderedMap<String>
    +
    static com.github.tommyettinger.ds.ObjectFloatOrderedMap<String>
    Stores alternative names for colors in NAMED, like "grey" as an alias for GRAY or "gold" as an @@ -254,23 +254,23 @@

    Field Summary

    This color constant "moss" has RGBA8888 code 204608FF, L 0.3764706, A 0.45882353, B 0.5372549, alpha 1.0, hue 0.28017563, and saturation 0.23527473.
    -
    static com.github.tommyettinger.ds.ObjectFloatOrderedMap<String>
    +
    static com.github.tommyettinger.ds.ObjectFloatOrderedMap<String>
    You can look up colors by name here; the names are lower-case, and the colors are packed floats in rgba format.
    -
    static com.github.tommyettinger.ds.ObjectList<String>
    +
    static com.github.tommyettinger.ds.ObjectList<String>
    All names for colors in this palette, in alphabetical order.
    -
    static com.github.tommyettinger.ds.ObjectList<String>
    +
    static com.github.tommyettinger.ds.ObjectList<String>
    All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to blue.
    -
    static com.github.tommyettinger.ds.ObjectList<String>
    +
    static com.github.tommyettinger.ds.ObjectList<String>
    All names for colors in this palette, sorted by lightness from black to white.
    @@ -417,7 +417,7 @@

    Method Summary

    Modifier and Type
    Method
    Description
    -
    static String
    +
    static String
    bestMatch​(float oklab, int mixCount)
    @@ -425,7 +425,7 @@

    Method Summary

    using at most mixCount colors to mix in.
    static float
    -
    parseDescription​(String description)
    +
    parseDescription​(String description)
    Parses a color description and returns the approximate color it describes, as a packed float color.
    @@ -433,8 +433,8 @@

    Method Summary

    -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • @@ -449,14 +449,14 @@

    Field Details

  • NAMED

    -
    public static final com.github.tommyettinger.ds.ObjectFloatOrderedMap<String> NAMED
    +
    public static final com.github.tommyettinger.ds.ObjectFloatOrderedMap<String> NAMED
    You can look up colors by name here; the names are lower-case, and the colors are packed floats in rgba format.
  • ALIASES

    -
    public static final com.github.tommyettinger.ds.ObjectFloatOrderedMap<String> ALIASES
    +
    public static final com.github.tommyettinger.ds.ObjectFloatOrderedMap<String> ALIASES
    Stores alternative names for colors in NAMED, like "grey" as an alias for GRAY or "gold" as an alias for SAFFRON. Currently, the list of aliases is as follows:
      @@ -1334,7 +1334,7 @@

      RASPBERRY

    • NAMES

      -
      public static final com.github.tommyettinger.ds.ObjectList<String> NAMES
      +
      public static final com.github.tommyettinger.ds.ObjectList<String> NAMES
      All names for colors in this palette, in alphabetical order. You can fetch the corresponding packed float color by looking up a name in NAMED.
      @@ -1342,7 +1342,7 @@

      NAMES

    • NAMES_BY_HUE

      -
      public static final com.github.tommyettinger.ds.ObjectList<String> NAMES_BY_HUE
      +
      public static final com.github.tommyettinger.ds.ObjectList<String> NAMES_BY_HUE
      All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to blue. You can fetch the corresponding packed float color by looking up a name in NAMED.
      @@ -1357,7 +1357,7 @@

      COLORS_BY_HUE

    • NAMES_BY_LIGHTNESS

      -
      public static final com.github.tommyettinger.ds.ObjectList<String> NAMES_BY_LIGHTNESS
      +
      public static final com.github.tommyettinger.ds.ObjectList<String> NAMES_BY_LIGHTNESS
      All names for colors in this palette, sorted by lightness from black to white. You can fetch the corresponding packed float color by looking up a name in NAMED.
      @@ -1387,7 +1387,7 @@

      Method Details

    • parseDescription

      -
      public static float parseDescription(String description)
      +
      public static float parseDescription(String description)
      Parses a color description and returns the approximate color it describes, as a packed float color. Color descriptions consist of one or more lower-case words, separated by non-alphabetical characters (typically spaces and/or hyphens). Any word that is the name of a color in this SimplePalette will be looked up in @@ -1414,7 +1414,7 @@

      parseDescription

    • bestMatch

      -
      public static String bestMatch(float oklab, +
      public static String bestMatch(float oklab, int mixCount)
      Given a color as a packed Oklab float, this finds the closest description it can to match the given color while using at most mixCount colors to mix in. You should only use small numbers for mixCount, like 1 to 3; diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/class-use/ColorTools.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/class-use/ColorTools.html index d7650feb..017f5385 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/class-use/ColorTools.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/class-use/ColorTools.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.pure.oklab.ColorTools (colorful-pure 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.pure.oklab.ColorTools (colorful-pure 0.6.0 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/class-use/Palette.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/class-use/Palette.html index 87549bfd..7adbae2a 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/class-use/Palette.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/class-use/Palette.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.pure.oklab.Palette (colorful-pure 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.pure.oklab.Palette (colorful-pure 0.6.0 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/class-use/SimplePalette.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/class-use/SimplePalette.html index 44506607..b038ed74 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/class-use/SimplePalette.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/class-use/SimplePalette.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.pure.oklab.SimplePalette (colorful-pure 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.pure.oklab.SimplePalette (colorful-pure 0.6.0 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/package-summary.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/package-summary.html index ff88708d..e00b8a18 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/package-summary.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/package-summary.html @@ -3,7 +3,7 @@ -com.github.tommyettinger.colorful.pure.oklab (colorful-pure 0.5.2-SNAPSHOT API) +com.github.tommyettinger.colorful.pure.oklab (colorful-pure 0.6.0 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/package-tree.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/package-tree.html index da0aafd8..b0aa0f8b 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/package-tree.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/package-tree.html @@ -3,7 +3,7 @@ -com.github.tommyettinger.colorful.pure.oklab Class Hierarchy (colorful-pure 0.5.2-SNAPSHOT API) +com.github.tommyettinger.colorful.pure.oklab Class Hierarchy (colorful-pure 0.6.0 API) @@ -60,7 +60,7 @@

      Hierarchy For Package com.github.tommyettinger.colorful.pure.o

      Class Hierarchy

        -
      • java.lang.Object +
      • java.lang.Object
        • com.github.tommyettinger.colorful.pure.oklab.ColorTools
        • com.github.tommyettinger.colorful.pure.oklab.Palette
        • diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/package-use.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/package-use.html index 434be90b..955cb529 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/package-use.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/oklab/package-use.html @@ -3,7 +3,7 @@ -Uses of Package com.github.tommyettinger.colorful.pure.oklab (colorful-pure 0.5.2-SNAPSHOT API) +Uses of Package com.github.tommyettinger.colorful.pure.oklab (colorful-pure 0.6.0 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/package-summary.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/package-summary.html index f36ada8c..704736d0 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/package-summary.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/package-summary.html @@ -3,7 +3,7 @@ -com.github.tommyettinger.colorful.pure (colorful-pure 0.5.2-SNAPSHOT API) +com.github.tommyettinger.colorful.pure (colorful-pure 0.6.0 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/package-tree.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/package-tree.html index ff1cc585..00ef6d83 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/package-tree.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/package-tree.html @@ -3,7 +3,7 @@ -com.github.tommyettinger.colorful.pure Class Hierarchy (colorful-pure 0.5.2-SNAPSHOT API) +com.github.tommyettinger.colorful.pure Class Hierarchy (colorful-pure 0.6.0 API) @@ -60,7 +60,7 @@

          Hierarchy For Package com.github.tommyettinger.colorful.pure

          Class Hierarchy

            -
          • java.lang.Object +
          • java.lang.Object
            • com.github.tommyettinger.colorful.pure.FloatColors
            • com.github.tommyettinger.colorful.pure.MathTools
            • diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/package-use.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/package-use.html index 867187b8..7aabc5e0 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/package-use.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/package-use.html @@ -3,7 +3,7 @@ -Uses of Package com.github.tommyettinger.colorful.pure (colorful-pure 0.5.2-SNAPSHOT API) +Uses of Package com.github.tommyettinger.colorful.pure (colorful-pure 0.6.0 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/ColorTools.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/ColorTools.html index afceeecc..9a577b14 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/ColorTools.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/ColorTools.html @@ -3,7 +3,7 @@ -ColorTools (colorful-pure 0.5.2-SNAPSHOT API) +ColorTools (colorful-pure 0.6.0 API) @@ -74,13 +74,13 @@

              Class ColorTools

      -
      java.lang.Object +
      java.lang.Object
      com.github.tommyettinger.colorful.pure.rgb.ColorTools

      public class ColorTools -extends Object
      +extends Object
      Contains code for manipulating colors as int and packed float values in the RGB color space. All of these colors have an alpha channel as well as red, green, and blue; the package name isn't "rgba" because "ycwcm" and "ipt" don't mention alpha either and they also have that channel. RGB is the standard mode @@ -155,6 +155,30 @@

      Method Summary

      contrastingColor's lightness, but the same chromatic channels and opacity.
      static float
      +
      editRGB​(float encoded, + float addR, + float addG, + float addB, + float addAlpha)
      +
      +
      Given a packed float RGB color, this edits its red, green, blue, and alpha channels by adding the corresponding + "add" parameter and then clamping.
      +
      +
      static float
      +
      editRGB​(float encoded, + float addR, + float addG, + float addB, + float addAlpha, + float mulR, + float mulG, + float mulB, + float mulAlpha)
      +
      +
      Given a packed float RGB color, this edits its red, green, blue, and alpha channels by first multiplying each + channel by the corresponding "mul" parameter and then adding the corresponding "add" parameter, before clamping.
      +
      +
      static float
      fade​(float start, float change)
      @@ -228,7 +252,7 @@

      Method Summary

      wraps it around if it would go above 1.0, then averages that with the original lightness.
    • static float
      -
      randomColor​(Random random)
      +
      randomColor​(Random random)
      Produces a random packed float color that is always opaque and should be uniformly distributed.
      @@ -292,8 +316,8 @@

      Method Summary

  • -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • @@ -753,9 +777,67 @@

    lessenChange

  • +
    +

    editRGB

    +
    public static float editRGB(float encoded, + float addR, + float addG, + float addB, + float addAlpha)
    +
    Given a packed float RGB color, this edits its red, green, blue, and alpha channels by adding the corresponding + "add" parameter and then clamping. Each value is considered in the 0 to 1 range. This returns a different float + value (of course, the given float can't be edited in-place). You can give a value of 0 for any "add" parameter + you want to stay unchanged.
    +
    +
    Parameters:
    +
    encoded - a packed float RGB color
    +
    addR - how much to add to the R channel; typically in the -1 to 1 range
    +
    addG - how much to add to the G channel; typically in the -1 to 1 range
    +
    addB - how much to add to the B channel; typically in the -1 to 1 range
    +
    addAlpha - how much to add to the alpha channel; typically in the -1 to 1 range
    +
    Returns:
    +
    a packed float RGB color with the requested edits applied to encoded
    +
    +
    +
  • +
  • +
    +

    editRGB

    +
    public static float editRGB(float encoded, + float addR, + float addG, + float addB, + float addAlpha, + float mulR, + float mulG, + float mulB, + float mulAlpha)
    +
    Given a packed float RGB color, this edits its red, green, blue, and alpha channels by first multiplying each + channel by the corresponding "mul" parameter and then adding the corresponding "add" parameter, before clamping. + This means the red value R (which is considered in the 0 to 1 range) is multiplied by mulR, then + has addR added, and then is clamped to the normal range for R (0 to 1). This returns a different float + value (of course, the given float can't be edited in-place). You can give a value of 0 for any "add" parameter + you want to stay unchanged, or a value of 1 for any "mul" parameter that shouldn't change.
    +
    +
    Parameters:
    +
    encoded - a packed float RGB color
    +
    addR - how much to add to the R channel; typically in the -1 to 1 range
    +
    addG - how much to add to the G channel; typically in the -1 to 1 range
    +
    addB - how much to add to the B channel; typically in the -1 to 1 range
    +
    addAlpha - how much to add to the alpha channel; typically in the -1 to 1 range
    +
    mulR - how much to multiply the R channel by; should be non-negative
    +
    mulG - how much to multiply the G channel by; should be non-negative
    +
    mulB - how much to multiply the B channel by; should be non-negative
    +
    mulAlpha - how much to multiply the alpha channel by; should be non-negative
    +
    Returns:
    +
    a packed float RGB color with the requested edits applied to encoded
    +
    +
    +
  • +
  • randomEdit

    -
    public static float randomEdit(float color, +
    public static float randomEdit(float color, long seed, float variance)
    Makes a quasi-randomly-edited variant on the given color, allowing typically a small amount of @@ -778,7 +860,7 @@

    randomEdit

  • randomColor

    -
    public static float randomColor(Random random)
    +
    public static float randomColor(Random random)
    Produces a random packed float color that is always opaque and should be uniformly distributed.
    Parameters:
    @@ -791,7 +873,7 @@

    randomColor

  • subrandomColor

    -
    public static float subrandomColor(float r, +
    public static float subrandomColor(float r, float g, float b)
    Limited-use; like randomColor(Random) but for cases where you already have three floats (r, g, and b) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/Palette.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/Palette.html index 5e2a23cb..6e805798 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/Palette.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/Palette.html @@ -3,7 +3,7 @@ -Palette (colorful-pure 0.5.2-SNAPSHOT API) +Palette (colorful-pure 0.6.0 API) @@ -70,13 +70,13 @@

    Class Palette

    -
    java.lang.Object +
    java.lang.Object
    com.github.tommyettinger.colorful.pure.rgb.Palette

    public class Palette -extends Object
    +extends Object
    A palette of predefined colors as packed RGB(A) floats, the kind ColorTools works with. You can access colors by their constant name, such as OCEAN_BLUE, by the NAMED map using NAMED.get("Ocean Blue", 0f), or by index in the FloatList called LIST. Note that to access a float @@ -837,21 +837,21 @@

    Field Summary

    This color constant "Mush" has RGBA8888 code B1B10AFF, hue 0.16666667, saturation 0.654902, lightness 0.36666664, and alpha 1.0.
    -
    static com.github.tommyettinger.ds.ObjectFloatOrderedMap<String>
    +
    static com.github.tommyettinger.ds.ObjectFloatOrderedMap<String>
     
    -
    static com.github.tommyettinger.ds.ObjectList<String>
    +
    static com.github.tommyettinger.ds.ObjectList<String>
    All names for colors in this palette, in alphabetical order.
    -
    static com.github.tommyettinger.ds.ObjectList<String>
    +
    static com.github.tommyettinger.ds.ObjectList<String>
    All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to blue.
    -
    static com.github.tommyettinger.ds.ObjectList<String>
    +
    static com.github.tommyettinger.ds.ObjectList<String>
    All names for colors in this palette, sorted by lightness from black to white.
    @@ -1422,8 +1422,8 @@

    Constructor Summary

    Method Summary

    -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • @@ -1438,7 +1438,7 @@

    Field Details

  • NAMED

    -
    public static final com.github.tommyettinger.ds.ObjectFloatOrderedMap<String> NAMED
    +
    public static final com.github.tommyettinger.ds.ObjectFloatOrderedMap<String> NAMED
  • @@ -5802,7 +5802,7 @@

    RASPBERRY

  • NAMES

    -
    public static final com.github.tommyettinger.ds.ObjectList<String> NAMES
    +
    public static final com.github.tommyettinger.ds.ObjectList<String> NAMES
    All names for colors in this palette, in alphabetical order. You can fetch the corresponding packed float color by looking up a name in NAMED.
    @@ -5810,7 +5810,7 @@

    NAMES

  • NAMES_BY_HUE

    -
    public static final com.github.tommyettinger.ds.ObjectList<String> NAMES_BY_HUE
    +
    public static final com.github.tommyettinger.ds.ObjectList<String> NAMES_BY_HUE
    All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to blue. You can fetch the corresponding packed float color by looking up a name in NAMED.
    @@ -5818,7 +5818,7 @@

    NAMES_BY_HUE

  • NAMES_BY_LIGHTNESS

    -
    public static final com.github.tommyettinger.ds.ObjectList<String> NAMES_BY_LIGHTNESS
    +
    public static final com.github.tommyettinger.ds.ObjectList<String> NAMES_BY_LIGHTNESS
    All names for colors in this palette, sorted by lightness from black to white. You can fetch the corresponding packed float color by looking up a name in NAMED.
    diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/SimplePalette.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/SimplePalette.html index 6bf31aa1..d571503c 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/SimplePalette.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/SimplePalette.html @@ -3,7 +3,7 @@ -SimplePalette (colorful-pure 0.5.2-SNAPSHOT API) +SimplePalette (colorful-pure 0.6.0 API) @@ -74,13 +74,13 @@

    Class SimplePalette

  • -
    java.lang.Object +
    java.lang.Object
    com.github.tommyettinger.colorful.pure.rgb.SimplePalette

    -
    public class SimplePalette -extends Object
    +
    public class SimplePalette +extends Object
    A palette of predefined colors as packed RGB floats, the kind ColorTools works with, plus a way to describe colors by combinations and adjustments. The description code is probably what you would use this class for; it revolves around parseDescription(String), which takes a color description String and returns a packed float @@ -111,7 +111,7 @@

    Field Summary

    Modifier and Type
    Field
    Description
    -
    static com.github.tommyettinger.ds.ObjectFloatOrderedMap<String>
    +
    static com.github.tommyettinger.ds.ObjectFloatOrderedMap<String>
    Stores alternative names for colors in NAMED, like "grey" as an alias for GRAY or "gold" as an @@ -262,23 +262,23 @@

    Field Summary

    This color constant "moss" has RGBA8888 code 204608FF, R 0.1254902, G 0.27450982, B 0.03137255, alpha 1.0, hue 0.26881722, and saturation 0.24313727.
    -
    static com.github.tommyettinger.ds.ObjectFloatOrderedMap<String>
    +
    static com.github.tommyettinger.ds.ObjectFloatOrderedMap<String>
    You can look up colors by name here; the names are lower-case, and the colors are packed floats in rgba format.
    -
    static com.github.tommyettinger.ds.ObjectList<String>
    +
    static com.github.tommyettinger.ds.ObjectList<String>
    All names for colors in this palette, in alphabetical order.
    -
    static com.github.tommyettinger.ds.ObjectList<String>
    +
    static com.github.tommyettinger.ds.ObjectList<String>
    All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to blue.
    -
    static com.github.tommyettinger.ds.ObjectList<String>
    +
    static com.github.tommyettinger.ds.ObjectList<String>
    All names for colors in this palette, sorted by lightness from black to white.
    @@ -425,7 +425,7 @@

    Method Summary

    Modifier and Type
    Method
    Description
    -
    static String
    +
    static String
    bestMatch​(float rgb, int mixCount)
    @@ -433,7 +433,7 @@

    Method Summary

    using at most mixCount colors to mix in.
    static float
    -
    parseDescription​(String description)
    +
    parseDescription​(String description)
    Parses a color description and returns the approximate color it describes, as a packed float color.
    @@ -441,8 +441,8 @@

    Method Summary

    -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • @@ -457,14 +457,14 @@

    Field Details

  • NAMED

    -
    public static final com.github.tommyettinger.ds.ObjectFloatOrderedMap<String> NAMED
    +
    public static final com.github.tommyettinger.ds.ObjectFloatOrderedMap<String> NAMED
    You can look up colors by name here; the names are lower-case, and the colors are packed floats in rgba format.
  • ALIASES

    -
    public static final com.github.tommyettinger.ds.ObjectFloatOrderedMap<String> ALIASES
    +
    public static final com.github.tommyettinger.ds.ObjectFloatOrderedMap<String> ALIASES
    Stores alternative names for colors in NAMED, like "grey" as an alias for GRAY or "gold" as an alias for SAFFRON. Currently, the list of aliases is as follows:
      @@ -485,14 +485,14 @@

      ALIASES

    • LIST

      -
      public static final com.github.tommyettinger.ds.FloatList LIST
      +
      public static final com.github.tommyettinger.ds.FloatList LIST
      Lists the packed float color values in this, in no particular order. Does not include duplicates from aliases.
    • TRANSPARENT

      -
      public static final float TRANSPARENT
      +
      public static final float TRANSPARENT
      This color constant "transparent" has RGBA8888 code 00000000, R 0.0, G 0.0, B 0.0, alpha 0.0, hue 0.0, and saturation 0.0. It can be represented as a packed float with the constant 0x0.0p0F.
      @@ -509,7 +509,7 @@ 

      TRANSPARENT

    • BLACK

      -
      public static final float BLACK
      +
      public static final float BLACK
      This color constant "black" has RGBA8888 code 000000FF, R 0.0, G 0.0, B 0.0, alpha 1.0, hue 0.0, and saturation 0.0. It can be represented as a packed float with the constant -0x1.0p125F.
      @@ -526,7 +526,7 @@ 

      BLACK

    • GRAY

      -
      public static final float GRAY
      +
      public static final float GRAY
      This color constant "gray" has RGBA8888 code 808080FF, R 0.5019608, G 0.5019608, B 0.5019608, alpha 1.0, hue 0.0, and saturation 0.0. It can be represented as a packed float with the constant -0x1.0101p126F.
      @@ -543,7 +543,7 @@ 

      GRAY

    • SILVER

      -
      public static final float SILVER
      +
      public static final float SILVER
      This color constant "silver" has RGBA8888 code B6B6B6FF, R 0.7137255, G 0.7137255, B 0.7137255, alpha 1.0, hue 0.0, and saturation 0.0. It can be represented as a packed float with the constant -0x1.6d6d6cp126F.
      @@ -560,7 +560,7 @@ 

      SILVER

    • WHITE

      -
      public static final float WHITE
      +
      public static final float WHITE
      This color constant "white" has RGBA8888 code FFFFFFFF, R 1.0, G 1.0, B 1.0, alpha 1.0, hue 0.0, and saturation 0.0. It can be represented as a packed float with the constant -0x1.fffffep126F.
      @@ -577,7 +577,7 @@ 

      WHITE

    • RED

      -
      public static final float RED
      +
      public static final float RED
      This color constant "red" has RGBA8888 code FF0000FF, R 1.0, G 0.0, B 0.0, alpha 1.0, hue 0.0, and saturation 1.0. It can be represented as a packed float with the constant -0x1.0001fep125F.
      @@ -594,7 +594,7 @@ 

      RED

    • ORANGE

      -
      public static final float ORANGE
      +
      public static final float ORANGE
      This color constant "orange" has RGBA8888 code FF7F00FF, R 1.0, G 0.49803922, B 0.0, alpha 1.0, hue 0.08300654, and saturation 1.0. It can be represented as a packed float with the constant -0x1.00fffep125F.
      @@ -611,7 +611,7 @@ 

      ORANGE

    • YELLOW

      -
      public static final float YELLOW
      +
      public static final float YELLOW
      This color constant "yellow" has RGBA8888 code FFFF00FF, R 1.0, G 1.0, B 0.0, alpha 1.0, hue 0.16666667, and saturation 1.0. It can be represented as a packed float with the constant -0x1.01fffep125F.
      @@ -628,7 +628,7 @@ 

      YELLOW

    • GREEN

      -
      public static final float GREEN
      +
      public static final float GREEN
      This color constant "green" has RGBA8888 code 00FF00FF, R 0.0, G 1.0, B 0.0, alpha 1.0, hue 0.33333334, and saturation 1.0. It can be represented as a packed float with the constant -0x1.01fep125F.
      @@ -645,7 +645,7 @@ 

      GREEN

    • BLUE

      -
      public static final float BLUE
      +
      public static final float BLUE
      This color constant "blue" has RGBA8888 code 0000FFFF, R 0.0, G 0.0, B 1.0, alpha 1.0, hue 0.6666667, and saturation 1.0. It can be represented as a packed float with the constant -0x1.fep126F.
      @@ -662,7 +662,7 @@ 

      BLUE

    • INDIGO

      -
      public static final float INDIGO
      +
      public static final float INDIGO
      This color constant "indigo" has RGBA8888 code 520FE0FF, R 0.32156864, G 0.05882353, B 0.8784314, alpha 1.0, hue 0.7200957, and saturation 0.81960785. It can be represented as a packed float with the constant -0x1.c01ea4p126F.
      @@ -679,7 +679,7 @@ 

      INDIGO

    • VIOLET

      -
      public static final float VIOLET
      +
      public static final float VIOLET
      This color constant "violet" has RGBA8888 code 9040EFFF, R 0.5647059, G 0.2509804, B 0.9372549, alpha 1.0, hue 0.74285716, and saturation 0.6862745. It can be represented as a packed float with the constant -0x1.de812p126F.
      @@ -696,7 +696,7 @@ 

      VIOLET

    • PURPLE

      -
      public static final float PURPLE
      +
      public static final float PURPLE
      This color constant "purple" has RGBA8888 code C000FFFF, R 0.7529412, G 0.0, B 1.0, alpha 1.0, hue 0.7921569, and saturation 1.0. It can be represented as a packed float with the constant -0x1.fe018p126F.
      @@ -713,7 +713,7 @@ 

      PURPLE

    • BROWN

      -
      public static final float BROWN
      +
      public static final float BROWN
      This color constant "brown" has RGBA8888 code 8F573BFF, R 0.56078434, G 0.34117648, B 0.23137255, alpha 1.0, hue 0.055555552, and saturation 0.3294118. It can be represented as a packed float with the constant -0x1.76af1ep125F.
      @@ -730,7 +730,7 @@ 

      BROWN

    • PINK

      -
      public static final float PINK
      +
      public static final float PINK
      This color constant "pink" has RGBA8888 code FFA0E0FF, R 1.0, G 0.627451, B 0.8784314, alpha 1.0, hue 0.8877193, and saturation 0.372549. It can be represented as a packed float with the constant -0x1.c141fep126F.
      @@ -747,7 +747,7 @@ 

      PINK

    • MAGENTA

      -
      public static final float MAGENTA
      +
      public static final float MAGENTA
      This color constant "magenta" has RGBA8888 code F500F5FF, R 0.9607843, G 0.0, B 0.9607843, alpha 1.0, hue 0.8333333, and saturation 0.9607843. It can be represented as a packed float with the constant -0x1.ea01eap126F.
      @@ -764,7 +764,7 @@ 

      MAGENTA

    • BRICK

      -
      public static final float BRICK
      +
      public static final float BRICK
      This color constant "brick" has RGBA8888 code D5524AFF, R 0.8352941, G 0.32156864, B 0.2901961, alpha 1.0, hue 0.009592325, and saturation 0.54509807. It can be represented as a packed float with the constant -0x1.94a5aap125F.
      @@ -781,7 +781,7 @@ 

      BRICK

    • EMBER

      -
      public static final float EMBER
      +
      public static final float EMBER
      This color constant "ember" has RGBA8888 code F55A32FF, R 0.9607843, G 0.3529412, B 0.19607843, alpha 1.0, hue 0.034188036, and saturation 0.7647059. It can be represented as a packed float with the constant -0x1.64b5eap125F.
      @@ -798,7 +798,7 @@ 

      EMBER

    • SALMON

      -
      public static final float SALMON
      +
      public static final float SALMON
      This color constant "salmon" has RGBA8888 code FF6262FF, R 1.0, G 0.38431373, B 0.38431373, alpha 1.0, hue 0.0, and saturation 0.6156863. It can be represented as a packed float with the constant -0x1.c4c5fep125F.
      @@ -815,7 +815,7 @@ 

      SALMON

    • CHOCOLATE

      -
      public static final float CHOCOLATE
      +
      public static final float CHOCOLATE
      This color constant "chocolate" has RGBA8888 code 683818FF, R 0.40784314, G 0.21960784, B 0.09411765, alpha 1.0, hue 0.066666655, and saturation 0.3137255. It can be represented as a packed float with the constant -0x1.3070dp125F.
      @@ -832,7 +832,7 @@ 

      CHOCOLATE

    • TAN

      -
      public static final float TAN
      +
      public static final float TAN
      This color constant "tan" has RGBA8888 code D2B48CFF, R 0.8235294, G 0.7058824, B 0.54901963, alpha 1.0, hue 0.0952381, and saturation 0.2745098. It can be represented as a packed float with the constant -0x1.1969a4p126F.
      @@ -849,7 +849,7 @@ 

      TAN

    • BRONZE

      -
      public static final float BRONZE
      +
      public static final float BRONZE
      This color constant "bronze" has RGBA8888 code CE8E31FF, R 0.80784315, G 0.5568628, B 0.19215687, alpha 1.0, hue 0.09872612, and saturation 0.6156863. It can be represented as a packed float with the constant -0x1.631d9cp125F.
      @@ -866,7 +866,7 @@ 

      BRONZE

    • CINNAMON

      -
      public static final float CINNAMON
      +
      public static final float CINNAMON
      This color constant "cinnamon" has RGBA8888 code D2691DFF, R 0.8235294, G 0.4117647, B 0.11372549, alpha 1.0, hue 0.06998159, and saturation 0.70980394. It can be represented as a packed float with the constant -0x1.3ad3a4p125F.
      @@ -883,7 +883,7 @@ 

      CINNAMON

    • APRICOT

      -
      public static final float APRICOT
      +
      public static final float APRICOT
      This color constant "apricot" has RGBA8888 code FFA828FF, R 1.0, G 0.65882355, B 0.15686275, alpha 1.0, hue 0.09922481, and saturation 0.84313726. It can be represented as a packed float with the constant -0x1.5151fep125F.
      @@ -900,7 +900,7 @@ 

      APRICOT

    • PEACH

      -
      public static final float PEACH
      +
      public static final float PEACH
      This color constant "peach" has RGBA8888 code FFBF81FF, R 1.0, G 0.7490196, B 0.5058824, alpha 1.0, hue 0.08201058, and saturation 0.49411762. It can be represented as a packed float with the constant -0x1.037ffep126F.
      @@ -917,7 +917,7 @@ 

      PEACH

    • PEAR

      -
      public static final float PEAR
      +
      public static final float PEAR
      This color constant "pear" has RGBA8888 code D3E330FF, R 0.827451, G 0.8901961, B 0.1882353, alpha 1.0, hue 0.18156426, and saturation 0.7019608. It can be represented as a packed float with the constant -0x1.61c7a6p125F.
      @@ -934,7 +934,7 @@ 

      PEAR

    • SAFFRON

      -
      public static final float SAFFRON
      +
      public static final float SAFFRON
      This color constant "saffron" has RGBA8888 code FFD510FF, R 1.0, G 0.8352941, B 0.0627451, alpha 1.0, hue 0.13737796, and saturation 0.9372549. It can be represented as a packed float with the constant -0x1.21abfep125F.
      @@ -951,7 +951,7 @@ 

      SAFFRON

    • BUTTER

      -
      public static final float BUTTER
      +
      public static final float BUTTER
      This color constant "butter" has RGBA8888 code FFF288FF, R 1.0, G 0.9490196, B 0.53333336, alpha 1.0, hue 0.14845939, and saturation 0.46666664. It can be represented as a packed float with the constant -0x1.11e5fep126F.
      @@ -968,7 +968,7 @@ 

      BUTTER

    • CHARTREUSE

      -
      public static final float CHARTREUSE
      +
      public static final float CHARTREUSE
      This color constant "chartreuse" has RGBA8888 code C8FF41FF, R 0.78431374, G 1.0, B 0.25490198, alpha 1.0, hue 0.21491227, and saturation 0.745098. It can be represented as a packed float with the constant -0x1.83ff9p125F.
      @@ -985,7 +985,7 @@ 

      CHARTREUSE

    • CACTUS

      -
      public static final float CACTUS
      +
      public static final float CACTUS
      This color constant "cactus" has RGBA8888 code 30A000FF, R 0.1882353, G 0.627451, B 0.0, alpha 1.0, hue 0.28333336, and saturation 0.627451. It can be represented as a packed float with the constant -0x1.01406p125F.
      @@ -1002,7 +1002,7 @@ 

      CACTUS

    • LIME

      -
      public static final float LIME
      +
      public static final float LIME
      This color constant "lime" has RGBA8888 code 93D300FF, R 0.5764706, G 0.827451, B 0.0, alpha 1.0, hue 0.21721959, and saturation 0.827451. It can be represented as a packed float with the constant -0x1.01a726p125F.
      @@ -1019,7 +1019,7 @@ 

      LIME

    • OLIVE

      -
      public static final float OLIVE
      +
      public static final float OLIVE
      This color constant "olive" has RGBA8888 code 818000FF, R 0.5058824, G 0.5019608, B 0.0, alpha 1.0, hue 0.16537468, and saturation 0.5058824. It can be represented as a packed float with the constant -0x1.010102p125F.
      @@ -1036,7 +1036,7 @@ 

      OLIVE

    • FERN

      -
      public static final float FERN
      +
      public static final float FERN
      This color constant "fern" has RGBA8888 code 4E7942FF, R 0.30588236, G 0.4745098, B 0.25882354, alpha 1.0, hue 0.2969697, and saturation 0.21568626. It can be represented as a packed float with the constant -0x1.84f29cp125F.
      @@ -1053,7 +1053,7 @@ 

      FERN

    • MOSS

      -
      public static final float MOSS
      +
      public static final float MOSS
      This color constant "moss" has RGBA8888 code 204608FF, R 0.1254902, G 0.27450982, B 0.03137255, alpha 1.0, hue 0.26881722, and saturation 0.24313727. It can be represented as a packed float with the constant -0x1.108c4p125F.
      @@ -1070,7 +1070,7 @@ 

      MOSS

    • CELERY

      -
      public static final float CELERY
      +
      public static final float CELERY
      This color constant "celery" has RGBA8888 code 7DFF73FF, R 0.49019608, G 1.0, B 0.4509804, alpha 1.0, hue 0.32142857, and saturation 0.5490196. It can be represented as a packed float with the constant -0x1.e7fefap125F.
      @@ -1087,7 +1087,7 @@ 

      CELERY

    • SAGE

      -
      public static final float SAGE
      +
      public static final float SAGE
      This color constant "sage" has RGBA8888 code ABE3C5FF, R 0.67058825, G 0.8901961, B 0.77254903, alpha 1.0, hue 0.4107143, and saturation 0.21960783. It can be represented as a packed float with the constant -0x1.8bc756p126F.
      @@ -1104,7 +1104,7 @@ 

      SAGE

    • JADE

      -
      public static final float JADE
      +
      public static final float JADE
      This color constant "jade" has RGBA8888 code 3FBF3FFF, R 0.24705882, G 0.7490196, B 0.24705882, alpha 1.0, hue 0.33333334, and saturation 0.5019608. It can be represented as a packed float with the constant -0x1.7f7e7ep125F.
      @@ -1121,7 +1121,7 @@ 

      JADE

    • CYAN

      -
      public static final float CYAN
      +
      public static final float CYAN
      This color constant "cyan" has RGBA8888 code 00FFFFFF, R 0.0, G 1.0, B 1.0, alpha 1.0, hue 0.5, and saturation 1.0. It can be represented as a packed float with the constant -0x1.fffep126F.
      @@ -1138,7 +1138,7 @@ 

      CYAN

    • MINT

      -
      public static final float MINT
      +
      public static final float MINT
      This color constant "mint" has RGBA8888 code 7FFFD4FF, R 0.49803922, G 1.0, B 0.83137256, alpha 1.0, hue 0.44401044, and saturation 0.50196075. It can be represented as a packed float with the constant -0x1.a9fefep126F.
      @@ -1155,7 +1155,7 @@ 

      MINT

    • TEAL

      -
      public static final float TEAL
      +
      public static final float TEAL
      This color constant "teal" has RGBA8888 code 007F7FFF, R 0.0, G 0.49803922, B 0.49803922, alpha 1.0, hue 0.5, and saturation 0.49803922. It can be represented as a packed float with the constant -0x1.fefep125F.
      @@ -1172,7 +1172,7 @@ 

      TEAL

    • TURQUOISE

      -
      public static final float TURQUOISE
      +
      public static final float TURQUOISE
      This color constant "turquoise" has RGBA8888 code 2ED6C9FF, R 0.18039216, G 0.8392157, B 0.7882353, alpha 1.0, hue 0.48710316, and saturation 0.65882355. It can be represented as a packed float with the constant -0x1.93ac5cp126F.
      @@ -1189,7 +1189,7 @@ 

      TURQUOISE

    • SKY

      -
      public static final float SKY
      +
      public static final float SKY
      This color constant "sky" has RGBA8888 code 10C0E0FF, R 0.0627451, G 0.7529412, B 0.8784314, alpha 1.0, hue 0.5256411, and saturation 0.8156863. It can be represented as a packed float with the constant -0x1.c1802p126F.
      @@ -1206,7 +1206,7 @@ 

      SKY

    • COBALT

      -
      public static final float COBALT
      +
      public static final float COBALT
      This color constant "cobalt" has RGBA8888 code 0046ABFF, R 0.0, G 0.27450982, B 0.67058825, alpha 1.0, hue 0.5984406, and saturation 0.67058825. It can be represented as a packed float with the constant -0x1.568cp126F.
      @@ -1223,7 +1223,7 @@ 

      COBALT

    • DENIM

      -
      public static final float DENIM
      +
      public static final float DENIM
      This color constant "denim" has RGBA8888 code 3088B8FF, R 0.1882353, G 0.53333336, B 0.72156864, alpha 1.0, hue 0.5588235, and saturation 0.53333336. It can be represented as a packed float with the constant -0x1.71106p126F.
      @@ -1240,7 +1240,7 @@ 

      DENIM

    @@ -1395,7 +1395,7 @@

    Method Details

  • parseDescription

    -
    public static float parseDescription(String description)
    +
    public static float parseDescription(String description)
    Parses a color description and returns the approximate color it describes, as a packed float color. Color descriptions consist of one or more lower-case words, separated by non-alphabetical characters (typically spaces and/or hyphens). Any word that is the name of a color in this SimplePalette will be looked up in @@ -1422,7 +1422,7 @@

    parseDescription

  • bestMatch

    -
    public static String bestMatch(float rgb, +
    public static String bestMatch(float rgb, int mixCount)
    Given a color as a packed RGBA float, this finds the closest description it can to match the given color while using at most mixCount colors to mix in. You should only use small numbers for mixCount, like 1 to 3; diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/class-use/ColorTools.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/class-use/ColorTools.html index 3a23b1d7..5224ab9e 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/class-use/ColorTools.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/class-use/ColorTools.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.pure.rgb.ColorTools (colorful-pure 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.pure.rgb.ColorTools (colorful-pure 0.6.0 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/class-use/Palette.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/class-use/Palette.html index 9a207306..8c8291f1 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/class-use/Palette.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/class-use/Palette.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.pure.rgb.Palette (colorful-pure 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.pure.rgb.Palette (colorful-pure 0.6.0 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/class-use/SimplePalette.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/class-use/SimplePalette.html index c80f65a6..ade3a21b 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/class-use/SimplePalette.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/class-use/SimplePalette.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.pure.rgb.SimplePalette (colorful-pure 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.pure.rgb.SimplePalette (colorful-pure 0.6.0 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/package-summary.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/package-summary.html index 3e44b401..70d6cfa0 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/package-summary.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/package-summary.html @@ -3,7 +3,7 @@ -com.github.tommyettinger.colorful.pure.rgb (colorful-pure 0.5.2-SNAPSHOT API) +com.github.tommyettinger.colorful.pure.rgb (colorful-pure 0.6.0 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/package-tree.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/package-tree.html index 9b396e9c..51e57274 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/package-tree.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/package-tree.html @@ -3,7 +3,7 @@ -com.github.tommyettinger.colorful.pure.rgb Class Hierarchy (colorful-pure 0.5.2-SNAPSHOT API) +com.github.tommyettinger.colorful.pure.rgb Class Hierarchy (colorful-pure 0.6.0 API) @@ -60,7 +60,7 @@

    Hierarchy For Package com.github.tommyettinger.colorful.pure.r

    Class Hierarchy

      -
    • java.lang.Object +
    • java.lang.Object
      • com.github.tommyettinger.colorful.pure.rgb.ColorTools
      • com.github.tommyettinger.colorful.pure.rgb.Palette
      • diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/package-use.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/package-use.html index 9a9a4a08..8aa4fe0b 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/package-use.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/rgb/package-use.html @@ -3,7 +3,7 @@ -Uses of Package com.github.tommyettinger.colorful.pure.rgb (colorful-pure 0.5.2-SNAPSHOT API) +Uses of Package com.github.tommyettinger.colorful.pure.rgb (colorful-pure 0.6.0 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ycwcm/ColorTools.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ycwcm/ColorTools.html index b1a925cf..99112ae8 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ycwcm/ColorTools.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ycwcm/ColorTools.html @@ -3,7 +3,7 @@ -ColorTools (colorful-pure 0.5.2-SNAPSHOT API) +ColorTools (colorful-pure 0.6.0 API) @@ -74,13 +74,13 @@

        Class ColorTools

    -
    java.lang.Object +
    java.lang.Object
    com.github.tommyettinger.colorful.pure.ycwcm.ColorTools

    public class ColorTools -extends Object
    +extends Object
    Contains code for manipulating colors as int and packed float values in the YCwCm color space.
    @@ -175,6 +175,31 @@

    Method Summary

    Brings the chromatic components of start closer to grayscale by change (desaturating them).
  • static float
    +
    editYCwCm​(float encoded, + float addY, + float addCw, + float addCm, + float addAlpha)
    +
    +
    Given a packed float YCwCm color, this edits its luma (Y), chromatic warmth (Cw), chromatic mildness (Cm), and + alpha channels by adding the corresponding "add" parameter and then clamping.
    +
    +
    static float
    +
    editYCwCm​(float encoded, + float addY, + float addCw, + float addCm, + float addAlpha, + float mulY, + float mulCw, + float mulCm, + float mulAlpha)
    +
    +
    Given a packed float YCwCm color, this edits its luma (Y), chromatic warmth (Cw), chromatic mildness (Cm), and + alpha channels by first multiplying each channel by the corresponding "mul" parameter and then adding the + corresponding "add" parameter, before clamping.
    +
    +
    static float
    enrich​(float start, float change)
    @@ -300,7 +325,7 @@

    Method Summary

    with the original Y.
  • static float
    -
    randomColor​(Random random)
    +
    randomColor​(Random random)
    Produces a random packed float color that is always in-gamut and should be uniformly distributed.
    @@ -379,8 +404,8 @@

    Method Summary

  • -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • @@ -1145,7 +1170,7 @@

    limitToGamut

  • limitToGamut

    -
    public static float limitToGamut(float y, +
    public static float limitToGamut(float y, float cw, float cm)
    Iteratively checks whether the given YCwCm color is in-gamut, and either brings the color closer to 50% gray if @@ -1165,7 +1190,7 @@

    limitToGamut

  • limitToGamut

    -
    public static float limitToGamut(float y, +
    public static float limitToGamut(float y, float cw, float cm, float a)
    @@ -1185,9 +1210,72 @@

    limitToGamut

  • +
    +

    editYCwCm

    +
    public static float editYCwCm(float encoded, + float addY, + float addCw, + float addCm, + float addAlpha)
    +
    Given a packed float YCwCm color, this edits its luma (Y), chromatic warmth (Cw), chromatic mildness (Cm), and + alpha channels by adding the corresponding "add" parameter and then clamping. This returns a different float + value (of course, the given float can't be edited in-place). You can give a value of 0 for any "add" parameter + you want to stay unchanged. This clamps the resulting color to remain in-gamut, so it should be safe to convert + it back to RGBA.
    +
    +
    Parameters:
    +
    encoded - a packed float YCwCm color
    +
    addY - how much to add to the luma channel; typically in the -1 to 1 range
    +
    addCw - how much to add to the chromatic warmth channel; typically in the -2 to 2 range
    +
    addCm - how much to add to the chromatic mildness channel; typically in the -2 to 2 range
    +
    addAlpha - how much to add to the alpha channel; typically in the -1 to 1 range
    +
    Returns:
    +
    a packed float YCwCm color with the requested edits applied to encoded
    +
    +
    +
  • +
  • +
    +

    editYCwCm

    +
    public static float editYCwCm(float encoded, + float addY, + float addCw, + float addCm, + float addAlpha, + float mulY, + float mulCw, + float mulCm, + float mulAlpha)
    +
    Given a packed float YCwCm color, this edits its luma (Y), chromatic warmth (Cw), chromatic mildness (Cm), and + alpha channels by first multiplying each channel by the corresponding "mul" parameter and then adding the + corresponding "add" parameter, before clamping. This means the luma value is multiplied by mulY, then has + addY added, and then is clamped to the normal range for luma (0 to 1). This returns a different float + value (of course, the given float can't be edited in-place). You can give a value of 0 for any "add" parameter + you want to stay unchanged, or a value of 1 for any "mul" parameter that shouldn't change. Note that this + manipulates chromatic warmth and mildness in the -1 to 1 range, so if you multiply by a small number like + 0.25f, then this will produce a less-saturated color, and if you multiply by a larger number like + 4f, then you will get a much more-saturated color. This clamps the resulting color to remain in-gamut, + so it should be safe to convert it back to RGBA.
    +
    +
    Parameters:
    +
    encoded - a packed float YCwCm color
    +
    addY - how much to add to the luma channel; typically in the -1 to 1 range
    +
    addCw - how much to add to the chromatic warmth channel; typically in the -2 to 2 range
    +
    addCm - how much to add to the chromatic mildness channel; typically in the -2 to 2 range
    +
    addAlpha - how much to add to the alpha channel; typically in the -1 to 1 range
    +
    mulY - how much to multiply the luma channel by; should be non-negative
    +
    mulCw - how much to multiply the chromatic warmth channel by; usually non-negative (not always)
    +
    mulCm - how much to multiply the chromatic mildness channel by; usually non-negative (not always)
    +
    mulAlpha - how much to multiply the alpha channel by; should be non-negative
    +
    Returns:
    +
    a packed float YCwCm color with the requested edits applied to encoded
    +
    +
    +
  • +
  • randomColor

    -
    public static float randomColor(Random random)
    +
    public static float randomColor(Random random)
    Produces a random packed float color that is always in-gamut and should be uniformly distributed.
    Parameters:
    diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ycwcm/Palette.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ycwcm/Palette.html index 5894f262..a2866628 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ycwcm/Palette.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ycwcm/Palette.html @@ -3,7 +3,7 @@ -Palette (colorful-pure 0.5.2-SNAPSHOT API) +Palette (colorful-pure 0.6.0 API) @@ -70,13 +70,13 @@

    Class Palette

  • -
    java.lang.Object +
    java.lang.Object
    com.github.tommyettinger.colorful.pure.ycwcm.Palette

    public class Palette -extends Object
    +extends Object
    A palette of predefined colors as packed YCwCm floats, the kind FloatColors works with. You can access colors by their constant name, such as OCEAN_BLUE, by the NAMED map using NAMED.get("Ocean Blue", 0f), or by index in the FloatArray called LIST. Note that to access a float @@ -837,21 +837,21 @@

    Field Summary

    This color constant "Mush" has RGBA8888 code B1B10AFF, luma 0.6117647, warmth 0.82745105, mildness 0.82745105, alpha 1.0, hue 0.16666666, and saturation 0.90322566.
    -
    static com.github.tommyettinger.ds.ObjectFloatOrderedMap<String>
    +
    static com.github.tommyettinger.ds.ObjectFloatOrderedMap<String>
     
    -
    static com.github.tommyettinger.ds.ObjectList<String>
    +
    static com.github.tommyettinger.ds.ObjectList<String>
    All names for colors in this palette, in alphabetical order.
    -
    static com.github.tommyettinger.ds.ObjectList<String>
    +
    static com.github.tommyettinger.ds.ObjectList<String>
    All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to blue.
    -
    static com.github.tommyettinger.ds.ObjectList<String>
    +
    static com.github.tommyettinger.ds.ObjectList<String>
    All names for colors in this palette, sorted by lightness from black to white.
    @@ -1422,8 +1422,8 @@

    Constructor Summary

    Method Summary

    -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • @@ -1438,7 +1438,7 @@

    Field Details

  • NAMED

    -
    public static final com.github.tommyettinger.ds.ObjectFloatOrderedMap<String> NAMED
    +
    public static final com.github.tommyettinger.ds.ObjectFloatOrderedMap<String> NAMED
  • @@ -5802,7 +5802,7 @@

    RASPBERRY

  • NAMES

    -
    public static final com.github.tommyettinger.ds.ObjectList<String> NAMES
    +
    public static final com.github.tommyettinger.ds.ObjectList<String> NAMES
    All names for colors in this palette, in alphabetical order. You can fetch the corresponding packed float color by looking up a name in NAMED.
    @@ -5810,7 +5810,7 @@

    NAMES

  • NAMES_BY_HUE

    -
    public static final com.github.tommyettinger.ds.ObjectList<String> NAMES_BY_HUE
    +
    public static final com.github.tommyettinger.ds.ObjectList<String> NAMES_BY_HUE
    All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to blue. You can fetch the corresponding packed float color by looking up a name in NAMED.
    @@ -5818,7 +5818,7 @@

    NAMES_BY_HUE

  • NAMES_BY_LIGHTNESS

    -
    public static final com.github.tommyettinger.ds.ObjectList<String> NAMES_BY_LIGHTNESS
    +
    public static final com.github.tommyettinger.ds.ObjectList<String> NAMES_BY_LIGHTNESS
    All names for colors in this palette, sorted by lightness from black to white. You can fetch the corresponding packed float color by looking up a name in NAMED.
    diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ycwcm/class-use/ColorTools.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ycwcm/class-use/ColorTools.html index 173f6185..4839cbac 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ycwcm/class-use/ColorTools.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ycwcm/class-use/ColorTools.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.pure.ycwcm.ColorTools (colorful-pure 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.pure.ycwcm.ColorTools (colorful-pure 0.6.0 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ycwcm/class-use/Palette.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ycwcm/class-use/Palette.html index 3079c5bd..cf5b0fce 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ycwcm/class-use/Palette.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ycwcm/class-use/Palette.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.pure.ycwcm.Palette (colorful-pure 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.pure.ycwcm.Palette (colorful-pure 0.6.0 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ycwcm/package-summary.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ycwcm/package-summary.html index a9565e31..73a17313 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ycwcm/package-summary.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ycwcm/package-summary.html @@ -3,7 +3,7 @@ -com.github.tommyettinger.colorful.pure.ycwcm (colorful-pure 0.5.2-SNAPSHOT API) +com.github.tommyettinger.colorful.pure.ycwcm (colorful-pure 0.6.0 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ycwcm/package-tree.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ycwcm/package-tree.html index 9d1e493e..3f00c441 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ycwcm/package-tree.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ycwcm/package-tree.html @@ -3,7 +3,7 @@ -com.github.tommyettinger.colorful.pure.ycwcm Class Hierarchy (colorful-pure 0.5.2-SNAPSHOT API) +com.github.tommyettinger.colorful.pure.ycwcm Class Hierarchy (colorful-pure 0.6.0 API) @@ -60,7 +60,7 @@

    Hierarchy For Package com.github.tommyettinger.colorful.pure.y

    Class Hierarchy

      -
    • java.lang.Object +
    • java.lang.Object
      • com.github.tommyettinger.colorful.pure.ycwcm.ColorTools
      • com.github.tommyettinger.colorful.pure.ycwcm.Palette
      • diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ycwcm/package-use.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ycwcm/package-use.html index ccd60c44..15764b86 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ycwcm/package-use.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/ycwcm/package-use.html @@ -3,7 +3,7 @@ -Uses of Package com.github.tommyettinger.colorful.pure.ycwcm (colorful-pure 0.5.2-SNAPSHOT API) +Uses of Package com.github.tommyettinger.colorful.pure.ycwcm (colorful-pure 0.6.0 API) diff --git a/docs/colorful-pure/apidocs/constant-values.html b/docs/colorful-pure/apidocs/constant-values.html index e1491669..70ebf372 100644 --- a/docs/colorful-pure/apidocs/constant-values.html +++ b/docs/colorful-pure/apidocs/constant-values.html @@ -3,7 +3,7 @@ -Constant Field Values (colorful-pure 0.5.2-SNAPSHOT API) +Constant Field Values (colorful-pure 0.6.0 API) diff --git a/docs/colorful-pure/apidocs/help-doc.html b/docs/colorful-pure/apidocs/help-doc.html index 52cacc31..3fb6ffe6 100644 --- a/docs/colorful-pure/apidocs/help-doc.html +++ b/docs/colorful-pure/apidocs/help-doc.html @@ -3,7 +3,7 @@ -API Help (colorful-pure 0.5.2-SNAPSHOT API) +API Help (colorful-pure 0.6.0 API) @@ -64,10 +64,10 @@

        Package

        • Interfaces
        • Classes
        • -
        • Enums
        • +
        • Enum Classes
        • Exceptions
        • Errors
        • -
        • Annotation Types
        • +
        • Annotation Interfaces
    @@ -99,19 +99,19 @@

    Class or Interface

    The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.

    -

    Annotation Type

    -

    Each annotation type has its own separate page with the following sections:

    +

    Annotation Interface

    +

    Each annotation interface has its own separate page with the following sections:

      -
    • Annotation Type Declaration
    • -
    • Annotation Type Description
    • +
    • Annotation Interface Declaration
    • +
    • Annotation Interface Description
    • Required Element Summary
    • Optional Element Summary
    • Element Details
    -

    Enum

    -

    Each enum has its own separate page with the following sections:

    +

    Enum Class

    +

    Each enum class has its own separate page with the following sections:

    • Enum Declaration
    • Enum Description
    • diff --git a/docs/colorful-pure/apidocs/index-all.html b/docs/colorful-pure/apidocs/index-all.html index 87a73408..24a87c89 100644 --- a/docs/colorful-pure/apidocs/index-all.html +++ b/docs/colorful-pure/apidocs/index-all.html @@ -3,7 +3,7 @@ -Index (colorful-pure 0.5.2-SNAPSHOT API) +Index (colorful-pure 0.6.0 API) @@ -1291,6 +1291,11 @@

      C

      Gets the "chroma" or "colorfulness" of a given Oklab color.
      +
      chromaLimit(float, float) - Static method in class com.github.tommyettinger.colorful.pure.oklab.ColorTools
      +
      +
      Given a hue and lightness, this gets the (approximate) maximum chroma possible for that hue-lightness + combination.
      +
      chromaMild(float) - Static method in class com.github.tommyettinger.colorful.pure.ycwcm.ColorTools
      The "chroma mild" of the given packed float in YCwCm format, which when combined with chroma warm describes the @@ -1495,29 +1500,29 @@

      C

      cos(double) - Static method in class com.github.tommyettinger.colorful.pure.MathTools
      -
      A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x +
      A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x faster cos() calls in benchmarking; if you have access to libGDX you should consider its sometimes-more-precise and sometimes-faster MathUtils.cos() method.
      cos(float) - Static method in class com.github.tommyettinger.colorful.pure.MathTools
      -
      A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x +
      A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x faster cos() calls in benchmarking, and both takes and returns floats; if you have access to libGDX you should consider its more-precise and sometimes-faster MathUtils.cos() method.
      cos_(double) - Static method in class com.github.tommyettinger.colorful.pure.MathTools
      -
      A variation on Math.cos(double) that takes its input as a fraction of a turn instead of in radians; one +
      A variation on Math.cos(double) that takes its input as a fraction of a turn instead of in radians; one turn is equal to 360 degrees or two*PI radians.
      cos_(float) - Static method in class com.github.tommyettinger.colorful.pure.MathTools
      -
      A variation on Math.cos(double) that takes its input as a fraction of a turn instead of in radians (it +
      A variation on Math.cos(double) that takes its input as a fraction of a turn instead of in radians (it also takes and returns a float); one turn is equal to 360 degrees or two*PI radians.
      cosDegrees(float) - Static method in class com.github.tommyettinger.colorful.pure.MathTools
      -
      A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x +
      A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x faster cos() calls in benchmarking, and both takes and returns floats; if you have access to libGDX, you should consider its more-precise and sometimes-faster MathUtils.cosDeg() method.
      @@ -2221,6 +2226,59 @@

      E

      This color constant "Earwax" has RGBA8888 code BFBF3FFF, luma 0.6862745, warmth 0.7490196, mildness 0.7490196, alpha 1.0, hue 0.16666667, and saturation 0.5039369.
      +
      editIPT(float, float, float, float, float) - Static method in class com.github.tommyettinger.colorful.pure.ipt_hq.ColorTools
      +
      +
      Given a packed float IPT_HQ color, this edits its intensity, protan, tritan, and alpha channels by adding the + corresponding "add" parameter and then clamping.
      +
      +
      editIPT(float, float, float, float, float) - Static method in class com.github.tommyettinger.colorful.pure.ipt.ColorTools
      +
      +
      Given a packed float IPT color, this edits its intensity, protan, tritan, and alpha channels by adding the + corresponding "add" parameter and then clamping.
      +
      +
      editIPT(float, float, float, float, float, float, float, float, float) - Static method in class com.github.tommyettinger.colorful.pure.ipt_hq.ColorTools
      +
      +
      Given a packed float IPT_HQ color, this edits its intensity, protan, tritan, and alpha channels by first + multiplying each channel by the corresponding "mul" parameter and then adding the corresponding "add" parameter, + before clamping.
      +
      +
      editIPT(float, float, float, float, float, float, float, float, float) - Static method in class com.github.tommyettinger.colorful.pure.ipt.ColorTools
      +
      +
      Given a packed float IPT color, this edits its intensity, protan, tritan, and alpha channels by first + multiplying each channel by the corresponding "mul" parameter and then adding the corresponding "add" parameter, + before clamping.
      +
      +
      editOklab(float, float, float, float, float) - Static method in class com.github.tommyettinger.colorful.pure.oklab.ColorTools
      +
      +
      Given a packed float Oklab color, this edits its L, A, B, and alpha channels by adding the corresponding "add" + parameter and then clamping.
      +
      +
      editOklab(float, float, float, float, float, float, float, float, float) - Static method in class com.github.tommyettinger.colorful.pure.oklab.ColorTools
      +
      +
      Given a packed float Oklab color, this edits its L, A, B, and alpha channels by first multiplying each channel by + the corresponding "mul" parameter and then adding the corresponding "add" parameter, before clamping.
      +
      +
      editRGB(float, float, float, float, float) - Static method in class com.github.tommyettinger.colorful.pure.rgb.ColorTools
      +
      +
      Given a packed float RGB color, this edits its red, green, blue, and alpha channels by adding the corresponding + "add" parameter and then clamping.
      +
      +
      editRGB(float, float, float, float, float, float, float, float, float) - Static method in class com.github.tommyettinger.colorful.pure.rgb.ColorTools
      +
      +
      Given a packed float RGB color, this edits its red, green, blue, and alpha channels by first multiplying each + channel by the corresponding "mul" parameter and then adding the corresponding "add" parameter, before clamping.
      +
      +
      editYCwCm(float, float, float, float, float) - Static method in class com.github.tommyettinger.colorful.pure.ycwcm.ColorTools
      +
      +
      Given a packed float YCwCm color, this edits its luma (Y), chromatic warmth (Cw), chromatic mildness (Cm), and + alpha channels by adding the corresponding "add" parameter and then clamping.
      +
      +
      editYCwCm(float, float, float, float, float, float, float, float, float) - Static method in class com.github.tommyettinger.colorful.pure.ycwcm.ColorTools
      +
      +
      Given a packed float YCwCm color, this edits its luma (Y), chromatic warmth (Cw), chromatic mildness (Cm), and + alpha channels by first multiplying each channel by the corresponding "mul" parameter and then adding the + corresponding "add" parameter, before clamping.
      +
      EGGPLANT - Static variable in class com.github.tommyettinger.colorful.pure.ipt_hq.Palette
      This color constant "Eggplant" has RGBA8888 code 320A46FF, intensity 0.19607843, protan 0.54901963, tritan 0.41568628, alpha 1.0, hue 0.77523744, and saturation 0.23475279.
      @@ -3780,7 +3838,7 @@

      L

      limitToGamut(float) - Static method in class com.github.tommyettinger.colorful.pure.ipt_hq.ColorTools
      -
      Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it +
      Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to grayscale if it isn't in-gamut, or returns it as soon as it is in-gamut.
      limitToGamut(float) - Static method in class com.github.tommyettinger.colorful.pure.ipt.ColorTools
      @@ -3800,7 +3858,7 @@

      L

      limitToGamut(float, float, float) - Static method in class com.github.tommyettinger.colorful.pure.ipt_hq.ColorTools
      -
      Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it +
      Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to grayscale if it isn't in-gamut, or returns it as soon as it is in-gamut.
      limitToGamut(float, float, float) - Static method in class com.github.tommyettinger.colorful.pure.ipt.ColorTools
      @@ -3820,7 +3878,7 @@

      L

      limitToGamut(float, float, float, float) - Static method in class com.github.tommyettinger.colorful.pure.ipt_hq.ColorTools
      -
      Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it +
      Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to grayscale if it isn't in-gamut, or returns it as soon as it is in-gamut.
      limitToGamut(float, float, float, float) - Static method in class com.github.tommyettinger.colorful.pure.ipt.ColorTools
      @@ -4562,6 +4620,28 @@

      O

      (a chromatic component ranging from greenish to reddish, called protan in IPT), B (a chromatic component ranging from bluish to yellowish, called tritan in IPT), and alpha (or opacity).

  • +
    oklabByHCL(float, float, float, float) - Static method in class com.github.tommyettinger.colorful.pure.oklab.ColorTools
    +
    +
    A different way to specify an Oklab color, using hue, chroma, lightness, and alpha something like a normal HSL(A) + color but calculating them directly in the Oklab color space.
    +
    +
    oklabByHSL(float, float, float, float) - Static method in class com.github.tommyettinger.colorful.pure.oklab.ColorTools
    +
    +
    A different way to specify an Oklab color, using hue, saturation, lightness, and alpha like a normal HSL(A) color + but calculating them directly in the Oklab color space.
    +
    +
    oklabHue(float) - Static method in class com.github.tommyettinger.colorful.pure.oklab.ColorTools
    +
    +
    Gets the hue of the given Oklab float color, but as Oklab understands hue rather than how HSL does.
    +
    +
    oklabLightness(float) - Static method in class com.github.tommyettinger.colorful.pure.oklab.ColorTools
    +
    +
    Gets the lightness of the given Oklab float color, but as Oklab understands lightness rather than how HSL does.
    +
    +
    oklabSaturation(float) - Static method in class com.github.tommyettinger.colorful.pure.oklab.ColorTools
    +
    +
    Gets the saturation of the given Oklab float color, but as Oklab understands saturation rather than how HSL does.
    +
    OLD_ROSE - Static variable in class com.github.tommyettinger.colorful.pure.ipt_hq.Palette
    This color constant "Old Rose" has RGBA8888 code D7A0BEFF, intensity 0.7372549, protan 0.57254905, tritan 0.48235294, alpha 1.0, hue 0.91212684, and saturation 0.21507424.
    @@ -6184,29 +6264,29 @@

    S

     
    sin(double) - Static method in class com.github.tommyettinger.colorful.pure.MathTools
    -
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x +
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x faster sin() calls in benchmarking; if you have access to libGDX you should consider its sometimes-more-precise and sometimes-faster MathUtils.sin() method.
    sin(float) - Static method in class com.github.tommyettinger.colorful.pure.MathTools
    -
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x +
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x faster sin() calls in benchmarking, and both takes and returns floats; if you have access to libGDX you should consider its more-precise and sometimes-faster MathUtils.sin() method.
    sin_(double) - Static method in class com.github.tommyettinger.colorful.pure.MathTools
    -
    A variation on Math.sin(double) that takes its input as a fraction of a turn instead of in radians; one +
    A variation on Math.sin(double) that takes its input as a fraction of a turn instead of in radians; one turn is equal to 360 degrees or two*PI radians.
    sin_(float) - Static method in class com.github.tommyettinger.colorful.pure.MathTools
    -
    A variation on Math.sin(double) that takes its input as a fraction of a turn instead of in radians (it +
    A variation on Math.sin(double) that takes its input as a fraction of a turn instead of in radians (it also takes and returns a float); one turn is equal to 360 degrees or two*PI radians.
    sinDegrees(float) - Static method in class com.github.tommyettinger.colorful.pure.MathTools
    -
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x +
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x faster sin() calls in benchmarking, and both takes and returns floats; if you have access to libGDX, you should consider its more-precise and sometimes-faster MathUtils.sinDeg() method.
    diff --git a/docs/colorful-pure/apidocs/index.html b/docs/colorful-pure/apidocs/index.html index 37eb3571..834bda1b 100644 --- a/docs/colorful-pure/apidocs/index.html +++ b/docs/colorful-pure/apidocs/index.html @@ -3,7 +3,7 @@ -Overview (colorful-pure 0.5.2-SNAPSHOT API) +Overview (colorful-pure 0.6.0 API) @@ -51,7 +51,7 @@
    -

    colorful-pure 0.5.2-SNAPSHOT API

    +

    colorful-pure 0.6.0 API

    Packages
    diff --git a/docs/colorful-pure/apidocs/member-search-index.js b/docs/colorful-pure/apidocs/member-search-index.js index 339ceb8b..ce97c669 100644 --- a/docs/colorful-pure/apidocs/member-search-index.js +++ b/docs/colorful-pure/apidocs/member-search-index.js @@ -1 +1 @@ -memberSearchIndex = [{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"acos_(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"acos_(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"acos(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"acos(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"ALIASES"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"ALIASES"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"ALIASES"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"asin_(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"asin_(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"asin(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"asin(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2_(double, double)","u":"atan2_(double,double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2_(float, float)","u":"atan2_(float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2(double, double)","u":"atan2(double,double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2(float, float)","u":"atan2(float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2Degrees(double, double)","u":"atan2Degrees(double,double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2Degrees(float, float)","u":"atan2Degrees(float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2Degrees360(double, double)","u":"atan2Degrees360(double,double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2Degrees360(float, float)","u":"atan2Degrees360(float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atanDegrees(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atanDegrees(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"bestMatch(float, int)","u":"bestMatch(float,int)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"bestMatch(float, int)","u":"bestMatch(float,int)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"bestMatch(float, int)","u":"bestMatch(float,int)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"BRONZE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"BRONZE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"BRONZE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"BROWN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"BROWN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"BROWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"BUTTER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"BUTTER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"BUTTER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"CACTUS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"CACTUS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"CACTUS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"channelA(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"channelB(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"channelL(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"CHOCOLATE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"CHOCOLATE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"CHOCOLATE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"chroma(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"chromaMild(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"chromaWarm(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"CINNAMON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"CINNAMON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"CINNAMON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"COBALT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"COBALT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"COBALT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"COLORS_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"COLORS_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"COLORS_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"cool(float, float)","u":"cool(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"cos_(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"cos_(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"cos(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"cos(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"cosDegrees(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"DENIM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"DENIM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"DENIM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"dullen(float, float)","u":"dullen(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"dullen(float, float)","u":"dullen(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"dullen(float, float)","u":"dullen(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"dullen(float, float)","u":"dullen(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"EMBER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"EMBER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"EMBER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"enrich(float, float)","u":"enrich(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"enrich(float, float)","u":"enrich(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"enrich(float, float)","u":"enrich(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"enrich(float, float)","u":"enrich(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"FERN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"FERN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"FERN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"FloatColors()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"fromHSI(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"fromHSI(float, float, float, float)","u":"fromHSI(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"fromRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"fromRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"fromRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"fromRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"getRawGamutValue(int)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"hsl2rgb(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"hsl2rgb(float, float, float, float)","u":"hsl2rgb(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"inGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"inGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"inGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"inGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"inGamut(float, float, float)","u":"inGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"inGamut(float, float, float)","u":"inGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"inGamut(float, float, float)","u":"inGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"inGamut(float, float, float)","u":"inGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"intensity(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"intensity(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"ipt(float, float, float, float)","u":"ipt(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"ipt(float, float, float, float)","u":"ipt(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"lerp(float, float, float)","u":"lerp(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"lerpFloatColors(float, float, float)","u":"lerpFloatColors(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"lerpFloatColorsBlended(float, float, float)","u":"lerpFloatColorsBlended(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"LIME"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"LIME"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"LIME"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"limitToGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"limitToGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"limitToGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"limitToGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"limitToGamut(float, float, float)","u":"limitToGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"limitToGamut(float, float, float)","u":"limitToGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"limitToGamut(float, float, float)","u":"limitToGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"limitToGamut(float, float, float)","u":"limitToGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"limitToGamut(float, float, float, float)","u":"limitToGamut(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"limitToGamut(float, float, float, float)","u":"limitToGamut(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"limitToGamut(float, float, float, float)","u":"limitToGamut(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"limitToGamut(float, float, float, float)","u":"limitToGamut(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"lowerA(float, float)","u":"lowerA(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"lowerB(float, float)","u":"lowerB(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"luma(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"MathTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"maximizeSaturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"maximizeSaturation(float, float, float, float)","u":"maximizeSaturation(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"MINT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"MINT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"MINT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"mix(float, float)","u":"mix(float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"mix(float, float, float)","u":"mix(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"mix(float, float, float, float)","u":"mix(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"mix(float...)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"mix(float[], int, int)","u":"mix(float[],int,int)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"MOSS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"MOSS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"MOSS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"multiplyAlpha(float, float)","u":"multiplyAlpha(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"NAVY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"NAVY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"NAVY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"oklab(float, float, float, float)","u":"oklab(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"OLIVE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"OLIVE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"OLIVE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"parseDescription(String)","u":"parseDescription(java.lang.String)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"parseDescription(String)","u":"parseDescription(java.lang.String)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"parseDescription(String)","u":"parseDescription(java.lang.String)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"PEAR"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"PEAR"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"PEAR"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"PINK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"PINK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"PLUM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"PLUM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"PLUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"protan(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"protan(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"protanDown(float, float)","u":"protanDown(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"protanDown(float, float)","u":"protanDown(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"protanUp(float, float)","u":"protanUp(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"protanUp(float, float)","u":"protanUp(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"raiseA(float, float)","u":"raiseA(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"raiseB(float, float)","u":"raiseB(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"rgb(float, float, float, float)","u":"rgb(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"rgb2hsl(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"rgb2hsl(float, float, float, float)","u":"rgb2hsl(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"SAGE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"SAGE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"SAGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"setAlpha(float, float)","u":"setAlpha(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"SimplePalette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"SimplePalette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"SimplePalette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"sin_(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"sin_(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"sin(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"sin(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"sinDegrees(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"SKY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"SKY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"SKY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"strengthen(float, float)","u":"strengthen(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"subrandomColor(float, float, float)","u":"subrandomColor(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"subrandomColor(float, float, float)","u":"subrandomColor(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"TEAL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"TEAL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"toRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"toRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"toRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"toRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"tritan(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"tritan(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"tritanDown(float, float)","u":"tritanDown(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"tritanDown(float, float)","u":"tritanDown(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"tritanUp(float, float)","u":"tritanUp(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"tritanUp(float, float)","u":"tritanUp(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"warm(float, float)","u":"warm(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"weaken(float, float)","u":"weaken(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"ycwcm(float, float, float, float)","u":"ycwcm(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ZUCCHINI"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ZUCCHINI"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ZUCCHINI"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ZUCCHINI"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ZUCCHINI"}];updateSearchResults(); \ No newline at end of file +memberSearchIndex = [{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"acos_(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"acos_(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"acos(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"acos(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"ALIASES"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"ALIASES"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"ALIASES"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"asin_(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"asin_(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"asin(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"asin(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2_(double, double)","u":"atan2_(double,double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2_(float, float)","u":"atan2_(float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2(double, double)","u":"atan2(double,double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2(float, float)","u":"atan2(float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2Degrees(double, double)","u":"atan2Degrees(double,double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2Degrees(float, float)","u":"atan2Degrees(float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2Degrees360(double, double)","u":"atan2Degrees360(double,double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2Degrees360(float, float)","u":"atan2Degrees360(float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atanDegrees(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atanDegrees(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"bestMatch(float, int)","u":"bestMatch(float,int)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"bestMatch(float, int)","u":"bestMatch(float,int)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"bestMatch(float, int)","u":"bestMatch(float,int)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"BRONZE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"BRONZE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"BRONZE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"BROWN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"BROWN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"BROWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"BUTTER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"BUTTER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"BUTTER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"CACTUS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"CACTUS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"CACTUS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"channelA(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"channelB(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"channelL(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"CHOCOLATE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"CHOCOLATE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"CHOCOLATE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"chroma(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"chromaLimit(float, float)","u":"chromaLimit(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"chromaMild(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"chromaWarm(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"CINNAMON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"CINNAMON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"CINNAMON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"COBALT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"COBALT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"COBALT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"COLORS_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"COLORS_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"COLORS_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"cool(float, float)","u":"cool(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"cos_(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"cos_(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"cos(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"cos(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"cosDegrees(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"DENIM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"DENIM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"DENIM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"dullen(float, float)","u":"dullen(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"dullen(float, float)","u":"dullen(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"dullen(float, float)","u":"dullen(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"dullen(float, float)","u":"dullen(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"editIPT(float, float, float, float, float)","u":"editIPT(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"editIPT(float, float, float, float, float)","u":"editIPT(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"editIPT(float, float, float, float, float, float, float, float, float)","u":"editIPT(float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"editIPT(float, float, float, float, float, float, float, float, float)","u":"editIPT(float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"editOklab(float, float, float, float, float)","u":"editOklab(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"editOklab(float, float, float, float, float, float, float, float, float)","u":"editOklab(float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"editRGB(float, float, float, float, float)","u":"editRGB(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"editRGB(float, float, float, float, float, float, float, float, float)","u":"editRGB(float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"editYCwCm(float, float, float, float, float)","u":"editYCwCm(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"editYCwCm(float, float, float, float, float, float, float, float, float)","u":"editYCwCm(float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"EMBER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"EMBER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"EMBER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"enrich(float, float)","u":"enrich(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"enrich(float, float)","u":"enrich(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"enrich(float, float)","u":"enrich(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"enrich(float, float)","u":"enrich(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"FERN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"FERN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"FERN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"FloatColors()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"fromHSI(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"fromHSI(float, float, float, float)","u":"fromHSI(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"fromRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"fromRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"fromRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"fromRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"getRawGamutValue(int)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"hsl2rgb(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"hsl2rgb(float, float, float, float)","u":"hsl2rgb(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"inGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"inGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"inGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"inGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"inGamut(float, float, float)","u":"inGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"inGamut(float, float, float)","u":"inGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"inGamut(float, float, float)","u":"inGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"inGamut(float, float, float)","u":"inGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"intensity(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"intensity(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"ipt(float, float, float, float)","u":"ipt(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"ipt(float, float, float, float)","u":"ipt(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"lerp(float, float, float)","u":"lerp(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"lerpFloatColors(float, float, float)","u":"lerpFloatColors(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"lerpFloatColorsBlended(float, float, float)","u":"lerpFloatColorsBlended(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"LIME"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"LIME"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"LIME"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"limitToGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"limitToGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"limitToGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"limitToGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"limitToGamut(float, float, float)","u":"limitToGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"limitToGamut(float, float, float)","u":"limitToGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"limitToGamut(float, float, float)","u":"limitToGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"limitToGamut(float, float, float)","u":"limitToGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"limitToGamut(float, float, float, float)","u":"limitToGamut(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"limitToGamut(float, float, float, float)","u":"limitToGamut(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"limitToGamut(float, float, float, float)","u":"limitToGamut(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"limitToGamut(float, float, float, float)","u":"limitToGamut(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"lowerA(float, float)","u":"lowerA(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"lowerB(float, float)","u":"lowerB(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"luma(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"MathTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"maximizeSaturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"maximizeSaturation(float, float, float, float)","u":"maximizeSaturation(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"MINT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"MINT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"MINT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"mix(float, float)","u":"mix(float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"mix(float, float, float)","u":"mix(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"mix(float, float, float, float)","u":"mix(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"mix(float...)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"mix(float[], int, int)","u":"mix(float[],int,int)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"MOSS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"MOSS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"MOSS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"multiplyAlpha(float, float)","u":"multiplyAlpha(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"NAVY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"NAVY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"NAVY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"oklab(float, float, float, float)","u":"oklab(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"oklabByHCL(float, float, float, float)","u":"oklabByHCL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"oklabByHSL(float, float, float, float)","u":"oklabByHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"oklabHue(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"oklabLightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"oklabSaturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"OLIVE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"OLIVE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"OLIVE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"parseDescription(String)","u":"parseDescription(java.lang.String)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"parseDescription(String)","u":"parseDescription(java.lang.String)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"parseDescription(String)","u":"parseDescription(java.lang.String)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"PEAR"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"PEAR"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"PEAR"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"PINK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"PINK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"PLUM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"PLUM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"PLUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"protan(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"protan(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"protanDown(float, float)","u":"protanDown(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"protanDown(float, float)","u":"protanDown(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"protanUp(float, float)","u":"protanUp(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"protanUp(float, float)","u":"protanUp(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"raiseA(float, float)","u":"raiseA(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"raiseB(float, float)","u":"raiseB(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"rgb(float, float, float, float)","u":"rgb(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"rgb2hsl(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"rgb2hsl(float, float, float, float)","u":"rgb2hsl(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"SAGE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"SAGE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"SAGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"setAlpha(float, float)","u":"setAlpha(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"SimplePalette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"SimplePalette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"SimplePalette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"sin_(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"sin_(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"sin(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"sin(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"sinDegrees(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"SKY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"SKY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"SKY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"strengthen(float, float)","u":"strengthen(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"subrandomColor(float, float, float)","u":"subrandomColor(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"subrandomColor(float, float, float)","u":"subrandomColor(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"TEAL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"TEAL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"toRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"toRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"toRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"toRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"tritan(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"tritan(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"tritanDown(float, float)","u":"tritanDown(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"tritanDown(float, float)","u":"tritanDown(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"tritanUp(float, float)","u":"tritanUp(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"tritanUp(float, float)","u":"tritanUp(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"warm(float, float)","u":"warm(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"weaken(float, float)","u":"weaken(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"ycwcm(float, float, float, float)","u":"ycwcm(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ZUCCHINI"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ZUCCHINI"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ZUCCHINI"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ZUCCHINI"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ZUCCHINI"}];updateSearchResults(); \ No newline at end of file diff --git a/docs/colorful-pure/apidocs/overview-summary.html b/docs/colorful-pure/apidocs/overview-summary.html index 59efc74f..bd939693 100644 --- a/docs/colorful-pure/apidocs/overview-summary.html +++ b/docs/colorful-pure/apidocs/overview-summary.html @@ -3,7 +3,7 @@ -colorful-pure 0.5.2-SNAPSHOT API +colorful-pure 0.6.0 API diff --git a/docs/colorful-pure/apidocs/overview-tree.html b/docs/colorful-pure/apidocs/overview-tree.html index 35f395e5..e62e4eb5 100644 --- a/docs/colorful-pure/apidocs/overview-tree.html +++ b/docs/colorful-pure/apidocs/overview-tree.html @@ -3,7 +3,7 @@ -Class Hierarchy (colorful-pure 0.5.2-SNAPSHOT API) +Class Hierarchy (colorful-pure 0.6.0 API) @@ -65,7 +65,7 @@

    Hierarchy For All Packages

    Class Hierarchy

      -
    • java.lang.Object +
    • java.lang.Object
      • com.github.tommyettinger.colorful.pure.ipt_hq.ColorTools
      • com.github.tommyettinger.colorful.pure.ipt.ColorTools
      • diff --git a/docs/colorful-pure/apidocs/search.js b/docs/colorful-pure/apidocs/search.js index c5865187..2c2ced05 100644 --- a/docs/colorful-pure/apidocs/search.js +++ b/docs/colorful-pure/apidocs/search.js @@ -27,7 +27,7 @@ var noResult = {l: "No results found"}; var loading = {l: "Loading search index..."}; var catModules = "Modules"; var catPackages = "Packages"; -var catTypes = "Types"; +var catTypes = "Classes and Interfaces"; var catMembers = "Members"; var catSearchTags = "Search Tags"; var highlight = "$&"; diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/FloatColors.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/FloatColors.html index a4a908f1..38903601 100644 --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/FloatColors.html +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/FloatColors.html @@ -145,10 +145,10 @@ 132 133 /** 134 * Interpolates from the packed float color start towards end by change. Both start and end should be packed colors, -135 * as from {@link ColorTools#ycwcm(float, float, float, float)} or +135 * as from {@link com.github.tommyettinger.colorful.pure.oklab.ColorTools#oklab(float, float, float, float)} or 136 * {@link com.github.tommyettinger.colorful.pure.ipt.ColorTools#ipt(float, float, float, float)}, and change can be 137 * between 0f (keep start) and 1f (only use end). Both start and end should use the same color space; that is, both -138 * could be produced using YCwCm, both could be produced using IPT, or both could be libGDX-native RGB, but they +138 * could be produced using Oklab, both could be produced using IPT, or both could be libGDX-native RGB, but they 139 * can't mix. This is a good way to reduce allocations of temporary Colors. 140 * @param start the starting color as a packed float 141 * @param end the target color as a packed float @@ -168,11 +168,11 @@ 155 /** 156 * Interpolates from the packed float color start towards end by change, but keeps the alpha of start and uses the 157 * alpha of end as an extra factor that can affect how much to change. Both start and end should be packed colors, -158 * as from {@link ColorTools#ycwcm(float, float, float, float)} or -159 * {@link com.github.tommyettinger.colorful.pure.ipt.ColorTools#ipt(float, float, float, float)}, and change can be between 0f -160 * (keep start) and 1f (only use end). Both start and end should use the same color space; that is, both could be -161 * produced using YCwCm, or both could be produced using IPT, but not a mix of the two. This is a good way to -162 * reduce allocations of temporary Colors. +158 * as from {@link com.github.tommyettinger.colorful.pure.ipt_hq.ColorTools#ipt(float, float, float, float)} or +159 * {@link com.github.tommyettinger.colorful.pure.ycwcm.ColorTools#ycwcm(float, float, float, float)}, and change can +160 * be between 0f (keep start) and 1f (only use end). Both start and end should use the same color space; that is, +161 * both could be produced using IPT_HQ, or both could be produced using YCwCm, but not a mix of the two. This is a +162 * good way to reduce allocations of temporary Colors. 163 * @param start the starting color as a packed float; alpha will be preserved 164 * @param end the target color as a packed float; alpha will not be used directly, and will instead be multiplied with change 165 * @param change how much to go from start toward end, as a float between 0 and 1; higher means closer to end @@ -242,21 +242,23 @@ 229 /** 230 * Given several colors, this gets an even mix of all colors in equal measure. 231 * If {@code colors} is null or has no items, this returns 0f (usually transparent in most color spaces). -232 * @param colors an array or varargs of packed float colors; all should use the same color space -233 * @param offset the index of the first item in {@code colors} to use -234 * @param size how many items from {@code colors} to use -235 * @return an even mix of all colors given, as a packed float color -236 */ -237 public static float mix(float[] colors, int offset, int size) { -238 if(colors == null || colors.length < offset + size || offset < 0 || size <= 0) -239 return 0f; // transparent, usually -240 float result = colors[offset]; -241 for (int i = offset + 1, o = offset + size, denom = 2; i < o; i++, denom++) { -242 result = lerpFloatColors(result, colors[i], 1f / denom); -243 } -244 return result; -245 } -246} +232 * This is mostly useful in conjunction with {@link com.github.tommyettinger.ds.FloatList}, using its {@code items} +233 * for colors, typically 0 for offset, and its {@code size} for size. +234 * @param colors an array of packed float colors; all should use the same color space +235 * @param offset the index of the first item in {@code colors} to use +236 * @param size how many items from {@code colors} to use +237 * @return an even mix of all colors given, as a packed float color +238 */ +239 public static float mix(float[] colors, int offset, int size) { +240 if(colors == null || colors.length < offset + size || offset < 0 || size <= 0) +241 return 0f; // transparent, usually +242 float result = colors[offset]; +243 for (int i = offset + 1, o = offset + size, denom = 2; i < o; i++, denom++) { +244 result = lerpFloatColors(result, colors[i], 1f / denom); +245 } +246 return result; +247 } +248} diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ipt/ColorTools.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ipt/ColorTools.html index daa4d57c..66d0a5e2 100644 --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ipt/ColorTools.html +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ipt/ColorTools.html @@ -866,99 +866,160 @@ 853 } 854 return ipt(i2, p2 * 0.5f + 0.5f, t2 * 0.5f + 0.5f, a); 855 } -856 -857 /** -858 * Converts from a packed float in HSI format to a packed float in IPT format. -859 * @param packed a packed float in HSI format -860 * @return a packed float in IPT format -861 */ -862 public static float fromHSI(float packed){ -863 final int decoded = BitConversion.floatToRawIntBits(packed); -864 final float h = (decoded & 0xff) / 255f; -865 final float s = (decoded >>> 8 & 0xff) / 255f; -866 final float i = (decoded >>> 16 & 0xff) / 255f; -867 final float y = MathTools.cos_(h) * s, z = MathTools.sin_(h) * s; -868 final float crMid = 0.3481738f * y + 0.104959644f * z; -869 final float crScale = (i - 0.5f + (BitConversion.floatToRawIntBits(crMid) >>> 31)) * 0.16420607f / -crMid; -870 final float mgMid = 0.122068435f * y + -0.070396f * z; -871 final float mgScale = (i + 0.5f - (BitConversion.floatToRawIntBits(mgMid) >>> 31)) * -0.16136102f / -mgMid; -872 final float ybMid = 0.020876605f * y + -0.26078433f * z; -873 final float ybScale = (i - 0.5f + (BitConversion.floatToRawIntBits(ybMid) >>> 31)) * 0.16155326f / -ybMid; -874 final float scale = Math.max(crScale, Math.max(mgScale, ybScale)); -875 final float d = 4f * s * scale / (MathTools.sin(3.14159f * i) + 0.000001f); -876 -877 final float p = y * d; -878 final float t = z * d; -879 return BitConversion.intBitsToFloat((decoded & 0xFE000000) | ((int) (t * 255) << 16 & 0xFF0000) -880 | ((int) (p * 255) << 8 & 0xFF00) | (decoded >>> 16 & 0xFF)); -881 } -882 -883 /** -884 * Converts from hue, saturation, intensity, and alpha components (each ranging from 0 to 1 inclusive) to a packed -885 * float color in IPT format. -886 * @param hue hue, from 0 to 1 inclusive; 0 is red, 0.25 is yellow, 0.75 is blue -887 * @param saturation saturation from 0 (grayscale) to a limit between 0 and 1 depending on intensity (it can be 1 only when intensity is 0.5) -888 * @param intensity intensity, or lightness, from 0 (black) to 1 (white) -889 * @param alpha alpha transparency/opacity, from 0 (fully transparent) to 1 (fully opaque) -890 * @return a packed float in IPT format -891 */ -892 public static float fromHSI(float hue, float saturation, float intensity, float alpha){ -893 final float y = MathTools.cos_(hue) * saturation, z = MathTools.sin_(hue) * saturation; -894 final float crMid = 0.3481738f * y + 0.104959644f * z; -895 final float crScale = (intensity - 0.5f + (BitConversion.floatToRawIntBits(crMid) >>> 31)) * 0.16420607f / -crMid; -896 final float mgMid = 0.122068435f * y + -0.070396f * z; -897 final float mgScale = (intensity + 0.5f - (BitConversion.floatToRawIntBits(mgMid) >>> 31)) * -0.16136102f / -mgMid; -898 final float ybMid = 0.020876605f * y + -0.26078433f * z; -899 final float ybScale = (intensity - 0.5f + (BitConversion.floatToRawIntBits(ybMid) >>> 31)) * 0.16155326f / -ybMid; -900 final float scale = Math.max(crScale, Math.max(mgScale, ybScale)); -901 final float d = 4f * saturation * scale / (MathTools.sin(3.14159f * intensity) + 0.000001f); -902 -903 final float p = y * d; -904 final float t = z * d; -905 return BitConversion.intBitsToFloat(((int)(alpha * 255) << 24 & 0xFE000000) | ((int) (t * 255) << 16 & 0xFF0000) -906 | ((int) (p * 255) << 8 & 0xFF00) | ((int) (intensity * 255) & 0xFF)); -907 } -908 -909 /** -910 * Produces a random packed float color that is always in-gamut and should be uniformly distributed. -911 * @param random a Random object (or preferably a subclass of Random, like {@link com.github.tommyettinger.ds.support.LaserRandom}) -912 * @return a packed float color that is always in-gamut -913 */ -914 public static float randomColor(Random random) { -915 final float ir = 0.1882353f, pr = 0.83137256f - 0.5f, tr = 0.6431373f - 0.5f; -916 final float ig = 0.5764706f, pg = 0.12941177f - 0.5f, tg = 0.827451f - 0.5f; -917 final float ib = 0.23137255f, pb = 0.53333336f - 0.5f, tb = 0.02745098f - 0.5f; -918 final float r = random.nextFloat(), g = random.nextFloat(), b = random.nextFloat(); -919 return BitConversion.intBitsToFloat(0xFE000000 -920 | ((int) ((tr * r + tg * g + tb * b) * 128f + 128f) << 16 & 0xFF0000) -921 | ((int) ((pr * r + pg * g + pb * b) * 128f + 128f) << 8 & 0xFF00) -922 | ((int) ((ir * r + ig * g + ib * b) * 256f) & 0xFF)); -923 } -924 /** -925 * Limited-use; like {@link #randomColor(Random)} but for cases where you already have three floats (r, g, and b) -926 * distributed how you want. This can be somewhat useful if you are using a "subrandom" or "quasi-random" sequence, -927 * like the Halton, Sobol, or R3 sequences, to get 3D points and map them to colors. It can also be useful if you -928 * want to randomly generate the RGB channels yourself and track the values produced, as you would if you wanted to -929 * avoid generating too many colors with high blue, for instance. This approximately maps the r, g, and b parameters -930 * to distances on the RGB axes of a rectangular prism, which is stretched and rotated to form the IPT gamut. -931 * @param r red value to use; will be clamped between 0 and 1 -932 * @param g green value to use; will be clamped between 0 and 1 -933 * @param b blue value to use; will be clamped between 0 and 1 -934 * @return a packed float color that is always opaque -935 */ -936 public static float subrandomColor(float r, float g, float b) { -937 r = Math.min(Math.max(r, 0f), 0.999f); -938 g = Math.min(Math.max(g, 0f), 0.999f); -939 b = Math.min(Math.max(b, 0f), 0.999f); -940 final float ir = 0.1882353f, pr = 0.83137256f - 0.5f, tr = 0.6431373f - 0.5f; -941 final float ig = 0.5764706f, pg = 0.12941177f - 0.5f, tg = 0.827451f - 0.5f; -942 final float ib = 0.23137255f, pb = 0.53333336f - 0.5f, tb = 0.02745098f - 0.5f; -943 return BitConversion.intBitsToFloat(0xFE000000 -944 | ((int) ((tr * r + tg * g + tb * b) * 127.5f + 127.5f) << 16 & 0xFF0000) -945 | ((int) ((pr * r + pg * g + pb * b) * 127.5f + 127.5f) << 8 & 0xFF00) -946 | ((int) ((ir * r + ig * g + ib * b) * 255f) & 0xFF)); -947 } -948} +856 /** +857 * Given a packed float IPT color, this edits its intensity, protan, tritan, and alpha channels by adding the +858 * corresponding "add" parameter and then clamping. This returns a different float value (of course, the given float +859 * can't be edited in-place). You can give a value of 0 for any "add" parameter you want to stay unchanged. This +860 * clamps the resulting color to remain in-gamut, so it should be safe to convert it back to RGBA. +861 * @param encoded a packed float IPT color +862 * @param addI how much to add to the intensity channel; typically in the -1 to 1 range +863 * @param addP how much to add to the protan channel; typically in the -2 to 2 range +864 * @param addT how much to add to the tritan channel; typically in the -2 to 2 range +865 * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range +866 * @return a packed float IPT color with the requested edits applied to {@code encoded} +867 */ +868 public static float editIPT(float encoded, float addI, float addP, float addT, float addAlpha) { +869 return editIPT(encoded, addI, addP, addT, addAlpha, 1f, 1f, 1f, 1f); +870 } +871 /** +872 * Given a packed float IPT color, this edits its intensity, protan, tritan, and alpha channels by first +873 * multiplying each channel by the corresponding "mul" parameter and then adding the corresponding "add" parameter, +874 * before clamping. This means the intensity value is multiplied by {@code mulI}, then has {@code addI} added, and +875 * then is clamped to the normal range for intensity (0 to 1). This returns a different float value (of course, the +876 * given float can't be edited in-place). You can give a value of 0 for any "add" parameter you want to stay +877 * unchanged, or a value of 1 for any "mul" parameter that shouldn't change. Note that this manipulates protan and +878 * tritan in the -1 to 1 range, so if you multiply by a small number like {@code 0.25f}, then this will produce a +879 * less-saturated color, and if you multiply by a larger number like {@code 4f}, then you will get a much +880 * more-saturated color. This clamps the resulting color to remain in-gamut, so it should be safe to convert it back +881 * to RGBA. +882 * @param encoded a packed float IPT color +883 * @param addI how much to add to the intensity channel; typically in the -1 to 1 range +884 * @param addP how much to add to the protan channel; typically in the -2 to 2 range +885 * @param addT how much to add to the tritan channel; typically in the -2 to 2 range +886 * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range +887 * @param mulI how much to multiply the intensity channel by; should be non-negative +888 * @param mulP how much to multiply the protan channel by; usually non-negative (not always) +889 * @param mulT how much to multiply the tritan channel by; usually non-negative (not always) +890 * @param mulAlpha how much to multiply the alpha channel by; should be non-negative +891 * @return a packed float IPT color with the requested edits applied to {@code encoded} +892 */ +893 public static float editIPT(float encoded, float addI, float addP, float addT, float addAlpha, +894 float mulI, float mulP, float mulT, float mulAlpha) { +895 final int decoded = BitConversion.floatToRawIntBits(encoded); +896 float i = (decoded & 0xff) / 255f; +897 float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +898 float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +899 float alpha = (decoded >>> 25) / 127f; +900 +901 float i2 = Math.min(Math.max(i * mulI + addI, 0f), 1f); +902 float p2 = p = Math.min(Math.max(p * mulP + addP, -1f), 1f); +903 float t2 = t = Math.min(Math.max(t * mulT + addT, -1f), 1f); +904 alpha = Math.min(Math.max(alpha * mulAlpha + addAlpha, 0f), 1f); +905 for (int attempt = 31; attempt >= 0; attempt--) { +906 final float r = 0.999779f * i2 + 1.0709400f * p2 + 0.324891f * t2; +907 final float g = 1.000150f * i2 - 0.3777440f * p2 + 0.220439f * t2; +908 final float b = 0.999769f * i2 + 0.0629496f * p2 - 0.809638f * t2; +909 if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f) +910 break; +911 final float progress = attempt * 0x1p-5f; +912 p2 = MathTools.lerp(0, p, progress); +913 t2 = MathTools.lerp(0, t, progress); +914 } +915 return ipt(i2, p2 * 0.5f + 0.5f, t2 * 0.5f + 0.5f, alpha); +916 } +917 +918 /** +919 * Converts from a packed float in HSI format to a packed float in IPT format. +920 * @param packed a packed float in HSI format +921 * @return a packed float in IPT format +922 */ +923 public static float fromHSI(float packed){ +924 final int decoded = BitConversion.floatToRawIntBits(packed); +925 final float h = (decoded & 0xff) / 255f; +926 final float s = (decoded >>> 8 & 0xff) / 255f; +927 final float i = (decoded >>> 16 & 0xff) / 255f; +928 final float y = MathTools.cos_(h) * s, z = MathTools.sin_(h) * s; +929 final float crMid = 0.3481738f * y + 0.104959644f * z; +930 final float crScale = (i - 0.5f + (BitConversion.floatToRawIntBits(crMid) >>> 31)) * 0.16420607f / -crMid; +931 final float mgMid = 0.122068435f * y + -0.070396f * z; +932 final float mgScale = (i + 0.5f - (BitConversion.floatToRawIntBits(mgMid) >>> 31)) * -0.16136102f / -mgMid; +933 final float ybMid = 0.020876605f * y + -0.26078433f * z; +934 final float ybScale = (i - 0.5f + (BitConversion.floatToRawIntBits(ybMid) >>> 31)) * 0.16155326f / -ybMid; +935 final float scale = Math.max(crScale, Math.max(mgScale, ybScale)); +936 final float d = 4f * s * scale / (MathTools.sin(3.14159f * i) + 0.000001f); +937 +938 final float p = y * d; +939 final float t = z * d; +940 return BitConversion.intBitsToFloat((decoded & 0xFE000000) | ((int) (t * 255) << 16 & 0xFF0000) +941 | ((int) (p * 255) << 8 & 0xFF00) | (decoded >>> 16 & 0xFF)); +942 } +943 +944 /** +945 * Converts from hue, saturation, intensity, and alpha components (each ranging from 0 to 1 inclusive) to a packed +946 * float color in IPT format. +947 * @param hue hue, from 0 to 1 inclusive; 0 is red, 0.25 is yellow, 0.75 is blue +948 * @param saturation saturation from 0 (grayscale) to a limit between 0 and 1 depending on intensity (it can be 1 only when intensity is 0.5) +949 * @param intensity intensity, or lightness, from 0 (black) to 1 (white) +950 * @param alpha alpha transparency/opacity, from 0 (fully transparent) to 1 (fully opaque) +951 * @return a packed float in IPT format +952 */ +953 public static float fromHSI(float hue, float saturation, float intensity, float alpha){ +954 final float y = MathTools.cos_(hue) * saturation, z = MathTools.sin_(hue) * saturation; +955 final float crMid = 0.3481738f * y + 0.104959644f * z; +956 final float crScale = (intensity - 0.5f + (BitConversion.floatToRawIntBits(crMid) >>> 31)) * 0.16420607f / -crMid; +957 final float mgMid = 0.122068435f * y + -0.070396f * z; +958 final float mgScale = (intensity + 0.5f - (BitConversion.floatToRawIntBits(mgMid) >>> 31)) * -0.16136102f / -mgMid; +959 final float ybMid = 0.020876605f * y + -0.26078433f * z; +960 final float ybScale = (intensity - 0.5f + (BitConversion.floatToRawIntBits(ybMid) >>> 31)) * 0.16155326f / -ybMid; +961 final float scale = Math.max(crScale, Math.max(mgScale, ybScale)); +962 final float d = 4f * saturation * scale / (MathTools.sin(3.14159f * intensity) + 0.000001f); +963 +964 final float p = y * d; +965 final float t = z * d; +966 return BitConversion.intBitsToFloat(((int)(alpha * 255) << 24 & 0xFE000000) | ((int) (t * 255) << 16 & 0xFF0000) +967 | ((int) (p * 255) << 8 & 0xFF00) | ((int) (intensity * 255) & 0xFF)); +968 } +969 +970 /** +971 * Produces a random packed float color that is always in-gamut and should be uniformly distributed. +972 * @param random a Random object (or preferably a subclass of Random, like {@link com.github.tommyettinger.ds.support.LaserRandom}) +973 * @return a packed float color that is always in-gamut +974 */ +975 public static float randomColor(Random random) { +976 final float ir = 0.1882353f, pr = 0.83137256f - 0.5f, tr = 0.6431373f - 0.5f; +977 final float ig = 0.5764706f, pg = 0.12941177f - 0.5f, tg = 0.827451f - 0.5f; +978 final float ib = 0.23137255f, pb = 0.53333336f - 0.5f, tb = 0.02745098f - 0.5f; +979 final float r = random.nextFloat(), g = random.nextFloat(), b = random.nextFloat(); +980 return BitConversion.intBitsToFloat(0xFE000000 +981 | ((int) ((tr * r + tg * g + tb * b) * 128f + 128f) << 16 & 0xFF0000) +982 | ((int) ((pr * r + pg * g + pb * b) * 128f + 128f) << 8 & 0xFF00) +983 | ((int) ((ir * r + ig * g + ib * b) * 256f) & 0xFF)); +984 } +985 /** +986 * Limited-use; like {@link #randomColor(Random)} but for cases where you already have three floats (r, g, and b) +987 * distributed how you want. This can be somewhat useful if you are using a "subrandom" or "quasi-random" sequence, +988 * like the Halton, Sobol, or R3 sequences, to get 3D points and map them to colors. It can also be useful if you +989 * want to randomly generate the RGB channels yourself and track the values produced, as you would if you wanted to +990 * avoid generating too many colors with high blue, for instance. This approximately maps the r, g, and b parameters +991 * to distances on the RGB axes of a rectangular prism, which is stretched and rotated to form the IPT gamut. +992 * @param r red value to use; will be clamped between 0 and 1 +993 * @param g green value to use; will be clamped between 0 and 1 +994 * @param b blue value to use; will be clamped between 0 and 1 +995 * @return a packed float color that is always opaque +996 */ +997 public static float subrandomColor(float r, float g, float b) { +998 r = Math.min(Math.max(r, 0f), 0.999f); +999 g = Math.min(Math.max(g, 0f), 0.999f); +1000 b = Math.min(Math.max(b, 0f), 0.999f); +1001 final float ir = 0.1882353f, pr = 0.83137256f - 0.5f, tr = 0.6431373f - 0.5f; +1002 final float ig = 0.5764706f, pg = 0.12941177f - 0.5f, tg = 0.827451f - 0.5f; +1003 final float ib = 0.23137255f, pb = 0.53333336f - 0.5f, tb = 0.02745098f - 0.5f; +1004 return BitConversion.intBitsToFloat(0xFE000000 +1005 | ((int) ((tr * r + tg * g + tb * b) * 127.5f + 127.5f) << 16 & 0xFF0000) +1006 | ((int) ((pr * r + pg * g + pb * b) * 127.5f + 127.5f) << 8 & 0xFF00) +1007 | ((int) ((ir * r + ig * g + ib * b) * 255f) & 0xFF)); +1008 } +1009} diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ipt_hq/ColorTools.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ipt_hq/ColorTools.html index 101c180a..89252cfe 100644 --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ipt_hq/ColorTools.html +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ipt_hq/ColorTools.html @@ -919,98 +919,164 @@ 906 } 907 908 /** -909 * Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it -910 * isn't in-gamut, or returns it as soon as it is in-gamut. -911 * @param packed a packed float color in IPT format; often this color is not in-gamut -912 * @return the first color this finds that is between the given IPT color and 50% gray, and is in-gamut -913 * @see #inGamut(float) You can use inGamut() if you just want to check whether a color is in-gamut. -914 */ -915 public static float limitToGamut(final float packed) { -916 final int decoded = BitConversion.floatToRawIntBits(packed); -917 final float i = (decoded & 0xff) / 255f; -918 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -919 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -920 float i2 = i, p2 = p, t2 = t; -921 for (int attempt = 31; attempt >= 0; attempt--) { -922 final float l = reverseTransform(i2 + 0.097569f * p2 + 0.205226f * t2); -923 final float m = reverseTransform(i2 + -0.11388f * p2 + 0.133217f * t2); -924 final float s = reverseTransform(i2 + 0.032615f * p2 + -0.67689f * t2); -925 -926 final float r = 5.432622f * l + -4.67910f * m + 0.246257f * s; -927 final float g = -1.10517f * l + 2.311198f * m + -0.20588f * s; -928 final float b = 0.028104f * l + -0.19466f * m + 1.166325f * s; -929 if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f) -930 break; -931 final float progress = attempt * 0x1p-5f; -932 i2 = MathTools.lerp(0.55f, i, progress); +909 * Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to grayscale if it +910 * isn't in-gamut, or returns it as soon as it is in-gamut. Maintains the intensity of the color, only bringing +911 * protan and tritan closer to grayscale. +912 * @param packed a packed float color in IPT format; often this color is not in-gamut +913 * @return the first color this finds that is between the given IPT color and grayscale, and is in-gamut +914 * @see #inGamut(float) You can use inGamut() if you just want to check whether a color is in-gamut. +915 */ +916 public static float limitToGamut(final float packed) { +917 final int decoded = BitConversion.floatToRawIntBits(packed); +918 final float i = (decoded & 0xff) / 255f; +919 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +920 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +921 float p2 = p, t2 = t; +922 for (int attempt = 31; attempt >= 0; attempt--) { +923 final float l = reverseTransform(i + 0.097569f * p2 + 0.205226f * t2); +924 final float m = reverseTransform(i + -0.11388f * p2 + 0.133217f * t2); +925 final float s = reverseTransform(i + 0.032615f * p2 + -0.67689f * t2); +926 +927 final float r = 5.432622f * l + -4.67910f * m + 0.246257f * s; +928 final float g = -1.10517f * l + 2.311198f * m + -0.20588f * s; +929 final float b = 0.028104f * l + -0.19466f * m + 1.166325f * s; +930 if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f) +931 break; +932 final float progress = attempt * 0x1p-5f; 933 p2 = MathTools.lerp(0, p, progress); 934 t2 = MathTools.lerp(0, t, progress); 935 } -936 return ipt(i2, p2 * 0.5f + 0.5f, t2 * 0.5f + 0.5f, (decoded >>> 25) / 127f); +936 return ipt(i, p2 * 0.5f + 0.5f, t2 * 0.5f + 0.5f, (decoded >>> 25) / 127f); 937 } 938 939 /** -940 * Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it -941 * isn't in-gamut, or returns it as soon as it is in-gamut. This always produces an opaque color. -942 * @param i intensity component; will be clamped between 0 and 1 if it isn't already -943 * @param p protan component; will be clamped between 0 and 1 if it isn't already -944 * @param t tritan component; will be clamped between 0 and 1 if it isn't already -945 * @return the first color this finds that is between the given IPT color and 50% gray, and is in-gamut -946 * @see #inGamut(float, float, float) You can use inGamut() if you just want to check whether a color is in-gamut. -947 */ -948 public static float limitToGamut(float i, float p, float t) { -949 return limitToGamut(i, p, t, 1f); -950 } -951 /** -952 * Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it -953 * isn't in-gamut, or returns it as soon as it is in-gamut. -954 * @param i intensity component; will be clamped between 0 and 1 if it isn't already -955 * @param p protan component; will be clamped between 0 and 1 if it isn't already -956 * @param t tritan component; will be clamped between 0 and 1 if it isn't already -957 * @param a alpha component; will be clamped between 0 and 1 if it isn't already -958 * @return the first color this finds that is between the given IPT color and 50% gray, and is in-gamut -959 * @see #inGamut(float, float, float) You can use inGamut() if you just want to check whether a color is in-gamut. -960 */ -961 public static float limitToGamut(float i, float p, float t, float a) { -962 float i2 = i = Math.min(Math.max(i, 0f), 1f); -963 float p2 = p = Math.min(Math.max((p - 0.5f) * 2f, -1f), 1f); -964 float t2 = t = Math.min(Math.max((t - 0.5f) * 2f, -1f), 1f); -965 a = Math.min(Math.max(a, 0f), 1f); -966 for (int attempt = 31; attempt >= 0; attempt--) { -967 final float l = reverseTransform(i2 + 0.097569f * p2 + 0.205226f * t2); -968 final float m = reverseTransform(i2 + -0.11388f * p2 + 0.133217f * t2); -969 final float s = reverseTransform(i2 + 0.032615f * p2 + -0.67689f * t2); -970 -971 final float r = 5.432622f * l + -4.67910f * m + 0.246257f * s; -972 final float g = -1.10517f * l + 2.311198f * m + -0.20588f * s; -973 final float b = 0.028104f * l + -0.19466f * m + 1.166325f * s; -974 if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f) -975 break; -976 final float progress = attempt * 0x1p-5f; -977 i2 = MathTools.lerp(0.55f, i, progress); -978 p2 = MathTools.lerp(0, p, progress); -979 t2 = MathTools.lerp(0, t, progress); -980 } -981 return ipt(i2, p2 * 0.5f + 0.5f, t2 * 0.5f + 0.5f, a); -982 } -983 +940 * Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to grayscale if it +941 * isn't in-gamut, or returns it as soon as it is in-gamut. Maintains the intensity of the color, only bringing +942 * protan and tritan closer to grayscale. This always produces an opaque color. +943 * @param i intensity component; will be clamped between 0 and 1 if it isn't already +944 * @param p protan component; will be clamped between 0 and 1 if it isn't already +945 * @param t tritan component; will be clamped between 0 and 1 if it isn't already +946 * @return the first color this finds that is between the given IPT color and grayscale, and is in-gamut +947 * @see #inGamut(float, float, float) You can use inGamut() if you just want to check whether a color is in-gamut. +948 */ +949 public static float limitToGamut(float i, float p, float t) { +950 return limitToGamut(i, p, t, 1f); +951 } +952 /** +953 * Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to grayscale if it +954 * isn't in-gamut, or returns it as soon as it is in-gamut. Maintains the intensity of the color, only bringing +955 * protan and tritan closer to grayscale. +956 * @param i intensity component; will be clamped between 0 and 1 if it isn't already +957 * @param p protan component; will be clamped between 0 and 1 if it isn't already +958 * @param t tritan component; will be clamped between 0 and 1 if it isn't already +959 * @param a alpha component; will be clamped between 0 and 1 if it isn't already +960 * @return the first color this finds that is between the given IPT color and grayscale, and is in-gamut +961 * @see #inGamut(float, float, float) You can use inGamut() if you just want to check whether a color is in-gamut. +962 */ +963 public static float limitToGamut(float i, float p, float t, float a) { +964 float i2 = Math.min(Math.max(i, 0f), 1f); +965 float p2 = p = Math.min(Math.max((p - 0.5f) * 2f, -1f), 1f); +966 float t2 = t = Math.min(Math.max((t - 0.5f) * 2f, -1f), 1f); +967 a = Math.min(Math.max(a, 0f), 1f); +968 for (int attempt = 31; attempt >= 0; attempt--) { +969 final float l = reverseTransform(i2 + 0.097569f * p2 + 0.205226f * t2); +970 final float m = reverseTransform(i2 + -0.11388f * p2 + 0.133217f * t2); +971 final float s = reverseTransform(i2 + 0.032615f * p2 + -0.67689f * t2); +972 +973 final float r = 5.432622f * l + -4.67910f * m + 0.246257f * s; +974 final float g = -1.10517f * l + 2.311198f * m + -0.20588f * s; +975 final float b = 0.028104f * l + -0.19466f * m + 1.166325f * s; +976 if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f) +977 break; +978 final float progress = attempt * 0x1p-5f; +979 p2 = MathTools.lerp(0, p, progress); +980 t2 = MathTools.lerp(0, t, progress); +981 } +982 return ipt(i2, p2 * 0.5f + 0.5f, t2 * 0.5f + 0.5f, a); +983 } 984 /** -985 * Produces a random packed float color that is always in-gamut and should be uniformly distributed. -986 * @param random a Random object (preferably a subclass of Random, like {@link com.github.tommyettinger.ds.support.LaserRandom}) -987 * @return a packed float color that is always in-gamut -988 */ -989 public static float randomColor(Random random) { -990 float i = random.nextFloat(); -991 float p = random.nextFloat(); -992 float t = random.nextFloat(); -993 while (!inGamut(i, p, t)) { -994 i = random.nextFloat(); -995 p = random.nextFloat(); -996 t = random.nextFloat(); -997 } -998 return ipt(i, p, t, 1f); -999 } -1000} +985 * Given a packed float IPT_HQ color, this edits its intensity, protan, tritan, and alpha channels by adding the +986 * corresponding "add" parameter and then clamping. This returns a different float value (of course, the given float +987 * can't be edited in-place). You can give a value of 0 for any "add" parameter you want to stay unchanged. This +988 * clamps the resulting color to remain in-gamut, so it should be safe to convert it back to RGBA. +989 * @param encoded a packed float IPT_HQ color +990 * @param addI how much to add to the intensity channel; typically in the -1 to 1 range +991 * @param addP how much to add to the protan channel; typically in the -2 to 2 range +992 * @param addT how much to add to the tritan channel; typically in the -2 to 2 range +993 * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range +994 * @return a packed float IPT_HQ color with the requested edits applied to {@code encoded} +995 */ +996 public static float editIPT(float encoded, float addI, float addP, float addT, float addAlpha) { +997 return editIPT(encoded, addI, addP, addT, addAlpha, 1f, 1f, 1f, 1f); +998 } +999 /** +1000 * Given a packed float IPT_HQ color, this edits its intensity, protan, tritan, and alpha channels by first +1001 * multiplying each channel by the corresponding "mul" parameter and then adding the corresponding "add" parameter, +1002 * before clamping. This means the intensity value is multiplied by {@code mulI}, then has {@code addI} added, and +1003 * then is clamped to the normal range for intensity (0 to 1). This returns a different float value (of course, the +1004 * given float can't be edited in-place). You can give a value of 0 for any "add" parameter you want to stay +1005 * unchanged, or a value of 1 for any "mul" parameter that shouldn't change. Note that this manipulates protan and +1006 * tritan in the -1 to 1 range, so if you multiply by a small number like {@code 0.25f}, then this will produce a +1007 * less-saturated color, and if you multiply by a larger number like {@code 4f}, then you will get a much +1008 * more-saturated color. This clamps the resulting color to remain in-gamut, so it should be safe to convert it back +1009 * to RGBA. +1010 * @param encoded a packed float IPT_HQ color +1011 * @param addI how much to add to the intensity channel; typically in the -1 to 1 range +1012 * @param addP how much to add to the protan channel; typically in the -2 to 2 range +1013 * @param addT how much to add to the tritan channel; typically in the -2 to 2 range +1014 * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range +1015 * @param mulI how much to multiply the intensity channel by; should be non-negative +1016 * @param mulP how much to multiply the protan channel by; usually non-negative (not always) +1017 * @param mulT how much to multiply the tritan channel by; usually non-negative (not always) +1018 * @param mulAlpha how much to multiply the alpha channel by; should be non-negative +1019 * @return a packed float IPT_HQ color with the requested edits applied to {@code encoded} +1020 */ +1021 public static float editIPT(float encoded, float addI, float addP, float addT, float addAlpha, +1022 float mulI, float mulP, float mulT, float mulAlpha) { +1023 final int decoded = BitConversion.floatToRawIntBits(encoded); +1024 float i = (decoded & 0xff) / 255f; +1025 float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +1026 float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +1027 float alpha = (decoded >>> 25) / 127f; +1028 +1029 float i2 = Math.min(Math.max(i * mulI + addI, 0f), 1f); +1030 float p2 = p = Math.min(Math.max(p * mulP + addP, -1f), 1f); +1031 float t2 = t = Math.min(Math.max(t * mulT + addT, -1f), 1f); +1032 alpha = Math.min(Math.max(alpha * mulAlpha + addAlpha, 0f), 1f); +1033 for (int attempt = 31; attempt >= 0; attempt--) { +1034 final float l = reverseTransform(i2 + 0.097569f * p2 + 0.205226f * t2); +1035 final float m = reverseTransform(i2 + -0.11388f * p2 + 0.133217f * t2); +1036 final float s = reverseTransform(i2 + 0.032615f * p2 + -0.67689f * t2); +1037 +1038 final float r = 5.432622f * l + -4.67910f * m + 0.246257f * s; +1039 final float g = -1.10517f * l + 2.311198f * m + -0.20588f * s; +1040 final float b = 0.028104f * l + -0.19466f * m + 1.166325f * s; +1041 if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f) +1042 break; +1043 final float progress = attempt * 0x1p-5f; +1044 p2 = MathTools.lerp(0, p, progress); +1045 t2 = MathTools.lerp(0, t, progress); +1046 } +1047 return ipt(i2, p2 * 0.5f + 0.5f, t2 * 0.5f + 0.5f, alpha); +1048 } +1049 +1050 /** +1051 * Produces a random packed float color that is always in-gamut and should be uniformly distributed. +1052 * @param random a Random object (preferably a subclass of Random, like {@link com.github.tommyettinger.ds.support.LaserRandom}) +1053 * @return a packed float color that is always in-gamut +1054 */ +1055 public static float randomColor(Random random) { +1056 float i = random.nextFloat(); +1057 float p = random.nextFloat(); +1058 float t = random.nextFloat(); +1059 while (!inGamut(i, p, t)) { +1060 i = random.nextFloat(); +1061 p = random.nextFloat(); +1062 t = random.nextFloat(); +1063 } +1064 return ipt(i, p, t, 1f); +1065 } +1066} diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ipt_hq/SimplePalette.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ipt_hq/SimplePalette.html index 430600ad..f4c8d5e1 100644 --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ipt_hq/SimplePalette.html +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ipt_hq/SimplePalette.html @@ -748,13 +748,13 @@ 735 if (len > 2 && term.charAt(2) == 'g') { 736 switch (len) { 737 case 9: -738 intensity += 0.125f; +738 intensity += 0.14f; 739 case 8: -740 intensity += 0.125f; +740 intensity += 0.14f; 741 case 7: -742 intensity += 0.125f; +742 intensity += 0.14f; 743 case 5: -744 intensity += 0.125f; +744 intensity += 0.14f; 745 break; 746 default: 747 mixing.add(TRANSPARENT); @@ -788,13 +788,13 @@ 775 if (len > 1 && term.charAt(1) == 'a') { 776 switch (len) { 777 case 8: -778 intensity -= 0.125f; +778 intensity -= 0.14f; 779 case 7: -780 intensity -= 0.125f; +780 intensity -= 0.14f; 781 case 6: -782 intensity -= 0.125f; +782 intensity -= 0.14f; 783 case 4: -784 intensity -= 0.125f; +784 intensity -= 0.14f; 785 break; 786 default: 787 mixing.add(TRANSPARENT); @@ -881,7 +881,7 @@ 868 mixing.set(i, colorsByHue.get((c / e) % paletteSize)); 869 } 870 int idxI = ((c / colorTries) % 9 - 4), idxS = (c / (colorTries * 9) - 4); -871 float intensity = idxI * 0.125f, saturation = idxS * 0.2f; +871 float intensity = idxI * 0.14f, saturation = idxS * 0.2f; 872 873 float result = FloatColors.mix(mixing.items, 0, mixCount); 874 if(intensity > 0) result = ColorTools.lighten(result, intensity); diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/oklab/ColorTools.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/oklab/ColorTools.html index 04499046..0a14a20c 100644 --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/oklab/ColorTools.html +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/oklab/ColorTools.html @@ -17,1102 +17,1310 @@ 004import com.github.tommyettinger.colorful.pure.MathTools; 005import com.github.tommyettinger.ds.support.BitConversion; 006 -007import java.io.UnsupportedEncodingException; -008import java.nio.charset.StandardCharsets; -009import java.util.Random; -010 -011/** -012 * Contains code for manipulating colors as {@code int} and packed {@code float} values in the Oklab color space. -013 * Oklab is a very new color space that builds on the same foundation as IPT, but seems to be better-calibrated for -014 * uniform lightness and colorfulness, instead of just the emphasis on uniform hue that IPT has. Relative to IPT, Oklab -015 * has a noticeably smaller range in chromatic channels (IPT's protan and tritan can range past 0.8 or as low as 0.35, -016 * but the similar A and B channels in Oklab don't stray past about 0.65 at the upper end, if that), but it does this so -017 * the difference between two Oklab colors is just the Euclidean distance between their components. A slight difference -018 * between Oklab and IPT here is that IPT shrinks the chromatic channels to store their -1 to 1 range in a color float's -019 * 0 to 1 range, then offsets the shrunken range from -0.5 to 0.5, to 0 to 1; Oklab does not need to shrink the range, -020 * and only offsets it in the same way (both just add 0.5). -021 * <br> -022 * Here's <a href="https://bottosson.github.io/posts/oklab/">Björn Ottosson's original post introducing Oklab</a>. -023 * So far, <a href="https://raphlinus.github.io/color/2021/01/18/oklab-critique.html">it stood up to analysis by Raph -024 * Levien</a>, and seems to be gaining fans quickly. -025 */ -026public class ColorTools { -027 /** -028 * Gets a packed float representation of a color given as 4 float components, here, L (luminance or lightness), A -029 * (a chromatic component ranging from greenish to reddish, called protan in IPT), B (a chromatic component ranging -030 * from bluish to yellowish, called tritan in IPT), and alpha (or opacity). L should be -031 * between 0 and 1, inclusive, with 0 used for very dark colors (almost only black), and 1 used for very light -032 * colors (almost only white). A and B range from 0.0 to 1.0, with grayscale results when both are about 0.5. -033 * There's some aesthetic value in changing just one chroma value. When A is high and B is low, the color is more -034 * purple/magenta, when both are low it is more bluish, when B is high and A is low, the color tends to be greenish, -035 * and when both are high it tends to be orange. When A and B are both near 0.5f, the color is closer to gray. -036 * Alpha is the multiplicative opacity of the color, and acts like RGBA's alpha. -037 * <br> -038 * This method bit-masks the resulting color's byte values, so any values can technically be given to this as -039 * L, A, and B, but they will only be reversible from the returned float color to the original L, -040 * A, and B values if the original values were in the range that {@link #channelL(float)}, {@link #channelA(float)}, -041 * and {@link #channelB(float)} return. You can use {@link #inGamut(float, float, float)} to check if a given set of -042 * L, A, and B values is in-gamut, that is, it can be converted to and from an RGB color without going out of the -043 * valid range. If you just want to enforce that a color is in-gamut, you can use -044 * {@link #limitToGamut(float, float, float, float)}, which takes the same parameters this method does, or -045 * {@link #limitToGamut(float)} if you already have a packed float color that could be out-of-gamut. -046 * -047 * @param l 0f to 1f, lightness or L component of Oklab, with 0.5f meaning "no change" and 1f brightening -048 * @param a 0f to 1f, protan or A component of Oklab, with 1f more orange, red, or magenta -049 * @param b 0f to 1f, tritan or B component of Oklab, with 1f more green, yellow, or red -050 * @param alpha 0f to 1f, 0f makes the color transparent and 1f makes it opaque -051 * @return a float encoding a color with the given properties -052 */ -053 public static float oklab(float l, float a, float b, float alpha) { -054 return BitConversion.intBitsToFloat(((int) (alpha * 255) << 24 & 0xFE000000) | ((int) (b * 255) << 16 & 0xFF0000) -055 | ((int) (a * 255) << 8 & 0xFF00) | ((int) (l * 255) & 0xFF)); -056 } -057 -058 /** -059 * An approximation of the cube-root function for float inputs and outputs. -060 * This can be about twice as fast as {@link Math#cbrt(double)}. This -061 * version does not tolerate negative inputs, because in the narrow use -062 * case it has in this class, it never is given negative inputs. -063 * <br> -064 * Has very low relative error (less than 1E-9) when inputs are uniformly -065 * distributed between 0 and 512, and absolute mean error of less than -066 * 1E-6 in the same scenario. Uses a bit-twiddling method similar to one -067 * presented in Hacker's Delight and also used in early 3D graphics (see -068 * https://en.wikipedia.org/wiki/Fast_inverse_square_root for more, but -069 * this code approximates cbrt(x) and not 1/sqrt(x)). This specific code -070 * was originally by Marc B. Reynolds, posted in his "Stand-alone-junk" -071 * repo: https://github.com/Marc-B-Reynolds/Stand-alone-junk/blob/master/src/Posts/ballcube.c#L182-L197 . -072 * It's worth noting that while hardware instructions for finding the -073 * square root of a float have gotten extremely fast, the same is not -074 * true for the cube root (which has to allow negative inputs), so while -075 * the bit-twiddling inverse square root is no longer a beneficial -076 * optimization on current hardware, this does seem to help. -077 * <br> -078 * This is used when converting from RGB to Oklab, as an intermediate step. -079 * @param x any non-negative finite float to find the cube root of -080 * @return the cube root of x, approximated -081 */ -082 private static float cbrtPositive(float x) { -083 int ix = BitConversion.floatToRawIntBits(x); -084 final float x0 = x; -085 ix = (ix>>>2) + (ix>>>4); -086 ix += (ix>>>4); -087 ix += (ix>>>8) + 0x2A5137A0; -088 x = BitConversion.intBitsToFloat(ix); +007import java.nio.charset.StandardCharsets; +008import java.util.Random; +009 +010/** +011 * Contains code for manipulating colors as {@code int} and packed {@code float} values in the Oklab color space. +012 * Oklab is a very new color space that builds on the same foundation as IPT, but seems to be better-calibrated for +013 * uniform lightness and colorfulness, instead of just the emphasis on uniform hue that IPT has. Relative to IPT, Oklab +014 * has a noticeably smaller range in chromatic channels (IPT's protan and tritan can range past 0.8 or as low as 0.35, +015 * but the similar A and B channels in Oklab don't stray past about 0.65 at the upper end, if that), but it does this so +016 * the difference between two Oklab colors is just the Euclidean distance between their components. A slight difference +017 * between Oklab and IPT here is that IPT shrinks the chromatic channels to store their -1 to 1 range in a color float's +018 * 0 to 1 range, then offsets the shrunken range from -0.5 to 0.5, to 0 to 1; Oklab does not need to shrink the range, +019 * and only offsets it in the same way (both just add 0.5). +020 * <br> +021 * Here's <a href="https://bottosson.github.io/posts/oklab/">Björn Ottosson's original post introducing Oklab</a>. +022 * So far, <a href="https://raphlinus.github.io/color/2021/01/18/oklab-critique.html">it stood up to analysis by Raph +023 * Levien</a>, and seems to be gaining fans quickly. +024 */ +025public class ColorTools { +026 /** +027 * Gets a packed float representation of a color given as 4 float components, here, L (luminance or lightness), A +028 * (a chromatic component ranging from greenish to reddish, called protan in IPT), B (a chromatic component ranging +029 * from bluish to yellowish, called tritan in IPT), and alpha (or opacity). L should be +030 * between 0 and 1, inclusive, with 0 used for very dark colors (almost only black), and 1 used for very light +031 * colors (almost only white). A and B range from 0.0 to 1.0, with grayscale results when both are about 0.5. +032 * There's some aesthetic value in changing just one chroma value. When A is high and B is low, the color is more +033 * purple/magenta, when both are low it is more bluish, when B is high and A is low, the color tends to be greenish, +034 * and when both are high it tends to be orange. When A and B are both near 0.5f, the color is closer to gray. +035 * Alpha is the multiplicative opacity of the color, and acts like RGBA's alpha. +036 * <br> +037 * This method bit-masks the resulting color's byte values, so any values can technically be given to this as +038 * L, A, and B, but they will only be reversible from the returned float color to the original L, +039 * A, and B values if the original values were in the range that {@link #channelL(float)}, {@link #channelA(float)}, +040 * and {@link #channelB(float)} return. You can use {@link #inGamut(float, float, float)} to check if a given set of +041 * L, A, and B values is in-gamut, that is, it can be converted to and from an RGB color without going out of the +042 * valid range. If you just want to enforce that a color is in-gamut, you can use +043 * {@link #limitToGamut(float, float, float, float)}, which takes the same parameters this method does, or +044 * {@link #limitToGamut(float)} if you already have a packed float color that could be out-of-gamut. +045 * +046 * @param l 0f to 1f, lightness or L component of Oklab, with 0.5f meaning "no change" and 1f brightening +047 * @param a 0f to 1f, protan or A component of Oklab, with 1f more orange, red, or magenta +048 * @param b 0f to 1f, tritan or B component of Oklab, with 1f more green, yellow, or red +049 * @param alpha 0f to 1f, 0f makes the color transparent and 1f makes it opaque +050 * @return a float encoding a color with the given properties +051 */ +052 public static float oklab(float l, float a, float b, float alpha) { +053 return BitConversion.intBitsToFloat(((int) (alpha * 255) << 24 & 0xFE000000) | ((int) (b * 255) << 16 & 0xFF0000) +054 | ((int) (a * 255) << 8 & 0xFF00) | ((int) (l * 255) & 0xFF)); +055 } +056 +057 /** +058 * An approximation of the cube-root function for float inputs and outputs. +059 * This can be about twice as fast as {@link Math#cbrt(double)}. This +060 * version does not tolerate negative inputs, because in the narrow use +061 * case it has in this class, it never is given negative inputs. +062 * <br> +063 * Has very low relative error (less than 1E-9) when inputs are uniformly +064 * distributed between 0 and 512, and absolute mean error of less than +065 * 1E-6 in the same scenario. Uses a bit-twiddling method similar to one +066 * presented in Hacker's Delight and also used in early 3D graphics (see +067 * https://en.wikipedia.org/wiki/Fast_inverse_square_root for more, but +068 * this code approximates cbrt(x) and not 1/sqrt(x)). This specific code +069 * was originally by Marc B. Reynolds, posted in his "Stand-alone-junk" +070 * repo: https://github.com/Marc-B-Reynolds/Stand-alone-junk/blob/master/src/Posts/ballcube.c#L182-L197 . +071 * It's worth noting that while hardware instructions for finding the +072 * square root of a float have gotten extremely fast, the same is not +073 * true for the cube root (which has to allow negative inputs), so while +074 * the bit-twiddling inverse square root is no longer a beneficial +075 * optimization on current hardware, this does seem to help. +076 * <br> +077 * This is used when converting from RGB to Oklab, as an intermediate step. +078 * @param x any non-negative finite float to find the cube root of +079 * @return the cube root of x, approximated +080 */ +081 private static float cbrtPositive(float x) { +082 int ix = BitConversion.floatToRawIntBits(x); +083 final float x0 = x; +084 ix = (ix>>>2) + (ix>>>4); +085 ix += (ix>>>4); +086 ix += (ix>>>8) + 0x2A5137A0; +087 x = BitConversion.intBitsToFloat(ix); +088 x = 0.33333334f*(2f * x + x0/(x*x)); 089 x = 0.33333334f*(2f * x + x0/(x*x)); -090 x = 0.33333334f*(2f * x + x0/(x*x)); -091 return x; -092 } -093 -094 /** -095 * Used when converting from Oklab to RGB, as an intermediate step. -096 * Really just {@code x * x * x}. -097 * @param x one of the LMS Prime channels to be converted to LMS -098 * @return an LMS channel value, which can be converted to RGB -099 */ -100 private static float cube(final float x) { -101 return x * x * x; -102 } -103 -104 /** -105 * Used when given non-linear sRGB inputs to make them linear, approximating with gamma 2.0. -106 * Really just {@code component * component}. -107 * @param component any non-linear channel of a color, to be made linear -108 * @return a linear version of component -109 */ -110 private static float forwardGamma(final float component) { -111 return component * component; -112 } -113 -114 /** -115 * Used to return from a linear, gamma-corrected input to an sRGB, non-linear output, using gamma 2.0. -116 * Really just gets the square root of component, as a float. -117 * @param component a linear channel of a color, to be made non-linear -118 * @return a non-linear version of component -119 */ -120 private static float reverseGamma(final float component) { -121 return (float)Math.sqrt(component); -122 } -123 -124 /** -125 * Converts a packed float color in the format produced by {@link ColorTools#oklab(float, float, float, float)} to an RGBA8888 int. -126 * This format of int can be used with Pixmap and in some other places in libGDX. -127 * @param packed a packed float color, as produced by {@link ColorTools#oklab(float, float, float, float)} -128 * @return an RGBA8888 int color -129 */ -130 public static int toRGBA8888(final float packed) -131 { -132 final int decoded = BitConversion.floatToRawIntBits(packed); -133 final float L = (decoded & 0xff) / 255f; -134 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -135 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -136 final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B); -137 final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B); -138 final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B); -139 final int r = (int)(reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f)) * 255.999f); -140 final int g = (int)(reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f)) * 255.999f); -141 final int b = (int)(reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f)) * 255.999f); -142 return r << 24 | g << 16 | b << 8 | (decoded & 0xfe000000) >>> 24 | decoded >>> 31; -143 } -144 -145 /** -146 * Converts a packed float color in the format produced by {@link ColorTools#oklab(float, float, float, float)} -147 * to a packed float in RGBA format. -148 * This format of float can be used with the standard SpriteBatch and in some other places in libGDX. -149 * @param packed a packed float color, as produced by {@link ColorTools#oklab(float, float, float, float)} -150 * @return a packed float color as RGBA -151 */ -152 public static float toRGBA(final float packed) -153 { -154 final int decoded = BitConversion.floatToRawIntBits(packed); -155 final float L = (decoded & 0xff) / 255f; -156 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -157 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -158 final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B); -159 final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B); -160 final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B); -161 final int r = (int)(reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f)) * 255.999f); -162 final int g = (int)(reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f)) * 255.999f); -163 final int b = (int)(reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f)) * 255.999f); -164 return BitConversion.intBitsToFloat(r | g << 8 | b << 16 | (decoded & 0xfe000000)); -165 } -166 -167 /** -168 * Takes a color encoded as an RGBA8888 int and converts to a packed float in the Oklab format this uses. -169 * @param rgba an int with the channels (in order) red, green, blue, alpha; should have 8 bits per channel -170 * @return a packed float as Oklab, which this class can use -171 */ -172 public static float fromRGBA8888(final int rgba) { -173 final float r = forwardGamma((rgba >>> 24) * 0x1.010101010101p-8f); -174 final float g = forwardGamma((rgba >>> 16 & 0xFF) * 0x1.010101010101p-8f); -175 final float b = forwardGamma((rgba >>> 8 & 0xFF) * 0x1.010101010101p-8f); -176 -177 final float l = cbrtPositive(0.4121656120f * r + 0.5362752080f * g + 0.0514575653f * b); -178 final float m = cbrtPositive(0.2118591070f * r + 0.6807189584f * g + 0.1074065790f * b); -179 final float s = cbrtPositive(0.0883097947f * r + 0.2818474174f * g + 0.6302613616f * b); -180 -181 return BitConversion.intBitsToFloat( -182 Math.min(Math.max((int)((0.2104542553f * l + 0.7936177850f * m - 0.0040720468f * s) * 255.999f ), 0), 255) -183 | Math.min(Math.max((int)((1.9779984951f * l - 2.4285922050f * m + 0.4505937099f * s) * 127.999f + 127.5f), 0), 255) << 8 -184 | Math.min(Math.max((int)((0.0259040371f * l + 0.7827717662f * m - 0.8086757660f * s) * 127.999f + 127.5f), 0), 255) << 16 -185 | (rgba & 0xFE) << 24); -186 } -187 -188 /** -189 * Takes a color encoded as an RGBA8888 packed float and converts to a packed float in the Oklab format this uses. -190 * @param packed a packed float in RGBA8888 format, with A in the MSB and R in the LSB -191 * @return a packed float as Oklab, which this class can use -192 */ -193 public static float fromRGBA(final float packed) { -194 final int abgr = BitConversion.floatToRawIntBits(packed); -195 final float r = forwardGamma((abgr & 0xFF) * 0x1.010101010101p-8f); -196 final float g = forwardGamma((abgr >>> 8 & 0xFF) * 0x1.010101010101p-8f); -197 final float b = forwardGamma((abgr >>> 16 & 0xFF) * 0x1.010101010101p-8f); -198 final float l = cbrtPositive(0.4121656120f * r + 0.5362752080f * g + 0.0514575653f * b); -199 final float m = cbrtPositive(0.2118591070f * r + 0.6807189584f * g + 0.1074065790f * b); -200 final float s = cbrtPositive(0.0883097947f * r + 0.2818474174f * g + 0.6302613616f * b); -201 return BitConversion.intBitsToFloat( -202 Math.min(Math.max((int)((0.2104542553f * l + 0.7936177850f * m - 0.0040720468f * s) * 255.999f ), 0), 255) -203 | Math.min(Math.max((int)((1.9779984951f * l - 2.4285922050f * m + 0.4505937099f * s) * 127.999f + 127.5f), 0), 255) << 8 -204 | Math.min(Math.max((int)((0.0259040371f * l + 0.7827717662f * m - 0.8086757660f * s) * 127.999f + 127.5f), 0), 255) << 16 -205 | (abgr & 0xFE000000)); -206 } -207 -208 // original multipliers for LMS when obtaining the non-shrunken A and B values: -209 //+0.2104542553 +0.7936177850 -0.0040720468 -210 //+1.9779984951 -2.4285922050 +0.4505937099 -211 //+0.0259040371 +0.7827717662 -0.8086757660 -212 -213 // shrunken multipliers: -214 //+0.2104542553 +0.7936177850 -0.0040720468 -215 //+0.9889992500 -1.2142961000 +0.2252968500 -216 //+0.0129520185 +0.3913858800 -0.4043378800 -217 -218 /** -219 * Takes RGBA components from 0.0 to 1.0 each and converts to a packed float in the Oklab format this uses. -220 * @param r red, from 0.0 to 1.0 (both inclusive) -221 * @param g green, from 0.0 to 1.0 (both inclusive) -222 * @param b blue, from 0.0 to 1.0 (both inclusive) -223 * @param a alpha, from 0.0 to 1.0 (both inclusive) -224 * @return a packed float as Oklab, which this class can use -225 */ -226 public static float fromRGBA(float r, float g, float b, final float a) { -227 r = forwardGamma(r); -228 g = forwardGamma(g); -229 b = forwardGamma(b); -230 final float l = cbrtPositive(0.4121656120f * r + 0.5362752080f * g + 0.0514575653f * b); -231 final float m = cbrtPositive(0.2118591070f * r + 0.6807189584f * g + 0.1074065790f * b); -232 final float s = cbrtPositive(0.0883097947f * r + 0.2818474174f * g + 0.6302613616f * b); -233 return BitConversion.intBitsToFloat( -234 Math.min(Math.max((int)((0.2104542553f * l + 0.7936177850f * m - 0.0040720468f * s) * 255.999f ), 0), 255) -235 | Math.min(Math.max((int)((1.9779984951f * l - 2.4285922050f * m + 0.4505937099f * s) * 127.999f + 127.5f), 0), 255) << 8 -236 | Math.min(Math.max((int)((0.0259040371f * l + 0.7827717662f * m - 0.8086757660f * s) * 127.999f + 127.5f), 0), 255) << 16 -237 | ((int)(a * 255f) << 24 & 0xFE000000)); -238 } -239 -240 /** -241 * Gets the red channel value of the given encoded color, as an int ranging from 0 to 255, inclusive. -242 * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)} -243 * @return an int from 0 to 255, inclusive, representing the red channel value of the given encoded color -244 */ -245 public static int redInt(final float encoded) -246 { -247 final int decoded = BitConversion.floatToRawIntBits(encoded); -248 final float L = (decoded & 0xff) / 255f; -249 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -250 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -251 final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B); -252 final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B); -253 final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B); -254 return (int)(reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f)) * 255.999f); -255 } -256 -257 /** -258 * Gets the green channel value of the given encoded color, as an int ranging from 0 to 255, inclusive. -259 * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)} -260 * @return an int from 0 to 255, inclusive, representing the green channel value of the given encoded color -261 */ -262 public static int greenInt(final float encoded) -263 { -264 final int decoded = BitConversion.floatToRawIntBits(encoded); -265 final float L = (decoded & 0xff) / 255f; -266 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -267 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -268 final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B); -269 final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B); -270 final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B); -271 return (int)(reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f)) * 255.999f); -272 } -273 -274 /** -275 * Gets the blue channel value of the given encoded color, as an int ranging from 0 to 255, inclusive. -276 * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)} -277 * @return an int from 0 to 255, inclusive, representing the blue channel value of the given encoded color -278 */ -279 public static int blueInt(final float encoded) -280 { -281 final int decoded = BitConversion.floatToRawIntBits(encoded); -282 final float L = (decoded & 0xff) / 255f; -283 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -284 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -285 final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B); -286 final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B); -287 final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B); -288 return (int)(reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f)) * 255.999f); -289 } -290 -291 /** -292 * Gets the alpha channel value of the given encoded color, as an even int ranging from 0 to 254, inclusive. Because -293 * of how alpha is stored in libGDX, no odd-number values are possible for alpha. -294 * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)} -295 * @return an even int from 0 to 254, inclusive, representing the alpha channel value of the given encoded color -296 */ -297 public static int alphaInt(final float encoded) -298 { -299 return (BitConversion.floatToRawIntBits(encoded) & 0xfe000000) >>> 24; -300 } -301 -302 /** -303 * Gets the red channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive. -304 * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)} -305 * @return a float from 0.0f to 1.0f, inclusive, representing the red channel value of the given encoded color -306 */ -307 public static float red(final float encoded) -308 { -309 final int decoded = BitConversion.floatToRawIntBits(encoded); -310 final float L = (decoded & 0xff) / 255f; -311 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -312 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -313 final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B); -314 final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B); -315 final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B); -316 return reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f)); -317 } -318 -319 /** -320 * Gets the green channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive. -321 * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)} -322 * @return a float from 0.0f to 1.0f, inclusive, representing the green channel value of the given encoded color -323 */ -324 public static float green(final float encoded) -325 { -326 final int decoded = BitConversion.floatToRawIntBits(encoded); -327 final float L = (decoded & 0xff) / 255f; -328 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -329 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -330 final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B); -331 final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B); -332 final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B); -333 return reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f)); -334 } -335 -336 /** -337 * Gets the blue channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive. -338 * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)} -339 * @return a float from 0.0f to 1.0f, inclusive, representing the blue channel value of the given encoded color -340 */ -341 public static float blue(final float encoded) -342 { -343 final int decoded = BitConversion.floatToRawIntBits(encoded); -344 final float L = (decoded & 0xff) / 255f; -345 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -346 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -347 final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B); -348 final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B); -349 final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B); -350 return reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f)); -351 } -352 -353 /** -354 * Gets the alpha channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive. -355 * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)} -356 * @return a float from 0.0f to 1.0f, inclusive, representing the alpha channel value of the given encoded color -357 */ -358 public static float alpha(final float encoded) -359 { -360 return ((BitConversion.floatToRawIntBits(encoded) & 0xfe000000) >>> 24) * 0x1.020408p-8f; -361 } -362 -363 /** -364 * Gets the "chroma" or "colorfulness" of a given Oklab color. Chroma is similar to saturation in that grayscale -365 * values have 0 saturation and 0 chroma, while brighter colors have high saturation and chroma. The difference is -366 * that colors that are perceptually more-colorful have higher chroma that colors that are perceptually -367 * less-colorful, regardless of hue, whereas saturation changes its range depending on how colorful a value can be -368 * at its hue. That is, the most saturated color always has a saturation of 1, but if that color isn't perceptually -369 * very colorful, it could have a chroma that is somewhat lower than 1. I don't yet know the range of this function, -370 * other than it can't be negative, grayscale values have 0 chroma, and the most colorful values should be near 1, -371 * maybe as high as the square root of 2. -372 * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)} -373 * @return a non-negative float that represents how colorful the given value is -374 */ -375 public static float chroma(final float encoded) { -376 final int decoded = BitConversion.floatToRawIntBits(encoded); -377 final float a = ((decoded >>> 7 & 0x1FE) - 255) / 255f; -378 final float b = ((decoded >>> 15 & 0x1FE) - 255) / 255f; -379 return (float) Math.sqrt(a * a + b * b); -380 } -381 -382 /** -383 * Gets a color as an Oklab packed float given floats representing hue, saturation, lightness, and opacity. -384 * All parameters should normally be between 0 and 1 inclusive, though any hue is tolerated (precision loss may -385 * affect the color if the hue is too large). A hue of 0 is red, progressively higher hue values go to orange, -386 * yellow, green, blue, and purple before wrapping around to red as it approaches 1. A saturation of 0 is grayscale, -387 * a saturation of 1 is brightly colored, and values close to 1 will usually appear more distinct than values close -388 * to 0, especially if the hue is different. A lightness of 0.001f or less is always black (also using a shortcut if -389 * this is the case, respecting opacity), while a lightness of 1f is white. Very bright colors are mostly in a band -390 * of high-saturation where lightness is 0.5f. -391 * -392 * @param hue 0f to 1f, color wheel position -393 * @param saturation 0f to 1f, 0f is grayscale and 1f is brightly colored -394 * @param lightness 0f to 1f, 0f is black and 1f is white -395 * @param opacity 0f to 1f, 0f is fully transparent and 1f is opaque -396 * @return a float encoding a color with the given properties -397 */ -398 public static float floatGetHSL(float hue, float saturation, float lightness, float opacity) { -399 if (lightness <= 0.001f) { -400 return BitConversion.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x7F7F00); -401 } else { -402 return fromRGBA(FloatColors.hsl2rgb(hue, saturation, lightness, opacity)); -403 } -404 } -405 -406 /** -407 * Gets the saturation of the given encoded color as HSL would calculate it, as a float ranging from 0.0f to 1.0f, -408 * inclusive. This is different from {@link #chroma(float)}; see that method's documentation for details. -409 * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)} -410 * @return the saturation of the color from 0.0 (a grayscale color; inclusive) to 1.0 (a bright color, inclusive) -411 */ -412 public static float saturation(final float encoded) { -413 final int decoded = BitConversion.floatToRawIntBits(encoded); -414 final float L = (decoded & 0xff) / 255f; -415 if(Math.abs(L - 0.5) > 0.495f) return 0f; -416 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -417 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -418 final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B); -419 final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B); -420 final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B); -421 final float r = reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f)); -422 final float g = reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f)); -423 final float b = reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f)); -424 float x, y, w; -425 if(g < b) { -426 x = b; -427 y = g; -428 } -429 else { -430 x = g; -431 y = b; -432 } -433 if(r < x) { -434 w = r; -435 } -436 else { -437 w = x; -438 x = r; -439 } -440 return x - Math.min(w, y); -441 } -442 -443 /** -444 * Defined as per HSL; normally you only need {@link #channelL(float)} to get accurate lightness for Oklab. -445 * This ranges from 0.0f (black) to 1.0f (white). -446 * @param encoded a packed float Oklab color -447 * @return the lightness of the given color as HSL would calculate it -448 */ -449 public static float lightness(final float encoded) { -450 final int decoded = BitConversion.floatToRawIntBits(encoded); -451 final float L = (decoded & 0xff) / 255f; -452 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -453 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -454 final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B); -455 final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B); -456 final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B); -457 final float r = reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f)); -458 final float g = reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f)); -459 final float b = reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f)); -460 float x, y, w; -461 if(g < b) { -462 x = b; -463 y = g; -464 } -465 else { -466 x = g; -467 y = b; -468 } -469 if(r < x) { -470 w = r; -471 } -472 else { -473 w = x; -474 x = r; -475 } -476 float d = x - Math.min(w, y); -477 return x * (1f - 0.5f * d / (x + 1e-10f)); -478 } -479 -480 /** -481 * Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased) -482 * to 1f (exclusive, red and approaching purple if decreased). -483 * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)} -484 * @return The hue of the color from 0.0 (red, inclusive) towards orange, then yellow, and -485 * eventually to purple before looping back to almost the same red (1.0, exclusive) -486 */ -487 public static float hue(final float encoded) { -488 final int decoded = BitConversion.floatToRawIntBits(encoded); -489 final float L = (decoded & 0xff) / 255f; -490 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -491 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -492 final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B); -493 final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B); -494 final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B); -495 final float r = reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f)); -496 final float g = reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f)); -497 final float b = reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f)); -498 float x, y, z, w; -499 if(g < b) { -500 x = b; -501 y = g; -502 z = -1f; -503 w = 2f / 3f; -504 } -505 else { -506 x = g; -507 y = b; -508 z = 0f; -509 w = -1f / 3f; -510 } -511 if(r < x) { -512 z = w; -513 w = r; -514 } -515 else { -516 w = x; -517 x = r; -518 } -519 float d = x - Math.min(w, y); -520 return Math.abs(z + (w - y) / (6f * d + 1e-10f)); -521 } -522 -523 /** -524 * The "L" channel of the given packed float in Oklab format, which is its lightness; ranges from 0.0f to -525 * 1.0f . You can edit the L of a color with {@link #lighten(float, float)} and {@link #darken(float, float)}. -526 * -527 * @param encoded a color encoded as a packed float, as by {@link #oklab(float, float, float, float)} -528 * @return the L value as a float from 0.0f to 1.0f -529 */ -530 public static float channelL(final float encoded) -531 { -532 return (BitConversion.floatToRawIntBits(encoded) & 0xff) / 255f; -533 } -534 -535 /** -536 * The "A" channel of the given packed float in Oklab format, which when combined with the B channel describes the -537 * hue and saturation of a color; ranges from 0f to 1f . If A is 0f, the color will be cooler, more green or -538 * blue; if A is 1f, the color will be warmer, from magenta to orange. You can edit the A of a color with -539 * {@link #raiseA(float, float)} and {@link #lowerA(float, float)}. -540 * @param encoded a color encoded as a packed float, as by {@link #oklab(float, float, float, float)} -541 * @return the A value as a float from 0.0f to 1.0f -542 */ -543 public static float channelA(final float encoded) -544 { -545 return ((BitConversion.floatToRawIntBits(encoded) >>> 8 & 0xff)) / 255f; -546 } -547 -548 /** -549 * The "B" channel of the given packed float in Oklab format, which when combined with the A channel describes the -550 * hue and saturation of a color; ranges from 0f to 1f . If B is 0f, the color will be more "artificial", more -551 * blue or purple; if B is 1f, the color will be more "natural", from green to yellow to orange. You can edit -552 * the B of a color with {@link #raiseB(float, float)} and {@link #lowerB(float, float)}. -553 * @param encoded a color encoded as a packed float, as by {@link #oklab(float, float, float, float)} -554 * @return the B value as a float from 0.0f to 1.0f -555 */ -556 public static float channelB(final float encoded) -557 { -558 return ((BitConversion.floatToRawIntBits(encoded) >>> 16 & 0xff)) / 255f; -559 } -560 -561 /** -562 * Gets a variation on the packed float color basis as another packed float that has its hue, saturation, lightness, -563 * and opacity adjusted by the specified amounts. Note that this edits the color in HSL space, not Oklab! Takes -564 * floats representing the amounts of change to apply to hue, saturation, lightness, and opacity; these can be -565 * between -1f and 1f. Returns a float that can be used as a packed or encoded color. The float is -566 * likely to be different than the result of {@link #oklab(float, float, float, float)} unless hue, saturation, -567 * lightness, and opacity are all 0. This won't allocate any objects. -568 * <br> -569 * The parameters this takes all specify additive changes for a color component, clamping the final values so they -570 * can't go above 1 or below 0, with an exception for hue, which can rotate around if lower or higher hues would be -571 * used. As an example, if you give this 0.4f for saturation, and the current color has saturation 0.7f, then the -572 * resulting color will have 1f for saturation. If you gave this -0.1f for saturation and the current color again -573 * has saturation 0.7f, then resulting color will have 0.6f for saturation. -574 * -575 * @param basis a packed float color that will be used as the starting point to make the next color -576 * @param hue -1f to 1f, the hue change that can be applied to the new float color (not clamped, wraps) -577 * @param saturation -1f to 1f, the saturation change that can be applied to the new float color -578 * @param light -1f to 1f, the light/brightness change that can be applied to the new float color -579 * @param opacity -1f to 1f, the opacity/alpha change that can be applied to the new float color -580 * @return a float encoding a variation of basis with the given changes -581 */ -582 public static float toEditedFloat(float basis, float hue, float saturation, float light, float opacity) { -583 final int decoded = BitConversion.floatToRawIntBits(basis); -584 final float L = Math.min(Math.max(light + (decoded & 0xff) / 255f, 0f), 1f); -585 opacity = Math.min(Math.max(opacity + (decoded >>> 24 & 0xfe) * 0x1.020408p-8f, 0f), 1f); -586 if (L <= 0.001f) -587 return BitConversion.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x808000); -588 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -589 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -590 final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B); -591 final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B); -592 final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B); -593 final float r = reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f)); -594 final float g = reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f)); -595 final float b = reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f)); -596 float x, y, z, w; -597 if(g < b) { -598 x = b; -599 y = g; -600 z = -1f; -601 w = 2f / 3f; -602 } -603 else { -604 x = g; -605 y = b; -606 z = 0f; -607 w = -1f / 3f; -608 } -609 if(r < x) { -610 z = w; -611 w = r; -612 } -613 else { -614 w = x; -615 x = r; -616 } -617 final float d = x - Math.min(w, y); -618 final float lum = x * (1f - 0.5f * d / (x + 1e-10f)); -619 hue += Math.abs(z + (w - y) / (6f * d + 1e-10f)) + 1f; -620 saturation += (x - lum) / (Math.min(lum, 1f - lum) + 1e-10f); -621 return fromRGBA(FloatColors.hsl2rgb(hue - (int)hue, Math.min(Math.max(saturation, 0f), 1f), lum, opacity)); -622 } -623 -624 /** -625 * Interpolates from the packed float color start towards white by change. While change should be between 0f (return -626 * start as-is) and 1f (return white), start should be a packed color, as from -627 * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and -628 * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards -629 * white. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is. -630 * @see #darken(float, float) the counterpart method that darkens a float color -631 * @param start the starting color as a packed float -632 * @param change how much to go from start toward white, as a float between 0 and 1; higher means closer to white -633 * @return a packed float that represents a color between start and white -634 */ -635 public static float lighten(final float start, final float change) { -636 final int s = BitConversion.floatToRawIntBits(start), i = s & 0xFF, other = s & 0xFEFFFF00; -637 return BitConversion.intBitsToFloat(((int) (i + (0xFF - i) * change) & 0xFF) | other); -638 } -639 -640 /** -641 * Interpolates from the packed float color start towards black by change. While change should be between 0f (return -642 * start as-is) and 1f (return black), start should be a packed color, as from -643 * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and -644 * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards -645 * black. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is. -646 * @see #lighten(float, float) the counterpart method that lightens a float color -647 * @param start the starting color as a packed float -648 * @param change how much to go from start toward black, as a float between 0 and 1; higher means closer to black -649 * @return a packed float that represents a color between start and black -650 */ -651 public static float darken(final float start, final float change) { -652 final int s = BitConversion.floatToRawIntBits(start), i = s & 0xFF, other = s & 0xFEFFFF00; -653 return BitConversion.intBitsToFloat(((int) (i * (1f - change)) & 0xFF) | other); +090 return x; +091 } +092 +093 /** +094 * Used when converting from Oklab to RGB, as an intermediate step. +095 * Really just {@code x * x * x}. +096 * @param x one of the LMS Prime channels to be converted to LMS +097 * @return an LMS channel value, which can be converted to RGB +098 */ +099 private static float cube(final float x) { +100 return x * x * x; +101 } +102 +103 /** +104 * Used when given non-linear sRGB inputs to make them linear, approximating with gamma 2.0. +105 * Really just {@code component * component}. +106 * @param component any non-linear channel of a color, to be made linear +107 * @return a linear version of component +108 */ +109 private static float forwardGamma(final float component) { +110 return component * component; +111 } +112 +113 /** +114 * Used to return from a linear, gamma-corrected input to an sRGB, non-linear output, using gamma 2.0. +115 * Really just gets the square root of component, as a float. +116 * @param component a linear channel of a color, to be made non-linear +117 * @return a non-linear version of component +118 */ +119 private static float reverseGamma(final float component) { +120 return (float)Math.sqrt(component); +121 } +122 +123 /** +124 * Converts a packed float color in the format produced by {@link ColorTools#oklab(float, float, float, float)} to an RGBA8888 int. +125 * This format of int can be used with Pixmap and in some other places in libGDX. +126 * @param packed a packed float color, as produced by {@link ColorTools#oklab(float, float, float, float)} +127 * @return an RGBA8888 int color +128 */ +129 public static int toRGBA8888(final float packed) +130 { +131 final int decoded = BitConversion.floatToRawIntBits(packed); +132 final float L = (decoded & 0xff) / 255f; +133 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +134 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +135 final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B); +136 final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B); +137 final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B); +138 final int r = (int)(reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f)) * 255.999f); +139 final int g = (int)(reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f)) * 255.999f); +140 final int b = (int)(reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f)) * 255.999f); +141 return r << 24 | g << 16 | b << 8 | (decoded & 0xfe000000) >>> 24 | decoded >>> 31; +142 } +143 +144 /** +145 * Converts a packed float color in the format produced by {@link ColorTools#oklab(float, float, float, float)} +146 * to a packed float in RGBA format. +147 * This format of float can be used with the standard SpriteBatch and in some other places in libGDX. +148 * @param packed a packed float color, as produced by {@link ColorTools#oklab(float, float, float, float)} +149 * @return a packed float color as RGBA +150 */ +151 public static float toRGBA(final float packed) +152 { +153 final int decoded = BitConversion.floatToRawIntBits(packed); +154 final float L = (decoded & 0xff) / 255f; +155 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +156 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +157 final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B); +158 final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B); +159 final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B); +160 final int r = (int)(reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f)) * 255.999f); +161 final int g = (int)(reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f)) * 255.999f); +162 final int b = (int)(reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f)) * 255.999f); +163 return BitConversion.intBitsToFloat(r | g << 8 | b << 16 | (decoded & 0xfe000000)); +164 } +165 +166 /** +167 * Takes a color encoded as an RGBA8888 int and converts to a packed float in the Oklab format this uses. +168 * @param rgba an int with the channels (in order) red, green, blue, alpha; should have 8 bits per channel +169 * @return a packed float as Oklab, which this class can use +170 */ +171 public static float fromRGBA8888(final int rgba) { +172 final float r = forwardGamma((rgba >>> 24) * 0x1.010101010101p-8f); +173 final float g = forwardGamma((rgba >>> 16 & 0xFF) * 0x1.010101010101p-8f); +174 final float b = forwardGamma((rgba >>> 8 & 0xFF) * 0x1.010101010101p-8f); +175 +176 final float l = cbrtPositive(0.4121656120f * r + 0.5362752080f * g + 0.0514575653f * b); +177 final float m = cbrtPositive(0.2118591070f * r + 0.6807189584f * g + 0.1074065790f * b); +178 final float s = cbrtPositive(0.0883097947f * r + 0.2818474174f * g + 0.6302613616f * b); +179 +180 return BitConversion.intBitsToFloat( +181 Math.min(Math.max((int)((0.2104542553f * l + 0.7936177850f * m - 0.0040720468f * s) * 255.999f ), 0), 255) +182 | Math.min(Math.max((int)((1.9779984951f * l - 2.4285922050f * m + 0.4505937099f * s) * 127.999f + 127.5f), 0), 255) << 8 +183 | Math.min(Math.max((int)((0.0259040371f * l + 0.7827717662f * m - 0.8086757660f * s) * 127.999f + 127.5f), 0), 255) << 16 +184 | (rgba & 0xFE) << 24); +185 } +186 +187 /** +188 * Takes a color encoded as an RGBA8888 packed float and converts to a packed float in the Oklab format this uses. +189 * @param packed a packed float in RGBA8888 format, with A in the MSB and R in the LSB +190 * @return a packed float as Oklab, which this class can use +191 */ +192 public static float fromRGBA(final float packed) { +193 final int abgr = BitConversion.floatToRawIntBits(packed); +194 final float r = forwardGamma((abgr & 0xFF) * 0x1.010101010101p-8f); +195 final float g = forwardGamma((abgr >>> 8 & 0xFF) * 0x1.010101010101p-8f); +196 final float b = forwardGamma((abgr >>> 16 & 0xFF) * 0x1.010101010101p-8f); +197 final float l = cbrtPositive(0.4121656120f * r + 0.5362752080f * g + 0.0514575653f * b); +198 final float m = cbrtPositive(0.2118591070f * r + 0.6807189584f * g + 0.1074065790f * b); +199 final float s = cbrtPositive(0.0883097947f * r + 0.2818474174f * g + 0.6302613616f * b); +200 return BitConversion.intBitsToFloat( +201 Math.min(Math.max((int)((0.2104542553f * l + 0.7936177850f * m - 0.0040720468f * s) * 255.999f ), 0), 255) +202 | Math.min(Math.max((int)((1.9779984951f * l - 2.4285922050f * m + 0.4505937099f * s) * 127.999f + 127.5f), 0), 255) << 8 +203 | Math.min(Math.max((int)((0.0259040371f * l + 0.7827717662f * m - 0.8086757660f * s) * 127.999f + 127.5f), 0), 255) << 16 +204 | (abgr & 0xFE000000)); +205 } +206 +207 // original multipliers for LMS when obtaining the non-shrunken A and B values: +208 //+0.2104542553 +0.7936177850 -0.0040720468 +209 //+1.9779984951 -2.4285922050 +0.4505937099 +210 //+0.0259040371 +0.7827717662 -0.8086757660 +211 +212 // shrunken multipliers: +213 //+0.2104542553 +0.7936177850 -0.0040720468 +214 //+0.9889992500 -1.2142961000 +0.2252968500 +215 //+0.0129520185 +0.3913858800 -0.4043378800 +216 +217 /** +218 * Takes RGBA components from 0.0 to 1.0 each and converts to a packed float in the Oklab format this uses. +219 * @param r red, from 0.0 to 1.0 (both inclusive) +220 * @param g green, from 0.0 to 1.0 (both inclusive) +221 * @param b blue, from 0.0 to 1.0 (both inclusive) +222 * @param a alpha, from 0.0 to 1.0 (both inclusive) +223 * @return a packed float as Oklab, which this class can use +224 */ +225 public static float fromRGBA(float r, float g, float b, final float a) { +226 r = forwardGamma(r); +227 g = forwardGamma(g); +228 b = forwardGamma(b); +229 final float l = cbrtPositive(0.4121656120f * r + 0.5362752080f * g + 0.0514575653f * b); +230 final float m = cbrtPositive(0.2118591070f * r + 0.6807189584f * g + 0.1074065790f * b); +231 final float s = cbrtPositive(0.0883097947f * r + 0.2818474174f * g + 0.6302613616f * b); +232 return BitConversion.intBitsToFloat( +233 Math.min(Math.max((int)((0.2104542553f * l + 0.7936177850f * m - 0.0040720468f * s) * 255.999f ), 0), 255) +234 | Math.min(Math.max((int)((1.9779984951f * l - 2.4285922050f * m + 0.4505937099f * s) * 127.999f + 127.5f), 0), 255) << 8 +235 | Math.min(Math.max((int)((0.0259040371f * l + 0.7827717662f * m - 0.8086757660f * s) * 127.999f + 127.5f), 0), 255) << 16 +236 | ((int)(a * 255f) << 24 & 0xFE000000)); +237 } +238 +239 /** +240 * Gets the red channel value of the given encoded color, as an int ranging from 0 to 255, inclusive. +241 * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)} +242 * @return an int from 0 to 255, inclusive, representing the red channel value of the given encoded color +243 */ +244 public static int redInt(final float encoded) +245 { +246 final int decoded = BitConversion.floatToRawIntBits(encoded); +247 final float L = (decoded & 0xff) / 255f; +248 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +249 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +250 final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B); +251 final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B); +252 final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B); +253 return (int)(reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f)) * 255.999f); +254 } +255 +256 /** +257 * Gets the green channel value of the given encoded color, as an int ranging from 0 to 255, inclusive. +258 * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)} +259 * @return an int from 0 to 255, inclusive, representing the green channel value of the given encoded color +260 */ +261 public static int greenInt(final float encoded) +262 { +263 final int decoded = BitConversion.floatToRawIntBits(encoded); +264 final float L = (decoded & 0xff) / 255f; +265 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +266 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +267 final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B); +268 final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B); +269 final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B); +270 return (int)(reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f)) * 255.999f); +271 } +272 +273 /** +274 * Gets the blue channel value of the given encoded color, as an int ranging from 0 to 255, inclusive. +275 * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)} +276 * @return an int from 0 to 255, inclusive, representing the blue channel value of the given encoded color +277 */ +278 public static int blueInt(final float encoded) +279 { +280 final int decoded = BitConversion.floatToRawIntBits(encoded); +281 final float L = (decoded & 0xff) / 255f; +282 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +283 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +284 final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B); +285 final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B); +286 final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B); +287 return (int)(reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f)) * 255.999f); +288 } +289 +290 /** +291 * Gets the alpha channel value of the given encoded color, as an even int ranging from 0 to 254, inclusive. Because +292 * of how alpha is stored in libGDX, no odd-number values are possible for alpha. +293 * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)} +294 * @return an even int from 0 to 254, inclusive, representing the alpha channel value of the given encoded color +295 */ +296 public static int alphaInt(final float encoded) +297 { +298 return (BitConversion.floatToRawIntBits(encoded) & 0xfe000000) >>> 24; +299 } +300 +301 /** +302 * Gets the red channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive. +303 * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)} +304 * @return a float from 0.0f to 1.0f, inclusive, representing the red channel value of the given encoded color +305 */ +306 public static float red(final float encoded) +307 { +308 final int decoded = BitConversion.floatToRawIntBits(encoded); +309 final float L = (decoded & 0xff) / 255f; +310 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +311 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +312 final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B); +313 final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B); +314 final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B); +315 return reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f)); +316 } +317 +318 /** +319 * Gets the green channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive. +320 * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)} +321 * @return a float from 0.0f to 1.0f, inclusive, representing the green channel value of the given encoded color +322 */ +323 public static float green(final float encoded) +324 { +325 final int decoded = BitConversion.floatToRawIntBits(encoded); +326 final float L = (decoded & 0xff) / 255f; +327 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +328 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +329 final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B); +330 final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B); +331 final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B); +332 return reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f)); +333 } +334 +335 /** +336 * Gets the blue channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive. +337 * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)} +338 * @return a float from 0.0f to 1.0f, inclusive, representing the blue channel value of the given encoded color +339 */ +340 public static float blue(final float encoded) +341 { +342 final int decoded = BitConversion.floatToRawIntBits(encoded); +343 final float L = (decoded & 0xff) / 255f; +344 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +345 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +346 final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B); +347 final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B); +348 final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B); +349 return reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f)); +350 } +351 +352 /** +353 * Gets the alpha channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive. +354 * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)} +355 * @return a float from 0.0f to 1.0f, inclusive, representing the alpha channel value of the given encoded color +356 */ +357 public static float alpha(final float encoded) +358 { +359 return ((BitConversion.floatToRawIntBits(encoded) & 0xfe000000) >>> 24) * 0x1.020408p-8f; +360 } +361 +362 /** +363 * Gets the "chroma" or "colorfulness" of a given Oklab color. Chroma is similar to saturation in that grayscale +364 * values have 0 saturation and 0 chroma, while brighter colors have high saturation and chroma. The difference is +365 * that colors that are perceptually more-colorful have higher chroma than colors that are perceptually +366 * less-colorful, regardless of hue, whereas saturation changes its meaning depending on the hue and lightness. That +367 * is, the most saturated color for a given hue and lightness always has a saturation of 1, but if that color +368 * isn't perceptually very colorful (as is the case for very dark and very light colors), it will have a chroma that +369 * is much lower than the maximum. The result of this method can't be negative, grayscale values have very close to +370 * 0 chroma, and the most colorful values (all very close to magenta) should have 0.31613f chroma. +371 * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)} +372 * @return a float between 0.0f and 0.31613f that represents how colorful the given value is +373 */ +374 public static float chroma(final float encoded) { +375 final int decoded = BitConversion.floatToRawIntBits(encoded); +376 final float a = ((decoded >>> 7 & 0x1FE) - 255) / 510f; +377 final float b = ((decoded >>> 15 & 0x1FE) - 255) / 510f; +378 return (float) Math.sqrt(a * a + b * b); +379 } +380 +381 /** +382 * Given a hue and lightness, this gets the (approximate) maximum chroma possible for that hue-lightness +383 * combination. This is useful to know the bounds of {@link #chroma(float)}. This should be no greater +384 * than 0.31613f . +385 * @param hue the hue, typically between 0.0f and 1.0f, to look up +386 * @param lightness the lightness, clamped between 0.0f and 1.0f, to look up +387 * @return the maximum possible chroma for the given hue and lightness, between 0.0f and 0.31613f +388 */ +389 public static float chromaLimit(final float hue, final float lightness){ +390 final int idx = (int) (Math.min(Math.max(lightness, 0f), 1f) * 255.999f) << 8 +391 | (int) (256f * (hue - ((int)(hue + 0x1p14) - 0x4000))); +392 return GAMUT_DATA[idx] * 0x1p-8f; +393 } +394 +395 /** +396 * Gets a color as an Oklab packed float given floats representing hue, saturation, lightness, and opacity. +397 * All parameters should normally be between 0 and 1 inclusive, though any hue is tolerated (precision loss may +398 * affect the color if the hue is too large). A hue of 0 is red, progressively higher hue values go to orange, +399 * yellow, green, blue, and purple before wrapping around to red as it approaches 1. A saturation of 0 is grayscale, +400 * a saturation of 1 is brightly colored, and values close to 1 will usually appear more distinct than values close +401 * to 0, especially if the hue is different. A lightness of 0.001f or less is always black (also using a shortcut if +402 * this is the case, respecting opacity), while a lightness of 1f is white. Very bright colors are mostly in a band +403 * of high-saturation where lightness is 0.5f. +404 * <br> +405 * This method considers its hue, saturation, and lightness parameters as the HSL color space does. You may instead +406 * want the method {@link #oklabByHSL(float, float, float, float)}, which treats lightness exactly as Oklab does, +407 * and handles hue and saturation with the Oklab color solid (which is shaped oddly) instead of the HSL color solid +408 * (which is a bicone, with a wide cone pointing up attached at the base to another wide cone pointing down). +409 * Using oklabByHSL() should be faster in many cases, and the lightness handling alone may be a reason to use it. +410 * There is also {@link #oklabByHCL(float, float, float, float)}, which may be preferable if you want a specific +411 * amount of chroma (colorful-ness) and no greater. +412 * +413 * @param hue 0f to 1f, color wheel position +414 * @param saturation 0f to 1f, 0f is grayscale and 1f is brightly colored +415 * @param lightness 0f to 1f, 0f is black and 1f is white +416 * @param opacity 0f to 1f, 0f is fully transparent and 1f is opaque +417 * @return a float encoding a color with the given properties +418 */ +419 public static float floatGetHSL(float hue, float saturation, float lightness, float opacity) { +420 if (lightness <= 0.001f) { +421 return BitConversion.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x7F7F00); +422 } else { +423 return fromRGBA(FloatColors.hsl2rgb(hue, saturation, lightness, opacity)); +424 } +425 } +426 +427 /** +428 * Gets the saturation of the given encoded color as HSL would calculate it, as a float ranging from 0.0f to 1.0f, +429 * inclusive. This is different from {@link #chroma(float)}; see that method's documentation for details. It is also +430 * different from {@link #oklabSaturation(float)}, which gets the saturation as Oklab understands it rather than how +431 * HSL understands it. +432 * +433 * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)} +434 * @return the saturation of the color from 0.0 (a grayscale color; inclusive) to 1.0 (a bright color, inclusive) +435 */ +436 public static float saturation(final float encoded) { +437 final int decoded = BitConversion.floatToRawIntBits(encoded); +438 final float L = (decoded & 0xff) / 255f; +439 if(Math.abs(L - 0.5) > 0.495f) return 0f; +440 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +441 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +442 final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B); +443 final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B); +444 final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B); +445 final float r = reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f)); +446 final float g = reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f)); +447 final float b = reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f)); +448 float x, y, w; +449 if(g < b) { +450 x = b; +451 y = g; +452 } +453 else { +454 x = g; +455 y = b; +456 } +457 if(r < x) { +458 w = r; +459 } +460 else { +461 w = x; +462 x = r; +463 } +464 return x - Math.min(w, y); +465 } +466 +467 /** +468 * Defined as per HSL; normally you only need {@link #channelL(float)} to get accurate lightness for Oklab. You can +469 * also use {@link #oklabLightness(float)}, which is an alias for channelL(). This ranges from 0.0f (black) to 1.0f +470 * (white). +471 * +472 * @param encoded a packed float Oklab color +473 * @return the lightness of the given color as HSL would calculate it +474 */ +475 public static float lightness(final float encoded) { +476 final int decoded = BitConversion.floatToRawIntBits(encoded); +477 final float L = (decoded & 0xff) / 255f; +478 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +479 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +480 final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B); +481 final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B); +482 final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B); +483 final float r = reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f)); +484 final float g = reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f)); +485 final float b = reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f)); +486 float x, y, w; +487 if(g < b) { +488 x = b; +489 y = g; +490 } +491 else { +492 x = g; +493 y = b; +494 } +495 if(r < x) { +496 w = r; +497 } +498 else { +499 w = x; +500 x = r; +501 } +502 float d = x - Math.min(w, y); +503 return x * (1f - 0.5f * d / (x + 1e-10f)); +504 } +505 +506 /** +507 * Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased) +508 * to 1f (exclusive, red and approaching purple if decreased). You can also use {@link #oklabHue(float)}, which +509 * positions the different hues at different values, somewhat, from this, but is more accurate to how Oklab handles +510 * hues. +511 * +512 * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)} +513 * @return The hue of the color from 0.0 (red, inclusive) towards orange, then yellow, and +514 * eventually to purple before looping back to almost the same red (1.0, exclusive) +515 */ +516 public static float hue(final float encoded) { +517 final int decoded = BitConversion.floatToRawIntBits(encoded); +518 final float L = (decoded & 0xff) / 255f; +519 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +520 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +521 final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B); +522 final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B); +523 final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B); +524 final float r = reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f)); +525 final float g = reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f)); +526 final float b = reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f)); +527 float x, y, z, w; +528 if(g < b) { +529 x = b; +530 y = g; +531 z = -1f; +532 w = 2f / 3f; +533 } +534 else { +535 x = g; +536 y = b; +537 z = 0f; +538 w = -1f / 3f; +539 } +540 if(r < x) { +541 z = w; +542 w = r; +543 } +544 else { +545 w = x; +546 x = r; +547 } +548 float d = x - Math.min(w, y); +549 return Math.abs(z + (w - y) / (6f * d + 1e-10f)); +550 } +551 +552 /** +553 * The "L" channel of the given packed float in Oklab format, which is its lightness; ranges from 0.0f to +554 * 1.0f . You can edit the L of a color with {@link #lighten(float, float)} and {@link #darken(float, float)}. +555 * +556 * @param encoded a color encoded as a packed float, as by {@link #oklab(float, float, float, float)} +557 * @return the L value as a float from 0.0f to 1.0f +558 */ +559 public static float channelL(final float encoded) +560 { +561 return (BitConversion.floatToRawIntBits(encoded) & 0xff) / 255f; +562 } +563 +564 /** +565 * The "A" channel of the given packed float in Oklab format, which when combined with the B channel describes the +566 * hue and saturation of a color; ranges from 0f to 1f . If A is 0f, the color will be cooler, more green or +567 * blue; if A is 1f, the color will be warmer, from magenta to orange. You can edit the A of a color with +568 * {@link #raiseA(float, float)} and {@link #lowerA(float, float)}. +569 * @param encoded a color encoded as a packed float, as by {@link #oklab(float, float, float, float)} +570 * @return the A value as a float from 0.0f to 1.0f +571 */ +572 public static float channelA(final float encoded) +573 { +574 return ((BitConversion.floatToRawIntBits(encoded) >>> 8 & 0xff)) / 255f; +575 } +576 +577 /** +578 * The "B" channel of the given packed float in Oklab format, which when combined with the A channel describes the +579 * hue and saturation of a color; ranges from 0f to 1f . If B is 0f, the color will be more "artificial", more +580 * blue or purple; if B is 1f, the color will be more "natural", from green to yellow to orange. You can edit +581 * the B of a color with {@link #raiseB(float, float)} and {@link #lowerB(float, float)}. +582 * @param encoded a color encoded as a packed float, as by {@link #oklab(float, float, float, float)} +583 * @return the B value as a float from 0.0f to 1.0f +584 */ +585 public static float channelB(final float encoded) +586 { +587 return ((BitConversion.floatToRawIntBits(encoded) >>> 16 & 0xff)) / 255f; +588 } +589 +590 /** +591 * Gets a variation on the packed float color basis as another packed float that has its hue, saturation, lightness, +592 * and opacity adjusted by the specified amounts. Note that this edits the color in HSL space, not Oklab! Takes +593 * floats representing the amounts of change to apply to hue, saturation, lightness, and opacity; these can be +594 * between -1f and 1f. Returns a float that can be used as a packed or encoded color. The float is +595 * likely to be different than the result of {@link #oklab(float, float, float, float)} unless hue, saturation, +596 * lightness, and opacity are all 0. This won't allocate any objects. +597 * <br> +598 * The parameters this takes all specify additive changes for a color component, clamping the final values so they +599 * can't go above 1 or below 0, with an exception for hue, which can rotate around if lower or higher hues would be +600 * used. As an example, if you give this 0.4f for saturation, and the current color has saturation 0.7f, then the +601 * resulting color will have 1f for saturation. If you gave this -0.1f for saturation and the current color again +602 * has saturation 0.7f, then resulting color will have 0.6f for saturation. +603 * <br> +604 * You may want {@link #editOklab(float, float, float, float, float, float, float, float, float)} instead, which +605 * adjusts the L, A, B, and alpha channels directly instead of converting to HSL and back. +606 * +607 * @param basis a packed float color that will be used as the starting point to make the next color +608 * @param hue -1f to 1f, the hue change that can be applied to the new float color (not clamped, wraps) +609 * @param saturation -1f to 1f, the saturation change that can be applied to the new float color +610 * @param light -1f to 1f, the light/brightness change that can be applied to the new float color +611 * @param opacity -1f to 1f, the opacity/alpha change that can be applied to the new float color +612 * @return a float encoding a variation of basis with the given changes +613 */ +614 public static float toEditedFloat(float basis, float hue, float saturation, float light, float opacity) { +615 final int decoded = BitConversion.floatToRawIntBits(basis); +616 final float L = Math.min(Math.max(light + (decoded & 0xff) / 255f, 0f), 1f); +617 opacity = Math.min(Math.max(opacity + (decoded >>> 24 & 0xfe) * 0x1.020408p-8f, 0f), 1f); +618 if (L <= 0.001f) +619 return BitConversion.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x808000); +620 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +621 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +622 final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B); +623 final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B); +624 final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B); +625 final float r = reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f)); +626 final float g = reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f)); +627 final float b = reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f)); +628 float x, y, z, w; +629 if(g < b) { +630 x = b; +631 y = g; +632 z = -1f; +633 w = 2f / 3f; +634 } +635 else { +636 x = g; +637 y = b; +638 z = 0f; +639 w = -1f / 3f; +640 } +641 if(r < x) { +642 z = w; +643 w = r; +644 } +645 else { +646 w = x; +647 x = r; +648 } +649 final float d = x - Math.min(w, y); +650 final float lum = x * (1f - 0.5f * d / (x + 1e-10f)); +651 hue += Math.abs(z + (w - y) / (6f * d + 1e-10f)) + 1f; +652 saturation += (x - lum) / (Math.min(lum, 1f - lum) + 1e-10f); +653 return fromRGBA(FloatColors.hsl2rgb(hue - (int)hue, Math.min(Math.max(saturation, 0f), 1f), lum, opacity)); 654 } 655 656 /** -657 * Interpolates from the packed float color start towards a warmer color (orange to magenta) by change. While change -658 * should be between 0f (return start as-is) and 1f (return fully warmed), start should be a packed color, as from -659 * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, -660 * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to -661 * lerp towards a warmer color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the -662 * alpha and L of start as-is. -663 * @see #lowerA(float, float) the counterpart method that cools a float color -664 * @param start the starting color as a packed float -665 * @param change how much to warm start, as a float between 0 and 1; higher means a warmer result -666 * @return a packed float that represents a color between start and a warmer color -667 */ -668 public static float raiseA(final float start, final float change) { -669 final int s = BitConversion.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF; -670 return BitConversion.intBitsToFloat(((int) (p + (0xFF - p) * change) << 8 & 0xFF00) | other); -671 } -672 -673 /** -674 * Interpolates from the packed float color start towards a cooler color (green to blue) by change. While change -675 * should be between 0f (return start as-is) and 1f (return fully cooled), start should be a packed color, as from -676 * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and -677 * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp -678 * towards a cooler color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and -679 * L of start as-is. -680 * @see #raiseA(float, float) the counterpart method that warms a float color -681 * @param start the starting color as a packed float -682 * @param change how much to cool start, as a float between 0 and 1; higher means a cooler result -683 * @return a packed float that represents a color between start and a cooler color -684 */ -685 public static float lowerA(final float start, final float change) { -686 final int s = BitConversion.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF; -687 return BitConversion.intBitsToFloat(((int) (p * (1f - change)) & 0xFF) << 8 | other); -688 } -689 -690 /** -691 * Interpolates from the packed float color start towards a "natural" color (between green and orange) by change. -692 * While change should be between 0f (return start as-is) and 1f (return fully natural), start should be a packed color, as -693 * from {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary -694 * Colors, and is a little more efficient and clear than using -695 * {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards a more natural color. Unlike -696 * {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and L of start as-is. -697 * @see #lowerB(float, float) the counterpart method that makes a float color less natural -698 * @param start the starting color as a packed float -699 * @param change how much to change start to a natural color, as a float between 0 and 1; higher means a more natural result -700 * @return a packed float that represents a color between start and a more natural color -701 */ -702 public static float raiseB(final float start, final float change) { -703 final int s = BitConversion.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF; -704 return BitConversion.intBitsToFloat(((int) (t + (0xFF - t) * change) << 16 & 0xFF0000) | other); -705 } -706 -707 /** -708 * Interpolates from the packed float color start towards an "artificial" color (between blue and purple) by change. -709 * While change should be between 0f (return start as-is) and 1f (return fully artificial), start should be a packed color, as -710 * from {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary -711 * Colors, and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp -712 * towards a more artificial color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the -713 * alpha and L of start as-is. -714 * @see #raiseB(float, float) the counterpart method that makes a float color less artificial -715 * @param start the starting color as a packed float -716 * @param change how much to change start to a bolder color, as a float between 0 and 1; higher means a more artificial result -717 * @return a packed float that represents a color between start and a more artificial color -718 */ -719 public static float lowerB(final float start, final float change) { -720 final int s = BitConversion.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF; -721 return BitConversion.intBitsToFloat(((int) (t * (1f - change)) & 0xFF) << 16 | other); -722 } -723 -724 /** -725 * Interpolates from the packed float color start towards that color made opaque by change. While change should be -726 * between 0f (return start as-is) and 1f (return start with full alpha), start should be a packed color, as from -727 * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and -728 * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards -729 * transparent. This won't change the L, A, or B of the color. -730 * @see #fade(float, float) the counterpart method that makes a float color more translucent -731 * @param start the starting color as a packed float -732 * @param change how much to go from start toward opaque, as a float between 0 and 1; higher means closer to opaque -733 * @return a packed float that represents a color between start and its opaque version -734 */ -735 public static float blot(final float start, final float change) { -736 final int s = BitConversion.floatToRawIntBits(start), opacity = s >>> 24 & 0xFE, other = s & 0x00FFFFFF; -737 return BitConversion.intBitsToFloat(((int) (opacity + (0xFE - opacity) * change) & 0xFE) << 24 | other); -738 } -739 -740 /** -741 * Interpolates from the packed float color start towards transparent by change. While change should be between 0 -742 * (return start as-is) and 1f (return the color with 0 alpha), start should be a packed color, as from -743 * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, -744 * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards -745 * transparent. This won't change the L, A, or B of the color. -746 * @see #blot(float, float) the counterpart method that makes a float color more opaque +657 * Interpolates from the packed float color start towards white by change. While change should be between 0f (return +658 * start as-is) and 1f (return white), start should be a packed color, as from +659 * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and +660 * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards +661 * white. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is. +662 * @see #darken(float, float) the counterpart method that darkens a float color +663 * @param start the starting color as a packed float +664 * @param change how much to go from start toward white, as a float between 0 and 1; higher means closer to white +665 * @return a packed float that represents a color between start and white +666 */ +667 public static float lighten(final float start, final float change) { +668 final int s = BitConversion.floatToRawIntBits(start), i = s & 0xFF, other = s & 0xFEFFFF00; +669 return BitConversion.intBitsToFloat(((int) (i + (0xFF - i) * change) & 0xFF) | other); +670 } +671 +672 /** +673 * Interpolates from the packed float color start towards black by change. While change should be between 0f (return +674 * start as-is) and 1f (return black), start should be a packed color, as from +675 * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and +676 * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards +677 * black. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is. +678 * @see #lighten(float, float) the counterpart method that lightens a float color +679 * @param start the starting color as a packed float +680 * @param change how much to go from start toward black, as a float between 0 and 1; higher means closer to black +681 * @return a packed float that represents a color between start and black +682 */ +683 public static float darken(final float start, final float change) { +684 final int s = BitConversion.floatToRawIntBits(start), i = s & 0xFF, other = s & 0xFEFFFF00; +685 return BitConversion.intBitsToFloat(((int) (i * (1f - change)) & 0xFF) | other); +686 } +687 +688 /** +689 * Interpolates from the packed float color start towards a warmer color (orange to magenta) by change. While change +690 * should be between 0f (return start as-is) and 1f (return fully warmed), start should be a packed color, as from +691 * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, +692 * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to +693 * lerp towards a warmer color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the +694 * alpha and L of start as-is. +695 * @see #lowerA(float, float) the counterpart method that cools a float color +696 * @param start the starting color as a packed float +697 * @param change how much to warm start, as a float between 0 and 1; higher means a warmer result +698 * @return a packed float that represents a color between start and a warmer color +699 */ +700 public static float raiseA(final float start, final float change) { +701 final int s = BitConversion.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF; +702 return BitConversion.intBitsToFloat(((int) (p + (0xFF - p) * change) << 8 & 0xFF00) | other); +703 } +704 +705 /** +706 * Interpolates from the packed float color start towards a cooler color (green to blue) by change. While change +707 * should be between 0f (return start as-is) and 1f (return fully cooled), start should be a packed color, as from +708 * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and +709 * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp +710 * towards a cooler color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and +711 * L of start as-is. +712 * @see #raiseA(float, float) the counterpart method that warms a float color +713 * @param start the starting color as a packed float +714 * @param change how much to cool start, as a float between 0 and 1; higher means a cooler result +715 * @return a packed float that represents a color between start and a cooler color +716 */ +717 public static float lowerA(final float start, final float change) { +718 final int s = BitConversion.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF; +719 return BitConversion.intBitsToFloat(((int) (p * (1f - change)) & 0xFF) << 8 | other); +720 } +721 +722 /** +723 * Interpolates from the packed float color start towards a "natural" color (between green and orange) by change. +724 * While change should be between 0f (return start as-is) and 1f (return fully natural), start should be a packed color, as +725 * from {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary +726 * Colors, and is a little more efficient and clear than using +727 * {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards a more natural color. Unlike +728 * {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and L of start as-is. +729 * @see #lowerB(float, float) the counterpart method that makes a float color less natural +730 * @param start the starting color as a packed float +731 * @param change how much to change start to a natural color, as a float between 0 and 1; higher means a more natural result +732 * @return a packed float that represents a color between start and a more natural color +733 */ +734 public static float raiseB(final float start, final float change) { +735 final int s = BitConversion.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF; +736 return BitConversion.intBitsToFloat(((int) (t + (0xFF - t) * change) << 16 & 0xFF0000) | other); +737 } +738 +739 /** +740 * Interpolates from the packed float color start towards an "artificial" color (between blue and purple) by change. +741 * While change should be between 0f (return start as-is) and 1f (return fully artificial), start should be a packed color, as +742 * from {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary +743 * Colors, and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp +744 * towards a more artificial color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the +745 * alpha and L of start as-is. +746 * @see #raiseB(float, float) the counterpart method that makes a float color less artificial 747 * @param start the starting color as a packed float -748 * @param change how much to go from start toward transparent, as a float between 0 and 1; higher means closer to transparent -749 * @return a packed float that represents a color between start and transparent +748 * @param change how much to change start to a bolder color, as a float between 0 and 1; higher means a more artificial result +749 * @return a packed float that represents a color between start and a more artificial color 750 */ -751 public static float fade(final float start, final float change) { -752 final int s = BitConversion.floatToRawIntBits(start), opacity = s & 0xFE, other = s & 0x00FFFFFF; -753 return BitConversion.intBitsToFloat(((int) (opacity * (1f - change)) & 0xFE) << 24 | other); +751 public static float lowerB(final float start, final float change) { +752 final int s = BitConversion.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF; +753 return BitConversion.intBitsToFloat(((int) (t * (1f - change)) & 0xFF) << 16 | other); 754 } 755 756 /** -757 * Brings the chromatic components of {@code start} closer to grayscale by {@code change} (desaturating them). While -758 * change should be between 0f (return start as-is) and 1f (return fully gray), start should be a packed color, as -759 * from {@link #oklab(float, float, float, float)}. This only changes A and B; it leaves L and alpha alone, unlike -760 * {@link #lessenChange(float, float)}, which usually changes L. -761 * @see #enrich(float, float) the counterpart method that makes a float color more saturated -762 * @param start the starting color as a packed float -763 * @param change how much to change start to a desaturated color, as a float between 0 and 1; higher means a less saturated result -764 * @return a packed float that represents a color between start and a desaturated color -765 */ -766 public static float dullen(final float start, final float change) { -767 final int s = BitConversion.floatToRawIntBits(start); -768 return oklab((s & 0xFF) / 255f, -769 ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f, -770 ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f, -771 (s >>> 25) / 127f); -772 } -773 -774 /** -775 * Pushes the chromatic components of {@code start} away from grayscale by change (saturating them). While change -776 * should be between 0f (return start as-is) and 1f (return maximally saturated), start should be a packed color, as -777 * from {@link #oklab(float, float, float, float)}. This usually changes only A and B, but higher values for -778 * {@code change} can force the color out of the gamut, which this corrects using -779 * {@link #limitToGamut(float, float, float, float)} (and that can change L somewhat). If the color stays in-gamut, -780 * then L won't change; alpha never changes. -781 * @see #dullen(float, float) the counterpart method that makes a float color less saturated -782 * @param start the starting color as a packed float -783 * @param change how much to change start to a saturated color, as a float between 0 and 1; higher means a more saturated result -784 * @return a packed float that represents a color between start and a saturated color -785 */ -786 public static float enrich(final float start, final float change) { -787 final int s = BitConversion.floatToRawIntBits(start); -788 return limitToGamut((s & 0xFF) / 255f, -789 ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f, -790 ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f, -791 (s >>> 25) / 127f); -792 } -793 -794 -795 /** -796 * Given a packed float Oklab color {@code mainColor} and another Oklab color that it should be made to contrast with, -797 * gets a packed float Oklab color with roughly inverted L but the same chromatic channels and opacity (A and B -798 * are likely to be clamped if the result gets close to white or black). This won't ever produce black or other very -799 * dark colors, and also has a gap in the range it produces for L values between 0.5 and 0.55. That allows -800 * most of the colors this method produces to contrast well as a foreground when displayed on a background of -801 * {@code contrastingColor}, or vice versa. This will leave the L unchanged if the chromatic channels of the -802 * contrastingColor and those of the mainColor are already very different. This has nothing to do with the contrast -803 * channel of the tweak in ColorfulBatch; where that part of the tweak can make too-similar lightness values further -804 * apart by just a little, this makes a modification on {@code mainColor} to maximize its lightness difference from -805 * {@code contrastingColor} without losing its other qualities. -806 * @param mainColor a packed float color, as produced by {@link #oklab(float, float, float, float)}; -807 * this is the color that will be adjusted -808 * @param contrastingColor a packed float color, as produced by {@link #oklab(float, float, float, float)}; -809 * the adjusted mainColor will contrast with this -810 * @return a different Oklab packed float color, based on mainColor but with potentially very different lightness -811 */ -812 public static float inverseLightness(final float mainColor, final float contrastingColor) -813 { -814 final int bits = BitConversion.floatToRawIntBits(mainColor), -815 contrastBits = BitConversion.floatToRawIntBits(contrastingColor), -816 L = (bits & 0xff), -817 A = (bits >>> 8 & 0xff), -818 B = (bits >>> 16 & 0xff), -819 cL = (contrastBits & 0xff), -820 cA = (contrastBits >>> 8 & 0xff), -821 cB = (contrastBits >>> 16 & 0xff); -822 if((A - cA) * (A - cA) + (B - cB) * (B - cB) >= 0x10000) -823 return mainColor; -824 return BitConversion.intBitsToFloat((bits & 0xFEFFFF00) | (int) (cL < 128 ? L * 0.45f + 140 : 127 - L * 0.45f)); -825 } -826 +757 * Interpolates from the packed float color start towards that color made opaque by change. While change should be +758 * between 0f (return start as-is) and 1f (return start with full alpha), start should be a packed color, as from +759 * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and +760 * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards +761 * transparent. This won't change the L, A, or B of the color. +762 * @see #fade(float, float) the counterpart method that makes a float color more translucent +763 * @param start the starting color as a packed float +764 * @param change how much to go from start toward opaque, as a float between 0 and 1; higher means closer to opaque +765 * @return a packed float that represents a color between start and its opaque version +766 */ +767 public static float blot(final float start, final float change) { +768 final int s = BitConversion.floatToRawIntBits(start), opacity = s >>> 24 & 0xFE, other = s & 0x00FFFFFF; +769 return BitConversion.intBitsToFloat(((int) (opacity + (0xFE - opacity) * change) & 0xFE) << 24 | other); +770 } +771 +772 /** +773 * Interpolates from the packed float color start towards transparent by change. While change should be between 0 +774 * (return start as-is) and 1f (return the color with 0 alpha), start should be a packed color, as from +775 * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, +776 * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards +777 * transparent. This won't change the L, A, or B of the color. +778 * @see #blot(float, float) the counterpart method that makes a float color more opaque +779 * @param start the starting color as a packed float +780 * @param change how much to go from start toward transparent, as a float between 0 and 1; higher means closer to transparent +781 * @return a packed float that represents a color between start and transparent +782 */ +783 public static float fade(final float start, final float change) { +784 final int s = BitConversion.floatToRawIntBits(start), opacity = s & 0xFE, other = s & 0x00FFFFFF; +785 return BitConversion.intBitsToFloat(((int) (opacity * (1f - change)) & 0xFE) << 24 | other); +786 } +787 +788 /** +789 * Brings the chromatic components of {@code start} closer to grayscale by {@code change} (desaturating them). While +790 * change should be between 0f (return start as-is) and 1f (return fully gray), start should be a packed color, as +791 * from {@link #oklab(float, float, float, float)}. This only changes A and B; it leaves L and alpha alone, unlike +792 * {@link #lessenChange(float, float)}, which usually changes L. +793 * @see #enrich(float, float) the counterpart method that makes a float color more saturated +794 * @param start the starting color as a packed float +795 * @param change how much to change start to a desaturated color, as a float between 0 and 1; higher means a less saturated result +796 * @return a packed float that represents a color between start and a desaturated color +797 */ +798 public static float dullen(final float start, final float change) { +799 final int s = BitConversion.floatToRawIntBits(start); +800 return oklab((s & 0xFF) / 255f, +801 ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f, +802 ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f, +803 (s >>> 25) / 127f); +804 } +805 +806 /** +807 * Pushes the chromatic components of {@code start} away from grayscale by change (saturating them). While change +808 * should be between 0f (return start as-is) and 1f (return maximally saturated), start should be a packed color, as +809 * from {@link #oklab(float, float, float, float)}. This usually changes only A and B, but higher values for +810 * {@code change} can force the color out of the gamut, which this corrects using +811 * {@link #limitToGamut(float, float, float, float)} (and that can change L somewhat). If the color stays in-gamut, +812 * then L won't change; alpha never changes. +813 * @see #dullen(float, float) the counterpart method that makes a float color less saturated +814 * @param start the starting color as a packed float +815 * @param change how much to change start to a saturated color, as a float between 0 and 1; higher means a more saturated result +816 * @return a packed float that represents a color between start and a saturated color +817 */ +818 public static float enrich(final float start, final float change) { +819 final int s = BitConversion.floatToRawIntBits(start); +820 return limitToGamut((s & 0xFF) / 255f, +821 ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f, +822 ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f, +823 (s >>> 25) / 127f); +824 } +825 +826 827 /** -828 * Given a packed float Oklab color {@code mainColor} and another Oklab color that it should be made to contrast -829 * with, gets a packed float Oklab color with L that should be quite different from {@code contrastingColor}'s L, -830 * but the same chromatic channels and opacity (A and B are likely to be clamped if the result gets close to white -831 * or black). This allows most of the colors this method produces to contrast well as a foreground when displayed on -832 * a background of {@code contrastingColor}, or vice versa. -833 * <br> -834 * This is similar to {@link #inverseLightness(float, float)}, but is considerably simpler, and this method will -835 * change the lightness of mainColor when the two given colors have close lightness but distant chroma. Because it -836 * averages the original L of mainColor with the modified one, this tends to not produce harsh color changes. -837 * @param mainColor a packed Oklab float color; this is the color that will be adjusted -838 * @param contrastingColor a packed Oklab float color; the adjusted mainColor will contrast with the L of this -839 * @return a different packed Oklab float color, based on mainColor but typically with different lightness -840 */ -841 public static float differentiateLightness(final float mainColor, final float contrastingColor) -842 { -843 final int main = BitConversion.floatToRawIntBits(mainColor), contrast = BitConversion.floatToRawIntBits(contrastingColor); -844 return limitToGamut(BitConversion.intBitsToFloat((main & 0xFEFFFF00) | (contrast + 128 & 0xFF) + (main & 0xFF) >>> 1)); -845 } -846 -847 /** -848 * Pretty simple; adds 0.5 to the given color's L and wraps it around if it would go above 1.0, then averages that -849 * with the original L. This means light colors become darker, and dark colors become lighter, with almost all -850 * results in the middle-range of possible lightness. -851 * @param mainColor a packed Oklab float color -852 * @return a different packed Oklab float color, with its L channel changed and limited to the correct gamut -853 */ -854 public static float offsetLightness(final float mainColor) { -855 final int oklab = BitConversion.floatToRawIntBits(mainColor); -856 return limitToGamut(BitConversion.intBitsToFloat((oklab & 0xFEFFFF00) | (oklab + 128 & 0xFF) + (oklab & 0xFF) >>> 1)); +828 * Given a packed float Oklab color {@code mainColor} and another Oklab color that it should be made to contrast with, +829 * gets a packed float Oklab color with roughly inverted L but the same chromatic channels and opacity (A and B +830 * are likely to be clamped if the result gets close to white or black). This won't ever produce black or other very +831 * dark colors, and also has a gap in the range it produces for L values between 0.5 and 0.55. That allows +832 * most of the colors this method produces to contrast well as a foreground when displayed on a background of +833 * {@code contrastingColor}, or vice versa. This will leave the L unchanged if the chromatic channels of the +834 * contrastingColor and those of the mainColor are already very different. This has nothing to do with the contrast +835 * channel of the tweak in ColorfulBatch; where that part of the tweak can make too-similar lightness values further +836 * apart by just a little, this makes a modification on {@code mainColor} to maximize its lightness difference from +837 * {@code contrastingColor} without losing its other qualities. +838 * @param mainColor a packed float color, as produced by {@link #oklab(float, float, float, float)}; +839 * this is the color that will be adjusted +840 * @param contrastingColor a packed float color, as produced by {@link #oklab(float, float, float, float)}; +841 * the adjusted mainColor will contrast with this +842 * @return a different Oklab packed float color, based on mainColor but with potentially very different lightness +843 */ +844 public static float inverseLightness(final float mainColor, final float contrastingColor) +845 { +846 final int bits = BitConversion.floatToRawIntBits(mainColor), +847 contrastBits = BitConversion.floatToRawIntBits(contrastingColor), +848 L = (bits & 0xff), +849 A = (bits >>> 8 & 0xff), +850 B = (bits >>> 16 & 0xff), +851 cL = (contrastBits & 0xff), +852 cA = (contrastBits >>> 8 & 0xff), +853 cB = (contrastBits >>> 16 & 0xff); +854 if((A - cA) * (A - cA) + (B - cB) * (B - cB) >= 0x10000) +855 return mainColor; +856 return BitConversion.intBitsToFloat((bits & 0xFEFFFF00) | (int) (cL < 128 ? L * 0.45f + 140 : 127 - L * 0.45f)); 857 } -858 +858 859 /** -860 * Makes the additive Oklab color stored in {@code color} cause less of a change when used as a tint, as if it were -861 * mixed with neutral gray. When {@code fraction} is 1.0, this returns color unchanged; when fraction is 0.0, it -862 * returns {@link Palette#GRAY}, and when it is in-between 0.0 and 1.0 it returns something between the two. This is -863 * meant for things like area of effect abilities that make smaller color changes toward their periphery. -864 * @param color a color that should have its tinting effect potentially weakened -865 * @param fraction how much of {@code color} should be kept, from 0.0 to 1.0 -866 * @return an Oklab float color between gray and {@code color} -867 */ -868 public static float lessenChange(final float color, float fraction) { -869 final int e = BitConversion.floatToRawIntBits(color), -870 sL = 0x80, sA = 0x80, sB = 0x80, sAlpha = 0xFE, -871 eL = (e & 0xFF), eA = (e >>> 8) & 0xFF, eB = (e >>> 16) & 0xFF, eAlpha = e >>> 24 & 0xFE; -872 return BitConversion.intBitsToFloat(((int) (sL + fraction * (eL - sL)) & 0xFF) -873 | (((int) (sA + fraction * (eA - sA)) & 0xFF) << 8) -874 | (((int) (sB + fraction * (eB - sB)) & 0xFF) << 16) -875 | (((int) (sAlpha + fraction * (eAlpha - sAlpha)) & 0xFE) << 24)); -876 } -877 -878 /** -879 * Makes a quasi-randomly-edited variant on the given {@code color}, allowing typically a small amount of -880 * {@code variance} (such as 0.05 to 0.25) between the given color and what this can return. The {@code seed} should -881 * be different each time this is called, and can be obtained from a random number generator to make the colors more -882 * random, or can be incremented on each call. If the seed is only incremented or decremented, then this shouldn't -883 * produce two similar colors in a row unless variance is very small. The variance affects the L, A, and B of the -884 * generated color, and each of those channels can go up or down by the given variance as long as the total distance -885 * isn't greater than the variance (this considers A and B extra-wide, going from -1 to 1, while L goes from 0 to 1, -886 * but only internally for measuring distance). -887 * @param color a packed float color, as produced by {@link #oklab(float, float, float, float)} -888 * @param seed a long seed that should be different on each call; should not be 0 -889 * @param variance max amount of difference between the given color and the generated color; always less than 1 -890 * @return a generated packed float color that should be at least somewhat different from {@code color} -891 */ -892 public static float randomEdit(final float color, long seed, final float variance) { -893 final int decoded = BitConversion.floatToRawIntBits(color); -894 final float L = (decoded & 0xff) / 255f; -895 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -896 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -897 final float limit = variance * variance; -898 float dist, x, y, z; -899 for (int j = 0; j < 50; j++) { -900 x = (((seed * 0xD1B54A32D192ED03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance; -901 y = (((seed * 0xABC98388FB8FAC03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance; -902 z = (((seed * 0x8CB92BA72F3D8DD7L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance; -903 seed += 0x9E3779B97F4A7C15L; -904 dist = x * x + y * y + z * z; -905 if(dist <= limit && inGamut(x += L, y = (A + y) * 0.5f + 0.5f, z = (B + z) * 0.5f + 0.5f)) -906 return BitConversion.intBitsToFloat((decoded & 0xFE000000) | ((int)(z * 255.5f) << 16 & 0xFF0000) -907 | ((int)(y * 255.5f) << 8 & 0xFF00) | (int)(x * 255.5f)); -908 } -909 return color; -910 } -911 -912 private static final byte[] GAMUT_DATA = (new StringBuilder().append("\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\001\001\001\001\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\003\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\003\003\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\003\003\003\004\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\004\004\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\003\003\003\003\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\004\004\005\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\004\004\004\005\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\004\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\004\004\004\004\005\006\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\004\004\004\004\004\005\005\006\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\005\005\005\006\007\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\005\005\005\005\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\005\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\005\005\005\006\006\007\n\n\n\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\005\005\005\006\006\007\b\013\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\005\005\005\005\006\006\006\007\b\013\013\013\013\013\013\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\006\005\005\005\005\005\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\005\005\005\005\006\006\006\007\b\t\f\f\f\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\006\006\006\006\006\005\005\005\005\005\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\005\005\005\005\005\006\006\006\007\007\b\t\r\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\007\007\007\007\b\b\b\b\b\b\b\b\b\b\007\007\007\006\006\006\006\006\006\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\006\006\006\007\007\b\b\n\r\r\r\r\r\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\007\006\006\006\006\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\006\006\006\007\007\b\b\t\n\016\016\016\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\007\007\007\006\006\006\006\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\006\006\006\006\007\007\007\b\t\t\013\017\016\016\016\016\016\016\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\007\007\007\007\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\007\007\007\007\007\007\006\006\006\006\006\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\006\006\006\006\007\007\007\b\b\t\n\013\017\017\017\017\017\016\016\016\016\016\016\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\007\007\007\007\007\b\007\007\007\007\006\006\006\006\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\006\006\006\006\006\007\007\007\b\b\t\t\n\f\020\020\020\017\017\017\017\017\017\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\n\n\n\n\n\n\n\n\t\t\t\t\n\n\n\n\n\n\n\n\n\n\t\t\t\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\007\007\007\007\006\006\006\006\006\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\006\006\006\006\006\007\007\007\b\b\b\t\n\013\f\021\021\020\020\020\020\020\017\017\017\017\017\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\b\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\b\b\b\007\007\007\007\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\007\007\007\b\b\b\t\t\n\013\r\021\021\021\021\021\020\020\020\020\020\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\n\n\n\t\t\t\b\b\b\b\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\b\b\b\b\t\b\b\b\007\007\007\007\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\007\007\007\b\b\b\t\t\n\013\f\r\022\022\022\021\021\021\021\021\020\020\020\020\020\020\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\n\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\n\n\n\t\t\t\b\b\b\b\b\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\b\b\b\b\t\t\t\b\b\b\007\007\007\007\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\007\007\007\007\007\b\b\t\t\n\n\013\f\016\023\023\022\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\n\n\n\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\b\b\b\b\b\t\t\t\t\t\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\t\t\n\013\013\f\016\024\023\023\023\023\022\022\022\022\021\021\021\021\021\021\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\f\f\f\f\f\f\f\f\013\013\013\013\f\f\f\f\f\f\f\f\f\f\013\013\n\n\n\t\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\b\b\b\b\b\t\t\t\n\t\t\t\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\t\t\n\n\013\f\r\017\024\024\024\023\023\023\023\022\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\013\013\n\n\n\t\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\b\b\b\b\b\t\t\t\t\n\n\n\t\t\t\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\t\t\n\n\013\013\f\r\017\025\025\024\024\024\024\023\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\f\f\013\013\n\n\n\t\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\t\t\t\t\n\n\n\n\n\t\t\t\b\b\b\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\b\t\t\t\n\n\013\f\r\016\020\026\025\025\025\024\024\024\024\024\023\023\023\023\023\022\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\f\f\013\013\013\n\n\n\t\t\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\t\t\t\t\n\n\n\013\n\n\n\t\t\b\b\b\b\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\b\t\t\t\n\n\013\013\f\r\016\020\026\026\026\025\025\025\025\024\024\024\024\023\023\023\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\f\f\013\013\013\n\n\n\t\t\t\t\t\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\013\013\013\n\n\t\t\t\b\b\b\b\b\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\b\b\b\b\t\t\t\n\n\013\013\f\r\r\017\021\027\027\026\026\026\026\025\025\025\025\024\024\024\024\023\023\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\r\r\r\r\016\016\016\016\016\016\016\016\r\r\r\r\016\016\016\016\016\016\016\016\016\016\r\r\f\f\013\013\013\n\n\n\n\t\t\t\t\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\013\013\013\013\013\n\n\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\b\b\b\b\t\t\t\t\n\n\013\013\f\r\016\017\021\030\027\027\027\026\026\026\026\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\r\r\f\f\013\013\013\n\n\n\n\t\t\t\t\t\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\n\013\013\013\f\013\013\n\n\n\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\b\b\b\b\t\t\t\t\n\n\013\013\f\f\r\016\020\022\030\030\030\027\027\027\027\026\026\026\026\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\022\022\022\022\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\016\r\r\f\f\f\013\013\013\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\f\013\013\n\n\n\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\b\b\b\b\b\t\t\t\n\n\n\013\013\f\r\016\017\020\022\031\031\030\030\030\027\027\027\027\026\026\026\026\025\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\016\016\r\r\f\f\f\013\013\013\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\f\f\f\013\013\n\n\n\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\t\t\t\n\n\n\013\013\f\f\r\016\017\021\023\032\031\031\031\030\030\030\030\027\027\027\027\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\016\016\r\r\f\f\f\013\013\013\n\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\f\r\f\f\013\013\n\n\n\t\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\t\t\t\t\n\n\n\013\013\f\f\r\016\016\020\021\023\032\032\032\031\031\031\030\030\030\030\027\027\027\027\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\017\017\017\020\020\020\020\020\020\020\020\017\017\017\017\020\020\020\020\020\020\020\020\020\020\017\017\016\r\r\r\f\f\f\013\013\013\n\n\n\n\n\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\r\r\r\f\f\013\013\n\n\n\t\t\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\t\t\t\t\n\n\n\013\013\013\f\f\r\016\017\020\021\024\033\033\032\032\032\031\031\031\031\030\030\030\027\027\027\027\027\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\017\017\016\016\r\r\r\f\f\f\013\013\013\n\n\n\n\n\n\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\f\r\r\r\f\f\013\013\013\n\n\n\t\t\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\t\t\t\t\t\n\n\n\013\013\f\f\r\r\016\017\020\022\024\034\033\033\033\032\032\032\031\031\031\031\030\030\030\030\027\027\027\027\027\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\020\020\020\020\020\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\020\017\017\016\016\r\r\f\f\f\f\013\013\013\013\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\013\013\013\013\f\f\f\r\r\016\r\r\f\f\013\013\013\n\n\n\t\t\t\t\t\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\013\013\013\f\r\r\016\017\020\021\022\025\035\034\034\033\033\033\032\032\032\031\031\031\031\030\030\030\030\030\027\027\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\020\020\017\017\016\016\r\r\f\f\f\f\013\013\013\013\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\016\016\016\r\r\f\f\013\013\013\n\n\n\t\t\t\t\t\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\013\013\013\f\f\r\r\016\017\020\021\023\025\035\035\034\034\034\033\033\033\032\032\032\032\031\031\031\031\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\020\017\017\016\016\r\r\r\f\f\f\f\013\013\013\013\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\r\016\016\016\r\r\f\f\013\013\013\n\n\n\n\t\t\t\t\t\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\013\013\013\f\f\r\r\016\016\017\020\022\023\026\036\035\035\035\034\034\034\033\033\033\032\032\032\032\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\021\021\022\022\022\022\022\022\022\022\021\021\021\021\022\022\022\022\022\022\022\022\022\022\021\020\020\017\017\016\016\r\r\r\f\f\f\f\013\013\013\013\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\r\016\016\017\016\016\r\r\f\f\013\013\013\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\r\r\016\017\020\021\022\024\026\037\036\036\035\035\035\034\034\034\033\033\033\032\032\032\032\031\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\021\021\020\020\017\017\016\016\r\r\r\f\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\f\r\r\r\016\016\017\017\017\016\r\r\f\f\f\013\013\013\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\r\r\016\016\017\020\021\022\024\027\037\037\036\036\036\035\035\035\034\034\034\033\033\033\033\032\032\032\032\031\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\022\022\022\022\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\022\021\021\020\017\017\016\016\016\r\r\r\f\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\f\r\r\r\016\016\016\017\017\017\016\016\r\r\f\f\f\013\013\013\n\n\n\n\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\f\r\r\016\017\020\020\021\023\025\027 \037\037\036\036\036\035\035\035\034\034\034\033\033\033\033\032\032\032\032\031\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\026\026\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\022\022\021\020\020\017\017\016\016\016\r\r\r\f\f\f\f\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\f\f\f\f\r\r\r\016\016\016\017\017\020\017\017\016\016\r\r\f\f\013\013\013\013\n\n\n\n\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\f\r\r\016\016\017\020\021\022\023\025\030! \037\037\037\036\036\036\035\035\035\034\034\034\033\033\033\033\032\032\032\032\032\031\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\023\023\022\021\021\020\020\017\017\016\016\016\r\r\r\f\f\f\f\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\f\f\f\f\r\r\r\r\016\016\017\017\017\020\020\017\016\016\r\r\f\f\f\013\013\013\013\n\n\n\n\n\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\r\r\r\016\017\017\020\021\022\024\025\030!! \037\037\037\036\036\035\035\035\035\034\034\034\034\033\033\033\033\032\032\032\032\032\031\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\023\024\024\024\024\024\024\024\024\023\023\023\023\024\024\024\024\024\024\024\024\024\024\023\022\022\021\020\020\017\017\017\016\016\r\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\f\f\f\f\r\r\r\r\016\016\016\017\017\020\020\020\017\017\016\016\r\r\f\f\f\013\013\013\013\n\n\n\n\n\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\f\r\r\016\016\017\020\021\021\023\024\026\031\"\"!! \037\037\036\036\036\035\035\035\035\034\034\034\034\033\033\033\033\032\032\032\032\032\031\031\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\023\023\022\021\021\020\020\017\017\016\016\016\r\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\r\016\016\016\017\017\020\020\021\020\020\017\016\016\r\r\r\f\f\f\013\013\013\013\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\f\r\r\016\016\017\017\020\021\022\023\024\026\031#\"\"!!! \037\037\037\036\036\036\035\035\035\035\034\034\034\034\033\033\033\033\033\032\032\032\032\032\031\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\024\024\024\024\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\024\023\022\022\021\021\020\020\017\017\016\016\016\r\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\r\016\016\016\017\017\020\020\020\021\021\020\017\017\016\016\r\r\f\f\f\013\013\013\013\013\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\f\r\r\r\016\016\017\020\020\021\022\023\025\027\032##\"\"\"!! \037\037\037\036\036\036\036\035\035\035\034\034\034\034\034\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\024\023\023\022\021\021\020\020\017\017\017\016\016\016\r\r\r\r\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\r\r\r\r\016\016\016\017\017\017\020\020\021\021\021\020\020\017\016\016\r\r\r\f\f\f\013\013\013\013\013\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\016\016\017\017\020\021\022\023\024\025\027\032$$##\"\"!!! \037\037\037\036\036\036\036\035\035\035\035\034\034\034\034\033\033\033\033\033\032\032\032\032\032\031\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\027\027\026\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\025\025\024\023\022\022\021\021\020\020\017\017\017\016\016\016\r\r\r\r\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\r\r\r\r\016\016\016\017\017\017\020\020\021\021\022\021\021\020\017\017\016\016\r\r\r\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\r\016\016\017\020\020\021\022\023\024\026\030\033%$$##\"\"\"!!! \037\037\037\036\036\036\036\035\035\035\035\034\034\034\034\034\033\033\033\033\033\032\032\032\032\032\031\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\025\026\026\026\026\026\026\026\026\025\025\025\025\026\026\026\026\026\026\026\026\026\026\025\024\023\023\022\022\021\020\020\020\017\017\017\016\016\016\r\r\r\r\r\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\r\r\r\r\016\016\016\016\017\017\020\020\020\021\021\022\022\021\020\020\017\016\016\016\r\r\f\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\r\016\016\017\017\020\021\021\022\023\025\026\030\033&%$$$##\"\"\"!! \037\037\037\036\036\036\036\035\035\035\035\034\034\034\034\034\033\033\033\033\033\032\032\032\032\032\031\031\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\025\025\024\023\022\022\021\021\020\020\020\017\017\016\016\016\016\r\r\r\r\r\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\016\017\017\017\020\020\021\021\022\022\022\021\020\020\017\017\016\016\r\r\r\f\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\f\r\r\016\016\016\017\017\020\021\022\023\024\025\027\031\034&&%%$$###\"\"!!! \037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\026\026\026\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\026\025\024\023\023\022\022\021\021\020\020\017\017\017\016\016\016\016\r\r\r\r\r\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\016\017\017\017\020\020\021\021\022\022\023\022\022\021\020\020\017\017\016\016\r\r\r\f\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\f\r\r\r\016\016\017\017\020\020\021\022\023\024\025\027\031\034'&&%%$$$##\"\"\"!!! \037\037\037\037\036\036\036\036\035\035\035\035\034\034\034\034\034\033\033\033\033\033\032\032\032\032\032\031\031\031\031\031\031\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\026\025\024\024\023\022\022\021\021\020\020\020\017\017\017\016\016\016\016\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\016\016\016\016\017\017\017\020\020\020\021\021\022\022\023\023\022\021\020\020\017\017\016\016\016\r\r\r\f\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\f\r\r\r\016\016\016\017\017\020\021\021\022\023\024\026\027\031\035(''&&%%$$###\"\"\"!!! \037\037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\033\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\027\027\026\025\024\023\023\022\022\021\021\020\020\020\017\017\017\016\016\016\016\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\016\016\016\016\017\017\017\020\020\020\021\021\022\022\023\023\023\022\021\021\020\020\017\017\016\016\r\r\r\f\f\f\f\f\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\f\f\f\f\r\r\r\r\016\016\017\017\020\020\021\022\023\024\025\026\030\032\035((''&&%%$$$###\"\"\"!!! \037\037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\033\033\033\033\033\032\032\032\032\032\031\031\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\027\027\027\027\030\030\030\030\030\030\030\030\030\030\027\026\025\024\024\023\023\022\022\021\021\020\020\020\017\017\017\016\016\016\016\016\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\016\016\016\016\017\017\017\017\020\020\021\021\021\022\022\023\024\023\022\022\021\020\020\017\017\016\016\016\r\r\r\f\f\f\f\f\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\f\f\f\f\f\r\r\r\016\016\017\017\017\020\021\021\022\023\024\025\026\030\032\036)((''&&%%%$$###\"\"\"\"!!! \037\037\037\037\036\036\036\036\036\035\035\035\035\034\034\034\034\034\033\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\027\026\026\025\024\023\023\022\022\021\021\021\020\020\017\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\016\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\023\023\024\024\023\022\021\021\020\020\017\017\016\016\016\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\016\016\016\017\017\020\020\021\022\022\023\024\025\027\031\033\036*))('''&&%%$$$###\"\"\"\"!!! \037\037\037\037\036\036\036\036\036\035\035\035\035\034\034\034\034\034\033\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\031\031\030\030\030\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\031\030\027\026\025\024\024\023\023\022\022\021\021\020\020\020\017\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\r\r\016\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\023\023\024\024\024\023\022\022\021\020\020\017\017\017\016\016\r\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\r\016\016\017\017\017\020\021\021\022\023\024\025\026\027\031\033\037**))((''&&%%%$$$###\"\"\"!!!! \037\037\037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\033\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\030\027\026\026\025\024\024\023\022\022\022\021\021\020\020\020\017\017\017\017\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\017\017\017\017\020\020\020\021\021\021\022\022\023\023\024\025\024\023\023\022\021\021\020\020\017\017\016\016\016\r\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\r\016\016\016\017\017\020\020\021\021\022\023\024\025\026\030\031\034\037+**))((''&&&%%%$$$###\"\"\"!!!! \037\037\037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\033\033\033\033\033\033\032\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\030\030\027\026\025\024\024\023\023\022\022\021\021\021\020\020\020\017\017\017\017\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\017\017\017\017\020\020\020\021\021\021\022\022\023\023\024\024\025\025\024\023\022\022\021\020\020\017\017\017\016\016\016\r\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\r\016\016\016\017\017\020\020\021\021\022\022\023\024\025\027\030\032\034 ,++*))(((''&&&%%$$$####\"\"\"!!!! \037\037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\031\031\031\031\032\032\032\032\032\032\032\032\032\032\031\030\027\026\025\025\024\024\023\023\022\022\021\021\021\020\020\020\017\017\017\017\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\017\017\017\017\020\020\020\020\021\021\022\022\022\023\024\024\025\025\025\024\023\022\022\021\021\020\020\017\017\016\016\016\016\r\r\r\r\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\r\r\r\r\016\016\016\017\017\017\020\020\021\021\022\023\024\025\026\027\030\032\035 ,,++**))((''&&&%%%$$$####\"\"\"\"!!! \037\037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\034\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\031\030\027\027\026\025\024\024\023\023\022\022\022\021\021\020\020\020\020\017\017\017\017\017\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\016\017\017\017\017\020\020\020\020\021\021\021\022\022\023\023\024\024\025\026\025\024\024\023\022\021\021\020\020\017\017\017\016\016\016\r\r\r\r\r\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\r\r\r\r\r\016\016\016\017\017\020\020\021\021\022\022\023\024\025\026\027\031\033\035!-,,++**))(('''&&&%%%$$$####\"\"\"\"!!!! \037\037\037\037\036\036\036\036\036\035\035\035\035\035\034\034\034\034\034\033\033\033\033\033\033\033\033\032\032\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\033\032\031\030\027\026\025\025\024\024\023\023\022\022\021\021\021\020\020\020\020\017\017\017\017\017\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\016\017\017\017\017\017\020\020\020\020\021\021\021\022\022\023\023\024\024\025\025\026\026\025\024\023\022\022\021\021\020\020\017\017\017\016\016\016\r\r\r\r\r\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\017\017\017\020\020\021\021\022\023\023\024\025\026\030\031\033\036!.--,++**)))(('''&&&%%%$$$####\"\"\"\"!!!! \037\037\037\037\036\036\036\036\036\035\035\035\035\035\034\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033").append("\033\033\033\033\033\033\033\033\033\033\033\033\033\033\032\031\030\027\026\026\025\025\024\023\023\022\022\022\021\021\021\020\020\020\020\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\020\020\020\020\021\021\021\022\022\022\023\023\024\024\025\026\026\026\025\024\023\023\022\021\021\020\020\020\017\017\016\016\016\016\r\r\r\r\r\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\016\017\017\020\020\021\021\022\022\023\024\025\026\027\030\032\033\036\"..--,,++**))(('''&&&%%%$$$$####\"\"\"\"!!!! \037\037\037\037\036\036\036\036\036\035\035\035\035\035\034\034\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\032\031\030\030\027\026\025\025\024\024\023\023\022\022\022\021\021\021\020\020\020\020\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\020\020\020\020\021\021\021\022\022\022\023\023\024\024\025\025\026\027\026\025\024\024\023\022\022\021\021\020\020\017\017\017\016\016\016\016\r\r\r\r\r\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\016\017\017\017\020\020\021\021\022\022\023\024\025\026\027\030\032\034\036\"//.--,,++**))((('''&&&%%%$$$$####\"\"\"\"!!!! \037\037\037\037\036\036\036\036\036\035\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\033\033\033\033\034\034\034\034\034\034\034\034\034\034\033\032\031\030\027\026\026\025\025\024\024\023\023\022\022\021\021\021\021\020\020\020\020\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\020\020\020\020\021\021\021\021\022\022\023\023\023\024\024\025\026\026\027\027\026\025\024\023\023\022\021\021\020\020\020\017\017\017\016\016\016\016\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\016\017\017\017\020\020\021\021\022\022\023\023\024\025\026\027\031\032\034\037#0//.--,,++**)))((('''&&&%%%$$$$####\"\"\"!!!!! \037\037\037\037\036\036\036\036\036\036\035\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\034\033\032\031\030\027\027\026\025\025\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\020\020\020\020\021\021\021\021\022\022\022\023\023\024\024\025\025\026\027\027\027\026\025\024\024\023\022\022\021\021\020\020\017\017\017\017\016\016\016\016\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\016\016\016\016\017\017\017\020\020\020\021\021\022\022\023\024\025\025\027\030\031\033\035\037#10//.--,,+++**))((('''&&&&%%%$$$$###\"\"\"\"!!!! \037\037\037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\034\034\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\035\034\033\032\031\030\027\026\026\025\025\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\020\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\017\017\020\020\020\020\021\021\021\021\022\022\022\023\023\024\024\025\025\026\026\027\030\027\026\025\025\024\023\023\022\021\021\020\020\020\017\017\017\016\016\016\016\016\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\016\016\016\016\016\017\017\017\020\020\021\021\022\022\023\023\024\025\026\027\030\031\033\035 $110//..--,,++**)))((('''&&&%%%%$$$$###\"\"\"\"!!!! \037\037\037\037\037\036\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\034\033\032\031\030\027\027\026\025\025\024\024\023\023\023\022\022\022\021\021\021\021\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\021\022\022\022\023\023\023\024\024\025\025\026\027\027\030\030\027\026\025\024\023\023\022\022\021\021\020\020\020\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\016\016\016\016\016\017\017\017\020\020\020\021\021\022\022\023\024\024\025\026\027\030\032\033\036 $2110//..--,,++***)))((('''&&&%%%%$$$####\"\"\"\"!!!! \037\037\037\037\037\036\036\036\036\036\036\036\035\035\035\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\034\033\032\031\031\030\027\026\026\025\025\024\024\023\023\023\022\022\022\021\021\021\021\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\021\022\022\022\022\023\023\024\024\025\025\026\026\027\030\030\030\027\026\025\024\024\023\022\022\021\021\021\020\020\017\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\016\016\016\016\016\017\017\017\017\020\020\021\021\021\022\023\023\024\025\025\026\027\031\032\034\036!%32110//..--,,+++**)))(((''''&&&%%%%$$$####\"\"\"\"!!!! \037\037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\035\035\035\035\036\036\036\036\036\036\036\036\036\036\035\034\033\032\031\030\027\027\026\025\025\024\024\024\023\023\022\022\022\022\021\021\021\021\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\021\021\021\021\021\022\022\022\023\023\023\024\024\025\025\026\027\027\030\031\030\027\026\025\025\024\023\023\022\022\021\021\020\020\020\017\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\r\r\016\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\023\023\024\025\026\027\030\031\032\034\036!%3321100/..--,,,++***)))((('''&&&&%%%$$$$####\"\"\"\"!!!! \037\037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\036\035\034\033\032\031\030\030\027\026\026\025\025\024\024\023\023\023\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\023\023\023\024\024\025\025\026\026\027\030\030\031\031\030\027\026\025\024\024\023\022\022\021\021\021\020\020\020\017\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\017\017\017\017\020\020\020\021\021\021\022\023\023\024\024\025\026\027\030\031\033\035\037\"&43321100//..--,,+++***)))((('''&&&&%%%$$$$####\"\"\"\"!!!! \037\037\037\037\037\037\037\036\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037\037\036\034\033\032\032\031\030\027\027\026\026\025\025\024\024\023\023\023\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\023\023\023\024\024\024\025\025\026\027\027\030\031\031\031\030\027\026\025\024\024\023\023\022\022\021\021\020\020\020\017\017\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\023\023\024\025\025\026\027\030\032\033\035\037\"&543321100//..--,,,++***)))(((''''&&&%%%%$$$$####\"\"\"\"!!!!! \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\036\035\034\033\032\031\030\030\027\026\026\025\025\024\024\024\023\023\023\022\022\022\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\022\023\023\023\024\024\025\025\026\026\027\030\030\031\032\031\030\027\026\025\025\024\023\023\022\022\021\021\021\020\020\020\017\017\017\017\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\022\023\024\024\025\026\027\030\031\032\034\035 \"'5543321100//..---,,+++***)))(((''''&&&%%%%$$$####\"\"\"\"\"!!!!! \037\037\037 \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037 \036\035\034\033\032\031\031\030\027\027\026\026\025\025\024\024\023\023\023\022\022\022\022\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\022\022\022\022\023\023\023\024\024\025\025\025\026\027\027\030\031\031\032\032\030\027\027\026\025\024\024\023\023\022\022\021\021\021\020\020\020\017\017\017\017\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\017\017\017\017\020\020\020\021\021\021\022\022\023\023\024\025\025\026\027\030\031\032\034\036 #'65543321100//...--,,,++***))))((('''&&&&%%%$$$$####\"\"\"\"\"!!!!! \037\037\037\037 \037\036\034\033\033\032\031\030\030\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\021\022\022\022\022\023\023\023\024\024\024\025\025\026\026\027\027\030\031\032\032\032\031\030\027\026\025\025\024\023\023\022\022\022\021\021\020\020\020\020\017\017\017\017\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\016\017\017\017\017\020\020\020\020\021\021\022\022\022\023\024\024\025\026\026\027\030\031\033\034\036 #(765543322100///..--,,,+++***)))(((('''&&&&%%%$$$$####\"\"\"\"\"!!!!!! ! \037\036\035\034\033\032\031\031\030\027\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\021\022\022\022\022\023\023\023\024\024\024\025\025\026\026\027\027\030\030\031\032\033\032\031\030\027\026\026\025\024\024\023\023\022\022\021\021\021\020\020\020\020\017\017\017\017\017\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\016\016\017\017\017\017\020\020\020\020\021\021\021\022\022\023\023\024\024\025\026\027\030\031\032\033\035\037!$(77655433221100//..---,,,+++***)))(((''''&&&%%%%$$$$####\"\"\"\"\"!!!!!!! !!! !!!!!!\037\036\035\034\033\032\032\031\030\030\027\026\026\025\025\025\024\024\024\023\023\023\022\022\022\022\022\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\023\024\024\025\025\025\026\026\027\027\030\031\031\032\033\033\031\030\027\027\026\025\024\024\023\023\022\022\022\021\021\021\020\020\020\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\020\020\020\021\021\021\022\022\022\023\023\024\025\025\026\027\030\031\032\033\035\037!$)877655433221100//...--,,,+++***))))((('''&&&&%%%%$$$$####\"\"\"\"\"\"!!!!!!!!!!!!!!!!!!!!!!!!!!! \037\036\034\034\033\032\031\030\030\027\027\026\026\025\025\024\024\024\023\023\023\023\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\020\020\020\020\020\020\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\023\024\024\024\025\025\026\026\027\027\030\030\031\032\033\033\033\032\031\030\027\026\025\025\024\024\023\023\022\022\021\021\021\020\020\020\020\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\020\020\020\020\021\021\021\022\022\023\023\024\024\025\026\026\027\030\031\032\034\035\037\"%)9877655433221100///..---,,,+++***)))(((('''&&&&%%%$$$$$####\"\"\"\"\"\"\"!!\"!!!!!!!!!!!!!!!!!\"\"\"\" \037\036\035\034\033\032\031\031\030\030\027\026\026\026\025\025\024\024\024\023\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\023\024\024\024\025\025\025\026\026\027\027\030\031\031\032\033\034\033\032\031\030\027\026\026\025\024\024\023\023\022\022\022\021\021\021\020\020\020\020\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\020\020\020\020\021\021\021\022\022\022\023\023\024\025\025\026\027\027\030\032\033\034\036 \"%*:98776554332211000//...--,,,+++****)))(((''''&&&%%%%$$$$$#####\"\"\"\"\"\"\"\"\"\"\"\"\"\"!!!!\"\"\"\"\"\"\"\"\"\"!\037\036\035\034\033\033\032\031\030\030\027\027\026\026\025\025\025\024\024\024\023\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\023\023\023\023\024\024\024\025\025\025\026\026\027\027\030\030\031\032\032\033\034\034\032\031\030\027\027\026\025\025\024\024\023\023\022\022\021\021\021\021\020\020\020\020\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\020\020\020\020\021\021\021\021\022\022\023\023\024\024\025\025\026\027\030\031\032\033\034\036 \"&*:998776554432211100//...---,,,+++***)))(((('''&&&&%%%%$$$$$#####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"##\"! \037\036\035\034\033\032\031\031\030\030\027\026\026\026\025\025\024\024\024\024\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\022\023\023\023\023\024\024\024\024\025\025\026\026\026\027\027\030\031\031\032\033\034\034\034\033\032\031\030\027\026\026\025\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\022\022\022\023\023\024\024\025\026\026\027\030\031\032\033\035\036 #&+;:998776554433221100///...--,,,++++***)))(((''''&&&&%%%%$$$$$######\"####\"\"\"\"\"\"\"\"\"\"\"#######! \037\036\035\034\033\032\032\031\030\030\027\027\026\026\025\025\025\024\024\024\024\023\023\023\023\022\022\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\022\022\023\023\023\023\024\024\024\024\025\025\025\026\026\027\027\030\030\031\032\032\033\034\035\034\033\032\031\030\027\026\026\025\025\024\024\023\023\022\022\022\021\021\021\020\020\020\020\020\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\022\022\022\023\023\024\024\025\025\026\027\027\030\031\032\034\035\037!#&+<;:9987765544332211000//...---,,,+++***))))(((''''&&&%%%%%$$$$$###########################\"!\037\036\035\034\033\033\032\031\031\030\030\027\027\026\026\025\025\025\024\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\021\021\021\021\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\024\024\024\025\025\025\026\026\026\027\027\030\031\031\032\033\033\034\035\035\033\032\031\030\027\027\026\025\025\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\016\016\016\016\016\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\021\022\022\023\023\023\024\024\025\026\026\027\030\031\032\033\034\035\037!$',<;;:9887765544332211100///...---,,,+++***)))(((('''&&&&%%%%%$$$$$$##$#################$$$$\"! \037\036\035\034\033\032\032\031\030\030\027\027\026\026\026\025\025\025\024\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\024\024\024\025\025\025\026\026\026\027\027\030\030\031\031\032\033\034\035\035\035\034\033\032\031\030\027\026\026\025\025\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\021\022\022\022\023\023\024\024\025\025\026\026\027\030\031\032\033\034\036 \"$',=<;;:98877655443322211000//...---,,,+++***))))(((''''&&&&%%%%%$$$$$$$$$$$$$$####$$$$$$$$$$#! \037\036\035\034\033\033\032\031\031\030\030\027\027\026\026\025\025\025\025\024\024\024\024\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\023\024\024\024\024\025\025\025\026\026\027\027\027\030\031\031\032\032\033\034\035\036\035\034\033\032\031\030\027\027\026\025\025\024\024\023\023\023\022\022\022\021\021\021\021\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\021\021\021\021\022\022\022\023\023\023\024\024\025\025\026\027\027\030\031\032\033\035\036 \"%(->=<;;:98877655443332211000///...---,,,+++***)))((((''''&&&&%%%%%%$$$$$$$$$$$$$$$$$$$$$$%%$#\" \037\036\035\034\034\033\032\032\031\030\030\027\027\026\026\026\025\025\025\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\024\024\024\024\024\025\025\025\026\026\026\027\027\030\030\031\031\032\033\034\034\035\036\036\034\033\032\031\030\030\027\026\026\025\024\024\024\023\023\022\022\022\021\021\021\021\021\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\021\021\021\021\021\022\022\022\023\023\024\024\025\025\026\026\027\030\031\031\033\034\035\036 \"%(->>=<;::98877665544332211100///...---,,,+++***))))((((''''&&&&%%%%%%%%%%%$$$$$$$$$$$%%%%%%%#\"! \037\036\035\034\033\032\032\031\031\030\030\027\027\026\026\026\025\025\025\024\024\024\024\024\023\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\023\023\024\024\024\024\024\025\025\025\026\026\026\027\027\030\030\031\031\032\032\033\034\035\036\036\036\035\033\032\031\031\030\027\026\026\025\025\024\024\023\023\023\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\023\023\023\024\024\025\025\026\027\027\030\031\032\033\034\035\037!#%).?>==<;::988776655443322211000///...---,,,+++***)))((((''''&&&&&&%%%%%%%%%%%%%%%%%%%%%%%%&%$\"! \037\036\035\034\033\033\032\031\031\030\030\027\027\027\026\026\026\025\025\025\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\022\022\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\025\025\025\025\026\026\027\027\027\030\030\031\031\032\033\033\034\035\036\037\036\035\034\033\032\031\030\027\027\026\025\025\024\024\024\023\023\022\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\022\023\023\024\024\024\025\026\026\027\027\030\031\032\033\034\036\037!#&).@?>=<<;::988776655443322211100///...---,,,+++****)))((((''''&&&&&&%%&&%%%%%%%%%%%%%%%&&&&&$#\" \037\036\035\035\034\033\032\032\031\031\030\030\027\027\026\026\026\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\025\025\025\025\026\026\026\027\027\030\030\031\031\032\032\033\034\034\035\036\037\037\035\034\033\032\031\030\030\027\026\026\025\025\024\024\023\023\023\022\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\017\017\017\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\022\023\023\023\024\024\025\025\026\026\027\030\031\031\032\033\035\036 !#&*/@@?>=<<;::9887766554433322111000///..---,,,,+++***))))(((('''''&&&&&&&&&&&&&%%%%&&&&&&&&&&%#\"! \037\036\035\034\033\033\032\031\031\030\030\027\027\027\026\026\026\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\025\025\025\025\026\026\026\027\027\027\030\030\031\031\032\033\033\034\035\036\036\037\037\036\034\033\032\031\031\030\027\027\026\025\025\024\024\024\023\023\023\022\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\022\023\023\023\024\024\024\025\025\026\027\027\030\031\032\033\034\035\036 \"$'*/A@??>=<<;::9887766554443322211000///...---,,,+++****)))((((('''''&&&&&&&&&&&&&&&&&&&&&&'''%$\"! \037\036\035\034\034\033\032\032\031\031\030\030\027\027\027\026\026\026\025\025\025\025\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\024\025\025\025\025\026\026\026\027\027\027\030\030\031\031\032\032\033\034\034\035\036\037 \037\036\035\034\033\032\031\030\027\027\026\026\025\025\024\024\023\023\023\022\022\022\022\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\022\022\022\022\023\023\023\024\024\025\025\026\026\027\030\030\031\032\033\034\035\037 \"$'+0BA@?>>=<<;::99877665554433222111000//...---,,,++++***))))(((((''''''''''&&&&&&&&&&&'''''''%$#! \037\036\035\035\034\033\033\032\031\031\030\030\030\027\027\026\026\026\026\025\025\025\025\024\024\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\024\024\025\025\025\025\026\026\026\026\027\027\027\030\030\031\031\032\032\033\034\035\035\036\037 \036\035\034\033\032\031\030\030\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\021\022\022\022\022\023\023\023\024\024\024\025\025\026\026\027\030\030\031\032\033\034\036\037!\"%'+0CBA@?>>=<<;::99887766554433322111000///...---,,,+++****))))(((((''''''''''''''''''''''''('&$#\"! \037\036\035\034\034\033\032\032\031\031\030\030\027\027\027\026\026\026\026\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\026\026\026\026\027\027\027\030\030\031\031\032\032\033\033\034\035\036\037\037 \036\035\034\033\032\031\031\030\027\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\021\021\022\022\022\022\023\023\023\024\024\024\025\025\026\026\027\027\030\031\032\032\033\035\036\037!#%(+1CBAA@?>>=<;;::99887766554443322211100///...---,,,++++****))))(((((('(('''''''''''''''(((((&%#\"! \037\036\035\035\034\033\033\032\031\031\030\030\030\027\027\027\026\026\026\026\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\026\026\026\027\027\027\030\030\030\031\031\032\032\033\034\034\035\036\037 ! \037\036\034\033\032\032\031\030\027\027\026\026\025\025\024\024\024\023\023\023\023\022\022\022\022\021\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\021\021\021\022\022\022\022\023\023\023\023\024\024\024\025\025\026\026\027\030\030\031\032\033\034\035\036 !#%(,1DCBA@@?>==<;;::998877665554433322111000///...---,,,+++****)))))(((((((((((((''''(((((((((('%$\"! \037\036\036\035\034\033\033\032\032\031\031\030\030\030\027\027\027\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\026\026\026\026\027\027\027\030\030\031\031\032\032\033\033\034\035\035\036\037 !!\037\036\035\034\033\032\031\030\030\027\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\024\024\024\025\025\026\026\027\027\030\031\031\032\033\034\035\036 \"#&),2EDCBA@@?>==<;;::998877665554433322211000///...---,,,++++****)))))(((((((((((((((((((((()))'%$#\"! \037\036\035\034\034\033\032\032\031\031\031\030\030\027\027\027\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\025\026\026\026\026\027\027\027\030\030\030\031\031\032\032\033\034\034\035\036\037\037 !!\037\036\035\034\033\032\031\031\030\027\027\026\026\025\025\024\024\024\023\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\023\024\024\024\025\025\026\026\027\027\030\031\032\032\033\034\035\037 \"$&)-2EDCCBA@??>==<;;::998877666554443322211100///...---,,,,++++****))))))))))((((((((((()))))))'&$#\"! \037\036\035\035\034\033\033\032\032\031\031\030\030\030\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\025\025\026\026\026\026\026\027\027\027\030\030\030\031\031\032\032\033\033\034\035\035\036\037 !\"! \036\035\034\033\032\032\031\030\030\027\026\026\026\025\025\024\024\024\023\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\023\023\023\023\024\024\024\025\025\026\026\027\027\030\030\031\032\033\034\035\036\037!\"$')-3FEDCBBA@??>==<;;::9988777665544433322111000///...---,,,++++*****))))))))))))))))))))))))*)(&%#\"! \037\036\036\035\034\034\033\032\032\031\031\031\030\030\030\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\027\027\027\027\030\030\031\031\031\032\032\033\034\034\035\036\036\037 !\"\" \037\036\035\034\033\032\031\030\030\027\027\026\026\025\025\025\024\024\024\023\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\023\023\023\023\024\024\024\025\025\025\026\026\027\027\030\031\031\032\033\034\035\036\037!#%'*.3GFEDCBAA@??>==<<;::9988877665554433322211000///...---,,,,++++******)**)))))))))))))))*****('%$#\"! \037\036\035\035\034\033\033\032\032\031\031\030\030\030\027\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\027\027\027\027\030\030\030\031\031\032\032\033\033\034\034\035\036\037 !\"\" \037\036\035\034\033\032\031\031\030\027\027\026\026\026\025\025\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\022\023\023\023\023\023\024\024\024\025\025\026\026\026\027\030\030\031\032\032\033\034\035\036 !#%'*.4GFEEDCBAA@??>==<<;::9998877665554443322211100///....---,,,,++++*************))))**********('%$#\"! \037\036\036\035\034\034\033\032\032\032\031\031\030\030\030\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\027\027\027\027\030\030\030\031\031\031\032\032\033\033\034\035\035\036\037 !\"#\"!\037\036\035\034\033\032\032\031\030\030\027\027\026\026\025\025\025\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\022\022\023\023\023\023\023\024\024\024\025\025\025\026\026\027\027\030\030\031\032\033\033\034\035\037 \"#%(+/4HGFEDDCBA@@?>>==<<;;::9988776665544433222111000///...----,,,,+++++********************++++)'&%#\"! \037\037\036\035\034\034\033\033\032\032\031\031\031\030\030\030\027\027\027\027\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\026\027\027\027\027\030\030\030\031\031\031\032\032\033\033\034\034\035\036\036\037 !\"#\"! \036\035\034\033\033\032\031\031\030\027\027\026\026\026\025\025\024\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\024\024\024\024\025\025\026\026\026\027\027\030\031\031\032\033\034\035\036\037 \"$&(+/5IHGFEDCCBA@@?>>==<<;;::9988777665554433322111000///....---,,,,,+++++++++***********+++++++)(&%$#\"! \037\036\035\035\034\034\033\032\032\032\031\031\030\030\030\030\027\027\027\027\026\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\026\026\027\027\027\027\030\030\030\030\031\031\032\032\032\033\033\034\035\035\036\037 !\"$#! \037\036\035\034\033\032\031\031\030\030\027\027\026\026\025\025\025\024\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\024\024\024\024\025\025\025\026\026\027\027\030\030\031\032\032\033\034\035\036\037!\"$&(,/5IHGGFEDCBBA@@?>>==<<;;::9988777665554433322211100////...----,,,,,+++++++++++++++++++++++,+*('%$#\"! \037\036\036\035\034\034\033\033\032\032\031\031\031\030\030\030\030\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\030\030\030\031\031\031\032\032\033\033\034\034\035\036\036\037 !\"#$#\" \037\036\035\034\033\032\032\031\030\030\027\027\026\026\026\025\025\025\024\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\024\024\024\025\025\025\026\026\026\027\027\030\030\031\032\033\033\034\035\036 !\"$&),06JIHGFEEDCBBA@@?>>==<<;;::99888776665544433222111000///....----,,,,,+,,+++++++++++++++,,,,,*('&$#\"! \037\037\036\035\035\034\034\033\033\032\032\031\031\031\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\030\030\030\031\031\031\032\032\032\033\033\034\035\035\036\037\037 !\"#$#\"!\037\036\035\034\033\033\032\031\031\030\030\027\027\026\026\025\025\025\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\023\024\024\024\024\025\025\025\026\026\027\027\030\030\031\031\032\033\034\034\035\037 !#%'),06KJIHGFEDDCBBA@@?>>==<<;;::99988776665544433322111000////...-----,,,,,,,,,,,,++++,,,,,,,,,,*)'&%$\"!! \037\036\036\035\034\034\033\033\032\032\032\031\031\031\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\030\030\030\030\031\031\031\032\032\033\033\034\034\035\035\036\037 !\"#%$\"! \037\035\035\034\033\032\031\031\030\030\027\027\026\026\026\025\025\025\024\024\024\024\023\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\023\024\024\024\024\025\025\025\026\026\026\027\027\030\030\031\032\032\033\034\035\036\037 \"#%'*-17LJIIHGFEDDCBAA@@?>>==<<;;::999887776655544333222111000///....-----,,-,,,,,,,,,,,,,,,,,----+)(&%$#\"! \037\036\036\035\035\034\034\033\033\032\032\031\031\031\030\030\030\030\027\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\027\030\030\030\030\031\031\031\032\032\033\033\033\034\034\035\036\036\037 !\"#$%$#! \037\036\035\034\033\032\032\031\030\030\027\027\027\026\026\025\025\025\025\024\024\024\024\023\023\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\023\023\023\024\024\024\024\025\025\025\025\026\026\027\027\027\030\031\031\032\032\033\034\035\036\037 \"#%'*-17LKJIHGGFEDCCBAA@@?>>==<<;;:::99887776655544333222111000////....---------,,,,,,,,,,,-------+*('%$#\"! \037\036\035\035\034\034\033\033\032\032\032\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\027\026\026\026\026\026\026\026\026\027\027\027\027\027\027\027\027\027\030\030\030\030\031\031\031\032\032\032\033\033\034\034\035\035\036\037\037 !\"#$%$#! \037\036\035\034\033\033\032\031\031\030\030\027\027\026\026\026\025\025\025\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\025\025\025\026\026\026\027\027\030\030\031\031\032\033\034\034\035\036\037!\"$&(*.28MLKJIHGFFEDCCBAA@@?>>==<<;;;::998887766555444332221110000///.....----------------------..-,*('&%#\"!! \037\036\036\035\035\034\034\033\033\032\032\032\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\031\032\032\033\033\033\034\034\035\036\036\037 !\"#$&%#\"!\037\036\035\034\034\033\032\032\031\030\030\027\027\027\026\026\026\025\025\025\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\025\025\025\025\026\026\027\027\027\030\030\031\032\032\033\034\035\036\037 !\"$&(+.28NMKKJIHGFEEDCCBAA@@??>==<<<;;::998887766655444333222111000////.....-..---------------.....,*)'&%$#\"! \037\037\036\035\035\034\034\033\033\032\032\032\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\031\032\032\032\033\033\034\034\035\035\036\037\037 !\"#$%&%$\"! \037\036\035\034\033\032\032\031\031\030\030\027\027\026\026\026\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\025\025\025\025\026\026\026\027\027\030\030\031\031\032\032\033\034\035\036\037 !#$&)+.39NMLKJIHHGFEEDCCBAA@@??>>==<<;;::9998877666554443332221110000////............----......../.,+)(&%$#\"! \037\036\036\035\035\034\034\033\033\032\032\032\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\030\031\031\031\031\032\032\032\033\033\033\034\034\035\036\036\037 !\"#$%&%$\"! \037\036\035\034\033\033\032\031\031\030\030\027\027\027\026\026\026\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\025\025\025\025\026\026\026\027\027\027\030\030\031\031\032\033\033\034\035\036\037 \"#%'),/39ONMLKJIHGGFEDDCCBAA@@??>>==<<;;::9998877766555443332221111000/////../.................////-+)('%$#\"!! \037\037\036\035\035\034\034\033\033\033\032\032\032\031\031\031\031\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\030\031\031\031\031\032\032\032\033\033\033\034\034\035\035\036\036\037 !!\"#$%'&$#! \037\036\035\034\034\033\032\032\031\031\030\030\027\027\026\026\026\025\025\025\025\025\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\024\025\025\025\025\025\026\026\026\027\027\030\030\031\031\032\032\033\034\035\035\036\037!\"#%'),/3:OONMLKJIHGGFEDDCBBAA@@??>>==<<;;:::9988777665554443322221110000/////////...........///////-+*('&%$#\"! \037\037\036\036\035\035\034\034\033\033\032\032\032\032\031\031\031\031\030\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\030\030\030\030\030\030\030\030\031\031\031\031\031\032\032\032\033\033\034\034\034\035\035\036\037\037 !\"#$%&'&$#\" \037\036\035\035\034\033\032\032\031\031\030\030\027\027\027\026\026\026\025\025\025\025\025\024\024\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\024\024\024\024\024\024\024\024\025\025\025\025\025\026\026\026\027\027\027\030\030\031\031\032\033\033\034\035\036\037 !\"$%'*,04:OONMLKJJIHGFFEDDCBBAA@@??>>==<<;;:::99887776655544433322211110000//////////////////////00/.,*)'&%$#\"! \037\036\036\035\035\034\034\033\033\033\032\032\032\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\032\032\032\033\033\033\034\034\035\035\036\036\037 !\"#$%&'&%#\"! \037\036\035\034\033\033\032\031\031\030\030\030\027\027\026\026\026\026\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\026\026\026\026\027\027\030\030\030\031\032\032\033\033\034\035\036\037 !#$&(*-04;NNNNMLKJIIHGFFEDDCBBAA@@??>>==<<;;;::998887766655444333222211100000000///////////////00000.,+)(&%$#\"\"! \037\037\036\036\035\035\034\034\033\033\033\032\032\032\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\032\032\032\033\033\033\034\034\034\035\035\036\037\037 !!\"#$%&('%$\"! \037\036\035\034\034\033\032\032\031\031\030\030\027\027\027\026\026\026\026\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\026\026\026\026\027\027\027\030\030\031\031\032\032\033\034\034\035\036\037 !#$&(*-05;MMMMNMLKJIHHGFEEDDCBBAA@@??>>==<<;;;::99888776665554433332221111000000000000////0000000010.-+)('&%$#\"! \037\036\036\035\035\034\034\034\033\033\032\032\032\032\031\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\031\032\032\032\032\033\033\033\034\034\035\035\036\036\037\037 !\"##$%'('%$#! \037\036\035\035\034\033\033\032\031\031\030\030\030\027\027\027\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\026\026\026\027\027\027\030\030\030\031\031\032\033\033\034\035\036\036\037!\"#%&(+-15<MMMMMMLKKJIHGGFEEDDCBBAA@@??>>==<<<;;::999887766655544433322221111001000000000000000001111/-+*('&%$#\"!! \037\037\036\036\035\035\034\034\033\033\033\032\032\032\032\031\031\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\031\031\032\032\032\032\033\033\033\034\034\035\035\035\036\037\037 !\"#$%&'('&$#\" \037\036\036\035\034\033\033\032\032\031\031\030\030\027\027\027\026\026\026\026\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\025\026\026\026\026\027\027\027\030\030\031\031\032\032\033\033\034\035\036\037 !\"#%')+.16<LLLLLLMLKJJIHGGFEEDDCBBAA@@??>>==<<<;;::99988777665554443332222111111111000000000001111111/-,*)'&%$#\"\"! \037\037\036\036\035\035\034\034\034\033\033\033\032\032\032\032\031\031\031\031\031\031\031\031\031\030\030\030\030\030\030\031\031\031\031\031\031\031\031\031\032\032\032\032\033\033\033\034\034\034\035\035\036\036\037\037 !!\"#$%&')(&%#\"! \037\036\035\034\034\033\032\032\031\031\030\030\030\027\027\027\026\026\026\026\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\025\026\026\026\026\027\027\027\030\030\030\031\031\032\032\033\034\034\035\036\037 !\"$%')+.26=KKKKLLLLLKJIIHGGFEEDDCBBAA@@??>>===<<;;::9998877766555444333322221111111111111111111111222/.,*)('%$$#\"! \037\037\036\036\035\035\034\034\033\033\033\033\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\033\033\033\033\034\034\035\035\035\036\036\037 !\"##$%&()(&%#\"! \037\036\035\035\034\033\033\032\032\031\031\030\030\027\027\027\027\026\026\026\026\025\025\025\025\025\025\025\025\025\024\024\024\024\024\024\024\025\025\025\025\025\025\025\025\025\026\026\026\026\027\027\027\027\030\030\031\031\032\032\033\033\034\035\035\036\037 !#$&'),/27=KKKKKKKKLLKJIIHGGFEEDDCBBAA@@??>>===<<;;:::998877766655544433332222222211111111111112222220.,+)('&%$#\"!! \037\037\036\036\035\035\034\034\034\033\033\033\033\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\033\033\033\033\034\034\034\035\035\036\036\037\037 !!\"#$%&'()('%$\"! \037\036\036\035\034\033\033\032\032\031\031\030\030\030\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\027\027\027\030\030\030\031\031\032\032\033\033\034\035\036\037\037 \"#$&(*,/27>JJJJJJJKKKKKJIHHGFFEEDCCBBAA@@??>>>==<<;;:::99888776665554443333322222222222111122222222320.-+*('&%$#\"\"! \037\036\036\036\035\035\034\034\034\033\033\033\033\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\032\033\033\033\034\034\034\035\035\035\036\036\037 !\"\"#$%&'(*)'%$#\" \037\036\035\034\034\033\032\032\031\031\031\030\030\030\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\027\027\027\027\030\030\031\031\031\032\032\033\034\034\035\036\037 !\"#%&(*,/38>IIIIJJJJJKKKJJIHHGFFEEDCCBBAA@@??>>>==<<;;:::9988877666555444433333232222222222222222233331/-,*)(&%$$#\"!! \037\037\036\036\035\035\035\034\034\034\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\032\032\033\033\033\033\034\034\034\035\035\036\036\037\037 !\"##$%&')*)'&$#\"! \037\036\035\035\034\033\033\032\032\031\031\030\030\030\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\027\027\027\027\030\030\030\031\031\032\032\033\033\034\035\035\036\037 !\"#%'(*-038?IIIIIIIIJJJKKJJIHHGFFEEDCCBBAA@@???>>==<<;;:::998887776665554444333333332222222222233333331/-,*)('&%$#\"!! \037\036\036\036\035\035\034\034\034\033\033\033\033\033\032\032\032\032\032\032\032\032\031\031\031\031\031\031\032\032\032\032\032\032\032\032\032\033\033\033\033\034\034\034\035\035\035\036\036\037\037 !!\"#$%&'()*)(&%#\"! \037\036\035\035\034\033\033\032\032\031\031\031\030\030\030\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\027\027\027\027\030\030\030\031\031\031\032\032\033\034\034\035\036\036\037 !\"$%')+-048?HHHHHHHIIIJJJKJJIHHGFFEEDCCBBAA@@???>>==<<;;;::998887776665554444433333333333333333333344410.,+)('&%$#\"\"! \037\037\036\036\035\035\035\034\034\034\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\034\034\035\035\035\036\036\037\037 !\"\"#$%&'()+*(&%$\"! \037\037\036\035\034\034\033\033\032\032\031\031\030\030\030\027\027\027\027\027\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\026\026\027\027\027\027\030\030\030\031\031\032\032\033\033\034\034\035\036\037 \"#$%')+.149@GGGGHHHHHIIIJJKJIIHGGFFEEDCCBBAA@@@??>>==<<;;;::99988777666555544444444333333333333344444420.-+*('&%$$#\"!! \037\037\036\036\036\035\035\035\034\034\034\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\034\034\034\035\035\036\036\036\037\037 !!\"##$%&'(*+*('%$#\"! \037\036\035\035\034\033\033\032\032\031\031\031\030\030\030\027\027\027\027\027\026\026\026\026\026\026\026\026\026\025\025\025\025\025\025\026\026\026\026\026\026\026\026\026\027\027\027\027\030\030\030\031\031\031\032\032\033\033\034\035\035\036\037 !\"#$&')+.159@GGGGGGGGHHHIIJJKJIIHGGFFEEDDCBBAA@@@??>>==<<;;;::9998877766665555444444444443333444444445420/-+*)('&%$#\"\"! \037\037\036\036\035\035\035\034\034\034\034\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\033\034\034\034\034\035\035\035\036\036\037\037 !!\"#$%%&()*+*)'%$#\"! \037\036\035\035\034\034\033\033\032\032\031\031\030\030\030\030\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\030\030\030\030\031\031\032\032\033\033\034\034\035\036\036\037 !\"#%&(*,.15:AFFFFFFFGGGHHHIIJKJIIHGGFFEEDDCBBAAA@@??>>==<<;;;::999888777666555554544444444444444444555531/-,*)('&%$##\"!! \037\037\037\036\036\035\035\035\034\034\034\034\033\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\033\034\034\034\034\035\035\035\036\036\036\037\037 !\"\"#$%&'()*,+)'&$#\"! \037\036\036\035\034\034\033\033\032\032\031\031\031\030\030\030\030\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\030\030\030\031\031\031\032\032\033\033\034\034\035\036\037\037 !\"$%&(*,/25:AEEEEFFFFFGGGHHIIJJJIIHGGFFEEDDCBBBAA@@??>>==<<<;;::99988877766665555555554444444444555555531/.,+)('&%$$#\"!! \037\037\036\036\036\035\035\035\034\034\034\034\033\033\033\033\033\033\033\033\033\032\032\032\032\033\033\033\033\033\033\033\033\033\034\034\034\034\035\035\035\035\036\036\037\037 !!\"##$%&'()+,+)(&%#\"! \037\037\036\035\035\034\033\033\032\032\032\031\031\031\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\030\030\030\031\031\031\032\032\032\033\033\034\035\035\036\037 !\"#$%'(*,/26;BEEEEEEEEFFFGGHHIIJJJIHHGGFFEEDDCCBBAA@@??>>==<<<;;:::9988877776666555555555555555555555666310.,+*)'&&%$#\"\"! \037\037\037\036\036\035\035\035\035\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\035\035\035\036\036\036\037\037 !\"\"#$%%&'(*+,+*(&%$#\"! \037\036\035\035\034\034\033\033\032\032\031\031\031\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\030\030\030\030\031\031\031\032\032\033\033\034\034\035\035\036\037 !\"#$%')+-/26;BDDDDDDDEEEFFFGGHIIJJJIHHGGFFEEDDCCBBAA@@??>>==<<<;;:::999888777666666665555555555555666666420.-+*)('&%$##\"!! \037\037\036\036\036\035\035\035\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\035\035\035\036\036\036\037\037 !!\"##$%&'()*+-,*('%$#\"! \037\036\036\035\034\034\033\033\032\032\032\031\031\031\030\030\030\030\027\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\027\030\030\030\030\031\031\031\032\032\032\033\033\034\034\035\036\036\037 !\"#$&')+-037<CDCCCDDDDDEEEFFGGHIIJJJIHHGGFFEEDDCCBBAA@@??>>==<<<;;:::99988877776666666666655556666666676420/-,*)('&%$$#\"\"! \037\037\037\036\036\036\035\035\035\034\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\034\035\035\035\035\036\036\037\037\037 !!\"##$%&'()*,-,*('&$#\"! \037\037\036\035\035\034\034\033\033\032\032\031\031\031\031\030\030\030\030\027\027\027\027\027\027\027\027\027\026\026\026\026\026\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\032\032\033\033\034\034\035\035\036\037\037 !\"#%&()+-037<CCCCCCCCCDDDEEEFGGHIIJJJIHHGGFFEEDDCCBBAA@@??>>==<<<;;:::9998888777767666666666666666677777531/-,+*('&%%$#\"\"!! \037\037\036\036\036\035\035\035\035\034\034\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037 !!\"\"#$%%&'()+,-,*)'&%#\"! \037\036\035\035\034\034\033\033\032\032\032\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\032\032\032\033\033\034\034\035\035\036\037 !\"#$%&(*,.047<BBBBBBBCCCCDDDEEFFGHIIJJIIHHGGFFEEDDCCBBAA@@??>>===<<;;;::999988877777777766666666677777787531/.,+*)('&%$##\"!! \037\037\037\036\036\036\035\035\035\035\034\034\034\034\034\034\034\034\034\034\033\033\034\034\034\034\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037\037 !!\"##$%&'')*+,.-+)(&%$#\"! \037\036\036\035\034\034\033\033\033\032\032\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\031\032\032\033\033\033\034\035\035\036\036\037 !\"#$%'(*,.148=BBBABBBBBBCCCDDEEFFGHIJKJIIHHGGFFEEDDCCBBAA@@??>>===<<;;;:::99988887777777777777777777778885310.-+*)('&%$$#\"\"!! \037\037\037\036\036\036\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\036\036\036\036\037\037 !!\"\"#$$%&'()*+-.-+)(&%$#\"! \037\037\036\035\035\034\034\033\033\032\032\032\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\031\032\032\032\033\033\034\034\035\035\036\037\037 !\"#$%'(*,/148=AAAAAAAAABBBCCCDDEFFGHIJKJIIHHGGFFEEDDCCBBAA@@??>>===<<;;;:::9999888888877777777777778888886420.-,*)('&%%$##\"!! \037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\036\036\036\036\037\037\037 !!\"\"#$%%&'()*,-.-+*('%$#\"! \037\036\035\035\034\034\033\033\033\032\032\032\031\031\031\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\030\030\031\031\031\032\032\032\033\033\033\034\034\035\036\036\037 !\"#$&')+-/259>@@@@@@@AAAABBBCCDDEFFGHIJKJIIHHGGFFEEDCCCBBAA@@??>>===<<;;;:::999988888888888777788888889986420/-,+*)('&%$##\"\"!! \037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\035\036\036\036\037\037\037 !!\"\"##$%&&'()+,-/.,*('&$#\"!! \037\036\036\035\035\034\034\033\033\032\032\032\031\031\031\031\030\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\030\030\031\031\031\031\032\032\032\033\033\034\034\035\035\036\036\037 !\"#$%&')+-/259>@@@@@@@@@@AAABBCCDDEFGGHIJJJIIHHGGFFEDDCCBBBAA@@??>>===<<<;;;:::9999899888888888888888999997431/.,+*)('&%$$#\"\"!! \037\037\037\036\036\036\036\035\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\035\035\036\036\036\036\037\037 !!\"\"#$$%&'()*+,-/.,*)'&%$#\"! \037\037\036\035\035\034\034\033\033\033\032\032\032\031\031\031\031\030\030\030\030\030\030\030\030\030\030\027\027\027\030\030\030\030\030\030\030\030\030\030\031\031\031\031\032\032\032\033\033\033\034\034\035\035\036\037\037 !\"#$%&()+-0259??????????@@@AAABBCDDEFGHIJKJJIIHHGGFEEDDCCBBBAA@@??>>===<<<;;;::::99999999888888888999999:97531/.-+*)('&%%$##\"\"!! \037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\037\037\037 !!\"\"##$%%&'()*+,./.,+)(&%$#\"! \037\037\036\036\035\034\034\034\033\033\032\032\032\032\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\032\032\032\032\033\033\034\034\034\035\036\036\037 !\"#$%'(*+.036:?>>>>>>>????@@@AABBCDDEFGHIJKJJIIHHGGFEEDDCCBBAAA@@??>>>==<<<;;;::::99999999999999999999::::75310.-,*)(''&%$$#\"\"!! \037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\037\037\037 !!\"\"##$%&&'()*,-.0/-+)(&%$#\"! \037\036\036\035\035\034\034\033\033\033\032\032\032\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\032\032\032\033\033\033\034\034\035\035\036\036\037 !!\"#$&'(*,.036:>>>>>>>>>>>???@@AABBCDDEFGHIKKJJIIHHGFFEEDDCCBBAAA@@??>>>==<<<;;;;:::::::9999999999999::::::86420/-,+*)('&%%$##\"\"!! \037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\037\037\037\037 !!\"\"##$$%&'()*+,-.0/-+*('&$#\"!! \037\037\036\035\035\034\034\034\033\033\032\032\032\032\031\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\032\032\032\032\033\033\034\034\034\035\035\036\037\037 !\"#$%&')*,.137;=========>>>>???@@ABBCDEEFGIJKKJJIIHHGFFEEDDCCBBAAA@@??>>>===<<<;;;;::::::::::9999:::::::;;:86421/.,+*)('&%%$##\"\"!! \037\037\037\037\036\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\037\037\037\037 !!\"\"##$%%&'()*+,-/0/-,*('&%$#\"! \037\037\036\036\035\035\034\034\033\033\033\032\032\032\032\031\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\031\032\032\032\032\033\033\033\034\034\035\035\036\036\037\037 !\"#$%&')+,.147;=<<<<<<=====>>>??@@ABBCDEFGHIJKKJJIIHGGFFEEDDCCBBAAA@@??>>>===<<<;;;;:;;:::::::::::::::;;;;;86431/.-+*)(''&%$$##\"\"!! \037\037\037\037\036\036\036\036\036\036\036\035\035\035\035\035\035\035\035\036\036\036\036\036\036\036\037\037\037\037 !!\"\"\"#$$%&&'()*+,./10.,*)'&%$#\"! \037\036\036\035\035\034\034\034\033\033\033\032\032\032\032\031\031\031\031\031\031\031\030\030\030\030\030\030\030\030\030\031\031\031\031\031\031\031\032\032\032\032\033\033\033\034\034\034\035\035\036\036\037 !\"#$%&()+-/147<<<<<<<<<<<<===>>??@@ABBCDEFGHIKKKJJIIHGGFFEEDDCCBBAAA@@??>>>===<<<<;;;;;;;;:::::::::;;;;;;<;975310.-,+*)('&%%$##\"\"!!! \037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037 !!!\"\"##$%%&'(()*,-./10.,*)(&%$#\"!! \037\037\036\036\035\035\034\034\033\033\033\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\030\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\033\033\033\034\034\035\035\036\036\037\037 !!\"#$%'()+-/248;;;;;;;;;;<<<<===>>?@@ABBCDEFGIJKKKJJIHHGGFFEEDDCCBBAAA@@???>>====<<<<;<;;;;;;;;;;;;;;;;;<<<<975320/-,+*)('&&%$$##\"\"!! \037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037 !!\"\"\"#$$%%&'()*+,-.010.,+)('%$#\"\"! \037\037\036\036\035\035\034\034\034\033\033\033\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\033\033\033\034\034\034\035\035\036\036\037\037 !\"##%&'(*+-/258;;;;:::;;;;;;<<<==>>??@ABCCDFGHIKLKKJJIHHGGFFEEDDCCBBAAA@@???>>>===<<<<<<<;;;;;;;;;;;;;<<<<<<:75420/.,+*)(''&%$$##\"\"!!! \037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037 !!!\"\"##$$%&&'()*+,-/021/-+)('&%$#\"! \037\036\036\035\035\035\034\034\033\033\033\033\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\033\033\033\033\034\034\035\035\035\036\036\037 !\"#$%&')*,.0259:::::::::::;;;;<<==>>??@ABCDEFGHJKLKKJIIHHGGFFEEDDCCBBAAA@@???>>>====<<<<<<<<<<;;;;<<<<<<<==<:86421/.-+*)(('&%%$$##\"\"!!! \037\037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037\037 !!\"\"\"##$%%&''()*+,./021/-+*('&%$#\"!! \037\037\036\036\035\035\034\034\034\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\032\033\033\033\034\034\034\035\035\036\036\037\037 !!\"#$%&')*,.0359:999999999::::;;;<<==>??@ABCDEFHIJLLKKJIIHHGGFFEEDDCCBBAAA@@???>>>=======<<<<<<<<<<<<<<<=====:86431/.-,+*)('&&%$$##\"\"!!! \037\037\037\037\037\037\037\036\036\036\036\036\036\036\036\037\037\037\037\037\037\037 !!!\"\"##$$%&&'()*+,-./121/-,*)'&%$#\"\"! \037\037\036\036\035\035\035\034\034\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\032\033\033\033\033\034\034\034\035\035\036\036\037\037 !\"\"#$%&()+,.03699999999999999:::;;<<==>?@@ABCDFGHJKLLKJJIIHHGGFFEEDDCCBBAAA@@???>>>>========<<<<<<<<<======>=;965310.-,+*)(''&%%$###\"\"!!! \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037 !!!\"\"\"##$$%&&'()*+,-.01320.,*)(&%$##\"! \037\037\036\036\035\035\034\034\034\033\033\033\033\032\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\032\032\032\032\032\032\032\033\033\033\033\034\034\034\035\035\036\036\037\037 !\"##$&'()+-/1369888888888889999::;;<<==>?@AACDEFGIJLLLKJJIIHHGGFFEEDDCCBBAAA@@@???>>>>=>=================>>>>;975320/-,+*)(('&%%$$##\"\"\"!!! \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037 !!!!\"\"##$$%%&''()*+,-/01320.,+)('&%$#\"!! \037\037\036\036\035\035\035\034\034\034\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\034\034\034\034\035\035\036\036\037\037 !!\"#$%&'(*+-/147888777777788888999::;;<==>?@ABCDEGHJKMLKKJJIIHHGGFFEEDDCCBBAAA@@@???>>>>>>>=============>>>>>><975420/.-,**)('&&%$$###\"\"!!!! \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037 !!!\"\"\"##$$%&&'())*+,./02320.,+)('&%$#\"!! \037\037\036\036\036\035\035\034\034\034\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\034\034\035\035\035\036\036\037\037 !!\"#$%&'(*+-/1477777777777777888899::;;<==>?@ABCDFGIJLMLKKJJIIHHGGFFEEDDCCBBBAA@@@????>>>>>>>>>>====>>>>>>>???<:86421/.-,+*)(''&%%$$##\"\"\"!!! \037\037\037\037\037\037\037\037\037\037\037\037 !!!\"\"\"##$$%%&''()*+,-./12430/-+*('&%$#\"\"! \037\037\036\036\035\035\035\034\034\034\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\034\034\035\035\035\036\036\037\037 !\"\"#$%&')*,./24776666666666777778899::;;<=>>?@ABDEFHIKMLLKKJJIIHHGGFFEEDDCCBBBAA@@@@??????>>>>>>>>>>>>>>>?????<:864310.-,+*)(('&&%$$###\"\"\"!!! \037\037\037\037\037\037\037\037 !!!!\"\"###$$%%&''()*+,-.012431/-+*)'&%$##\"!! \037\037\036\036\035\035\035\034\034\034\034\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\034\034\034\035\035\035\036\036\037\037 !!\"#$$%'()*,.02566666555566666677788899:;;<=>?@ABCDFGIJLMLLKKJJIIHGGFFEEEDDCCBBBAAA@@@????????>>>>>>>>>??????@?=:865310/-,+*))('&&%%$$##\"\"\"!!!! !!!!\"\"\"##$$%%&&'())*+,-/013431/-,*)('&%$#\"!! \037\037\036\036\035\035\035\034\034\034\033\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\033\033\034\034\034\035\035\035\036\036\037\037 !!\"#$%&'()+,.025655555555555556667778899:;;<=>?@ABCEFHIKMMLLKKJJIHHGGFFEEEDDCCBBBAAA@@@@?@?????????????????@@@@=;975320/.-,+*)(''&%%$$###\"\"\"!!!!! !!!!\"\"\"###$$%%&''()*++-./023541/.,+)('&%$#\"\"! \037\037\036\036\035\035\035\034\034\034\034\033\033\033\033\033\033\033\033\032\032\032\032\032\032\032\033\033\033\033\033\033\033\033\034\034\034\034\035\035\035\036\036\037\037 !\"\"#$%&'(*+-.0355554444444445555666778899:;;<=>?@ACDEGIJLMMLLKKJIIHHGGFFEEEDDCCBBBAAAA@@@@@@?????????????@@@@A@>;975421/.-,+*)(('&&%%$$###\"\"\"!!!!! !!!!!\"\"\"\"##$$%%&&'(()*+,-./0235420.,+)('&%$##\"!! \037\037\036\036\036\035\035\035\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\035\035\035\036\036\036\037\037 !!\"##$%&'(*+-/13544444444444444455566677899:;<<=>?ABCEFHIKMMMLLKJJIIHHGGFFEEEDDCCCBBBAAA@@@@@@@@@@????@@@@@@@AAA><9764210.-,+*))(''&%%$$###\"\"\"\"!!!!! !!!!!\"\"\"\"###$$%%&&'())*+,-./1245420.-+*('&%$$#\"!! \037\037\036\036\035\035\035\035\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\035\035\035\035\036\036\037\037 !!\"#$$%&()*,-/134443333333333344445556677899:;<=>?@ABDEGIJLNMMLLKJJIIHHGGFFEEEDDCCCBBBAAAAAA@@@@@@@@@@@@@@@AAAAA><:864310/.,++*)(''&&%%$$###\"\"\"\"!!!!!!! !!!!!!!!\"\"\"###$$%%&&''()**+,-/01246520/-+*)(&&%$#\"\"! \037\037\036\036\036\035\035\035\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\035\035\035\036\036\036\037\037 !\"\"#$%&'()*,-/1433333222222333333444556677899:;<=>?@BCDFHJLNNMMLKKJJIIHHGGFFEEEDDCCCBBBAAAAAAAA@@@@@@@@@A@@@@@").append("@@?<:865320/.-,+*)(('&&%%$$$###\"\"\"\"!!!!!!!!!!!!!!!!!!!\"\"\"\"###$$%%&&'(()*+,-./01346531/-,*)('&%$#\"\"!! \037\037\036\036\036\035\035\035\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\035\035\035\035\036\036\037\037 !!\"\"#$%&'()+,.023322222222222222333344455677899:;<=>?ABDEGIKMNNMLLKKJJIIHHGGFFEEEDDCCCBBBBABAAAAAAAAA@@@@@????????=:875320/.-,+*))(''&&%%$$###\"\"\"\"\"!!!!!!!!!!!!!!!!\"\"\"\"\"###$$%%%&''())*+,-./02356531/-,+)('&%$##\"!! \037\037\036\036\036\035\035\035\035\034\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037 !!\"##$%&'(*+,.0222222111111111222223334455677899:;<=?@ACDFHJLNNMMLLKKJJIIHHGGFFEEEDDCCCCBBBBBBAAAAA@@?????>>>>>>>>=;9754210.-,+**)(('&&%%$$$###\"\"\"\"\"!!!!!!!!!!!!!!\"\"\"\"\"###$$$%%&&''()**+,-./12357631/.,+)('&%$$#\"\"! \037\037\037\036\036\036\035\035\035\035\034\034\034\034\034\034\034\033\033\033\033\033\033\033\034\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037\037 !\"\"#$$%&')*+-.0221111111111111111222233445566789:;<=>?@BCEGIKMONMMLLKKJJIIHHGGFFEEEDDDCCCBBBBBBA@@@??>>>>>=========;9764210/.-,+*)((''&&%%$$####\"\"\"\"\"\"!!!!!!!!!!\"\"\"\"\"\"####$$%%%&&'(()*++,-/0124576420.,+*)'&&%$#\"\"!! \037\037\036\036\036\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037 !!\"\"#$%&'()*+-/01111000000000000011112233345567789:;<=>@ACDFHJLONNMMLLKKJJIIHHGGFFEEEDDDCCCCCBAA@???>>=====<<<<<<<<=<9864310/.-,+*))(''&&%%$$$####\"\"\"\"\"\"\"!!!!!!\"\"\"\"\"\"\"####$$$%%&&''())*+,-./0134676420.-+*)('&%$##\"!! \037\037\037\036\036\036\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037\037 !!\"##$%&'()*,-/11000000///////000001112223344567789:;<>?@BCEGIKNONNMMLLKJJIIHHHGGFFEEEDDDDCCAA@@?>>>===<<<<;;;;;;;<<<:865320/.-,+**)(('&&%%%$$$####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"####$$$%%%&&'(()**+,-./0234687420/-,*)('&%$$#\"\"!! \037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\036\036\036\036\037\037 !\"\"#$$%&'()+,-/0000///////////////000111223344567789:<=>?ABDFHJMOONNMMLKKJJIIHHHGGFFFEEEDDCB@@?>>===<<<;;;;;::::::;;;:8753210.-,,+*)((''&&%%$$$$####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"#####$$$%%&&''(()*++,-./1235687521/-,+)('&%%$#\"\"!! \037\037\037\036\036\036\035\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\035\036\036\036\037\037\037 !!\"\"#$%%&'(*+,./00////...........////0001122334456789:;<=?@BCEGILNOONNMLLKKJJIIHHHGGFFFEEDCBA??>==<<<;;;::::::9999:::::9754210/.-,+*))(''&&%%%$$$#####\"\"\"\"\"\"\"\"\"\"\"\"\"\"#####$$$%%%&&''())*+,-./01245787531/.,+*('&&%$##\"!! \037\037\036\036\036\036\035\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\035\036\036\036\036\037\037 !!\"##$%&'()*+,.0///.................///000112234456789:;<>?ABDFHKMPOONMMLLKKJJIIHHHGGFFDCCBA@>>=<<;;;:::9999999999999999764310/.-,+**)((''&&%%%$$$######\"\"\"\"\"\"\"\"\"\"######$$$%%%&&''(()**+,-./01245798531/.,+*)('&%$##\"\"!! \037\037\037\036\036\036\036\035\035\035\035\035\035\035\034\034\034\034\034\034\034\035\035\035\035\035\035\035\036\036\036\036\037\037\037 !!\"\"##$%&'()*+-.//....-------------....///00112234556789:<=>@BCEGJLOPOONMMLLKKJJIIHHHGEDCBAA@?==<;;:::9998888888888888889764320/.-,++*))(''&&&%%$$$$#######\"\"\"\"\"\"#######$$$$%%%&&''(()*++,-./013467986310.-+*)('&%$$#\"\"!! \037\037\037\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\037\037\037 !!\"\"#$$%&'()*,-/...------,,,,,,,------...//0011223455678:;<>?ABDFIKNPPONNMMLLKKJJIIHGFDCBA@??><<;::99988877777777777777788653210.--,+*))((''&&%%%$$$$##################$$$$%%%&&''(())*+,,-./123468986420.-,*)('&%%$##\"\"!! \037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\037\037\037 !!!\"##$%%&'()+,-..----,,,,,,,,,,,,,,,----..///001223456789:;=>@BCEHJMOPOONNMMLLKKJJHGFDCBA@?>>=;;:9998877776666666666666777654210/.-,+**)((''&&&%%%$$$$################$$$$%%%&&&''(()**+,-./0123568:96420/-,+)('&&%$##\"\"!! \037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\037\037\037 !!\"\"##$%&''(*+,.---,,,,,+++++++++++,,,,----..//001223456789:<=?ABDGILNPPOONNMMLLKJHGFDCBA@?>==<::99887766665555555555555666654210/.-,++*))((''&&%%%%$$$$$#############$$$$$%%%&&''(())*++,-./0124578:97421/-,+*)('&%$$#\"\"!! \037\037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\037\037\037\037 !!\"\"#$$%&'()*+,--,,,,+++++++++++++++++,,,---..//00123345678:;<>@BDFHJMPPPOONNMLLJIGFDCBA@?>=<<;9988776665555444444444445555664320/.-,,+**)((''&&&%%%$$$$$$##########$$$$$$%%%&&&''(())*+,,-./0134579:97531/.,+*)('&%%$##\"\"!! \037\037\037\036\036\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\036\037\037\037 !!\"\"##$%%&'()*+--,,,++++*************++++,,,---.//00123345689:<=?ACEGILOQPPOONMMKIHFECBA@?>=<;;:88776655544443333333333344445543210/.-,+**))((''&&&%%%$$$$$$$$####$$$$$$$$%%%%&&'''(()**+,--./0234679;:7531/.-+*)('&%%$##\"\"!! \037\037\037\037\036\036\036\036\036\036\036\036\035\035\035\035\035\036\036\036\036\036\036\036\036\037\037\037\037 !!\"\"##$%&&'()*,,,,+++******)))))))******+++,,,--../00123456789;<>@BDFHKNQQPPONMKJHFECBA@?>=<;::977665544433333222222222333334443210/.-,++*))((''&&&%%%%$$$$$$$$$$$$$$$$$$%%%%&&&''(())*++,-./01235689;:75310.-,*)('&&%$$#\"\"\"!! \037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037 !!!\"\"#$$%&''()+,,+++****)))))))))))))))****+++,,--../0012345679:;=?ACEGJMPQQPONLJHGEDBA@?>=<;:99866554433332222221111122222233344210/.-,,+**)(((''&&&%%%%$$$$$$$$$$$$$$$$%%%%&&&'''(()**+,,-./0123568:;:86420.-,+*)('&%$$##\"\"!! \037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037 !!\"\"##$$%&'()*+,++***))))))((((((((())))))***++,,--../0012345689;<>@BDFILORQPOLKIGEDBA@?>=<;:988755443332221111111111111111122233310/.--,+**))(('''&&&%%%%%$$$$$$$$$$$$%%%%%&&&&''(())**+,--./0124578:<;86420/-,+*)('&%%$##\"\"!!! \037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037 !!!\"\"##$%%&'()*+++**))))((((((((((((((((())))**+++,,-../011235678:;=?ACEHKNQROMKIGFDCA@?><;;:98776443322211110000000000000001111223210/.-,++**)(((''&&&&%%%%%%$$$$$$$$$%%%%%&&&&'''(())*++,-.//1234578:<;86421/.,+*)('&&%$$##\"\"!! \037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037 !!\"\"##$$%&&'()*+**))))(((('''''''''''''(((()))***++,,-../012345679:<>@BDGJMPPNLJHFDCA@?><;:998766533222110000//////////////00001112210/.-,,+**))(('''&&&&%%%%%%%%$$$%%%%%%%%&&&'''(())**+,,-./01234679;<;96431/.-+*)(''&%$$##\"\"!!! \037\037\037\037\037\037\036\036\036\036\036\036\036\036\036\037\037\037\037\037\037 !!!\"\"##$$%&''()***)))(((''''''''&&&''''''''((()))**++,,-../01234578:;=?ACFHKOOMJIGECB@?><;:9887655422111000////............/////0001110/.--,++*))((('''&&&&%%%%%%%%%%%%%%%%%&&&&''((())**+,--./01235689;=<975310.-,*)(('&%%$##\"\"\"!!! \037\037\037\037\037\037\037\037\036\036\036\036\036\037\037\037\037\037\037\037\037 !!!\"\"\"##$%%&'()**)))(((''''&&&&&&&&&&&&&&&''''((()))**+,,-../01235679:<>@BEGJMMKIGEDBA?>=;:98776544321100///.....----------.....///00010//.-,++**))(('''&&&&&%%%%%%%%%%%%%%&&&&&'''(())**++,-../01245689;=<975310.-,+*)('&&%$$##\"\"!!! \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037 !!!\"\"##$$%&&'()*))((('''&&&&&&%%%%%%%%%&&&&&&'''((())**+,,-.//01345689;=?ADFILLJHFDBA?>=;:9876654332100//....------,,,,,,,------...//0000/.-,,+**))((('''&&&&&%%%%%%%%%%%%&&&&&'''((())**+,,-./01234578:<=<:75320/-,+*)('&&%$$##\"\"\"!!! \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037 !!!\"\"\"##$$%&&'()))(('''&&&&%%%%%%%%%%%%%%%%%&&&&'''(())**+,,-./01234579:<>@CEHKKIGECA@>=<:987655432210//...---,,,,,,,,,,,,,,,,,,---...//00/.--,++**))((''''&&&&&&%%%%%%%%&&&&&&''''(())**++,--./01234678:<>=:86420/.,+*)(''&%%$$##\"\"!!! \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037 !!!\"\"##$$%%&''())((''&&&&%%%%%$$$$$$$$$$$%%%%%&&&&''(())**+,,-./01235689;=?ADGJIGECB@>=<:987654432110/...--,,,,++++++++++++++++,,,,---..///..-,,+**))(((''''&&&&&&&&%%&&&&&&&&''''((())**++,-../01234679:<>=:86421/.-+*)(('&%%$$##\"\"\"!!! \037\037\037\037\037\037\037\037\037\037\037\037 !!!\"\"\"##$$%%&'()(('''&&&%%%$$$$$$$$$$$$$$$$$$$%%%&&&'''(()**+,,-./0134578:<>@CFIHFDB@?=<;987654332110/.---,,,++++**************++++,,,---..//.-,,++**))(((''''&&&&&&&&&&&&&&&&''''((()))**+,,-.//01245689;<>=;86421/.-,+*)('&&%$$###\"\"!!!! \037\037\037\037\037\037\037\037\037 !!!!\"\"###$$%&&'(((''&&&%%%$$$$$#############$$$$$%%%&&&''(()**+,--./1234679;=?BEHGECA?><;987654322100/.--,,+++******)))))))))))*****+++,,--../.--,++**))((((''''&&&&&&&&&&&&&&'''''((())**++,--./012345689;=?>;964310.-,+*)(''&%%$$##\"\"\"!!!! \037\037\037 !!!!\"\"\"##$$%%&''((''&&%%%$$$$#######\"\"\"\"\"#######$$$$%%%&&''(()**+,-./0124578:<>ACFECA@><;:8765432110//..,,+++***))))))(((((((())))))***+++,,--...-,,+***))((('''''&&&&&&&&&&&&'''''((()))**+,,-../01234578:;=?>;975310/-,+*)(''&%%$$###\"\"!!!!! !!!!\"\"\"##$$%%&'((''&&%%$$$#####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"#####$$$%%&&&'(()**+,-./0134679;=@BEDB@>=;:8765432100/..--++***))))(((((((((((((((((())))**+++,,-..-,,++**)))(((''''''&&&&&&&&''''''((()))**++,,-.//01234678:<=?><975320/.,+*))('&&%%$$##\"\"\"!!!! !!!!\"\"\"##$$$%&&'('&&%%%$$####\"\"\"\"\"\"!!!!!!!!!\"\"\"\"\"\"####$$$%%&&''()**+,-./023568:<?ADCA?=<:9765432100/.--,,***)))((((''''''''''''''''(((()))**++,,----,++***))((((''''''''''''''''''(((()))**++,--./001235679:<>@?<975420/.-,+*)('&&%%$$###\"\"\"!!!!! !!!!\"\"\"\"##$$%%&&''&&%%$$$###\"\"\"\"!!!!!!!!!!!!!!!!!\"\"\"\"####$$%%&&''()**+,-.0124579;>@CA?><:986543210//.--,++*))((((''''&&&&&&&&&&&&&'''''((()))**++,,--,,++**)))((((''''''''''''''''(((()))**++,,-../012345689;<>@?<:86421/.-,+*)(''&%%$$###\"\"\"!!!!!! !!!!!!\"\"\"###$$%%&''&&%%$$###\"\"\"!!!!!! !!!!!!\"\"\"###$$%%&&''()*+,-./013568:<?B@><;986543210/..-,,++*)((('''&&&&&&%%%%%%%%%&&&&&&''''((())**+,,--,++***)))((((''''''''''''''(((()))***++,,-../012345689;=>@?=:864210.-,+*)(('&&%%$$###\"\"\"!!!!!! !!!!!!\"\"\"\"##$$%%&&'&&%$$$##\"\"\"!!!! !!!!\"\"\"###$$%%&''()*+,-./124579;>A?=;:87543210/.--,++**)((''&&&&%%%%%%%%%%%%%%%%%%%&&&&'''(())**++,-,,++**)))(((((('''''''''''((((()))**++,,--.//01234578:;=?A@=:864310.-,+*))('&&%%$$###\"\"\"\"!!!!!!!!! !!!!!!!!\"\"\"\"###$$%%&&&&%$$##\"\"\"!!!! \037\037\037\037\037\037\037\037\037\037\037\037\037 !!!\"\"\"##$$%%&''()*+,-.013468:=?=<:87643210/.--,++*))(''&&&%%%%$$$$$$$$$$$$$$$$$%%%%&&&'''(())*++,,,++***)))((((((''''''''(((((()))***++,,-../011235678:<=?A@=;865310/.,+**)(''&%%$$$###\"\"\"\"!!!!!!!!!!!!!!!!!\"\"\"\"###$$$%%&&&%$$##\"\"!!! \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037 !!!\"\"##$$%%&'(()*+,./023579<><:97643210/.-,,+**))((&&&%%%$$$$$##############$$$$$%%%&&'''(()**+,,,++***)))(((((((((((((((((())))**++,,--../012345679:<>?A@=;975320/.-,+*)(('&&%%$$###\"\"\"\"\"!!!!!!!!!!!!!!!\"\"\"\"\"###$$%%&&&%$$##\"\"!!! \037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037 !!\"\"\"#$$%%&'())*,-./12468;=;98653210/.-,++*))((''%%%$$$$######\"\"\"\"\"\"\"\"\"#######$$$%%%&&''(()**+,,++***))))(((((((((((((((())))***++,,--.//012345689;<>@BA>;975321/.-,+*)(('&&%%$$$###\"\"\"\"\"!!!!!!!!!!!!!\"\"\"\"\"###$$$%%&&%$$#\"\"!!! \037\037\037\037\036\036\036\036\036\036\036\035\035\035\035\035\035\035\036\036\036\036\036\036\036\037\037\037\037 !!!\"\"##$%%&'()*+,-/023579<:8654210/.-,+**)((''&&%$$$####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"####$$$%%%&&''())*+,,++***))))(((((((((((((())))***+++,,-../0012345789;<>@BA><975421/.-,+*))(''&&%%$$####\"\"\"\"\"!!!!!!!!!!!\"\"\"\"\"####$$%%&&%$##\"\"!! \037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\037\037\037 !!\"\"##$%%&'()*+,./12468:9754210/.-,+**)(('&&&%$$###\"\"\"\"!!!!!!!!!!!!!!!!!\"\"\"\"\"###$$%%&&''(()*+,+++***)))))(((((((((()))))****++,,--.//012335678:;=>@BA><:864210.-,+**)(''&&%%$$$###\"\"\"\"\"\"\"!!!!!!!\"\"\"\"\"\"\"###$$$%%&%$##\"\"!! \037\037\037\036\036\036\036\035\035\035\035\035\035\035\034\034\034\034\034\034\034\034\034\035\035\035\035\035\035\035\036\036\036\036\037\037\037 !!\"\"##$%%&'()*+-.013579764310/.-,+*))(''&&%%$##\"\"\"\"!!!!! !!!!!!\"\"\"###$$%%&&'(()*+,++****))))))((((((())))))***+++,,--.//012345678:;=?ACB?<:864310/.-,+*)(('&&%%%$$####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"####$$%%%%$##\"\"!! \037\037\036\036\036\036\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\036\036\036\037\037\037 !!\"##$%&&'()+,-/0246864320/.-,+*)(('&&%%$$#\"\"\"!!!! \037\037\037\037\037\037\037 !!!!\"\"\"###$$%&&''()*++++***))))))))))))))))))***+++,,--../0012345679:<=?ACB?=:865320/.-,+*))(''&&%%$$$####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"####$$$%%%$##\"!! \037\037\037\036\036\036\035\035\035\034\034\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037 !!\"##$%&'()*+,./13575320/.-,+*)(('&&%$$$##\"!!! \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037 !!!!\"\"##$$%%&''()*+++****))))))))))))))))****+++,,--.//0112345689:<>?ACB?=;875320/.-,+*))(''&&%%%$$$####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"#####$$$%%$##\"!! \037\037\036\036\036\035\035\035\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\035\035\035\036\036\036\037\037 !!\"##$%&'()*+-.0245421/.-,+*)(''&%%$$##\"\"! \037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037 !!!\"\"##$$%&&'()*+++*****)))))))))))))****+++,,--..//0123456789;<>@BDC@=;975321/.-,+**)((''&&%%$$$#####\"\"\"\"\"\"\"\"\"\"\"\"\"#####$$$%%$$#\"!! \037\037\036\036\035\035\035\034\034\034\034\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\033\034\034\034\034\035\035\035\036\036\036\037\037 !!\"##$%&'()+,./134310.-,+*)('&&%$$##\"\"!! \037\037\037\037\036\036\036\036\036\036\036\035\035\035\035\035\035\035\035\035\036\036\036\036\036\036\036\037\037\037\037 !!\"\"##$$%&&'()*+++*****))))))))))*****+++,,,--../0012345678:;=>@BDC@=;9754210/-,,+*)((''&&%%%$$$#####\"\"\"\"\"\"\"\"\"\"\"#####$$$$%%$#\"!! \037\037\036\036\036\035\035\034\034\034\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\034\034\035\035\035\036\036\037\037 !\"##$%&'(*+-.02310.-,+*)('&&%$$##\"\"!! \037\037\037\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\037\037\037 !!\"\"##$%&&'()*+++******))))))******++++,,--..//0112345679:;=?@BDC@>;9764310/.-,+*))(''&&%%%$$$$######\"\"\"\"\"\"\"######$$$$%%$#\"!! \037\037\036\036\035\035\035\034\034\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\032\033\033\033\033\034\034\034\035\035\036\036\037\037 !\"##$%&()*,-/120/-,+*)('&%%$##\"\"!! \036\036\036\036\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\036\036\036\037\037\037 !!\"##$%%&'()*+++*****************+++,,,--..//0122345689:<=?ACEDA><:864310/.-,+**)((''&&%%%$$$###################$$$%%$#\"!! \037\037\036\036\035\035\034\034\034\033\033\033\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\033\033\033\033\034\034\035\035\035\036\037\037 !\"#$%&'()+,.01/.,+*)('&%%$##\"!! \037\037\036\035\035\035\035\034\034\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037 !!\"\"#$%%&'()*+++***************+++,,,---.//00123456789:<>?ACEDA><:865320/.-,++*)((''&&%%%$$$$#################$$$$%$#\"!! \037\037\036\036\035\035\034\034\033\033\033\032\032\032\032\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\031\032\032\032\033\033\033\034\034\034\035\035\036\036\037 !\"#$%&'(*+-//.-+*)('&%$$#\"\"!! \037\037\036\036\035\035\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\035\035\035\036\036\037\037\037 !\"\"#$$%&'()++++************+++++,,,--..//01123456789;<>@ACEDA?<:865321/.-,,+*))(''&&&%%%$$$$###############$$$$%$#\"\"! \037\037\036\035\035\034\034\033\033\033\032\032\032\031\031\031\031\031\030\030\030\030\030\030\030\030\030\027\027\027\027\027\027\030\030\030\030\030\030\030\030\030\031\031\031\031\032\032\032\033\033\033\034\034\035\035\036\036\037 !\"#$%&')*,..-+*)('&%$##\"!! \037\037\036\036\036\035\034\034\034\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\034\034\034\035\035\035\036\036\037\037 !!\"#$$%&'(*++++**********+++++,,,---../00122345678:;=>@BDFDB?=:8754210/.-,+*))((''&&%%%$$$$$#############$$$$$%$#\"! \037\037\036\035\035\034\034\033\033\032\032\032\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\031\032\032\032\033\033\034\034\035\035\036\036\037 !\"#$%'()+--,*)('&%$##\"!! \037\037\036\036\036\035\035\035\034\033\033\033\033\032\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\032\032\033\033\033\033\034\034\034\035\035\035\036\036\037\037 !!\"#$$%&')*+++++******++++++,,,,--..//00123345679:;=>@BDFEB?=;9754210/.-,+**)((''&&&%%%$$$$$$##########$$$$$%$#\"! \037\036\036\035\035\034\034\033\033\032\032\031\031\031\031\030\030\030\030\027\027\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\032\032\032\033\033\034\034\035\036\036\037 !\"#$&'(*,,+)('&%$#\"\"! \037\037\036\036\035\035\034\034\034\033\033\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\033\033\033\034\034\034\035\035\036\036\037\037 !\"#$$%'()*+++++++++++++++,,,,---..//01123456789:<=?@BDGEB@=;9764310/.-,++*))((''&&%%%%$$$$$$#######$$$$$$%$#\"! \037\036\036\035\035\034\033\033\032\032\032\031\031\031\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\030\030\030\030\031\031\031\032\032\033\033\034\034\035\036\036\037 !\"\"$%&')++)('&%$#\"\"! \037\037\036\036\035\035\035\034\034\033\033\032\032\032\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\031\032\032\032\033\033\033\034\034\034\035\035\036\036\037 !\"#$$&'()++++++++++++++,,,,---..//001223456789;<=?ACEGEC@=;9764320/.-,,+*))((''&&&%%%%$$$$$$$$$$$$$$$$$$$#\"! \037\036\036\035\034\034\033\033\032\032\031\031\031\030\030\030\027\027\027\027\027\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\026\026\027\027\027\027\030\030\030\030\031\031\032\032\033\033\034\034\035\035\036\037 !\"#$%&(**('&%$#\"!! \037\037\036\036\035\035\034\034\033\033\033\032\031\031\031\031\030\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\030\030\031\031\031\031\032\032\032\032\033\033\034\034\035\035\036\036\037\037 !\"#$%&'(*++++++++++++,,,,,---..//001233456789;<>?ACEGFC@><:865321/.--,+**)(('''&&%%%%$$$$$$$$$$$$$$$$$%#\"! \037\037\036\035\034\034\033\033\032\032\031\031\030\030\030\027\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\027\027\027\030\030\030\031\031\031\032\032\033\033\034\035\035\036\037 !\"#$&'))'&%$#\"! \037\036\036\035\035\034\034\033\033\033\032\032\032\031\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\031\032\032\032\033\033\034\034\035\035\036\037\037 !\"#$%&'(*++++++++++,,,,,---..//001123445679:;<>@ACEHFC@><:8653210/.-,+**))((''&&&%%%%$$$$$$$$$$$$$$$%$#! \037\037\036\035\034\034\033\032\032\031\031\031\030\030\027\027\027\027\026\026\026\026\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\025\025\026\026\026\026\027\027\027\030\030\030\031\031\032\032\033\033\034\035\035\036\037 !\"#%&('&%$#\"! \037\036\036\035\034\034\033\033\033\032\032\032\031\031\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\030\030\030\030\031\031\031\032\032\033\033\033\034\035\035\036\036\037 !\"#$%&')*,,+++++,,,,,,---...//001223456789:;=>@BDFHFCA><:8754210/.-,++*))(('''&&&%%%%$$$$$$$$$$$$$%$#\"! \037\036\035\034\034\033\032\032\031\031\030\030\030\027\027\027\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\026\026\026\026\027\027\027\030\030\031\031\032\032\033\033\034\035\035\036\037 !\"$%&&%$#\"! \037\037\036\035\035\034\034\033\033\032\032\031\031\031\031\030\027\027\027\027\026\026\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\026\026\027\027\027\027\027\030\030\030\031\031\031\032\032\033\033\034\034\035\036\036\037 !\"#$%&()+,,,,,,,,,,,----..///011233456789:<=?@BDFHGDA?<:9754210/.-,,+**)(((''&&&%%%%%%$$$$$$$$$%%%#\"! \037\036\035\034\034\033\032\032\031\031\030\030\027\027\027\026\026\026\025\025\025\025\024\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\024\025\025\025\025\025\026\026\026\027\027\027\030\030\031\031\032\033\033\034\035\035\036\037 !#$%%$#\"! \037\036\036\035\034\034\033\033\032\032\032\031\031\030\030\030\030\027\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\027\027\027\027\030\030\030\031\031\031\032\032\033\034\034\035\035\036\037 !\"#$%'(*,,,,,,,,,,----...//0011234456789;<=?@BDFIGDA?=;9754310/.--,+**))(('''&&&%%%%%%%$$$$$%%%%$\"! \037\036\035\034\033\033\032\032\031\030\030\027\027\027\026\026\026\025\025\025\025\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\025\025\025\025\026\026\026\027\027\030\030\031\031\032\032\033\034\035\036\036\037!\"#$$#\"! \037\036\036\035\034\034\033\033\032\032\031\031\030\030\030\027\027\027\026\026\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\025\026\026\026\026\027\027\027\030\030\030\031\031\032\032\033\033\034\035\035\036\037 !\"#$&')*,,,,,,,,----...///001223455678:;<>?ACEGIGDB?=;97643210/.-,++*))(('''&&&&%%%%%%%%%%%%%%$#! \037\036\035\034\033\033\032\031\031\030\030\027\027\026\026\026\025\025\025\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\023\023\024\024\024\024\025\025\025\025\026\026\027\027\030\030\031\031\032\032\033\034\035\036\037 !\"##\"! \037\036\035\035\034\033\033\032\032\031\031\030\030\030\027\027\027\026\026\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\026\026\026\027\027\027\030\030\030\031\031\032\033\033\034\034\035\036\037 !\"#$&')+,,,,,------...//0011233456789:;<>?ACEGIHEB?=;98653210/.-,++**))(('''&&&&%%%%%%%%%%%%%#\" \037\036\035\034\033\033\032\031\031\030\030\027\027\026\026\025\025\025\024\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\024\024\024\024\025\025\025\026\026\026\027\027\030\030\031\032\032\033\034\035\036\037 !\"\"! \037\036\035\035\034\033\033\032\031\031\030\030\030\027\027\027\026\026\026\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\025\025\025\025\026\026\026\027\027\027\030\030\031\031\032\032\033\034\034\035\036\037 !\"#%&(*,,,-------...///0011233456789:;=>@ACEGJHEB@>;:8653210/.-,,+**))(('''&&&&&%%%%%%%%%%%$\"! \036\035\034\034\033\032\031\031\030\027\027\026\026\026\025\025\024\024\024\024\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\022\023\023\023\023\023\024\024\024\025\025\025\026\026\027\027\030\030\031\032\032\033\034\035\036\037 !! \037\036\035\034\034\033\032\032\031\031\030\030\027\027\027\026\026\026\025\025\025\024\024\024\023\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\023\023\024\024\024\024\024\025\025\025\025\026\026\027\027\027\030\030\031\031\032\033\033\034\035\036\037 !\"$%')+--------....//00112234456789:<=>@BDEHJHEC@><:8654210/.--,++*))((('''&&&&&%%%%%%%%%$#! \037\036\034\034\033\032\031\030\030\027\027\026\026\025\025\025\024\024\024\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\023\024\024\024\025\025\026\026\026\027\030\030\031\031\032\033\034\035\036\037 \037\036\035\034\033\033\032\031\031\030\030\027\027\027\026\026\025\025\025\025\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\024\024\024\024\025\025\025\026\026\027\027\030\030\031\031\032\033\033\034\035\036\037 !#$&')+------....///00112334566789;<=?@BDFHJIFC@><:8754310/..-,++**))((''''&&&&&%%%%%%%%#\" \037\036\035\034\033\032\031\030\030\027\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\024\024\024\025\025\026\026\027\027\030\031\031\032\033\034\035\036\037\037\036\035\034\033\033\032\031\031\030\030\027\027\026\026\025\025\025\024\024\024\024\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\022\023\023\023\023\024\024\024\024\025\025\025\026\026\027\027\030\030\031\032\032\033\034\035\036\037 \"#$&(*,----....///00112233456789:;<>?ABDFHHFDCA><:97643210/.-,,+**))((('''&&&&&&&%%%%%$\"!\037\036\035\034\033\032\031\030\030\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\022\022\022\022\023\023\023\024\024\025\025\026\026\027\027\030\031\031\032\033\034\035\036\036\035\034\033\032\032\031\030\030\027\027\026\026\025\025\025\024\024\024\023\023\023\023\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\020\020\020\020\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\023\024\024\024\025\025\026\026\027\027\030\030\031\032\032\033\034\035\036\037 \"#%')+--.....////00112234456789:;<>?ACDFGECB@?=<;97643210/.-,,++*)))((''''&&&&&&&&&&%#! \036\035\034\033\032\031\030\030\027\026\026\025\025\024\024\023\023\023\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\020\020\021\021\021\021\022\022\022\022\023\023\024\024\024\025\025\026\027\027\030\031\031\032\033\034\035\035\034\033\032\031\031\030\030\027\026\026\026\025\025\024\024\024\023\023\023\023\022\022\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\022\022\022\022\022\023\023\023\024\024\024\025\025\026\026\027\027\030\031\031\032\033\034\035\036\037!\"$%'*,......///001112334556789:;=>@ACEGDBA?=<;:987653210/.--,++**))(((''''&&&&&&&&%#\" \036\035\034\033\032\031\030\027\027\026\026\025\024\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\021\022\022\022\022\023\023\024\024\025\025\026\026\027\030\031\031\032\033\034\034\033\032\031\031\030\027\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\021\021\020\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\022\023\023\023\024\024\024\025\025\026\027\027\030\031\031\032\033\034\035\036 !\"$&(+-....///0001122334567789;<=>@ACEDB@><;:97665433210/..-,,+**)))(('''''&&&&&&&$\" \037\035\034\033\032\031\030\027\027\026\025\025\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\022\022\022\023\023\023\024\024\025\026\026\027\030\031\031\032\033\033\032\031\030\030\027\026\026\025\025\024\024\024\023\023\023\022\022\022\021\021\021\021\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\021\021\021\021\022\022\022\023\023\023\024\024\025\025\026\026\027\030\030\031\032\033\034\035\036 !#%'),...////001112234456789:;<=?@BCCA?=;:976543321100///.-,,++**))((('''''&&&&&%#!\037\036\034\033\032\031\030\027\027\026\025\025\024\024\023\023\022\022\021\021\021\020\020\020\020\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\020\020\020\020\021\021\021\022\022\022\023\023\024\024\025\025\026\027\030\031\031\032\032\031\030\027\027\026\026\025\025\024\024\023\023\022\022\022\022\021\021\021\021\020\020\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\022\022\022\023\023\023\024\024\025\025\026\027\027\030\031\032\033\034\035\037 \"#%(*-.////0001122334556789:;<>?@BB@><:9765432110//..---,,,,++**)))((('''''&&&&$\" \036\035\033\032\031\030\027\026\026\025\024\024\023\023\022\022\022\021\021\020\020\020\020\017\017\017\017\017\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\016\017\017\017\017\017\020\020\020\021\021\021\022\022\023\023\023\024\025\025\026\027\030\031\032\031\030\027\027\026\025\025\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\020\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\020\020\020\020\021\021\021\021\022\022\023\023\024\024\025\025\026\027\027\030\031\032\033\034\035\037 \"$&),////00011122344566789:;=>?AB?=;986543210/..--,,++++*******)))((('''''''&%\" \037\035\034\032\031\030\027\026\026\025\024\024\023\023\022\022\021\021\020\020\020\020\017\017\017\017\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\017\017\017\017\020\020\020\021\021\021\022\022\023\023\024\024\025\026\027\030\031\030\027\026\026\025\024\024\023\023\022\022\022\021\021\021\020\020\020\020\017\017\017\017\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\017\017\017\017\017\020\020\020\020\021\021\021\022\022\023\023\024\024\025\026\026\027\030\031\032\033\034\036\037!#%'*-//000011223344567789:<=>@A><:8754310//.-,,++***)))((((((((((((((''''''&#!\037\035\034\033\031\030\027\026\026\025\024\023\023\022\022\021\021\021\020\020\020\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\r\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\023\023\024\024\025\026\027\030\027\026\025\025\024\024\023\023\022\022\021\021\021\020\020\020\020\017\017\017\017\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\022\023\024\024\025\025\026\027\030\031\032\033\034\036 !#&(+//00011122334556789:;<=>@>;9764310/.-,,+**))(((''''&&&&&&&&&&&''''''''$\" \036\034\033\031\030\027\026\025\025\024\023\023\022\022\021\021\020\020\020\017\017\017\016\016\016\016\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\016\016\016\016\017\017\017\020\020\020\021\021\022\022\023\023\024\025\026\027\026\025\024\024\023\023\022\022\021\021\021\020\020\020\017\017\017\017\016\016\016\016\016\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\023\023\024\025\025\026\027\030\031\032\033\035\036 \"$'*-000011223344566789:;<=?=:864310/.-,+**)(('''&&&%%%%%$$$$$$$%%%%%%&&&%# \036\035\033\032\030\027\026\025\025\024\023\022\022\021\021\020\020\020\017\017\017\016\016\016\r\r\r\r\r\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\016\017\017\017\020\020\021\021\022\022\023\023\024\025\026\025\024\024\023\022\022\021\021\021\020\020\020\017\017\017\016\016\016\016\016\r\r\r\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\016\016\016\016\017\017\017\020\020\020\021\021\022\022\023\024\024\025\026\027\030\031\032\033\035\037 #%(+/00111223344567789:;<><:75320/.-,+*)(('&&%%%$$$#################$$$%$!\037\035\033\032\031\027\026\025\024\024\023\022\022\021\021\020\020\017\017\017\016\016\016\r\r\r\r\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\r\r\r\r\r\016\016\016\017\017\017\020\020\021\021\022\022\023\024\025\024\023\023\022\022\021\021\020\020\017\017\017\016\016\016\016\r\r\r\r\r\r\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\017\017\017\020\020\020\021\022\022\023\023\024\025\026\027\030\031\032\034\035\037!#&)-01112223345567889:;=<96421/.,+*)(('&&%%$$##\"\"\"\"!!!!!!!!!!!!!!!\"\"\"\"#\" \036\034\032\031\027\026\025\024\023\023\022\021\021\020\020\017\017\017\016\016\016\r\r\r\f\f\f\f\f\f\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\r\016\016\016\017\017\017\020\020\021\022\022\023\024\023\022\022\021\021\020\020\017\017\017\016\016\016\016\r\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\r\016\016\016\016\017\017\020\020\021\021\022\022\023\024\025\026\027\030\031\032\034\036 \"$'+/111223344566789:;<;86310.,+*)('&&%$$##\"\"!!! \037\037\037\037\037\037\037\037\037\037\037\037 ! \036\034\032\031\027\026\025\024\023\023\022\021\021\020\020\017\017\016\016\016\r\r\r\f\f\f\f\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\f\f\f\f\f\r\r\r\016\016\016\017\017\020\020\021\021\022\023\022\021\021\020\020\017\017\017\016\016\016\r\r\r\r\f\f\f\f\f\f\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\f\f\f\f\r\r\r\r\016\016\016\017\017\020\020\021\021\022\023\024\024\025\027\030\031\032\034\036 #&)-112223344566789:;:7520.-+*)('&%$##\"\"!! \037\037\037\036\036\036\036\036\036\036\035\035\035\035\035\035\036\036\036\036\036\036\036\037\037\037\035\033\031\030\026\025\024\023\022\022\021\020\020\017\017\016\016\016\r\r\r\f\f\f\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\f\r\r\r\016\016\016\017\017\020\020\021\022\021\020\020\017\017\017\016\016\016\r\r\r\f\f\f\f\f\013\013\013\013\013\013\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\f\f\f\f\r\r\r\016\016\016\017\017\020\021\021\022\023\023\024\025\026\030\031\033\035\037!$'+022233445567789::741/-,*)'&%$$#\"!! \037\037\036\036\036\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\033\031\030\026\025\024\023\022\021\021\020\017\017\016\016\016\r\r\f\f\f\f\013\013\013\013\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\r\016\016\017\017\020\020\021\020\020\017\017\016\016\r\r\r\f\f\f\f\013\013\013\013\013\013\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\r\016\016\017\017\020\020\021\022\022\023\024\025\026\030\031\033\035\037\"%)-222334456678999630.,*)'&%$#\"!! \037\037\036\036\035\035\035\034\034\034\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\032\030\026\025\024\023\022\021\020\020\017\017\016\016\r\r\f\f\f\013\013\013\013\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\f\r\r\r\016\016\017\017\020\017\017\016\016\r\r\r\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\f\f\r\r\016\016\017\017\020\021\021\022\023\024\025\026\030\031\033\036 #'+0233445566789952/-+)'&%$#\"! \037\037\036\035\035\034\034\034\033\033\033\032\032\032\032\031\031\031\031\031\031\031\031\030\030\030\030\031\031\031\031\031\031\031\031\031\032\032\030\027\025\024\023\022\021\020\020\017\016\016\r\r\f\f\f\013\013\013\013\n\n\n\n\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\r\r\r\016\016\017\016\016\r\r\r\f\f\f\013\013\013\013\n\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\n\n\n\n\013\013\013\013\f\f\f\r\r\016\016\017\017\020\021\022\023\024\025\026\030\032\034\036!%).33344556778841.,*(&%#\"! \037\037\036\035\035\034\033\033\033\032\032\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\027\025\024\023\022\021\020\017\017\016\r\r\f\f\f\013\013\013\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\r\r\016\016\r\r\f\f\f\013\013\013\013\n\n\n\n\t\t\t\t\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\n\013\013\013\f\f\f\r\r\016\016\017\020\021\022\023\024\025\026\030\032\034\037\"&+1344456678830-*(&%#\"! \037\036\035\034\034\033\033\032\032\031\031\030\030\030\027\027\027\027\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\026\025\024\023\021\021\020\017\016\016\r\r\f\f\013\013\013\n\n\n\t\t\t\t\t\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\013\013\013\f\f\r\r\f\f\f\013\013\013\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\t\t\t\t\n\n\n\n\013\013\013\f\f\r\r\016\017\017\020\021\022\024\025\026\030\032\035 $)/3445566772/,)'%#\" \037\036\035\034\034\033\032\032\031\031\030\030\027\027\027\026\026\026\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\024\022\021\020\017\017\016\r\r\f\f\013\013\n\n\n\n\t\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\t\t\t\t\n\n\n\013\013\013\f\f\f\013\013\n\n\n\n\t\t\t\t\b\b\b\b\b\b\b\b\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\t\t\t\t\n\n\n\013\013\013\f\f\r\016\016\017\020\021\022\023\025\027\031\033\036!&,344556771-*(%#\" \037\036\035\034\033\032\031\031\030\030\027\027\026\026\025\025\025\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\022\021\020\017\016\r\r\f\f\013\013\n\n\n\t\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\b\b\b\b\b\t\t\t\t\n\n\n\013\013\013\n\n\n\t\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\b\b\b\b\t\t\t\t\n\n\n\013\013\f\r\r\016\017\020\021\022\023\025\027\031\034\037#)04556660,)&$\" \037\035\034\033\032\031\031\030\027\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\020\017\016\r\f\f\013\013\n\n\n\t\t\t\b\b\b\b\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\b\b\b\b\t\t\t\n\n\n\n\t\t\t\t\b\b\b\b\007\007\007\007\007\007\007\007\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\b\t\t\t\n\n\n\013\013\f\r\r\016\017\020\022\023\025\027\031\035!&,45566/+'$\" \036\035\034\033\031\031\030\027\026\026\025\025\024\024\023\023\022\022\022\022\021\021\021\021\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\017\016\r\r\f\013\013\n\n\t\t\t\b\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\b\t\t\t\t\t\b\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\t\t\t\n\n\013\013\f\r\016\017\020\021\023\025\027\032\036\")1565.)%# \036\035\033\032\031\030\027\026\025\025\024\023\023\022\022\022\021\021\021\020\020\020\020\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\r\f\013\013\n\n\t\t\b\b\b\b\007\007\007\007\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\007\007\007\007\b\b\b\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\007\007\007\007\b\b\b\t\t\n\n\013\f\f\r\016\020\021\023\025\030\033\037%-54,'# \036\034\033\031\030\027\026\025\024\024\023\022\022\021\021\020\020\020\017\017\017\017\016\016\016\016\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\f\013\n\n\t\t\b\b\b\007\007\007\007\006\006\006\006\006\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\006\006\006\006\006\007\007\007\007\007\007\007\007\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\006\006\006\006\007\007\007\007\b\b\t\t\n\n\013\f\r\016\017\021\023\025\030\034!)3*%!\036\034\032\031\027\026\025\024\023\022\022\021\021\020\020\017\017\016\016\016\016\r\r\r\r\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\n\n\t\t\b\b\007\007\007\006\006\006\006\006\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\006\006\006\006\007\007\007\b\b\t\n\n\013\f\r\017\020\022\025\031\036%(\"\037\034\032\030\026\025\024\023\022\021\021\020\017\017\016\016\r\r\r\f\f\f\f\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\t\b\b\007\007\007\006\006\006\006\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\006\006\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\005\005\005\005\005\006\006\006\007\007\b\b\t\t\n\013\f\016\020\022\026\032 \037\034\031\027\025\024\023\022\021\020\017\016\016\r\r\f\f\f\013\013\013\013\n\n\n\n\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\006\006\006\005\005\005\005\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\005\005\005\005\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\005\005\005\005\006\006\007\007\b\b\t\n\f\r\017\022\026\034\030\026\024\022\021\020\017\016\016\r\f\f\013\013\013\n\n\n\t\t\t\t\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\006\006\005\005\005\005\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\004\004\004\004\005\005\005\006\006\007\007\b\t\013\f\017\022\024\022\021\017\016\r\f\f\013\013\n\n\t\t\t\b\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\004\004\004\005\005\006\007\b\t\013\016\016\r\f\013\n\n\t\b\b\b\007\007\007\006\006\006\006\006\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\003\003\003\003\004\004\005\006\007\t\t\b\007\007\006\006\006\005\005\005\005\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\002\002\002\003\003\004\004\004\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000").toString()).getBytes(StandardCharsets.ISO_8859_1); -913 -914 /** -915 * Given a 1D int index between 0 and 65535 (both inclusive), this treats the 1D index as two parts (lightness and -916 * hue angle, both from 0 to 255) and gets the distance from grayscale to the edge of the gamut at that lightness -917 * and hue. The index can be constructed from a lightness value {@code L} from 0 to 255, and a hue value {@code H} -918 * from 0 to 255 with: {@code (L << 8 | H)} or the simpler equivalent {@code (L * 256 + H)}. These assume L and H -919 * have been limited to the 0 to 255 range already. This does not bounds-check index. Because hue is not typically -920 * measured between 0 and 255, getting that value is a bit different; you can use -921 * {@link MathTools#atan2_(float, float)} (with an Oklab color's B for y, then its A for x) and multiply it by 256 -922 * to get H. -923 * <br> -924 * The distance this returns is a byte between 0 and 82 (both inclusive), as the Euclidean distance from the center -925 * grayscale value at the lightness in the index, to the edge of the gamut at the same lightness, along the hue in -926 * the index. This is measured in a space from -1 to 1 for both A and B, with the 0 in the center meaning grayscale, -927 * and multiplied by 256 to get a meaningful byte value. To return to the A and B values Oklab uses here, you would -928 * need to use some trigonometry on the hue (if it's in the 0 to 1 range, you can call -929 * {@link MathTools#cos_(float)} on the hue to almost get A, and {@link MathTools#sin_(float)} to almost get B), -930 * then multiply each of those by the distance, divide each by 256.0, and add 0.5. -931 * <br> -932 * Only intended for the narrow cases where external code needs read-only access to the internal Oklab gamut data. -933 * The gamut data is quite large (the Oklab ColorTools file is 236 KB at the time of writing, while the IPT_HQ -934 * ColorTools file is just 56 KB, with the main difference being the sizable exact gamut), so it's better to have -935 * direct read access to it without being able to accidentally rewrite it. -936 * @param index must be between 0 and 65535; the upper 8 bits are lightness and the lower 8 are hue angle. -937 * @return a byte (always between 0 and 82, inclusive) representing the Euclidean distance between a grayscale value and the most saturated value possible, using the above measurements -938 */ -939 public static byte getRawGamutValue(int index){ -940 return GAMUT_DATA[index]; -941 } -942 -943 /** -944 * Returns true if the given packed float color, as Oklab, is valid to convert losslessly back to RGBA. -945 * @param packed a packed float color as Oklab -946 * @return true if the given packed float color can be converted back and forth to RGBA -947 */ -948 public static boolean inGamut(final float packed) -949 { -950 final int decoded = BitConversion.floatToRawIntBits(packed); -951 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -952 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -953 final int idx = (decoded & 0xff) << 8 | (int)(256f * MathTools.atan2_(B, A)); -954 return GAMUT_DATA[idx] * 0x1p-8f >= (float) Math.sqrt(A * A + B * B); -955 } -956 -957 /** -958 * Returns true if the given Oklab values are valid to convert losslessly back to RGBA. -959 * @param L lightness channel, as a float from 0 to 1 -960 * @param A green-to-red chromatic channel, as a float from 0 to 1 -961 * @param B blue-to-yellow chromatic channel, as a float from 0 to 1 -962 * @return true if the given Oklab channels can be converted back and forth to RGBA -963 */ -964 public static boolean inGamut(float L, float A, float B) -965 { -966 A = (A - 0.5f); -967 B = (B - 0.5f); -968 final int idx = ((int)(L * 255.999f) << 8) | (int)(256f * MathTools.atan2_(B, A)); -969 return GAMUT_DATA[idx] * 0x1p-8f >= (float) Math.sqrt(A * A + B * B); -970 } -971 -972 /** -973 * Gets the color with the same L as the Oklab color stored in the given packed float, but the furthest A -974 * B from gray possible for that lightness while keeping the same hue as the given color. This is very -975 * similar to calling {@link #enrich(float, float)} with a very large {@code change} value. -976 * @param packed a packed float color in Oklab format; does not need to be in-gamut -977 * @return the color that is as far from grayscale as this can get while keeping the L and hue of packed -978 * @see #limitToGamut(float) You can use limitToGamut() if you only want max saturation for out-of-gamut colors. +860 * Given a packed float Oklab color {@code mainColor} and another Oklab color that it should be made to contrast +861 * with, gets a packed float Oklab color with L that should be quite different from {@code contrastingColor}'s L, +862 * but the same chromatic channels and opacity (A and B are likely to be clamped if the result gets close to white +863 * or black). This allows most of the colors this method produces to contrast well as a foreground when displayed on +864 * a background of {@code contrastingColor}, or vice versa. +865 * <br> +866 * This is similar to {@link #inverseLightness(float, float)}, but is considerably simpler, and this method will +867 * change the lightness of mainColor when the two given colors have close lightness but distant chroma. Because it +868 * averages the original L of mainColor with the modified one, this tends to not produce harsh color changes. +869 * @param mainColor a packed Oklab float color; this is the color that will be adjusted +870 * @param contrastingColor a packed Oklab float color; the adjusted mainColor will contrast with the L of this +871 * @return a different packed Oklab float color, based on mainColor but typically with different lightness +872 */ +873 public static float differentiateLightness(final float mainColor, final float contrastingColor) +874 { +875 final int main = BitConversion.floatToRawIntBits(mainColor), contrast = BitConversion.floatToRawIntBits(contrastingColor); +876 return limitToGamut(BitConversion.intBitsToFloat((main & 0xFEFFFF00) | (contrast + 128 & 0xFF) + (main & 0xFF) >>> 1)); +877 } +878 +879 /** +880 * Pretty simple; adds 0.5 to the given color's L and wraps it around if it would go above 1.0, then averages that +881 * with the original L. This means light colors become darker, and dark colors become lighter, with almost all +882 * results in the middle-range of possible lightness. +883 * @param mainColor a packed Oklab float color +884 * @return a different packed Oklab float color, with its L channel changed and limited to the correct gamut +885 */ +886 public static float offsetLightness(final float mainColor) { +887 final int oklab = BitConversion.floatToRawIntBits(mainColor); +888 return limitToGamut(BitConversion.intBitsToFloat((oklab & 0xFEFFFF00) | (oklab + 128 & 0xFF) + (oklab & 0xFF) >>> 1)); +889 } +890 +891 /** +892 * Makes the additive Oklab color stored in {@code color} cause less of a change when used as a tint, as if it were +893 * mixed with neutral gray. When {@code fraction} is 1.0, this returns color unchanged; when fraction is 0.0, it +894 * returns {@link Palette#GRAY}, and when it is in-between 0.0 and 1.0 it returns something between the two. This is +895 * meant for things like area of effect abilities that make smaller color changes toward their periphery. +896 * @param color a color that should have its tinting effect potentially weakened +897 * @param fraction how much of {@code color} should be kept, from 0.0 to 1.0 +898 * @return an Oklab float color between gray and {@code color} +899 */ +900 public static float lessenChange(final float color, float fraction) { +901 final int e = BitConversion.floatToRawIntBits(color), +902 sL = 0x80, sA = 0x80, sB = 0x80, sAlpha = 0xFE, +903 eL = (e & 0xFF), eA = (e >>> 8) & 0xFF, eB = (e >>> 16) & 0xFF, eAlpha = e >>> 24 & 0xFE; +904 return BitConversion.intBitsToFloat(((int) (sL + fraction * (eL - sL)) & 0xFF) +905 | (((int) (sA + fraction * (eA - sA)) & 0xFF) << 8) +906 | (((int) (sB + fraction * (eB - sB)) & 0xFF) << 16) +907 | (((int) (sAlpha + fraction * (eAlpha - sAlpha)) & 0xFE) << 24)); +908 } +909 +910 /** +911 * Makes a quasi-randomly-edited variant on the given {@code color}, allowing typically a small amount of +912 * {@code variance} (such as 0.05 to 0.25) between the given color and what this can return. The {@code seed} should +913 * be different each time this is called, and can be obtained from a random number generator to make the colors more +914 * random, or can be incremented on each call. If the seed is only incremented or decremented, then this shouldn't +915 * produce two similar colors in a row unless variance is very small. The variance affects the L, A, and B of the +916 * generated color, and each of those channels can go up or down by the given variance as long as the total distance +917 * isn't greater than the variance (this considers A and B extra-wide, going from -1 to 1, while L goes from 0 to 1, +918 * but only internally for measuring distance). +919 * @param color a packed float color, as produced by {@link #oklab(float, float, float, float)} +920 * @param seed a long seed that should be different on each call; should not be 0 +921 * @param variance max amount of difference between the given color and the generated color; always less than 1 +922 * @return a generated packed float color that should be at least somewhat different from {@code color} +923 */ +924 public static float randomEdit(final float color, long seed, final float variance) { +925 final int decoded = BitConversion.floatToRawIntBits(color); +926 final float L = (decoded & 0xff) / 255f; +927 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +928 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +929 final float limit = variance * variance; +930 float dist, x, y, z; +931 for (int j = 0; j < 50; j++) { +932 x = (((seed * 0xD1B54A32D192ED03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance; +933 y = (((seed * 0xABC98388FB8FAC03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance; +934 z = (((seed * 0x8CB92BA72F3D8DD7L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance; +935 seed += 0x9E3779B97F4A7C15L; +936 dist = x * x + y * y + z * z; +937 if(dist <= limit && inGamut(x += L, y = (A + y) * 0.5f + 0.5f, z = (B + z) * 0.5f + 0.5f)) +938 return BitConversion.intBitsToFloat((decoded & 0xFE000000) | ((int)(z * 255.5f) << 16 & 0xFF0000) +939 | ((int)(y * 255.5f) << 8 & 0xFF00) | (int)(x * 255.5f)); +940 } +941 return color; +942 } +943 +944 private static final byte[] GAMUT_DATA = (new StringBuilder().append("\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\001\001\001\001\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\003\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\003\003\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\003\003\003\004\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\004\004\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\003\003\003\003\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\004\004\005\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\004\004\004\005\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\004\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\004\004\004\004\005\006\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\004\004\004\004\004\005\005\006\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\005\005\005\006\007\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\005\005\005\005\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\005\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\005\005\005\006\006\007\n\n\n\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\005\005\005\006\006\007\b\013\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\005\005\005\005\006\006\006\007\b\013\013\013\013\013\013\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\006\005\005\005\005\005\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\005\005\005\005\006\006\006\007\b\t\f\f\f\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\006\006\006\006\006\005\005\005\005\005\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\005\005\005\005\005\006\006\006\007\007\b\t\r\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\007\007\007\007\b\b\b\b\b\b\b\b\b\b\007\007\007\006\006\006\006\006\006\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\006\006\006\007\007\b\b\n\r\r\r\r\r\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\007\006\006\006\006\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\006\006\006\007\007\b\b\t\n\016\016\016\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\007\007\007\006\006\006\006\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\006\006\006\006\007\007\007\b\t\t\013\017\016\016\016\016\016\016\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\007\007\007\007\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\007\007\007\007\007\007\006\006\006\006\006\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\006\006\006\006\007\007\007\b\b\t\n\013\017\017\017\017\017\016\016\016\016\016\016\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\007\007\007\007\007\b\007\007\007\007\006\006\006\006\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\006\006\006\006\006\007\007\007\b\b\t\t\n\f\020\020\020\017\017\017\017\017\017\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\n\n\n\n\n\n\n\n\t\t\t\t\n\n\n\n\n\n\n\n\n\n\t\t\t\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\007\007\007\007\006\006\006\006\006\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\006\006\006\006\006\007\007\007\b\b\b\t\n\013\f\021\021\020\020\020\020\020\017\017\017\017\017\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\b\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\b\b\b\007\007\007\007\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\007\007\007\b\b\b\t\t\n\013\r\021\021\021\021\021\020\020\020\020\020\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\n\n\n\t\t\t\b\b\b\b\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\b\b\b\b\t\b\b\b\007\007\007\007\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\007\007\007\b\b\b\t\t\n\013\f\r\022\022\022\021\021\021\021\021\020\020\020\020\020\020\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\n\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\n\n\n\t\t\t\b\b\b\b\b\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\b\b\b\b\t\t\t\b\b\b\007\007\007\007\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\007\007\007\007\007\b\b\t\t\n\n\013\f\016\023\023\022\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\n\n\n\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\b\b\b\b\b\t\t\t\t\t\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\t\t\n\013\013\f\016\024\023\023\023\023\022\022\022\022\021\021\021\021\021\021\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\f\f\f\f\f\f\f\f\013\013\013\013\f\f\f\f\f\f\f\f\f\f\013\013\n\n\n\t\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\b\b\b\b\b\t\t\t\n\t\t\t\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\t\t\n\n\013\f\r\017\024\024\024\023\023\023\023\022\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\013\013\n\n\n\t\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\b\b\b\b\b\t\t\t\t\n\n\n\t\t\t\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\t\t\n\n\013\013\f\r\017\025\025\024\024\024\024\023\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\f\f\013\013\n\n\n\t\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\t\t\t\t\n\n\n\n\n\t\t\t\b\b\b\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\b\t\t\t\n\n\013\f\r\016\020\026\025\025\025\024\024\024\024\024\023\023\023\023\023\022\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\f\f\013\013\013\n\n\n\t\t\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\t\t\t\t\n\n\n\013\n\n\n\t\t\b\b\b\b\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\b\t\t\t\n\n\013\013\f\r\016\020\026\026\026\025\025\025\025\024\024\024\024\023\023\023\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\f\f\013\013\013\n\n\n\t\t\t\t\t\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\013\013\013\n\n\t\t\t\b\b\b\b\b\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\b\b\b\b\t\t\t\n\n\013\013\f\r\r\017\021\027\027\026\026\026\026\025\025\025\025\024\024\024\024\023\023\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\r\r\r\r\016\016\016\016\016\016\016\016\r\r\r\r\016\016\016\016\016\016\016\016\016\016\r\r\f\f\013\013\013\n\n\n\n\t\t\t\t\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\013\013\013\013\013\n\n\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\b\b\b\b\t\t\t\t\n\n\013\013\f\r\016\017\021\030\027\027\027\026\026\026\026\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\r\r\f\f\013\013\013\n\n\n\n\t\t\t\t\t\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\n\013\013\013\f\013\013\n\n\n\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\b\b\b\b\t\t\t\t\n\n\013\013\f\f\r\016\020\022\030\030\030\027\027\027\027\026\026\026\026\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\022\022\022\022\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\016\r\r\f\f\f\013\013\013\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\f\013\013\n\n\n\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\b\b\b\b\b\t\t\t\n\n\n\013\013\f\r\016\017\020\022\031\031\030\030\030\027\027\027\027\026\026\026\026\025\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\016\016\r\r\f\f\f\013\013\013\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\f\f\f\013\013\n\n\n\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\t\t\t\n\n\n\013\013\f\f\r\016\017\021\023\032\031\031\031\030\030\030\030\027\027\027\027\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\016\016\r\r\f\f\f\013\013\013\n\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\f\r\f\f\013\013\n\n\n\t\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\t\t\t\t\n\n\n\013\013\f\f\r\016\016\020\021\023\032\032\032\031\031\031\030\030\030\030\027\027\027\027\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\017\017\017\020\020\020\020\020\020\020\020\017\017\017\017\020\020\020\020\020\020\020\020\020\020\017\017\016\r\r\r\f\f\f\013\013\013\n\n\n\n\n\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\r\r\r\f\f\013\013\n\n\n\t\t\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\t\t\t\t\n\n\n\013\013\013\f\f\r\016\017\020\021\024\033\033\032\032\032\031\031\031\031\030\030\030\027\027\027\027\027\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\017\017\016\016\r\r\r\f\f\f\013\013\013\n\n\n\n\n\n\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\f\r\r\r\f\f\013\013\013\n\n\n\t\t\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\t\t\t\t\t\n\n\n\013\013\f\f\r\r\016\017\020\022\024\034\033\033\033\032\032\032\031\031\031\031\030\030\030\030\027\027\027\027\027\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\020\020\020\020\020\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\020\017\017\016\016\r\r\f\f\f\f\013\013\013\013\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\013\013\013\013\f\f\f\r\r\016\r\r\f\f\013\013\013\n\n\n\t\t\t\t\t\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\013\013\013\f\r\r\016\017\020\021\022\025\035\034\034\033\033\033\032\032\032\031\031\031\031\030\030\030\030\030\027\027\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\020\020\017\017\016\016\r\r\f\f\f\f\013\013\013\013\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\016\016\016\r\r\f\f\013\013\013\n\n\n\t\t\t\t\t\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\013\013\013\f\f\r\r\016\017\020\021\023\025\035\035\034\034\034\033\033\033\032\032\032\032\031\031\031\031\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\020\017\017\016\016\r\r\r\f\f\f\f\013\013\013\013\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\r\016\016\016\r\r\f\f\013\013\013\n\n\n\n\t\t\t\t\t\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\013\013\013\f\f\r\r\016\016\017\020\022\023\026\036\035\035\035\034\034\034\033\033\033\032\032\032\032\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\021\021\022\022\022\022\022\022\022\022\021\021\021\021\022\022\022\022\022\022\022\022\022\022\021\020\020\017\017\016\016\r\r\r\f\f\f\f\013\013\013\013\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\r\016\016\017\016\016\r\r\f\f\013\013\013\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\r\r\016\017\020\021\022\024\026\037\036\036\035\035\035\034\034\034\033\033\033\032\032\032\032\031\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\021\021\020\020\017\017\016\016\r\r\r\f\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\f\r\r\r\016\016\017\017\017\016\r\r\f\f\f\013\013\013\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\r\r\016\016\017\020\021\022\024\027\037\037\036\036\036\035\035\035\034\034\034\033\033\033\033\032\032\032\032\031\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\022\022\022\022\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\022\021\021\020\017\017\016\016\016\r\r\r\f\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\f\r\r\r\016\016\016\017\017\017\016\016\r\r\f\f\f\013\013\013\n\n\n\n\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\f\r\r\016\017\020\020\021\023\025\027 \037\037\036\036\036\035\035\035\034\034\034\033\033\033\033\032\032\032\032\031\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\026\026\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\022\022\021\020\020\017\017\016\016\016\r\r\r\f\f\f\f\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\f\f\f\f\r\r\r\016\016\016\017\017\020\017\017\016\016\r\r\f\f\013\013\013\013\n\n\n\n\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\f\r\r\016\016\017\020\021\022\023\025\030! \037\037\037\036\036\036\035\035\035\034\034\034\033\033\033\033\032\032\032\032\032\031\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\023\023\022\021\021\020\020\017\017\016\016\016\r\r\r\f\f\f\f\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\f\f\f\f\r\r\r\r\016\016\017\017\017\020\020\017\016\016\r\r\f\f\f\013\013\013\013\n\n\n\n\n\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\r\r\r\016\017\017\020\021\022\024\025\030!! \037\037\037\036\036\035\035\035\035\034\034\034\034\033\033\033\033\032\032\032\032\032\031\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\023\024\024\024\024\024\024\024\024\023\023\023\023\024\024\024\024\024\024\024\024\024\024\023\022\022\021\020\020\017\017\017\016\016\r\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\f\f\f\f\r\r\r\r\016\016\016\017\017\020\020\020\017\017\016\016\r\r\f\f\f\013\013\013\013\n\n\n\n\n\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\f\r\r\016\016\017\020\021\021\023\024\026\031\"\"!! \037\037\036\036\036\035\035\035\035\034\034\034\034\033\033\033\033\032\032\032\032\032\031\031\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\023\023\022\021\021\020\020\017\017\016\016\016\r\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\r\016\016\016\017\017\020\020\021\020\020\017\016\016\r\r\r\f\f\f\013\013\013\013\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\f\r\r\016\016\017\017\020\021\022\023\024\026\031#\"\"!!! \037\037\037\036\036\036\035\035\035\035\034\034\034\034\033\033\033\033\033\032\032\032\032\032\031\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\024\024\024\024\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\024\023\022\022\021\021\020\020\017\017\016\016\016\r\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\r\016\016\016\017\017\020\020\020\021\021\020\017\017\016\016\r\r\f\f\f\013\013\013\013\013\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\f\r\r\r\016\016\017\020\020\021\022\023\025\027\032##\"\"\"!! \037\037\037\036\036\036\036\035\035\035\034\034\034\034\034\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\024\023\023\022\021\021\020\020\017\017\017\016\016\016\r\r\r\r\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\r\r\r\r\016\016\016\017\017\017\020\020\021\021\021\020\020\017\016\016\r\r\r\f\f\f\013\013\013\013\013\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\016\016\017\017\020\021\022\023\024\025\027\032$$##\"\"!!! \037\037\037\036\036\036\036\035\035\035\035\034\034\034\034\033\033\033\033\033\032\032\032\032\032\031\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\027\027\026\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\025\025\024\023\022\022\021\021\020\020\017\017\017\016\016\016\r\r\r\r\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\r\r\r\r\016\016\016\017\017\017\020\020\021\021\022\021\021\020\017\017\016\016\r\r\r\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\r\016\016\017\020\020\021\022\023\024\026\030\033%$$##\"\"\"!!! \037\037\037\036\036\036\036\035\035\035\035\034\034\034\034\034\033\033\033\033\033\032\032\032\032\032\031\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\025\026\026\026\026\026\026\026\026\025\025\025\025\026\026\026\026\026\026\026\026\026\026\025\024\023\023\022\022\021\020\020\020\017\017\017\016\016\016\r\r\r\r\r\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\r\r\r\r\016\016\016\016\017\017\020\020\020\021\021\022\022\021\020\020\017\016\016\016\r\r\f\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\r\016\016\017\017\020\021\021\022\023\025\026\030\033&%$$$##\"\"\"!! \037\037\037\036\036\036\036\035\035\035\035\034\034\034\034\034\033\033\033\033\033\032\032\032\032\032\031\031\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\025\025\024\023\022\022\021\021\020\020\020\017\017\016\016\016\016\r\r\r\r\r\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\016\017\017\017\020\020\021\021\022\022\022\021\020\020\017\017\016\016\r\r\r\f\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\f\r\r\016\016\016\017\017\020\021\022\023\024\025\027\031\034&&%%$$###\"\"!!! \037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\026\026\026\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\026\025\024\023\023\022\022\021\021\020\020\017\017\017\016\016\016\016\r\r\r\r\r\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\016\017\017\017\020\020\021\021\022\022\023\022\022\021\020\020\017\017\016\016\r\r\r\f\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\f\r\r\r\016\016\017\017\020\020\021\022\023\024\025\027\031\034'&&%%$$$##\"\"\"!!! \037\037\037\037\036\036\036\036\035\035\035\035\034\034\034\034\034\033\033\033\033\033\032\032\032\032\032\031\031\031\031\031\031\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\026\025\024\024\023\022\022\021\021\020\020\020\017\017\017\016\016\016\016\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\016\016\016\016\017\017\017\020\020\020\021\021\022\022\023\023\022\021\020\020\017\017\016\016\016\r\r\r\f\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\f\r\r\r\016\016\016\017\017\020\021\021\022\023\024\026\027\031\035(''&&%%$$###\"\"\"!!! \037\037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\033\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\027\027\026\025\024\023\023\022\022\021\021\020\020\020\017\017\017\016\016\016\016\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\016\016\016\016\017\017\017\020\020\020\021\021\022\022\023\023\023\022\021\021\020\020\017\017\016\016\r\r\r\f\f\f\f\f\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\f\f\f\f\r\r\r\r\016\016\017\017\020\020\021\022\023\024\025\026\030\032\035((''&&%%$$$###\"\"\"!!! \037\037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\033\033\033\033\033\032\032\032\032\032\031\031\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\027\027\027\027\030\030\030\030\030\030\030\030\030\030\027\026\025\024\024\023\023\022\022\021\021\020\020\020\017\017\017\016\016\016\016\016\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\016\016\016\016\017\017\017\017\020\020\021\021\021\022\022\023\024\023\022\022\021\020\020\017\017\016\016\016\r\r\r\f\f\f\f\f\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\f\f\f\f\f\r\r\r\016\016\017\017\017\020\021\021\022\023\024\025\026\030\032\036)((''&&%%%$$###\"\"\"\"!!! \037\037\037\037\036\036\036\036\036\035\035\035\035\034\034\034\034\034\033\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\027\026\026\025\024\023\023\022\022\021\021\021\020\020\017\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\016\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\023\023\024\024\023\022\021\021\020\020\017\017\016\016\016\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\016\016\016\017\017\020\020\021\022\022\023\024\025\027\031\033\036*))('''&&%%$$$###\"\"\"\"!!! \037\037\037\037\036\036\036\036\036\035\035\035\035\034\034\034\034\034\033\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\031\031\030\030\030\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\031\030\027\026\025\024\024\023\023\022\022\021\021\020\020\020\017\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\r\r\016\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\023\023\024\024\024\023\022\022\021\020\020\017\017\017\016\016\r\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\r\016\016\017\017\017\020\021\021\022\023\024\025\026\027\031\033\037**))((''&&%%%$$$###\"\"\"!!!! \037\037\037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\033\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\030\027\026\026\025\024\024\023\022\022\022\021\021\020\020\020\017\017\017\017\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\017\017\017\017\020\020\020\021\021\021\022\022\023\023\024\025\024\023\023\022\021\021\020\020\017\017\016\016\016\r\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\r\016\016\016\017\017\020\020\021\021\022\023\024\025\026\030\031\034\037+**))((''&&&%%%$$$###\"\"\"!!!! \037\037\037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\033\033\033\033\033\033\032\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\030\030\027\026\025\024\024\023\023\022\022\021\021\021\020\020\020\017\017\017\017\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\017\017\017\017\020\020\020\021\021\021\022\022\023\023\024\024\025\025\024\023\022\022\021\020\020\017\017\017\016\016\016\r\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\r\016\016\016\017\017\020\020\021\021\022\022\023\024\025\027\030\032\034 ,++*))(((''&&&%%$$$####\"\"\"!!!! \037\037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\031\031\031\031\032\032\032\032\032\032\032\032\032\032\031\030\027\026\025\025\024\024\023\023\022\022\021\021\021\020\020\020\017\017\017\017\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\017\017\017\017\020\020\020\020\021\021\022\022\022\023\024\024\025\025\025\024\023\022\022\021\021\020\020\017\017\016\016\016\016\r\r\r\r\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\r\r\r\r\016\016\016\017\017\017\020\020\021\021\022\023\024\025\026\027\030\032\035 ,,++**))((''&&&%%%$$$####\"\"\"\"!!! \037\037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\034\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\031\030\027\027\026\025\024\024\023\023\022\022\022\021\021\020\020\020\020\017\017\017\017\017\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\016\017\017\017\017\020\020\020\020\021\021\021\022\022\023\023\024\024\025\026\025\024\024\023\022\021\021\020\020\017\017\017\016\016\016\r\r\r\r\r\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\r\r\r\r\r\016\016\016\017\017\020\020\021\021\022\022\023\024\025\026\027\031\033\035!-,,++**))(('''&&&%%%$$$####\"\"\"\"!!!! \037\037\037\037\036\036\036\036\036\035\035\035\035\035\034\034\034\034\034\033\033\033\033\033\033\033\033\032\032\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\033\032\031\030\027\026\025\025\024\024\023\023\022\022\021\021\021\020\020\020\020\017\017\017\017\017\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\016\017\017\017\017\017\020\020\020\020\021\021\021\022\022\023\023\024\024\025\025\026\026\025\024\023\022\022\021\021\020\020\017\017\017\016\016\016\r\r\r\r\r\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\017\017\017\020\020\021\021\022\023\023\024\025\026\030\031\033\036!.--,++**)))(('''&&&%%%$$$####\"\"\"\"!!!! \037\037\037\037\036\036\036\036\036\035\035\035\035\035\034\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033").append("\033\033\033\033\033\033\033\033\033\033\033\033\033\033\032\031\030\027\026\026\025\025\024\023\023\022\022\022\021\021\021\020\020\020\020\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\020\020\020\020\021\021\021\022\022\022\023\023\024\024\025\026\026\026\025\024\023\023\022\021\021\020\020\020\017\017\016\016\016\016\r\r\r\r\r\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\016\017\017\020\020\021\021\022\022\023\024\025\026\027\030\032\033\036\"..--,,++**))(('''&&&%%%$$$$####\"\"\"\"!!!! \037\037\037\037\036\036\036\036\036\035\035\035\035\035\034\034\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\032\031\030\030\027\026\025\025\024\024\023\023\022\022\022\021\021\021\020\020\020\020\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\020\020\020\020\021\021\021\022\022\022\023\023\024\024\025\025\026\027\026\025\024\024\023\022\022\021\021\020\020\017\017\017\016\016\016\016\r\r\r\r\r\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\016\017\017\017\020\020\021\021\022\022\023\024\025\026\027\030\032\034\036\"//.--,,++**))((('''&&&%%%$$$$####\"\"\"\"!!!! \037\037\037\037\036\036\036\036\036\035\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\033\033\033\033\034\034\034\034\034\034\034\034\034\034\033\032\031\030\027\026\026\025\025\024\024\023\023\022\022\021\021\021\021\020\020\020\020\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\020\020\020\020\021\021\021\021\022\022\023\023\023\024\024\025\026\026\027\027\026\025\024\023\023\022\021\021\020\020\020\017\017\017\016\016\016\016\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\016\017\017\017\020\020\021\021\022\022\023\023\024\025\026\027\031\032\034\037#0//.--,,++**)))((('''&&&%%%$$$$####\"\"\"!!!!! \037\037\037\037\036\036\036\036\036\036\035\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\034\033\032\031\030\027\027\026\025\025\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\020\020\020\020\021\021\021\021\022\022\022\023\023\024\024\025\025\026\027\027\027\026\025\024\024\023\022\022\021\021\020\020\017\017\017\017\016\016\016\016\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\016\016\016\016\017\017\017\020\020\020\021\021\022\022\023\024\025\025\027\030\031\033\035\037#10//.--,,+++**))((('''&&&&%%%$$$$###\"\"\"\"!!!! \037\037\037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\034\034\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\035\034\033\032\031\030\027\026\026\025\025\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\020\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\017\017\020\020\020\020\021\021\021\021\022\022\022\023\023\024\024\025\025\026\026\027\030\027\026\025\025\024\023\023\022\021\021\020\020\020\017\017\017\016\016\016\016\016\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\016\016\016\016\016\017\017\017\020\020\021\021\022\022\023\023\024\025\026\027\030\031\033\035 $110//..--,,++**)))((('''&&&%%%%$$$$###\"\"\"\"!!!! \037\037\037\037\037\036\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\034\033\032\031\030\027\027\026\025\025\024\024\023\023\023\022\022\022\021\021\021\021\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\021\022\022\022\023\023\023\024\024\025\025\026\027\027\030\030\027\026\025\024\023\023\022\022\021\021\020\020\020\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\016\016\016\016\016\017\017\017\020\020\020\021\021\022\022\023\024\024\025\026\027\030\032\033\036 $2110//..--,,++***)))((('''&&&%%%%$$$####\"\"\"\"!!!! \037\037\037\037\037\036\036\036\036\036\036\036\035\035\035\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\034\033\032\031\031\030\027\026\026\025\025\024\024\023\023\023\022\022\022\021\021\021\021\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\021\022\022\022\022\023\023\024\024\025\025\026\026\027\030\030\030\027\026\025\024\024\023\022\022\021\021\021\020\020\017\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\016\016\016\016\016\017\017\017\017\020\020\021\021\021\022\023\023\024\025\025\026\027\031\032\034\036!%32110//..--,,+++**)))(((''''&&&%%%%$$$####\"\"\"\"!!!! \037\037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\035\035\035\035\036\036\036\036\036\036\036\036\036\036\035\034\033\032\031\030\027\027\026\025\025\024\024\024\023\023\022\022\022\022\021\021\021\021\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\021\021\021\021\021\022\022\022\023\023\023\024\024\025\025\026\027\027\030\031\030\027\026\025\025\024\023\023\022\022\021\021\020\020\020\017\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\r\r\016\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\023\023\024\025\026\027\030\031\032\034\036!%3321100/..--,,,++***)))((('''&&&&%%%$$$$####\"\"\"\"!!!! \037\037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\036\035\034\033\032\031\030\030\027\026\026\025\025\024\024\023\023\023\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\023\023\023\024\024\025\025\026\026\027\030\030\031\031\030\027\026\025\024\024\023\022\022\021\021\021\020\020\020\017\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\017\017\017\017\020\020\020\021\021\021\022\023\023\024\024\025\026\027\030\031\033\035\037\"&43321100//..--,,+++***)))((('''&&&&%%%$$$$####\"\"\"\"!!!! \037\037\037\037\037\037\037\036\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037\037\036\034\033\032\032\031\030\027\027\026\026\025\025\024\024\023\023\023\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\023\023\023\024\024\024\025\025\026\027\027\030\031\031\031\030\027\026\025\024\024\023\023\022\022\021\021\020\020\020\017\017\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\023\023\024\025\025\026\027\030\032\033\035\037\"&543321100//..--,,,++***)))(((''''&&&%%%%$$$$####\"\"\"\"!!!!! \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\036\035\034\033\032\031\030\030\027\026\026\025\025\024\024\024\023\023\023\022\022\022\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\022\023\023\023\024\024\025\025\026\026\027\030\030\031\032\031\030\027\026\025\025\024\023\023\022\022\021\021\021\020\020\020\017\017\017\017\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\022\023\024\024\025\026\027\030\031\032\034\035 \"'5543321100//..---,,+++***)))(((''''&&&%%%%$$$####\"\"\"\"\"!!!!! \037\037\037 \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037 \036\035\034\033\032\031\031\030\027\027\026\026\025\025\024\024\023\023\023\022\022\022\022\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\022\022\022\022\023\023\023\024\024\025\025\025\026\027\027\030\031\031\032\032\030\027\027\026\025\024\024\023\023\022\022\021\021\021\020\020\020\017\017\017\017\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\017\017\017\017\020\020\020\021\021\021\022\022\023\023\024\025\025\026\027\030\031\032\034\036 #'65543321100//...--,,,++***))))((('''&&&&%%%$$$$####\"\"\"\"\"!!!!! \037\037\037\037 \037\036\034\033\033\032\031\030\030\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\021\022\022\022\022\023\023\023\024\024\024\025\025\026\026\027\027\030\031\032\032\032\031\030\027\026\025\025\024\023\023\022\022\022\021\021\020\020\020\020\017\017\017\017\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\016\017\017\017\017\020\020\020\020\021\021\022\022\022\023\024\024\025\026\026\027\030\031\033\034\036 #(765543322100///..--,,,+++***)))(((('''&&&&%%%$$$$####\"\"\"\"\"!!!!!! ! \037\036\035\034\033\032\031\031\030\027\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\021\022\022\022\022\023\023\023\024\024\024\025\025\026\026\027\027\030\030\031\032\033\032\031\030\027\026\026\025\024\024\023\023\022\022\021\021\021\020\020\020\020\017\017\017\017\017\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\016\016\017\017\017\017\020\020\020\020\021\021\021\022\022\023\023\024\024\025\026\027\030\031\032\033\035\037!$(77655433221100//..---,,,+++***)))(((''''&&&%%%%$$$$####\"\"\"\"\"!!!!!!! !!! !!!!!!\037\036\035\034\033\032\032\031\030\030\027\026\026\025\025\025\024\024\024\023\023\023\022\022\022\022\022\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\023\024\024\025\025\025\026\026\027\027\030\031\031\032\033\033\031\030\027\027\026\025\024\024\023\023\022\022\022\021\021\021\020\020\020\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\020\020\020\021\021\021\022\022\022\023\023\024\025\025\026\027\030\031\032\033\035\037!$)877655433221100//...--,,,+++***))))((('''&&&&%%%%$$$$####\"\"\"\"\"\"!!!!!!!!!!!!!!!!!!!!!!!!!!! \037\036\034\034\033\032\031\030\030\027\027\026\026\025\025\024\024\024\023\023\023\023\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\020\020\020\020\020\020\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\023\024\024\024\025\025\026\026\027\027\030\030\031\032\033\033\033\032\031\030\027\026\025\025\024\024\023\023\022\022\021\021\021\020\020\020\020\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\020\020\020\020\021\021\021\022\022\023\023\024\024\025\026\026\027\030\031\032\034\035\037\"%)9877655433221100///..---,,,+++***)))(((('''&&&&%%%$$$$$####\"\"\"\"\"\"\"!!\"!!!!!!!!!!!!!!!!!\"\"\"\" \037\036\035\034\033\032\031\031\030\030\027\026\026\026\025\025\024\024\024\023\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\023\024\024\024\025\025\025\026\026\027\027\030\031\031\032\033\034\033\032\031\030\027\026\026\025\024\024\023\023\022\022\022\021\021\021\020\020\020\020\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\020\020\020\020\021\021\021\022\022\022\023\023\024\025\025\026\027\027\030\032\033\034\036 \"%*:98776554332211000//...--,,,+++****)))(((''''&&&%%%%$$$$$#####\"\"\"\"\"\"\"\"\"\"\"\"\"\"!!!!\"\"\"\"\"\"\"\"\"\"!\037\036\035\034\033\033\032\031\030\030\027\027\026\026\025\025\025\024\024\024\023\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\023\023\023\023\024\024\024\025\025\025\026\026\027\027\030\030\031\032\032\033\034\034\032\031\030\027\027\026\025\025\024\024\023\023\022\022\021\021\021\021\020\020\020\020\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\020\020\020\020\021\021\021\021\022\022\023\023\024\024\025\025\026\027\030\031\032\033\034\036 \"&*:998776554432211100//...---,,,+++***)))(((('''&&&&%%%%$$$$$#####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"##\"! \037\036\035\034\033\032\031\031\030\030\027\026\026\026\025\025\024\024\024\024\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\022\023\023\023\023\024\024\024\024\025\025\026\026\026\027\027\030\031\031\032\033\034\034\034\033\032\031\030\027\026\026\025\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\022\022\022\023\023\024\024\025\026\026\027\030\031\032\033\035\036 #&+;:998776554433221100///...--,,,++++***)))(((''''&&&&%%%%$$$$$######\"####\"\"\"\"\"\"\"\"\"\"\"#######! \037\036\035\034\033\032\032\031\030\030\027\027\026\026\025\025\025\024\024\024\024\023\023\023\023\022\022\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\022\022\023\023\023\023\024\024\024\024\025\025\025\026\026\027\027\030\030\031\032\032\033\034\035\034\033\032\031\030\027\026\026\025\025\024\024\023\023\022\022\022\021\021\021\020\020\020\020\020\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\022\022\022\023\023\024\024\025\025\026\027\027\030\031\032\034\035\037!#&+<;:9987765544332211000//...---,,,+++***))))(((''''&&&%%%%%$$$$$###########################\"!\037\036\035\034\033\033\032\031\031\030\030\027\027\026\026\025\025\025\024\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\021\021\021\021\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\024\024\024\025\025\025\026\026\026\027\027\030\031\031\032\033\033\034\035\035\033\032\031\030\027\027\026\025\025\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\016\016\016\016\016\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\021\022\022\023\023\023\024\024\025\026\026\027\030\031\032\033\034\035\037!$',<;;:9887765544332211100///...---,,,+++***)))(((('''&&&&%%%%%$$$$$$##$#################$$$$\"! \037\036\035\034\033\032\032\031\030\030\027\027\026\026\026\025\025\025\024\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\024\024\024\025\025\025\026\026\026\027\027\030\030\031\031\032\033\034\035\035\035\034\033\032\031\030\027\026\026\025\025\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\021\022\022\022\023\023\024\024\025\025\026\026\027\030\031\032\033\034\036 \"$',=<;;:98877655443322211000//...---,,,+++***))))(((''''&&&&%%%%%$$$$$$$$$$$$$$####$$$$$$$$$$#! \037\036\035\034\033\033\032\031\031\030\030\027\027\026\026\025\025\025\025\024\024\024\024\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\023\024\024\024\024\025\025\025\026\026\027\027\027\030\031\031\032\032\033\034\035\036\035\034\033\032\031\030\027\027\026\025\025\024\024\023\023\023\022\022\022\021\021\021\021\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\021\021\021\021\022\022\022\023\023\023\024\024\025\025\026\027\027\030\031\032\033\035\036 \"%(->=<;;:98877655443332211000///...---,,,+++***)))((((''''&&&&%%%%%%$$$$$$$$$$$$$$$$$$$$$$%%$#\" \037\036\035\034\034\033\032\032\031\030\030\027\027\026\026\026\025\025\025\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\024\024\024\024\024\025\025\025\026\026\026\027\027\030\030\031\031\032\033\034\034\035\036\036\034\033\032\031\030\030\027\026\026\025\024\024\024\023\023\022\022\022\021\021\021\021\021\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\021\021\021\021\021\022\022\022\023\023\024\024\025\025\026\026\027\030\031\031\033\034\035\036 \"%(->>=<;::98877665544332211100///...---,,,+++***))))((((''''&&&&%%%%%%%%%%%$$$$$$$$$$$%%%%%%%#\"! \037\036\035\034\033\032\032\031\031\030\030\027\027\026\026\026\025\025\025\024\024\024\024\024\023\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\023\023\024\024\024\024\024\025\025\025\026\026\026\027\027\030\030\031\031\032\032\033\034\035\036\036\036\035\033\032\031\031\030\027\026\026\025\025\024\024\023\023\023\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\023\023\023\024\024\025\025\026\027\027\030\031\032\033\034\035\037!#%).?>==<;::988776655443322211000///...---,,,+++***)))((((''''&&&&&&%%%%%%%%%%%%%%%%%%%%%%%%&%$\"! \037\036\035\034\033\033\032\031\031\030\030\027\027\027\026\026\026\025\025\025\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\022\022\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\025\025\025\025\026\026\027\027\027\030\030\031\031\032\033\033\034\035\036\037\036\035\034\033\032\031\030\027\027\026\025\025\024\024\024\023\023\022\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\022\023\023\024\024\024\025\026\026\027\027\030\031\032\033\034\036\037!#&).@?>=<<;::988776655443322211100///...---,,,+++****)))((((''''&&&&&&%%&&%%%%%%%%%%%%%%%&&&&&$#\" \037\036\035\035\034\033\032\032\031\031\030\030\027\027\026\026\026\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\025\025\025\025\026\026\026\027\027\030\030\031\031\032\032\033\034\034\035\036\037\037\035\034\033\032\031\030\030\027\026\026\025\025\024\024\023\023\023\022\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\017\017\017\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\022\023\023\023\024\024\025\025\026\026\027\030\031\031\032\033\035\036 !#&*/@@?>=<<;::9887766554433322111000///..---,,,,+++***))))(((('''''&&&&&&&&&&&&&%%%%&&&&&&&&&&%#\"! \037\036\035\034\033\033\032\031\031\030\030\027\027\027\026\026\026\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\025\025\025\025\026\026\026\027\027\027\030\030\031\031\032\033\033\034\035\036\036\037\037\036\034\033\032\031\031\030\027\027\026\025\025\024\024\024\023\023\023\022\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\022\023\023\023\024\024\024\025\025\026\027\027\030\031\032\033\034\035\036 \"$'*/A@??>=<<;::9887766554443322211000///...---,,,+++****)))((((('''''&&&&&&&&&&&&&&&&&&&&&&'''%$\"! \037\036\035\034\034\033\032\032\031\031\030\030\027\027\027\026\026\026\025\025\025\025\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\024\025\025\025\025\026\026\026\027\027\027\030\030\031\031\032\032\033\034\034\035\036\037 \037\036\035\034\033\032\031\030\027\027\026\026\025\025\024\024\023\023\023\022\022\022\022\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\022\022\022\022\023\023\023\024\024\025\025\026\026\027\030\030\031\032\033\034\035\037 \"$'+0BA@?>>=<<;::99877665554433222111000//...---,,,++++***))))(((((''''''''''&&&&&&&&&&&'''''''%$#! \037\036\035\035\034\033\033\032\031\031\030\030\030\027\027\026\026\026\026\025\025\025\025\024\024\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\024\024\025\025\025\025\026\026\026\026\027\027\027\030\030\031\031\032\032\033\034\035\035\036\037 \036\035\034\033\032\031\030\030\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\021\022\022\022\022\023\023\023\024\024\024\025\025\026\026\027\030\030\031\032\033\034\036\037!\"%'+0CBA@?>>=<<;::99887766554433322111000///...---,,,+++****))))(((((''''''''''''''''''''''''('&$#\"! \037\036\035\034\034\033\032\032\031\031\030\030\027\027\027\026\026\026\026\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\026\026\026\026\027\027\027\030\030\031\031\032\032\033\033\034\035\036\037\037 \036\035\034\033\032\031\031\030\027\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\021\021\022\022\022\022\023\023\023\024\024\024\025\025\026\026\027\027\030\031\032\032\033\035\036\037!#%(+1CBAA@?>>=<;;::99887766554443322211100///...---,,,++++****))))(((((('(('''''''''''''''(((((&%#\"! \037\036\035\035\034\033\033\032\031\031\030\030\030\027\027\027\026\026\026\026\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\026\026\026\027\027\027\030\030\030\031\031\032\032\033\034\034\035\036\037 ! \037\036\034\033\032\032\031\030\027\027\026\026\025\025\024\024\024\023\023\023\023\022\022\022\022\021\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\021\021\021\022\022\022\022\023\023\023\023\024\024\024\025\025\026\026\027\030\030\031\032\033\034\035\036 !#%(,1DCBA@@?>==<;;::998877665554433322111000///...---,,,+++****)))))(((((((((((((''''(((((((((('%$\"! \037\036\036\035\034\033\033\032\032\031\031\030\030\030\027\027\027\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\026\026\026\026\027\027\027\030\030\031\031\032\032\033\033\034\035\035\036\037 !!\037\036\035\034\033\032\031\030\030\027\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\024\024\024\025\025\026\026\027\027\030\031\031\032\033\034\035\036 \"#&),2EDCBA@@?>==<;;::998877665554433322211000///...---,,,++++****)))))(((((((((((((((((((((()))'%$#\"! \037\036\035\034\034\033\032\032\031\031\031\030\030\027\027\027\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\025\026\026\026\026\027\027\027\030\030\030\031\031\032\032\033\034\034\035\036\037\037 !!\037\036\035\034\033\032\031\031\030\027\027\026\026\025\025\024\024\024\023\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\023\024\024\024\025\025\026\026\027\027\030\031\032\032\033\034\035\037 \"$&)-2EDCCBA@??>==<;;::998877666554443322211100///...---,,,,++++****))))))))))((((((((((()))))))'&$#\"! \037\036\035\035\034\033\033\032\032\031\031\030\030\030\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\025\025\026\026\026\026\026\027\027\027\030\030\030\031\031\032\032\033\033\034\035\035\036\037 !\"! \036\035\034\033\032\032\031\030\030\027\026\026\026\025\025\024\024\024\023\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\023\023\023\023\024\024\024\025\025\026\026\027\027\030\030\031\032\033\034\035\036\037!\"$')-3FEDCBBA@??>==<;;::9988777665544433322111000///...---,,,++++*****))))))))))))))))))))))))*)(&%#\"! \037\036\036\035\034\034\033\032\032\031\031\031\030\030\030\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\027\027\027\027\030\030\031\031\031\032\032\033\034\034\035\036\036\037 !\"\" \037\036\035\034\033\032\031\030\030\027\027\026\026\025\025\025\024\024\024\023\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\023\023\023\023\024\024\024\025\025\025\026\026\027\027\030\031\031\032\033\034\035\036\037!#%'*.3GFEDCBAA@??>==<<;::9988877665554433322211000///...---,,,,++++******)**)))))))))))))))*****('%$#\"! \037\036\035\035\034\033\033\032\032\031\031\030\030\030\027\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\027\027\027\027\030\030\030\031\031\032\032\033\033\034\034\035\036\037 !\"\" \037\036\035\034\033\032\031\031\030\027\027\026\026\026\025\025\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\022\023\023\023\023\023\024\024\024\025\025\026\026\026\027\030\030\031\032\032\033\034\035\036 !#%'*.4GFEEDCBAA@??>==<<;::9998877665554443322211100///....---,,,,++++*************))))**********('%$#\"! \037\036\036\035\034\034\033\032\032\032\031\031\030\030\030\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\027\027\027\027\030\030\030\031\031\031\032\032\033\033\034\035\035\036\037 !\"#\"!\037\036\035\034\033\032\032\031\030\030\027\027\026\026\025\025\025\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\022\022\023\023\023\023\023\024\024\024\025\025\025\026\026\027\027\030\030\031\032\033\033\034\035\037 \"#%(+/4HGFEDDCBA@@?>>==<<;;::9988776665544433222111000///...----,,,,+++++********************++++)'&%#\"! \037\037\036\035\034\034\033\033\032\032\031\031\031\030\030\030\027\027\027\027\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\026\027\027\027\027\030\030\030\031\031\031\032\032\033\033\034\034\035\036\036\037 !\"#\"! \036\035\034\033\033\032\031\031\030\027\027\026\026\026\025\025\024\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\024\024\024\024\025\025\026\026\026\027\027\030\031\031\032\033\034\035\036\037 \"$&(+/5IHGFEDCCBA@@?>>==<<;;::9988777665554433322111000///....---,,,,,+++++++++***********+++++++)(&%$#\"! \037\036\035\035\034\034\033\032\032\032\031\031\030\030\030\030\027\027\027\027\026\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\026\026\027\027\027\027\030\030\030\030\031\031\032\032\032\033\033\034\035\035\036\037 !\"$#! \037\036\035\034\033\032\031\031\030\030\027\027\026\026\025\025\025\024\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\024\024\024\024\025\025\025\026\026\027\027\030\030\031\032\032\033\034\035\036\037!\"$&(,/5IHGGFEDCBBA@@?>>==<<;;::9988777665554433322211100////...----,,,,,+++++++++++++++++++++++,+*('%$#\"! \037\036\036\035\034\034\033\033\032\032\031\031\031\030\030\030\030\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\030\030\030\031\031\031\032\032\033\033\034\034\035\036\036\037 !\"#$#\" \037\036\035\034\033\032\032\031\030\030\027\027\026\026\026\025\025\025\024\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\024\024\024\025\025\025\026\026\026\027\027\030\030\031\032\033\033\034\035\036 !\"$&),06JIHGFEEDCBBA@@?>>==<<;;::99888776665544433222111000///....----,,,,,+,,+++++++++++++++,,,,,*('&$#\"! \037\037\036\035\035\034\034\033\033\032\032\031\031\031\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\030\030\030\031\031\031\032\032\032\033\033\034\035\035\036\037\037 !\"#$#\"!\037\036\035\034\033\033\032\031\031\030\030\027\027\026\026\025\025\025\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\023\024\024\024\024\025\025\025\026\026\027\027\030\030\031\031\032\033\034\034\035\037 !#%'),06KJIHGFEDDCBBA@@?>>==<<;;::99988776665544433322111000////...-----,,,,,,,,,,,,++++,,,,,,,,,,*)'&%$\"!! \037\036\036\035\034\034\033\033\032\032\032\031\031\031\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\030\030\030\030\031\031\031\032\032\033\033\034\034\035\035\036\037 !\"#%$\"! \037\035\035\034\033\032\031\031\030\030\027\027\026\026\026\025\025\025\024\024\024\024\023\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\023\024\024\024\024\025\025\025\026\026\026\027\027\030\030\031\032\032\033\034\035\036\037 \"#%'*-17LJIIHGFEDDCBAA@@?>>==<<;;::999887776655544333222111000///....-----,,-,,,,,,,,,,,,,,,,,----+)(&%$#\"! \037\036\036\035\035\034\034\033\033\032\032\031\031\031\030\030\030\030\027\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\027\030\030\030\030\031\031\031\032\032\033\033\033\034\034\035\036\036\037 !\"#$%$#! \037\036\035\034\033\032\032\031\030\030\027\027\027\026\026\025\025\025\025\024\024\024\024\023\023\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\023\023\023\024\024\024\024\025\025\025\025\026\026\027\027\027\030\031\031\032\032\033\034\035\036\037 \"#%'*-17LKJIHGGFEDCCBAA@@?>>==<<;;:::99887776655544333222111000////....---------,,,,,,,,,,,-------+*('%$#\"! \037\036\035\035\034\034\033\033\032\032\032\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\027\026\026\026\026\026\026\026\026\027\027\027\027\027\027\027\027\027\030\030\030\030\031\031\031\032\032\032\033\033\034\034\035\035\036\037\037 !\"#$%$#! \037\036\035\034\033\033\032\031\031\030\030\027\027\026\026\026\025\025\025\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\025\025\025\026\026\026\027\027\030\030\031\031\032\033\034\034\035\036\037!\"$&(*.28MLKJIHGFFEDCCBAA@@?>>==<<;;;::998887766555444332221110000///.....----------------------..-,*('&%#\"!! \037\036\036\035\035\034\034\033\033\032\032\032\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\031\032\032\033\033\033\034\034\035\036\036\037 !\"#$&%#\"!\037\036\035\034\034\033\032\032\031\030\030\027\027\027\026\026\026\025\025\025\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\025\025\025\025\026\026\027\027\027\030\030\031\032\032\033\034\035\036\037 !\"$&(+.28NMKKJIHGFEEDCCBAA@@??>==<<<;;::998887766655444333222111000////.....-..---------------.....,*)'&%$#\"! \037\037\036\035\035\034\034\033\033\032\032\032\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\031\032\032\032\033\033\034\034\035\035\036\037\037 !\"#$%&%$\"! \037\036\035\034\033\032\032\031\031\030\030\027\027\026\026\026\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\025\025\025\025\026\026\026\027\027\030\030\031\031\032\032\033\034\035\036\037 !#$&)+.39NMLKJIHHGFEEDCCBAA@@??>>==<<;;::9998877666554443332221110000////............----......../.,+)(&%$#\"! \037\036\036\035\035\034\034\033\033\032\032\032\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\030\031\031\031\031\032\032\032\033\033\033\034\034\035\036\036\037 !\"#$%&%$\"! \037\036\035\034\033\033\032\031\031\030\030\027\027\027\026\026\026\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\025\025\025\025\026\026\026\027\027\027\030\030\031\031\032\033\033\034\035\036\037 \"#%'),/39ONMLKJIHGGFEDDCCBAA@@??>>==<<;;::9998877766555443332221111000/////../.................////-+)('%$#\"!! \037\037\036\035\035\034\034\033\033\033\032\032\032\031\031\031\031\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\030\031\031\031\031\032\032\032\033\033\033\034\034\035\035\036\036\037 !!\"#$%'&$#! \037\036\035\034\034\033\032\032\031\031\030\030\027\027\026\026\026\025\025\025\025\025\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\024\025\025\025\025\025\026\026\026\027\027\030\030\031\031\032\032\033\034\035\035\036\037!\"#%'),/3:OONMLKJIHGGFEDDCBBAA@@??>>==<<;;:::9988777665554443322221110000/////////...........///////-+*('&%$#\"! \037\037\036\036\035\035\034\034\033\033\032\032\032\032\031\031\031\031\030\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\030\030\030\030\030\030\030\030\031\031\031\031\031\032\032\032\033\033\034\034\034\035\035\036\037\037 !\"#$%&'&$#\" \037\036\035\035\034\033\032\032\031\031\030\030\027\027\027\026\026\026\025\025\025\025\025\024\024\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\024\024\024\024\024\024\024\024\025\025\025\025\025\026\026\026\027\027\027\030\030\031\031\032\033\033\034\035\036\037 !\"$%'*,04:OONMLKJJIHGFFEDDCBBAA@@??>>==<<;;:::99887776655544433322211110000//////////////////////00/.,*)'&%$#\"! \037\036\036\035\035\034\034\033\033\033\032\032\032\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\032\032\032\033\033\033\034\034\035\035\036\036\037 !\"#$%&'&%#\"! \037\036\035\034\033\033\032\031\031\030\030\030\027\027\026\026\026\026\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\026\026\026\026\027\027\030\030\030\031\032\032\033\033\034\035\036\037 !#$&(*-04;NNNNMLKJIIHGFFEDDCBBAA@@??>>==<<;;;::998887766655444333222211100000000///////////////00000.,+)(&%$#\"\"! \037\037\036\036\035\035\034\034\033\033\033\032\032\032\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\032\032\032\033\033\033\034\034\034\035\035\036\037\037 !!\"#$%&('%$\"! \037\036\035\034\034\033\032\032\031\031\030\030\027\027\027\026\026\026\026\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\026\026\026\026\027\027\027\030\030\031\031\032\032\033\034\034\035\036\037 !#$&(*-05;MMMMNMLKJIHHGFEEDDCBBAA@@??>>==<<;;;::99888776665554433332221111000000000000////0000000010.-+)('&%$#\"! \037\036\036\035\035\034\034\034\033\033\032\032\032\032\031\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\031\032\032\032\032\033\033\033\034\034\035\035\036\036\037\037 !\"##$%'('%$#! \037\036\035\035\034\033\033\032\031\031\030\030\030\027\027\027\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\026\026\026\027\027\027\030\030\030\031\031\032\033\033\034\035\036\036\037!\"#%&(+-15<MMMMMMLKKJIHGGFEEDDCBBAA@@??>>==<<<;;::999887766655544433322221111001000000000000000001111/-+*('&%$#\"!! \037\037\036\036\035\035\034\034\033\033\033\032\032\032\032\031\031\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\031\031\032\032\032\032\033\033\033\034\034\035\035\035\036\037\037 !\"#$%&'('&$#\" \037\036\036\035\034\033\033\032\032\031\031\030\030\027\027\027\026\026\026\026\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\025\026\026\026\026\027\027\027\030\030\031\031\032\032\033\033\034\035\036\037 !\"#%')+.16<LLLLLLMLKJJIHGGFEEDDCBBAA@@??>>==<<<;;::99988777665554443332222111111111000000000001111111/-,*)'&%$#\"\"! \037\037\036\036\035\035\034\034\034\033\033\033\032\032\032\032\031\031\031\031\031\031\031\031\031\030\030\030\030\030\030\031\031\031\031\031\031\031\031\031\032\032\032\032\033\033\033\034\034\034\035\035\036\036\037\037 !!\"#$%&')(&%#\"! \037\036\035\034\034\033\032\032\031\031\030\030\030\027\027\027\026\026\026\026\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\025\026\026\026\026\027\027\027\030\030\030\031\031\032\032\033\034\034\035\036\037 !\"$%')+.26=KKKKLLLLLKJIIHGGFEEDDCBBAA@@??>>===<<;;::9998877766555444333322221111111111111111111111222/.,*)('%$$#\"! \037\037\036\036\035\035\034\034\033\033\033\033\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\033\033\033\033\034\034\035\035\035\036\036\037 !\"##$%&()(&%#\"! \037\036\035\035\034\033\033\032\032\031\031\030\030\027\027\027\027\026\026\026\026\025\025\025\025\025\025\025\025\025\024\024\024\024\024\024\024\025\025\025\025\025\025\025\025\025\026\026\026\026\027\027\027\027\030\030\031\031\032\032\033\033\034\035\035\036\037 !#$&'),/27=KKKKKKKKLLKJIIHGGFEEDDCBBAA@@??>>===<<;;:::998877766655544433332222222211111111111112222220.,+)('&%$#\"!! \037\037\036\036\035\035\034\034\034\033\033\033\033\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\033\033\033\033\034\034\034\035\035\036\036\037\037 !!\"#$%&'()('%$\"! \037\036\036\035\034\033\033\032\032\031\031\030\030\030\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\027\027\027\030\030\030\031\031\032\032\033\033\034\035\036\037\037 \"#$&(*,/27>JJJJJJJKKKKKJIHHGFFEEDCCBBAA@@??>>>==<<;;:::99888776665554443333322222222222111122222222320.-+*('&%$#\"\"! \037\036\036\036\035\035\034\034\034\033\033\033\033\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\032\033\033\033\034\034\034\035\035\035\036\036\037 !\"\"#$%&'(*)'%$#\" \037\036\035\034\034\033\032\032\031\031\031\030\030\030\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\027\027\027\027\030\030\031\031\031\032\032\033\034\034\035\036\037 !\"#%&(*,/38>IIIIJJJJJKKKJJIHHGFFEEDCCBBAA@@??>>>==<<;;:::9988877666555444433333232222222222222222233331/-,*)(&%$$#\"!! \037\037\036\036\035\035\035\034\034\034\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\032\032\033\033\033\033\034\034\034\035\035\036\036\037\037 !\"##$%&')*)'&$#\"! \037\036\035\035\034\033\033\032\032\031\031\030\030\030\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\027\027\027\027\030\030\030\031\031\032\032\033\033\034\035\035\036\037 !\"#%'(*-038?IIIIIIIIJJJKKJJIHHGFFEEDCCBBAA@@???>>==<<;;:::998887776665554444333333332222222222233333331/-,*)('&%$#\"!! \037\036\036\036\035\035\034\034\034\033\033\033\033\033\032\032\032\032\032\032\032\032\031\031\031\031\031\031\032\032\032\032\032\032\032\032\032\033\033\033\033\034\034\034\035\035\035\036\036\037\037 !!\"#$%&'()*)(&%#\"! \037\036\035\035\034\033\033\032\032\031\031\031\030\030\030\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\027\027\027\027\030\030\030\031\031\031\032\032\033\034\034\035\036\036\037 !\"$%')+-048?HHHHHHHIIIJJJKJJIHHGFFEEDCCBBAA@@???>>==<<;;;::998887776665554444433333333333333333333344410.,+)('&%$#\"\"! \037\037\036\036\035\035\035\034\034\034\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\034\034\035\035\035\036\036\037\037 !\"\"#$%&'()+*(&%$\"! \037\037\036\035\034\034\033\033\032\032\031\031\030\030\030\027\027\027\027\027\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\026\026\027\027\027\027\030\030\030\031\031\032\032\033\033\034\034\035\036\037 \"#$%')+.149@GGGGHHHHHIIIJJKJIIHGGFFEEDCCBBAA@@@??>>==<<;;;::99988777666555544444444333333333333344444420.-+*('&%$$#\"!! \037\037\036\036\036\035\035\035\034\034\034\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\034\034\034\035\035\036\036\036\037\037 !!\"##$%&'(*+*('%$#\"! \037\036\035\035\034\033\033\032\032\031\031\031\030\030\030\027\027\027\027\027\026\026\026\026\026\026\026\026\026\025\025\025\025\025\025\026\026\026\026\026\026\026\026\026\027\027\027\027\030\030\030\031\031\031\032\032\033\033\034\035\035\036\037 !\"#$&')+.159@GGGGGGGGHHHIIJJKJIIHGGFFEEDDCBBAA@@@??>>==<<;;;::9998877766665555444444444443333444444445420/-+*)('&%$#\"\"! \037\037\036\036\035\035\035\034\034\034\034\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\033\034\034\034\034\035\035\035\036\036\037\037 !!\"#$%%&()*+*)'%$#\"! \037\036\035\035\034\034\033\033\032\032\031\031\030\030\030\030\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\030\030\030\030\031\031\032\032\033\033\034\034\035\036\036\037 !\"#%&(*,.15:AFFFFFFFGGGHHHIIJKJIIHGGFFEEDDCBBAAA@@??>>==<<;;;::999888777666555554544444444444444444555531/-,*)('&%$##\"!! \037\037\037\036\036\035\035\035\034\034\034\034\033\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\033\034\034\034\034\035\035\035\036\036\036\037\037 !\"\"#$%&'()*,+)'&$#\"! \037\036\036\035\034\034\033\033\032\032\031\031\031\030\030\030\030\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\030\030\030\031\031\031\032\032\033\033\034\034\035\036\037\037 !\"$%&(*,/25:AEEEEFFFFFGGGHHIIJJJIIHGGFFEEDDCBBBAA@@??>>==<<<;;::99988877766665555555554444444444555555531/.,+)('&%$$#\"!! \037\037\036\036\036\035\035\035\034\034\034\034\033\033\033\033\033\033\033\033\033\032\032\032\032\033\033\033\033\033\033\033\033\033\034\034\034\034\035\035\035\035\036\036\037\037 !!\"##$%&'()+,+)(&%#\"! \037\037\036\035\035\034\033\033\032\032\032\031\031\031\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\030\030\030\031\031\031\032\032\032\033\033\034\035\035\036\037 !\"#$%'(*,/26;BEEEEEEEEFFFGGHHIIJJJIHHGGFFEEDDCCBBAA@@??>>==<<<;;:::9988877776666555555555555555555555666310.,+*)'&&%$#\"\"! \037\037\037\036\036\035\035\035\035\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\035\035\035\036\036\036\037\037 !\"\"#$%%&'(*+,+*(&%$#\"! \037\036\035\035\034\034\033\033\032\032\031\031\031\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\030\030\030\030\031\031\031\032\032\033\033\034\034\035\035\036\037 !\"#$%')+-/26;BDDDDDDDEEEFFFGGHIIJJJIHHGGFFEEDDCCBBAA@@??>>==<<<;;:::999888777666666665555555555555666666420.-+*)('&%$##\"!! \037\037\036\036\036\035\035\035\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\035\035\035\036\036\036\037\037 !!\"##$%&'()*+-,*('%$#\"! \037\036\036\035\034\034\033\033\032\032\032\031\031\031\030\030\030\030\027\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\027\030\030\030\030\031\031\031\032\032\032\033\033\034\034\035\036\036\037 !\"#$&')+-037<CDCCCDDDDDEEEFFGGHIIJJJIHHGGFFEEDDCCBBAA@@??>>==<<<;;:::99988877776666666666655556666666676420/-,*)('&%$$#\"\"! \037\037\037\036\036\036\035\035\035\034\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\034\035\035\035\035\036\036\037\037\037 !!\"##$%&'()*,-,*('&$#\"! \037\037\036\035\035\034\034\033\033\032\032\031\031\031\031\030\030\030\030\027\027\027\027\027\027\027\027\027\026\026\026\026\026\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\032\032\033\033\034\034\035\035\036\037\037 !\"#%&()+-037<CCCCCCCCCDDDEEEFGGHIIJJJIHHGGFFEEDDCCBBAA@@??>>==<<<;;:::9998888777767666666666666666677777531/-,+*('&%%$#\"\"!! \037\037\036\036\036\035\035\035\035\034\034\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037 !!\"\"#$%%&'()+,-,*)'&%#\"! \037\036\035\035\034\034\033\033\032\032\032\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\032\032\032\033\033\034\034\035\035\036\037 !\"#$%&(*,.047<BBBBBBBCCCCDDDEEFFGHIIJJIIHHGGFFEEDDCCBBAA@@??>>===<<;;;::999988877777777766666666677777787531/.,+*)('&%$##\"!! \037\037\037\036\036\036\035\035\035\035\034\034\034\034\034\034\034\034\034\034\033\033\034\034\034\034\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037\037 !!\"##$%&'')*+,.-+)(&%$#\"! \037\036\036\035\034\034\033\033\033\032\032\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\031\032\032\033\033\033\034\035\035\036\036\037 !\"#$%'(*,.148=BBBABBBBBBCCCDDEEFFGHIJKJIIHHGGFFEEDDCCBBAA@@??>>===<<;;;:::99988887777777777777777777778885310.-+*)('&%$$#\"\"!! \037\037\037\036\036\036\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\036\036\036\036\037\037 !!\"\"#$$%&'()*+-.-+)(&%$#\"! \037\037\036\035\035\034\034\033\033\032\032\032\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\031\032\032\032\033\033\034\034\035\035\036\037\037 !\"#$%'(*,/148=AAAAAAAAABBBCCCDDEFFGHIJKJIIHHGGFFEEDDCCBBAA@@??>>===<<;;;:::9999888888877777777777778888886420.-,*)('&%%$##\"!! \037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\036\036\036\036\037\037\037 !!\"\"#$%%&'()*,-.-+*('%$#\"! \037\036\035\035\034\034\033\033\033\032\032\032\031\031\031\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\030\030\031\031\031\032\032\032\033\033\033\034\034\035\036\036\037 !\"#$&')+-/259>@@@@@@@AAAABBBCCDDEFFGHIJKJIIHHGGFFEEDCCCBBAA@@??>>===<<;;;:::999988888888888777788888889986420/-,+*)('&%$##\"\"!! \037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\035\036\036\036\037\037\037 !!\"\"##$%&&'()+,-/.,*('&$#\"!! \037\036\036\035\035\034\034\033\033\032\032\032\031\031\031\031\030\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\030\030\031\031\031\031\032\032\032\033\033\034\034\035\035\036\036\037 !\"#$%&')+-/259>@@@@@@@@@@AAABBCCDDEFGGHIJJJIIHHGGFFEDDCCBBBAA@@??>>===<<<;;;:::9999899888888888888888999997431/.,+*)('&%$$#\"\"!! \037\037\037\036\036\036\036\035\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\035\035\036\036\036\036\037\037 !!\"\"#$$%&'()*+,-/.,*)'&%$#\"! \037\037\036\035\035\034\034\033\033\033\032\032\032\031\031\031\031\030\030\030\030\030\030\030\030\030\030\027\027\027\030\030\030\030\030\030\030\030\030\030\031\031\031\031\032\032\032\033\033\033\034\034\035\035\036\037\037 !\"#$%&()+-0259??????????@@@AAABBCDDEFGHIJKJJIIHHGGFEEDDCCBBBAA@@??>>===<<<;;;::::99999999888888888999999:97531/.-+*)('&%%$##\"\"!! \037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\037\037\037 !!\"\"##$%%&'()*+,./.,+)(&%$#\"! \037\037\036\036\035\034\034\034\033\033\032\032\032\032\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\032\032\032\032\033\033\034\034\034\035\036\036\037 !\"#$%'(*+.036:?>>>>>>>????@@@AABBCDDEFGHIJKJJIIHHGGFEEDDCCBBAAA@@??>>>==<<<;;;::::99999999999999999999::::75310.-,*)(''&%$$#\"\"!! \037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\037\037\037 !!\"\"##$%&&'()*,-.0/-+)(&%$#\"! \037\036\036\035\035\034\034\033\033\033\032\032\032\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\032\032\032\033\033\033\034\034\035\035\036\036\037 !!\"#$&'(*,.036:>>>>>>>>>>>???@@AABBCDDEFGHIKKJJIIHHGFFEEDDCCBBAAA@@??>>>==<<<;;;;:::::::9999999999999::::::86420/-,+*)('&%%$##\"\"!! \037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\037\037\037\037 !!\"\"##$$%&'()*+,-.0/-+*('&$#\"!! \037\037\036\035\035\034\034\034\033\033\032\032\032\032\031\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\032\032\032\032\033\033\034\034\034\035\035\036\037\037 !\"#$%&')*,.137;=========>>>>???@@ABBCDEEFGIJKKJJIIHHGFFEEDDCCBBAAA@@??>>>===<<<;;;;::::::::::9999:::::::;;:86421/.,+*)('&%%$##\"\"!! \037\037\037\037\036\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\037\037\037\037 !!\"\"##$%%&'()*+,-/0/-,*('&%$#\"! \037\037\036\036\035\035\034\034\033\033\033\032\032\032\032\031\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\031\032\032\032\032\033\033\033\034\034\035\035\036\036\037\037 !\"#$%&')+,.147;=<<<<<<=====>>>??@@ABBCDEFGHIJKKJJIIHGGFFEEDDCCBBAAA@@??>>>===<<<;;;;:;;:::::::::::::::;;;;;86431/.-+*)(''&%$$##\"\"!! \037\037\037\037\036\036\036\036\036\036\036\035\035\035\035\035\035\035\035\036\036\036\036\036\036\036\037\037\037\037 !!\"\"\"#$$%&&'()*+,./10.,*)'&%$#\"! \037\036\036\035\035\034\034\034\033\033\033\032\032\032\032\031\031\031\031\031\031\031\030\030\030\030\030\030\030\030\030\031\031\031\031\031\031\031\032\032\032\032\033\033\033\034\034\034\035\035\036\036\037 !\"#$%&()+-/147<<<<<<<<<<<<===>>??@@ABBCDEFGHIKKKJJIIHGGFFEEDDCCBBAAA@@??>>>===<<<<;;;;;;;;:::::::::;;;;;;<;975310.-,+*)('&%%$##\"\"!!! \037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037 !!!\"\"##$%%&'(()*,-./10.,*)(&%$#\"!! \037\037\036\036\035\035\034\034\033\033\033\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\030\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\033\033\033\034\034\035\035\036\036\037\037 !!\"#$%'()+-/248;;;;;;;;;;<<<<===>>?@@ABBCDEFGIJKKKJJIHHGGFFEEDDCCBBAAA@@???>>====<<<<;<;;;;;;;;;;;;;;;;;<<<<975320/-,+*)('&&%$$##\"\"!! \037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037 !!\"\"\"#$$%%&'()*+,-.010.,+)('%$#\"\"! \037\037\036\036\035\035\034\034\034\033\033\033\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\033\033\033\034\034\034\035\035\036\036\037\037 !\"##%&'(*+-/258;;;;:::;;;;;;<<<==>>??@ABCCDFGHIKLKKJJIHHGGFFEEDDCCBBAAA@@???>>>===<<<<<<<;;;;;;;;;;;;;<<<<<<:75420/.,+*)(''&%$$##\"\"!!! \037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037 !!!\"\"##$$%&&'()*+,-/021/-+)('&%$#\"! \037\036\036\035\035\035\034\034\033\033\033\033\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\033\033\033\033\034\034\035\035\035\036\036\037 !\"#$%&')*,.0259:::::::::::;;;;<<==>>??@ABCDEFGHJKLKKJIIHHGGFFEEDDCCBBAAA@@???>>>====<<<<<<<<<<;;;;<<<<<<<==<:86421/.-+*)(('&%%$$##\"\"!!! \037\037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037\037 !!\"\"\"##$%%&''()*+,./021/-+*('&%$#\"!! \037\037\036\036\035\035\034\034\034\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\032\033\033\033\034\034\034\035\035\036\036\037\037 !!\"#$%&')*,.0359:999999999::::;;;<<==>??@ABCDEFHIJLLKKJIIHHGGFFEEDDCCBBAAA@@???>>>=======<<<<<<<<<<<<<<<=====:86431/.-,+*)('&&%$$##\"\"!!! \037\037\037\037\037\037\037\036\036\036\036\036\036\036\036\037\037\037\037\037\037\037 !!!\"\"##$$%&&'()*+,-./121/-,*)'&%$#\"\"! \037\037\036\036\035\035\035\034\034\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\032\033\033\033\033\034\034\034\035\035\036\036\037\037 !\"\"#$%&()+,.03699999999999999:::;;<<==>?@@ABCDFGHJKLLKJJIIHHGGFFEEDDCCBBAAA@@???>>>>========<<<<<<<<<======>=;965310.-,+*)(''&%%$###\"\"!!! \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037 !!!\"\"\"##$$%&&'()*+,-.01320.,*)(&%$##\"! \037\037\036\036\035\035\034\034\034\033\033\033\033\032\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\032\032\032\032\032\032\032\033\033\033\033\034\034\034\035\035\036\036\037\037 !\"##$&'()+-/1369888888888889999::;;<<==>?@AACDEFGIJLLLKJJIIHHGGFFEEDDCCBBAAA@@@???>>>>=>=================>>>>;975320/-,+*)(('&%%$$##\"\"\"!!! \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037 !!!!\"\"##$$%%&''()*+,-/01320.,+)('&%$#\"!! \037\037\036\036\035\035\035\034\034\034\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\034\034\034\034\035\035\036\036\037\037 !!\"#$%&'(*+-/147888777777788888999::;;<==>?@ABCDEGHJKMLKKJJIIHHGGFFEEDDCCBBAAA@@@???>>>>>>>=============>>>>>><975420/.-,**)('&&%$$###\"\"!!!! \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037 !!!\"\"\"##$$%&&'())*+,./02320.,+)('&%$#\"!! \037\037\036\036\036\035\035\034\034\034\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\034\034\035\035\035\036\036\037\037 !!\"#$%&'(*+-/1477777777777777888899::;;<==>?@ABCDFGIJLMLKKJJIIHHGGFFEEDDCCBBBAA@@@????>>>>>>>>>>====>>>>>>>???<:86421/.-,+*)(''&%%$$##\"\"\"!!! \037\037\037\037\037\037\037\037\037\037\037\037 !!!\"\"\"##$$%%&''()*+,-./12430/-+*('&%$#\"\"! \037\037\036\036\035\035\035\034\034\034\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\034\034\035\035\035\036\036\037\037 !\"\"#$%&')*,./24776666666666777778899::;;<=>>?@ABDEFHIKMLLKKJJIIHHGGFFEEDDCCBBBAA@@@@??????>>>>>>>>>>>>>>>?????<:864310.-,+*)(('&&%$$###\"\"\"!!! \037\037\037\037\037\037\037\037 !!!!\"\"###$$%%&''()*+,-.012431/-+*)'&%$##\"!! \037\037\036\036\035\035\035\034\034\034\034\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\034\034\034\035\035\035\036\036\037\037 !!\"#$$%'()*,.02566666555566666677788899:;;<=>?@ABCDFGIJLMLLKKJJIIHGGFFEEEDDCCBBBAAA@@@????????>>>>>>>>>??????@?=:865310/-,+*))('&&%%$$##\"\"\"!!!! !!!!\"\"\"##$$%%&&'())*+,-/013431/-,*)('&%$#\"!! \037\037\036\036\035\035\035\034\034\034\033\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\033\033\034\034\034\035\035\035\036\036\037\037 !!\"#$%&'()+,.025655555555555556667778899:;;<=>?@ABCEFHIKMMLLKKJJIHHGGFFEEEDDCCBBBAAA@@@@?@?????????????????@@@@=;975320/.-,+*)(''&%%$$###\"\"\"!!!!! !!!!\"\"\"###$$%%&''()*++-./023541/.,+)('&%$#\"\"! \037\037\036\036\035\035\035\034\034\034\034\033\033\033\033\033\033\033\033\032\032\032\032\032\032\032\033\033\033\033\033\033\033\033\034\034\034\034\035\035\035\036\036\037\037 !\"\"#$%&'(*+-.0355554444444445555666778899:;;<=>?@ACDEGIJLMMLLKKJIIHHGGFFEEEDDCCBBBAAAA@@@@@@?????????????@@@@A@>;975421/.-,+*)(('&&%%$$###\"\"\"!!!!! !!!!!\"\"\"\"##$$%%&&'(()*+,-./0235420.,+)('&%$##\"!! \037\037\036\036\036\035\035\035\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\035\035\035\036\036\036\037\037 !!\"##$%&'(*+-/13544444444444444455566677899:;<<=>?ABCEFHIKMMMLLKJJIIHHGGFFEEEDDCCCBBBAAA@@@@@@@@@@????@@@@@@@AAA><9764210.-,+*))(''&%%$$###\"\"\"\"!!!!! !!!!!\"\"\"\"###$$%%&&'())*+,-./1245420.-+*('&%$$#\"!! \037\037\036\036\035\035\035\035\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\035\035\035\035\036\036\037\037 !!\"#$$%&()*,-/134443333333333344445556677899:;<=>?@ABDEGIJLNMMLLKJJIIHHGGFFEEEDDCCCBBBAAAAAA@@@@@@@@@@@@@@@AAAAA><:864310/.,++*)(''&&%%$$###\"\"\"\"!!!!!!! !!!!!!!!\"\"\"###$$%%&&''()**+,-/01246520/-+*)(&&%$#\"\"! \037\037\036\036\036\035\035\035\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\035\035\035\036\036\036\037\037 !\"\"#$%&'()*,-/1433333222222333333444556677899:;<=>?@BCDFHJLNNMMLKKJJIIHHGGFFEEEDDCCCBBBAAAAAAAA@@@@@@@@@A@@@@@").append("@@?<:865320/.-,+*)(('&&%%$$$###\"\"\"\"!!!!!!!!!!!!!!!!!!!\"\"\"\"###$$%%&&'(()*+,-./01346531/-,*)('&%$#\"\"!! \037\037\036\036\036\035\035\035\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\035\035\035\035\036\036\037\037 !!\"\"#$%&'()+,.023322222222222222333344455677899:;<=>?ABDEGIKMNNMLLKKJJIIHHGGFFEEEDDCCCBBBBABAAAAAAAAA@@@@@????????=:875320/.-,+*))(''&&%%$$###\"\"\"\"\"!!!!!!!!!!!!!!!!\"\"\"\"\"###$$%%%&''())*+,-./02356531/-,+)('&%$##\"!! \037\037\036\036\036\035\035\035\035\034\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037 !!\"##$%&'(*+,.0222222111111111222223334455677899:;<=?@ACDFHJLNNMMLLKKJJIIHHGGFFEEEDDCCCCBBBBBBAAAAA@@?????>>>>>>>>=;9754210.-,+**)(('&&%%$$$###\"\"\"\"\"!!!!!!!!!!!!!!\"\"\"\"\"###$$$%%&&''()**+,-./12357631/.,+)('&%$$#\"\"! \037\037\037\036\036\036\035\035\035\035\034\034\034\034\034\034\034\033\033\033\033\033\033\033\034\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037\037 !\"\"#$$%&')*+-.0221111111111111111222233445566789:;<=>?@BCEGIKMONMMLLKKJJIIHHGGFFEEEDDDCCCBBBBBBA@@@??>>>>>=========;9764210/.-,+*)((''&&%%$$####\"\"\"\"\"\"!!!!!!!!!!\"\"\"\"\"\"####$$%%%&&'(()*++,-/0124576420.,+*)'&&%$#\"\"!! \037\037\036\036\036\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037 !!\"\"#$%&'()*+-/01111000000000000011112233345567789:;<=>@ACDFHJLONNMMLLKKJJIIHHGGFFEEEDDDCCCCCBAA@???>>=====<<<<<<<<=<9864310/.-,+*))(''&&%%$$$####\"\"\"\"\"\"\"!!!!!!\"\"\"\"\"\"\"####$$$%%&&''())*+,-./0134676420.-+*)('&%$##\"!! \037\037\037\036\036\036\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037\037 !!\"##$%&'()*,-/11000000///////000001112223344567789:;<>?@BCEGIKNONNMMLLKJJIIHHHGGFFEEEDDDDCCAA@@?>>>===<<<<;;;;;;;<<<:865320/.-,+**)(('&&%%%$$$####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"####$$$%%%&&'(()**+,-./0234687420/-,*)('&%$$#\"\"!! \037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\036\036\036\036\037\037 !\"\"#$$%&'()+,-/0000///////////////000111223344567789:<=>?ABDFHJMOONNMMLKKJJIIHHHGGFFFEEEDDCB@@?>>===<<<;;;;;::::::;;;:8753210.-,,+*)((''&&%%$$$$####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"#####$$$%%&&''(()*++,-./1235687521/-,+)('&%%$#\"\"!! \037\037\037\036\036\036\035\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\035\036\036\036\037\037\037 !!\"\"#$%%&'(*+,./00////...........////0001122334456789:;<=?@BCEGILNOONNMLLKKJJIIHHHGGFFFEEDCBA??>==<<<;;;::::::9999:::::9754210/.-,+*))(''&&%%%$$$#####\"\"\"\"\"\"\"\"\"\"\"\"\"\"#####$$$%%%&&''())*+,-./01245787531/.,+*('&&%$##\"!! \037\037\036\036\036\036\035\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\035\036\036\036\036\037\037 !!\"##$%&'()*+,.0///.................///000112234456789:;<>?ABDFHKMPOONMMLLKKJJIIHHHGGFFDCCBA@>>=<<;;;:::9999999999999999764310/.-,+**)((''&&%%%$$$######\"\"\"\"\"\"\"\"\"\"######$$$%%%&&''(()**+,-./01245798531/.,+*)('&%$##\"\"!! \037\037\037\036\036\036\036\035\035\035\035\035\035\035\034\034\034\034\034\034\034\035\035\035\035\035\035\035\036\036\036\036\037\037\037 !!\"\"##$%&'()*+-.//....-------------....///00112234556789:<=>@BCEGJLOPOONMMLLKKJJIIHHHGEDCBAA@?==<;;:::9998888888888888889764320/.-,++*))(''&&&%%$$$$#######\"\"\"\"\"\"#######$$$$%%%&&''(()*++,-./013467986310.-+*)('&%$$#\"\"!! \037\037\037\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\037\037\037 !!\"\"#$$%&'()*,-/...------,,,,,,,------...//0011223455678:;<>?ABDFIKNPPONNMMLLKKJJIIHGFDCBA@??><<;::99988877777777777777788653210.--,+*))((''&&%%%$$$$##################$$$$%%%&&''(())*+,,-./123468986420.-,*)('&%%$##\"\"!! \037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\037\037\037 !!!\"##$%%&'()+,-..----,,,,,,,,,,,,,,,----..///001223456789:;=>@BCEHJMOPOONNMMLLKKJJHGFDCBA@?>>=;;:9998877776666666666666777654210/.-,+**)((''&&&%%%$$$$################$$$$%%%&&&''(()**+,-./0123568:96420/-,+)('&&%$##\"\"!! \037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\037\037\037 !!\"\"##$%&''(*+,.---,,,,,+++++++++++,,,,----..//001223456789:<=?ABDGILNPPOONNMMLLKJHGFDCBA@?>==<::99887766665555555555555666654210/.-,++*))((''&&%%%%$$$$$#############$$$$$%%%&&''(())*++,-./0124578:97421/-,+*)('&%$$#\"\"!! \037\037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\037\037\037\037 !!\"\"#$$%&'()*+,--,,,,+++++++++++++++++,,,---..//00123345678:;<>@BDFHJMPPPOONNMLLJIGFDCBA@?>=<<;9988776665555444444444445555664320/.-,,+**)((''&&&%%%$$$$$$##########$$$$$$%%%&&&''(())*+,,-./0134579:97531/.,+*)('&%%$##\"\"!! \037\037\037\036\036\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\036\037\037\037 !!\"\"##$%%&'()*+--,,,++++*************++++,,,---.//00123345689:<=?ACEGILOQPPOONMMKIHFECBA@?>=<;;:88776655544443333333333344445543210/.-,+**))((''&&&%%%$$$$$$$$####$$$$$$$$%%%%&&'''(()**+,--./0234679;:7531/.-+*)('&%%$##\"\"!! \037\037\037\037\036\036\036\036\036\036\036\036\035\035\035\035\035\036\036\036\036\036\036\036\036\037\037\037\037 !!\"\"##$%&&'()*,,,,+++******)))))))******+++,,,--../00123456789;<>@BDFHKNQQPPONMKJHFECBA@?>=<;::977665544433333222222222333334443210/.-,++*))((''&&&%%%%$$$$$$$$$$$$$$$$$$%%%%&&&''(())*++,-./01235689;:75310.-,*)('&&%$$#\"\"\"!! \037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037 !!!\"\"#$$%&''()+,,+++****)))))))))))))))****+++,,--../0012345679:;=?ACEGJMPQQPONLJHGEDBA@?>=<;:99866554433332222221111122222233344210/.-,,+**)(((''&&&%%%%$$$$$$$$$$$$$$$$%%%%&&&'''(()**+,,-./0123568:;:86420.-,+*)('&%$$##\"\"!! \037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037 !!\"\"##$$%&'()*+,++***))))))((((((((())))))***++,,--../0012345689;<>@BDFILORQPOLKIGEDBA@?>=<;:988755443332221111111111111111122233310/.--,+**))(('''&&&%%%%%$$$$$$$$$$$$%%%%%&&&&''(())**+,--./0124578:<;86420/-,+*)('&%%$##\"\"!!! \037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037 !!!\"\"##$%%&'()*+++**))))((((((((((((((((())))**+++,,-../011235678:;=?ACEHKNQROMKIGFDCA@?><;;:98776443322211110000000000000001111223210/.-,++**)(((''&&&&%%%%%%$$$$$$$$$%%%%%&&&&'''(())*++,-.//1234578:<;86421/.,+*)('&&%$$##\"\"!! \037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037 !!\"\"##$$%&&'()*+**))))(((('''''''''''''(((()))***++,,-../012345679:<>@BDGJMPPNLJHFDCA@?><;:998766533222110000//////////////00001112210/.-,,+**))(('''&&&&%%%%%%%%$$$%%%%%%%%&&&'''(())**+,,-./01234679;<;96431/.-+*)(''&%$$##\"\"!!! \037\037\037\037\037\037\036\036\036\036\036\036\036\036\036\037\037\037\037\037\037 !!!\"\"##$$%&''()***)))(((''''''''&&&''''''''((()))**++,,-../01234578:;=?ACFHKOOMJIGECB@?><;:9887655422111000////............/////0001110/.--,++*))((('''&&&&%%%%%%%%%%%%%%%%%&&&&''((())**+,--./01235689;=<975310.-,*)(('&%%$##\"\"\"!!! \037\037\037\037\037\037\037\037\036\036\036\036\036\037\037\037\037\037\037\037\037 !!!\"\"\"##$%%&'()**)))(((''''&&&&&&&&&&&&&&&''''((()))**+,,-../01235679:<>@BEGJMMKIGEDBA?>=;:98776544321100///.....----------.....///00010//.-,++**))(('''&&&&&%%%%%%%%%%%%%%&&&&&'''(())**++,-../01245689;=<975310.-,+*)('&&%$$##\"\"!!! \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037 !!!\"\"##$$%&&'()*))((('''&&&&&&%%%%%%%%%&&&&&&'''((())**+,,-.//01345689;=?ADFILLJHFDBA?>=;:9876654332100//....------,,,,,,,------...//0000/.-,,+**))((('''&&&&&%%%%%%%%%%%%&&&&&'''((())**+,,-./01234578:<=<:75320/-,+*)('&&%$$##\"\"\"!!! \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037 !!!\"\"\"##$$%&&'()))(('''&&&&%%%%%%%%%%%%%%%%%&&&&'''(())**+,,-./01234579:<>@CEHKKIGECA@>=<:987655432210//...---,,,,,,,,,,,,,,,,,,---...//00/.--,++**))((''''&&&&&&%%%%%%%%&&&&&&''''(())**++,--./01234678:<>=:86420/.,+*)(''&%%$$##\"\"!!! \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037 !!!\"\"##$$%%&''())((''&&&&%%%%%$$$$$$$$$$$%%%%%&&&&''(())**+,,-./01235689;=?ADGJIGECB@>=<:987654432110/...--,,,,++++++++++++++++,,,,---..///..-,,+**))(((''''&&&&&&&&%%&&&&&&&&''''((())**++,-../01234679:<>=:86421/.-+*)(('&%%$$##\"\"\"!!! \037\037\037\037\037\037\037\037\037\037\037\037 !!!\"\"\"##$$%%&'()(('''&&&%%%$$$$$$$$$$$$$$$$$$$%%%&&&'''(()**+,,-./0134578:<>@CFIHFDB@?=<;987654332110/.---,,,++++**************++++,,,---..//.-,,++**))(((''''&&&&&&&&&&&&&&&&''''((()))**+,,-.//01245689;<>=;86421/.-,+*)('&&%$$###\"\"!!!! \037\037\037\037\037\037\037\037\037 !!!!\"\"###$$%&&'(((''&&&%%%$$$$$#############$$$$$%%%&&&''(()**+,--./1234679;=?BEHGECA?><;987654322100/.--,,+++******)))))))))))*****+++,,--../.--,++**))((((''''&&&&&&&&&&&&&&'''''((())**++,--./012345689;=?>;964310.-,+*)(''&%%$$##\"\"\"!!!! \037\037\037 !!!!\"\"\"##$$%%&''((''&&%%%$$$$#######\"\"\"\"\"#######$$$$%%%&&''(()**+,-./0124578:<>ACFECA@><;:8765432110//..,,+++***))))))(((((((())))))***+++,,--...-,,+***))((('''''&&&&&&&&&&&&'''''((()))**+,,-../01234578:;=?>;975310/-,+*)(''&%%$$###\"\"!!!!! !!!!\"\"\"##$$%%&'((''&&%%$$$#####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"#####$$$%%&&&'(()**+,-./0134679;=@BEDB@>=;:8765432100/..--++***))))(((((((((((((((((())))**+++,,-..-,,++**)))(((''''''&&&&&&&&''''''((()))**++,,-.//01234678:<=?><975320/.,+*))('&&%%$$##\"\"\"!!!! !!!!\"\"\"##$$$%&&'('&&%%%$$####\"\"\"\"\"\"!!!!!!!!!\"\"\"\"\"\"####$$$%%&&''()**+,-./023568:<?ADCA?=<:9765432100/.--,,***)))((((''''''''''''''''(((()))**++,,----,++***))((((''''''''''''''''''(((()))**++,--./001235679:<>@?<975420/.-,+*)('&&%%$$###\"\"\"!!!!! !!!!\"\"\"\"##$$%%&&''&&%%$$$###\"\"\"\"!!!!!!!!!!!!!!!!!\"\"\"\"####$$%%&&''()**+,-.0124579;>@CA?><:986543210//.--,++*))((((''''&&&&&&&&&&&&&'''''((()))**++,,--,,++**)))((((''''''''''''''''(((()))**++,,-../012345689;<>@?<:86421/.-,+*)(''&%%$$###\"\"\"!!!!!! !!!!!!\"\"\"###$$%%&''&&%%$$###\"\"\"!!!!!! !!!!!!\"\"\"###$$%%&&''()*+,-./013568:<?B@><;986543210/..-,,++*)((('''&&&&&&%%%%%%%%%&&&&&&''''((())**+,,--,++***)))((((''''''''''''''(((()))***++,,-../012345689;=>@?=:864210.-,+*)(('&&%%$$###\"\"\"!!!!!! !!!!!!\"\"\"\"##$$%%&&'&&%$$$##\"\"\"!!!! !!!!\"\"\"###$$%%&''()*+,-./124579;>A?=;:87543210/.--,++**)((''&&&&%%%%%%%%%%%%%%%%%%%&&&&'''(())**++,-,,++**)))(((((('''''''''''((((()))**++,,--.//01234578:;=?A@=:864310.-,+*))('&&%%$$###\"\"\"\"!!!!!!!!! !!!!!!!!\"\"\"\"###$$%%&&&&%$$##\"\"\"!!!! \037\037\037\037\037\037\037\037\037\037\037\037\037 !!!\"\"\"##$$%%&''()*+,-.013468:=?=<:87643210/.--,++*))(''&&&%%%%$$$$$$$$$$$$$$$$$%%%%&&&'''(())*++,,,++***)))((((((''''''''(((((()))***++,,-../011235678:<=?A@=;865310/.,+**)(''&%%$$$###\"\"\"\"!!!!!!!!!!!!!!!!!\"\"\"\"###$$$%%&&&%$$##\"\"!!! \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037 !!!\"\"##$$%%&'(()*+,./023579<><:97643210/.-,,+**))((&&&%%%$$$$$##############$$$$$%%%&&'''(()**+,,,++***)))(((((((((((((((((())))**++,,--../012345679:<>?A@=;975320/.-,+*)(('&&%%$$###\"\"\"\"\"!!!!!!!!!!!!!!!\"\"\"\"\"###$$%%&&&%$$##\"\"!!! \037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037 !!\"\"\"#$$%%&'())*,-./12468;=;98653210/.-,++*))((''%%%$$$$######\"\"\"\"\"\"\"\"\"#######$$$%%%&&''(()**+,,++***))))(((((((((((((((())))***++,,--.//012345689;<>@BA>;975321/.-,+*)(('&&%%$$$###\"\"\"\"\"!!!!!!!!!!!!!\"\"\"\"\"###$$$%%&&%$$#\"\"!!! \037\037\037\037\036\036\036\036\036\036\036\035\035\035\035\035\035\035\036\036\036\036\036\036\036\037\037\037\037 !!!\"\"##$%%&'()*+,-/023579<:8654210/.-,+**)((''&&%$$$####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"####$$$%%%&&''())*+,,++***))))(((((((((((((())))***+++,,-../0012345789;<>@BA><975421/.-,+*))(''&&%%$$####\"\"\"\"\"!!!!!!!!!!!\"\"\"\"\"####$$%%&&%$##\"\"!! \037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\037\037\037 !!\"\"##$%%&'()*+,./12468:9754210/.-,+**)(('&&&%$$###\"\"\"\"!!!!!!!!!!!!!!!!!\"\"\"\"\"###$$%%&&''(()*+,+++***)))))(((((((((()))))****++,,--.//012335678:;=>@BA><:864210.-,+**)(''&&%%$$$###\"\"\"\"\"\"\"!!!!!!!\"\"\"\"\"\"\"###$$$%%&%$##\"\"!! \037\037\037\036\036\036\036\035\035\035\035\035\035\035\034\034\034\034\034\034\034\034\034\035\035\035\035\035\035\035\036\036\036\036\037\037\037 !!\"\"##$%%&'()*+-.013579764310/.-,+*))(''&&%%$##\"\"\"\"!!!!! !!!!!!\"\"\"###$$%%&&'(()*+,++****))))))((((((())))))***+++,,--.//012345678:;=?ACB?<:864310/.-,+*)(('&&%%%$$####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"####$$%%%%$##\"\"!! \037\037\036\036\036\036\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\036\036\036\037\037\037 !!\"##$%&&'()+,-/0246864320/.-,+*)(('&&%%$$#\"\"\"!!!! \037\037\037\037\037\037\037 !!!!\"\"\"###$$%&&''()*++++***))))))))))))))))))***+++,,--../0012345679:<=?ACB?=:865320/.-,+*))(''&&%%$$$####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"####$$$%%%$##\"!! \037\037\037\036\036\036\035\035\035\034\034\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037 !!\"##$%&'()*+,./13575320/.-,+*)(('&&%$$$##\"!!! \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037 !!!!\"\"##$$%%&''()*+++****))))))))))))))))****+++,,--.//0112345689:<>?ACB?=;875320/.-,+*))(''&&%%%$$$####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"#####$$$%%$##\"!! \037\037\036\036\036\035\035\035\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\035\035\035\036\036\036\037\037 !!\"##$%&'()*+-.0245421/.-,+*)(''&%%$$##\"\"! \037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037 !!!\"\"##$$%&&'()*+++*****)))))))))))))****+++,,--..//0123456789;<>@BDC@=;975321/.-,+**)((''&&%%$$$#####\"\"\"\"\"\"\"\"\"\"\"\"\"#####$$$%%$$#\"!! \037\037\036\036\035\035\035\034\034\034\034\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\033\034\034\034\034\035\035\035\036\036\036\037\037 !!\"##$%&'()+,./134310.-,+*)('&&%$$##\"\"!! \037\037\037\037\036\036\036\036\036\036\036\035\035\035\035\035\035\035\035\035\036\036\036\036\036\036\036\037\037\037\037 !!\"\"##$$%&&'()*+++*****))))))))))*****+++,,,--../0012345678:;=>@BDC@=;9754210/-,,+*)((''&&%%%$$$#####\"\"\"\"\"\"\"\"\"\"\"#####$$$$%%$#\"!! \037\037\036\036\036\035\035\034\034\034\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\034\034\035\035\035\036\036\037\037 !\"##$%&'(*+-.02310.-,+*)('&&%$$##\"\"!! \037\037\037\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\037\037\037 !!\"\"##$%&&'()*+++******))))))******++++,,--..//0112345679:;=?@BDC@>;9764310/.-,+*))(''&&%%%$$$$######\"\"\"\"\"\"\"######$$$$%%$#\"!! \037\037\036\036\035\035\035\034\034\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\032\033\033\033\033\034\034\034\035\035\036\036\037\037 !\"##$%&()*,-/120/-,+*)('&%%$##\"\"!! \036\036\036\036\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\036\036\036\037\037\037 !!\"##$%%&'()*+++*****************+++,,,--..//0122345689:<=?ACEDA><:864310/.-,+**)((''&&%%%$$$###################$$$%%$#\"!! \037\037\036\036\035\035\034\034\034\033\033\033\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\033\033\033\033\034\034\035\035\035\036\037\037 !\"#$%&'()+,.01/.,+*)('&%%$##\"!! \037\037\036\035\035\035\035\034\034\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037 !!\"\"#$%%&'()*+++***************+++,,,---.//00123456789:<>?ACEDA><:865320/.-,++*)((''&&%%%$$$$#################$$$$%$#\"!! \037\037\036\036\035\035\034\034\033\033\033\032\032\032\032\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\031\032\032\032\033\033\033\034\034\034\035\035\036\036\037 !\"#$%&'(*+-//.-+*)('&%$$#\"\"!! \037\037\036\036\035\035\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\035\035\035\036\036\037\037\037 !\"\"#$$%&'()++++************+++++,,,--..//01123456789;<>@ACEDA?<:865321/.-,,+*))(''&&&%%%$$$$###############$$$$%$#\"\"! \037\037\036\035\035\034\034\033\033\033\032\032\032\031\031\031\031\031\030\030\030\030\030\030\030\030\030\027\027\027\027\027\027\030\030\030\030\030\030\030\030\030\031\031\031\031\032\032\032\033\033\033\034\034\035\035\036\036\037 !\"#$%&')*,..-+*)('&%$##\"!! \037\037\036\036\036\035\034\034\034\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\034\034\034\035\035\035\036\036\037\037 !!\"#$$%&'(*++++**********+++++,,,---../00122345678:;=>@BDFDB?=:8754210/.-,+*))((''&&%%%$$$$$#############$$$$$%$#\"! \037\037\036\035\035\034\034\033\033\032\032\032\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\031\032\032\032\033\033\034\034\035\035\036\036\037 !\"#$%'()+--,*)('&%$##\"!! \037\037\036\036\036\035\035\035\034\033\033\033\033\032\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\032\032\033\033\033\033\034\034\034\035\035\035\036\036\037\037 !!\"#$$%&')*+++++******++++++,,,,--..//00123345679:;=>@BDFEB?=;9754210/.-,+**)((''&&&%%%$$$$$$##########$$$$$%$#\"! \037\036\036\035\035\034\034\033\033\032\032\031\031\031\031\030\030\030\030\027\027\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\032\032\032\033\033\034\034\035\036\036\037 !\"#$&'(*,,+)('&%$#\"\"! \037\037\036\036\035\035\034\034\034\033\033\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\033\033\033\034\034\034\035\035\036\036\037\037 !\"#$$%'()*+++++++++++++++,,,,---..//01123456789:<=?@BDGEB@=;9764310/.-,++*))((''&&%%%%$$$$$$#######$$$$$$%$#\"! \037\036\036\035\035\034\033\033\032\032\032\031\031\031\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\030\030\030\030\031\031\031\032\032\033\033\034\034\035\036\036\037 !\"\"$%&')++)('&%$#\"\"! \037\037\036\036\035\035\035\034\034\033\033\032\032\032\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\031\032\032\032\033\033\033\034\034\034\035\035\036\036\037 !\"#$$&'()++++++++++++++,,,,---..//001223456789;<=?ACEGEC@=;9764320/.-,,+*))((''&&&%%%%$$$$$$$$$$$$$$$$$$$#\"! \037\036\036\035\034\034\033\033\032\032\031\031\031\030\030\030\027\027\027\027\027\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\026\026\027\027\027\027\030\030\030\030\031\031\032\032\033\033\034\034\035\035\036\037 !\"#$%&(**('&%$#\"!! \037\037\036\036\035\035\034\034\033\033\033\032\031\031\031\031\030\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\030\030\031\031\031\031\032\032\032\032\033\033\034\034\035\035\036\036\037\037 !\"#$%&'(*++++++++++++,,,,,---..//001233456789;<>?ACEGFC@><:865321/.--,+**)(('''&&%%%%$$$$$$$$$$$$$$$$$%#\"! \037\037\036\035\034\034\033\033\032\032\031\031\030\030\030\027\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\027\027\027\030\030\030\031\031\031\032\032\033\033\034\035\035\036\037 !\"#$&'))'&%$#\"! \037\036\036\035\035\034\034\033\033\033\032\032\032\031\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\031\032\032\032\033\033\034\034\035\035\036\037\037 !\"#$%&'(*++++++++++,,,,,---..//001123445679:;<>@ACEHFC@><:8653210/.-,+**))((''&&&%%%%$$$$$$$$$$$$$$$%$#! \037\037\036\035\034\034\033\032\032\031\031\031\030\030\027\027\027\027\026\026\026\026\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\025\025\026\026\026\026\027\027\027\030\030\030\031\031\032\032\033\033\034\035\035\036\037 !\"#%&('&%$#\"! \037\036\036\035\034\034\033\033\033\032\032\032\031\031\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\030\030\030\030\031\031\031\032\032\033\033\033\034\035\035\036\036\037 !\"#$%&')*,,+++++,,,,,,---...//001223456789:;=>@BDFHFCA><:8754210/.-,++*))(('''&&&%%%%$$$$$$$$$$$$$%$#\"! \037\036\035\034\034\033\032\032\031\031\030\030\030\027\027\027\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\026\026\026\026\027\027\027\030\030\031\031\032\032\033\033\034\035\035\036\037 !\"$%&&%$#\"! \037\037\036\035\035\034\034\033\033\032\032\031\031\031\031\030\027\027\027\027\026\026\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\026\026\027\027\027\027\027\030\030\030\031\031\031\032\032\033\033\034\034\035\036\036\037 !\"#$%&()+,,,,,,,,,,,----..///011233456789:<=?@BDFHGDA?<:9754210/.-,,+**)(((''&&&%%%%%%$$$$$$$$$%%%#\"! \037\036\035\034\034\033\032\032\031\031\030\030\027\027\027\026\026\026\025\025\025\025\024\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\024\025\025\025\025\025\026\026\026\027\027\027\030\030\031\031\032\033\033\034\035\035\036\037 !#$%%$#\"! \037\036\036\035\034\034\033\033\032\032\032\031\031\030\030\030\030\027\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\027\027\027\027\030\030\030\031\031\031\032\032\033\034\034\035\035\036\037 !\"#$%'(*,,,,,,,,,,----...//0011234456789;<=?@BDFIGDA?=;9754310/.--,+**))(('''&&&%%%%%%%$$$$$%%%%$\"! \037\036\035\034\033\033\032\032\031\030\030\027\027\027\026\026\026\025\025\025\025\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\025\025\025\025\026\026\026\027\027\030\030\031\031\032\032\033\034\035\036\036\037!\"#$$#\"! \037\036\036\035\034\034\033\033\032\032\031\031\030\030\030\027\027\027\026\026\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\025\026\026\026\026\027\027\027\030\030\030\031\031\032\032\033\033\034\035\035\036\037 !\"#$&')*,,,,,,,,----...///001223455678:;<>?ACEGIGDB?=;97643210/.-,++*))(('''&&&&%%%%%%%%%%%%%%$#! \037\036\035\034\033\033\032\031\031\030\030\027\027\026\026\026\025\025\025\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\023\023\024\024\024\024\025\025\025\025\026\026\027\027\030\030\031\031\032\032\033\034\035\036\037 !\"##\"! \037\036\035\035\034\033\033\032\032\031\031\030\030\030\027\027\027\026\026\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\026\026\026\027\027\027\030\030\030\031\031\032\033\033\034\034\035\036\037 !\"#$&')+,,,,,------...//0011233456789:;<>?ACEGIHEB?=;98653210/.-,++**))(('''&&&&%%%%%%%%%%%%%#\" \037\036\035\034\033\033\032\031\031\030\030\027\027\026\026\025\025\025\024\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\024\024\024\024\025\025\025\026\026\026\027\027\030\030\031\032\032\033\034\035\036\037 !\"\"! \037\036\035\035\034\033\033\032\031\031\030\030\030\027\027\027\026\026\026\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\025\025\025\025\026\026\026\027\027\027\030\030\031\031\032\032\033\034\034\035\036\037 !\"#%&(*,,,-------...///0011233456789:;=>@ACEGJHEB@>;:8653210/.-,,+**))(('''&&&&&%%%%%%%%%%%$\"! \036\035\034\034\033\032\031\031\030\027\027\026\026\026\025\025\024\024\024\024\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\022\023\023\023\023\023\024\024\024\025\025\025\026\026\027\027\030\030\031\032\032\033\034\035\036\037 !! \037\036\035\034\034\033\032\032\031\031\030\030\027\027\027\026\026\026\025\025\025\024\024\024\023\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\023\023\024\024\024\024\024\025\025\025\025\026\026\027\027\027\030\030\031\031\032\033\033\034\035\036\037 !\"$%')+--------....//00112234456789:<=>@BDEHJHEC@><:8654210/.--,++*))((('''&&&&&%%%%%%%%%$#! \037\036\034\034\033\032\031\030\030\027\027\026\026\025\025\025\024\024\024\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\023\024\024\024\025\025\026\026\026\027\030\030\031\031\032\033\034\035\036\037 \037\036\035\034\033\033\032\031\031\030\030\027\027\027\026\026\025\025\025\025\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\024\024\024\024\025\025\025\026\026\027\027\030\030\031\031\032\033\033\034\035\036\037 !#$&')+------....///00112334566789;<=?@BDFHJIFC@><:8754310/..-,++**))((''''&&&&&%%%%%%%%#\" \037\036\035\034\033\032\031\030\030\027\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\024\024\024\025\025\026\026\027\027\030\031\031\032\033\034\035\036\037\037\036\035\034\033\033\032\031\031\030\030\027\027\026\026\025\025\025\024\024\024\024\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\022\023\023\023\023\024\024\024\024\025\025\025\026\026\027\027\030\030\031\032\032\033\034\035\036\037 \"#$&(*,----....///00112233456789:;<>?ABDFHHFDCA><:97643210/.-,,+**))((('''&&&&&&&%%%%%$\"!\037\036\035\034\033\032\031\030\030\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\022\022\022\022\023\023\023\024\024\025\025\026\026\027\027\030\031\031\032\033\034\035\036\036\035\034\033\032\032\031\030\030\027\027\026\026\025\025\025\024\024\024\023\023\023\023\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\020\020\020\020\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\023\024\024\024\025\025\026\026\027\027\030\030\031\032\032\033\034\035\036\037 \"#%')+--.....////00112234456789:;<>?ACDFGECB@?=<;97643210/.-,,++*)))((''''&&&&&&&&&&%#! \036\035\034\033\032\031\030\030\027\026\026\025\025\024\024\023\023\023\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\020\020\021\021\021\021\022\022\022\022\023\023\024\024\024\025\025\026\027\027\030\031\031\032\033\034\035\035\034\033\032\031\031\030\030\027\026\026\026\025\025\024\024\024\023\023\023\023\022\022\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\022\022\022\022\022\023\023\023\024\024\024\025\025\026\026\027\027\030\031\031\032\033\034\035\036\037!\"$%'*,......///001112334556789:;=>@ACEGDBA?=<;:987653210/.--,++**))(((''''&&&&&&&&%#\" \036\035\034\033\032\031\030\027\027\026\026\025\024\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\021\022\022\022\022\023\023\024\024\025\025\026\026\027\030\031\031\032\033\034\034\033\032\031\031\030\027\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\021\021\020\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\022\023\023\023\024\024\024\025\025\026\027\027\030\031\031\032\033\034\035\036 !\"$&(+-....///0001122334567789;<=>@ACEDB@><;:97665433210/..-,,+**)))(('''''&&&&&&&$\" \037\035\034\033\032\031\030\027\027\026\025\025\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\022\022\022\023\023\023\024\024\025\026\026\027\030\031\031\032\033\033\032\031\030\030\027\026\026\025\025\024\024\024\023\023\023\022\022\022\021\021\021\021\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\021\021\021\021\022\022\022\023\023\023\024\024\025\025\026\026\027\030\030\031\032\033\034\035\036 !#%'),...////001112234456789:;<=?@BCCA?=;:976543321100///.-,,++**))((('''''&&&&&%#!\037\036\034\033\032\031\030\027\027\026\025\025\024\024\023\023\022\022\021\021\021\020\020\020\020\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\020\020\020\020\021\021\021\022\022\022\023\023\024\024\025\025\026\027\030\031\031\032\032\031\030\027\027\026\026\025\025\024\024\023\023\022\022\022\022\021\021\021\021\020\020\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\022\022\022\023\023\023\024\024\025\025\026\027\027\030\031\032\033\034\035\037 \"#%(*-.////0001122334556789:;<>?@BB@><:9765432110//..---,,,,++**)))((('''''&&&&$\" \036\035\033\032\031\030\027\026\026\025\024\024\023\023\022\022\022\021\021\020\020\020\020\017\017\017\017\017\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\016\017\017\017\017\017\020\020\020\021\021\021\022\022\023\023\023\024\025\025\026\027\030\031\032\031\030\027\027\026\025\025\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\020\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\020\020\020\020\021\021\021\021\022\022\023\023\024\024\025\025\026\027\027\030\031\032\033\034\035\037 \"$&),////00011122344566789:;=>?AB?=;986543210/..--,,++++*******)))((('''''''&%\" \037\035\034\032\031\030\027\026\026\025\024\024\023\023\022\022\021\021\020\020\020\020\017\017\017\017\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\017\017\017\017\020\020\020\021\021\021\022\022\023\023\024\024\025\026\027\030\031\030\027\026\026\025\024\024\023\023\022\022\022\021\021\021\020\020\020\020\017\017\017\017\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\017\017\017\017\017\020\020\020\020\021\021\021\022\022\023\023\024\024\025\026\026\027\030\031\032\033\034\036\037!#%'*-//000011223344567789:<=>@A><:8754310//.-,,++***)))((((((((((((((''''''&#!\037\035\034\033\031\030\027\026\026\025\024\023\023\022\022\021\021\021\020\020\020\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\r\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\023\023\024\024\025\026\027\030\027\026\025\025\024\024\023\023\022\022\021\021\021\020\020\020\020\017\017\017\017\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\022\023\024\024\025\025\026\027\030\031\032\033\034\036 !#&(+//00011122334556789:;<=>@>;9764310/.-,,+**))(((''''&&&&&&&&&&&''''''''$\" \036\034\033\031\030\027\026\025\025\024\023\023\022\022\021\021\020\020\020\017\017\017\016\016\016\016\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\016\016\016\016\017\017\017\020\020\020\021\021\022\022\023\023\024\025\026\027\026\025\024\024\023\023\022\022\021\021\021\020\020\020\017\017\017\017\016\016\016\016\016\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\023\023\024\025\025\026\027\030\031\032\033\035\036 \"$'*-000011223344566789:;<=?=:864310/.-,+**)(('''&&&%%%%%$$$$$$$%%%%%%&&&%# \036\035\033\032\030\027\026\025\025\024\023\022\022\021\021\020\020\020\017\017\017\016\016\016\r\r\r\r\r\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\016\017\017\017\020\020\021\021\022\022\023\023\024\025\026\025\024\024\023\022\022\021\021\021\020\020\020\017\017\017\016\016\016\016\016\r\r\r\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\016\016\016\016\017\017\017\020\020\020\021\021\022\022\023\024\024\025\026\027\030\031\032\033\035\037 #%(+/00111223344567789:;<><:75320/.-,+*)(('&&%%%$$$#################$$$%$!\037\035\033\032\031\027\026\025\024\024\023\022\022\021\021\020\020\017\017\017\016\016\016\r\r\r\r\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\r\r\r\r\r\016\016\016\017\017\017\020\020\021\021\022\022\023\024\025\024\023\023\022\022\021\021\020\020\017\017\017\016\016\016\016\r\r\r\r\r\r\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\017\017\017\020\020\020\021\022\022\023\023\024\025\026\027\030\031\032\034\035\037!#&)-01112223345567889:;=<96421/.,+*)(('&&%%$$##\"\"\"\"!!!!!!!!!!!!!!!\"\"\"\"#\" \036\034\032\031\027\026\025\024\023\023\022\021\021\020\020\017\017\017\016\016\016\r\r\r\f\f\f\f\f\f\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\r\016\016\016\017\017\017\020\020\021\022\022\023\024\023\022\022\021\021\020\020\017\017\017\016\016\016\016\r\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\r\016\016\016\016\017\017\020\020\021\021\022\022\023\024\025\026\027\030\031\032\034\036 \"$'+/111223344566789:;<;86310.,+*)('&&%$$##\"\"!!! \037\037\037\037\037\037\037\037\037\037\037\037 ! \036\034\032\031\027\026\025\024\023\023\022\021\021\020\020\017\017\016\016\016\r\r\r\f\f\f\f\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\f\f\f\f\f\r\r\r\016\016\016\017\017\020\020\021\021\022\023\022\021\021\020\020\017\017\017\016\016\016\r\r\r\r\f\f\f\f\f\f\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\f\f\f\f\r\r\r\r\016\016\016\017\017\020\020\021\021\022\023\024\024\025\027\030\031\032\034\036 #&)-112223344566789:;:7520.-+*)('&%$##\"\"!! \037\037\037\036\036\036\036\036\036\036\035\035\035\035\035\035\036\036\036\036\036\036\036\037\037\037\035\033\031\030\026\025\024\023\022\022\021\020\020\017\017\016\016\016\r\r\r\f\f\f\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\f\r\r\r\016\016\016\017\017\020\020\021\022\021\020\020\017\017\017\016\016\016\r\r\r\f\f\f\f\f\013\013\013\013\013\013\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\f\f\f\f\r\r\r\016\016\016\017\017\020\021\021\022\023\023\024\025\026\030\031\033\035\037!$'+022233445567789::741/-,*)'&%$$#\"!! \037\037\036\036\036\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\033\031\030\026\025\024\023\022\021\021\020\017\017\016\016\016\r\r\f\f\f\f\013\013\013\013\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\r\016\016\017\017\020\020\021\020\020\017\017\016\016\r\r\r\f\f\f\f\013\013\013\013\013\013\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\r\016\016\017\017\020\020\021\022\022\023\024\025\026\030\031\033\035\037\"%)-222334456678999630.,*)'&%$#\"!! \037\037\036\036\035\035\035\034\034\034\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\032\030\026\025\024\023\022\021\020\020\017\017\016\016\r\r\f\f\f\013\013\013\013\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\f\r\r\r\016\016\017\017\020\017\017\016\016\r\r\r\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\f\f\r\r\016\016\017\017\020\021\021\022\023\024\025\026\030\031\033\036 #'+0233445566789952/-+)'&%$#\"! \037\037\036\035\035\034\034\034\033\033\033\032\032\032\032\031\031\031\031\031\031\031\031\030\030\030\030\031\031\031\031\031\031\031\031\031\032\032\030\027\025\024\023\022\021\020\020\017\016\016\r\r\f\f\f\013\013\013\013\n\n\n\n\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\r\r\r\016\016\017\016\016\r\r\r\f\f\f\013\013\013\013\n\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\n\n\n\n\013\013\013\013\f\f\f\r\r\016\016\017\017\020\021\022\023\024\025\026\030\032\034\036!%).33344556778841.,*(&%#\"! \037\037\036\035\035\034\033\033\033\032\032\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\027\025\024\023\022\021\020\017\017\016\r\r\f\f\f\013\013\013\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\r\r\016\016\r\r\f\f\f\013\013\013\013\n\n\n\n\t\t\t\t\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\n\013\013\013\f\f\f\r\r\016\016\017\020\021\022\023\024\025\026\030\032\034\037\"&+1344456678830-*(&%#\"! \037\036\035\034\034\033\033\032\032\031\031\030\030\030\027\027\027\027\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\026\025\024\023\021\021\020\017\016\016\r\r\f\f\013\013\013\n\n\n\t\t\t\t\t\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\013\013\013\f\f\r\r\f\f\f\013\013\013\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\t\t\t\t\n\n\n\n\013\013\013\f\f\r\r\016\017\017\020\021\022\024\025\026\030\032\035 $)/3445566772/,)'%#\" \037\036\035\034\034\033\032\032\031\031\030\030\027\027\027\026\026\026\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\024\022\021\020\017\017\016\r\r\f\f\013\013\n\n\n\n\t\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\t\t\t\t\n\n\n\013\013\013\f\f\f\013\013\n\n\n\n\t\t\t\t\b\b\b\b\b\b\b\b\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\t\t\t\t\n\n\n\013\013\013\f\f\r\016\016\017\020\021\022\023\025\027\031\033\036!&,344556771-*(%#\" \037\036\035\034\033\032\031\031\030\030\027\027\026\026\025\025\025\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\022\021\020\017\016\r\r\f\f\013\013\n\n\n\t\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\b\b\b\b\b\t\t\t\t\n\n\n\013\013\013\n\n\n\t\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\b\b\b\b\t\t\t\t\n\n\n\013\013\f\r\r\016\017\020\021\022\023\025\027\031\034\037#)04556660,)&$\" \037\035\034\033\032\031\031\030\027\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\020\017\016\r\f\f\013\013\n\n\n\t\t\t\b\b\b\b\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\b\b\b\b\t\t\t\n\n\n\n\t\t\t\t\b\b\b\b\007\007\007\007\007\007\007\007\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\b\t\t\t\n\n\n\013\013\f\r\r\016\017\020\022\023\025\027\031\035!&,45566/+'$\" \036\035\034\033\031\031\030\027\026\026\025\025\024\024\023\023\022\022\022\022\021\021\021\021\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\017\016\r\r\f\013\013\n\n\t\t\t\b\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\b\t\t\t\t\t\b\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\t\t\t\n\n\013\013\f\r\016\017\020\021\023\025\027\032\036\")1565.)%# \036\035\033\032\031\030\027\026\025\025\024\023\023\022\022\022\021\021\021\020\020\020\020\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\r\f\013\013\n\n\t\t\b\b\b\b\007\007\007\007\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\007\007\007\007\b\b\b\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\007\007\007\007\b\b\b\t\t\n\n\013\f\f\r\016\020\021\023\025\030\033\037%-54,'# \036\034\033\031\030\027\026\025\024\024\023\022\022\021\021\020\020\020\017\017\017\017\016\016\016\016\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\f\013\n\n\t\t\b\b\b\007\007\007\007\006\006\006\006\006\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\006\006\006\006\006\007\007\007\007\007\007\007\007\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\006\006\006\006\007\007\007\007\b\b\t\t\n\n\013\f\r\016\017\021\023\025\030\034!)3*%!\036\034\032\031\027\026\025\024\023\022\022\021\021\020\020\017\017\016\016\016\016\r\r\r\r\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\n\n\t\t\b\b\007\007\007\006\006\006\006\006\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\006\006\006\006\007\007\007\b\b\t\n\n\013\f\r\017\020\022\025\031\036%(\"\037\034\032\030\026\025\024\023\022\021\021\020\017\017\016\016\r\r\r\f\f\f\f\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\t\b\b\007\007\007\006\006\006\006\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\006\006\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\005\005\005\005\005\006\006\006\007\007\b\b\t\t\n\013\f\016\020\022\026\032 \037\034\031\027\025\024\023\022\021\020\017\016\016\r\r\f\f\f\013\013\013\013\n\n\n\n\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\006\006\006\005\005\005\005\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\005\005\005\005\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\005\005\005\005\006\006\007\007\b\b\t\n\f\r\017\022\026\034\030\026\024\022\021\020\017\016\016\r\f\f\013\013\013\n\n\n\t\t\t\t\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\006\006\005\005\005\005\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\004\004\004\004\005\005\005\006\006\007\007\b\t\013\f\017\022\024\022\021\017\016\r\f\f\013\013\n\n\t\t\t\b\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\004\004\004\005\005\006\007\b\t\013\016\016\r\f\013\n\n\t\b\b\b\007\007\007\006\006\006\006\006\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\003\003\003\003\004\004\005\006\007\t\t\b\007\007\006\006\006\005\005\005\005\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\002\002\002\003\003\004\004\004\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000").toString()).getBytes(StandardCharsets.ISO_8859_1); +945 +946 /** +947 * Given a 1D int index between 0 and 65535 (both inclusive), this treats the 1D index as two parts (lightness and +948 * hue angle, both from 0 to 255) and gets the distance from grayscale to the edge of the gamut at that lightness +949 * and hue. The index can be constructed from a lightness value {@code L} from 0 to 255, and a hue value {@code H} +950 * from 0 to 255 with: {@code (L << 8 | H)} or the simpler equivalent {@code (L * 256 + H)}. These assume L and H +951 * have been limited to the 0 to 255 range already. This does not bounds-check index. Because hue is not typically +952 * measured between 0 and 255, getting that value is a bit different; you can use +953 * {@link MathTools#atan2_(float, float)} (with an Oklab color's B for y, then its A for x) and multiply it by 256 +954 * to get H. +955 * <br> +956 * The distance this returns is a byte between 0 and 82 (both inclusive), as the Euclidean distance from the center +957 * grayscale value at the lightness in the index, to the edge of the gamut at the same lightness, along the hue in +958 * the index. This is measured in a space from -1 to 1 for both A and B, with the 0 in the center meaning grayscale, +959 * and multiplied by 256 to get a meaningful byte value. To return to the A and B values Oklab uses here, you would +960 * need to use some trigonometry on the hue (if it's in the 0 to 1 range, you can call +961 * {@link MathTools#cos_(float)} on the hue to almost get A, and {@link MathTools#sin_(float)} to almost get B), +962 * then multiply each of those by the distance, divide each by 256.0, and add 0.5. +963 * <br> +964 * Only intended for the narrow cases where external code needs read-only access to the internal Oklab gamut data. +965 * The gamut data is quite large (the Oklab ColorTools file is 236 KB at the time of writing, while the IPT_HQ +966 * ColorTools file is just 56 KB, with the main difference being the sizable exact gamut), so it's better to have +967 * direct read access to it without being able to accidentally rewrite it. +968 * @param index must be between 0 and 65535; the upper 8 bits are lightness and the lower 8 are hue angle. +969 * @return a byte (always between 0 and 82, inclusive) representing the Euclidean distance between a grayscale value and the most saturated value possible, using the above measurements +970 */ +971 public static byte getRawGamutValue(int index){ +972 return GAMUT_DATA[index]; +973 } +974 +975 /** +976 * Returns true if the given packed float color, as Oklab, is valid to convert losslessly back to RGBA. +977 * @param packed a packed float color as Oklab +978 * @return true if the given packed float color can be converted back and forth to RGBA 979 */ -980 public static float maximizeSaturation(final float packed) { -981 final int decoded = BitConversion.floatToRawIntBits(packed); -982 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -983 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -984 final float hue = MathTools.atan2_(B, A); -985 final int idx = (decoded & 0xff) << 8 | (int) (256f * hue); -986 final float dist = GAMUT_DATA[idx] * 0x1p-8f; -987 return BitConversion.intBitsToFloat( -988 (decoded & 0xFE0000FF) | -989 (int) (MathTools.cos_(hue) * dist * 127.999f + 127.999f) << 8 | -990 (int) (MathTools.sin_(hue) * dist * 127.999f + 127.999f) << 16); -991 } -992 -993 /** -994 * Gets the color with the same L as the Oklab color stored in the given packed float, but the furthest A -995 * B from gray possible for that lightness while keeping the same hue as the given color. This is very -996 * similar to calling {@link #enrich(float, float)} with a very large {@code change} value. -997 * @param L lightness component; will be clamped between 0 and 1 if it isn't already -998 * @param A green-to-red chromatic component; will be clamped between 0 and 1 if it isn't already -999 * @param B blue-to-yellow chromatic component; will be clamped between 0 and 1 if it isn't already -1000 * @param alpha alpha component; will be clamped between 0 and 1 if it isn't already -1001 * @return the color that is as far from grayscale as this can get while keeping the L and hue of packed -1002 * @see #limitToGamut(float, float, float, float) You can use limitToGamut() if you only want max saturation for out-of-gamut colors. -1003 */ -1004 public static float maximizeSaturation(float L, float A, float B, float alpha) { -1005 L = Math.min(Math.max(L, 0f), 1f); -1006 A = Math.min(Math.max(A, 0f), 1f); -1007 B = Math.min(Math.max(B, 0f), 1f); -1008 alpha = Math.min(Math.max(alpha, 0f), 1f); -1009 final float A2 = (A - 0.5f); -1010 final float B2 = (B - 0.5f); -1011 final float hue = MathTools.atan2_(B2, A2); -1012 final int idx = (int) (L * 255.999f) << 8 | (int) (256f * hue); -1013 final float dist = GAMUT_DATA[idx] * 0x1p-8f; -1014 return BitConversion.intBitsToFloat( -1015 (int) (alpha * 127.999f) << 25 | -1016 (int) (MathTools.sin_(hue) * dist * 127.999f + 127.999f) << 16 | -1017 (int) (MathTools.cos_(hue) * dist * 127.999f + 127.999f) << 8 | -1018 (int) (L * 255.999f)); -1019 } -1020 /** -1021 * Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside -1022 * the gamut at the same lightness, or if it is already in-gamut, returns the color as-is. -1023 * @param packed a packed float color in Oklab format; often this color is not in-gamut -1024 * @return the first color this finds that is in-gamut, as if it was moving toward a grayscale color with the same L -1025 * @see #inGamut(float) You can use inGamut() if you just want to check whether a color is in-gamut. -1026 */ -1027 public static float limitToGamut(final float packed) { -1028 final int decoded = BitConversion.floatToRawIntBits(packed); -1029 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -1030 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -1031 final float hue = MathTools.atan2_(B, A); -1032 final int idx = (decoded & 0xff) << 8 | (int) (256f * hue); -1033 final float dist = GAMUT_DATA[idx] * 0x1p-8f; -1034 if (dist >= (float) Math.sqrt(A * A + B * B)) -1035 return packed; -1036 return BitConversion.intBitsToFloat( -1037 (decoded & 0xFE0000FF) | -1038 (int) (MathTools.cos_(hue) * dist * 127.999f + 127.999f) << 8 | -1039 (int) (MathTools.sin_(hue) * dist * 127.999f + 127.999f) << 16); -1040 } -1041 -1042 /** -1043 * Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside -1044 * the gamut at the same lightness, or if it is already in-gamut, returns the color as-is. This always produces -1045 * an opaque color. -1046 * @param L lightness component; will be clamped between 0 and 1 if it isn't already -1047 * @param A green-to-red chromatic component; will be clamped between 0 and 1 if it isn't already -1048 * @param B blue-to-yellow chromatic component; will be clamped between 0 and 1 if it isn't already -1049 * @return the first color this finds that is in-gamut, as if it was moving toward a grayscale color with the same L -1050 * @see #inGamut(float, float, float) You can use inGamut() if you just want to check whether a color is in-gamut. -1051 */ -1052 public static float limitToGamut(float L, float A, float B) { -1053 return limitToGamut(L, A, B, 1f); -1054 } -1055 -1056 /** -1057 * Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside -1058 * the gamut at the same lightness, or if it is already in-gamut, returns the color as-is. -1059 * @param L lightness component; will be clamped between 0 and 1 if it isn't already -1060 * @param A green-to-red chromatic component; will be clamped between 0 and 1 if it isn't already -1061 * @param B blue-to-yellow chromatic component; will be clamped between 0 and 1 if it isn't already -1062 * @param alpha alpha component; will be clamped between 0 and 1 if it isn't already -1063 * @return the first color this finds that is in-gamut, as if it was moving toward a grayscale color with the same L -1064 * @see #inGamut(float, float, float) You can use inGamut() if you just want to check whether a color is in-gamut. -1065 */ -1066 public static float limitToGamut(float L, float A, float B, float alpha) { -1067 L = Math.min(Math.max(L, 0f), 1f); -1068 A = Math.min(Math.max(A, 0f), 1f); -1069 B = Math.min(Math.max(B, 0f), 1f); -1070 alpha = Math.min(Math.max(alpha, 0f), 1f); -1071 final float A2 = (A - 0.5f); -1072 final float B2 = (B - 0.5f); -1073 final float hue = MathTools.atan2_(B2, A2); -1074 final int idx = (int) (L * 255.999f) << 8 | (int)(256f * hue); -1075 final float dist = GAMUT_DATA[idx] * 0x1p-8f; -1076 if(dist >= (float) Math.sqrt(A2 * A2 + B2 * B2)) -1077 return oklab(L, A, B, alpha); -1078 return BitConversion.intBitsToFloat( -1079 (int) (alpha * 127.999f) << 25 | -1080 (int) (MathTools.sin_(hue) * dist * 127.999f + 127.999f) << 16 | -1081 (int) (MathTools.cos_(hue) * dist * 127.999f + 127.999f) << 8 | -1082 (int) (L * 255.999f)); -1083 } -1084 +980 public static boolean inGamut(final float packed) +981 { +982 final int decoded = BitConversion.floatToRawIntBits(packed); +983 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 255f; +984 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 255f; +985 final byte g = GAMUT_DATA[(decoded & 0xff) << 8 | (int)(256f * MathTools.atan2_(B, A))]; +986 return g * g * 0x1p-18 >= (A * A + B * B); +987 } +988 +989 /** +990 * Returns true if the given Oklab values are valid to convert losslessly back to RGBA. +991 * @param L lightness channel, as a float from 0 to 1 +992 * @param A green-to-red chromatic channel, as a float from 0 to 1 +993 * @param B blue-to-yellow chromatic channel, as a float from 0 to 1 +994 * @return true if the given Oklab channels can be converted back and forth to RGBA +995 */ +996 public static boolean inGamut(float L, float A, float B) +997 { +998 A = (A - 0.5f); +999 B = (B - 0.5f); +1000 final byte g = GAMUT_DATA[((int)(L * 255.999f) << 8) | (int)(256f * MathTools.atan2_(B, A))]; +1001 return g * g * 0x1p-18 >= (A * A + B * B); +1002 } +1003 +1004 /** +1005 * Gets the color with the same L as the Oklab color stored in the given packed float, but the furthest A +1006 * B from gray possible for that lightness while keeping the same hue as the given color. This is very +1007 * similar to calling {@link #enrich(float, float)} with a very large {@code change} value. +1008 * @param packed a packed float color in Oklab format; does not need to be in-gamut +1009 * @return the color that is as far from grayscale as this can get while keeping the L and hue of packed +1010 * @see #limitToGamut(float) You can use limitToGamut() if you only want max saturation for out-of-gamut colors. +1011 */ +1012 public static float maximizeSaturation(final float packed) { +1013 final int decoded = BitConversion.floatToRawIntBits(packed); +1014 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +1015 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +1016 final float hue = MathTools.atan2_(B, A); +1017 final int idx = (decoded & 0xff) << 8 | (int) (256f * hue); +1018 final float dist = GAMUT_DATA[idx]; +1019 return BitConversion.intBitsToFloat( +1020 (decoded & 0xFE0000FF) | +1021 (int) (MathTools.cos_(hue) * dist + 128f) << 8 | +1022 (int) (MathTools.sin_(hue) * dist + 128f) << 16); +1023 } +1024 +1025 /** +1026 * Gets the color with the same L as the Oklab color stored in the given packed float, but the furthest A +1027 * B from gray possible for that lightness while keeping the same hue as the given color. This is very +1028 * similar to calling {@link #enrich(float, float)} with a very large {@code change} value. +1029 * @param L lightness component; will be clamped between 0 and 1 if it isn't already +1030 * @param A green-to-red chromatic component; will be clamped between 0 and 1 if it isn't already +1031 * @param B blue-to-yellow chromatic component; will be clamped between 0 and 1 if it isn't already +1032 * @param alpha alpha component; will be clamped between 0 and 1 if it isn't already +1033 * @return the color that is as far from grayscale as this can get while keeping the L and hue of packed +1034 * @see #limitToGamut(float, float, float, float) You can use limitToGamut() if you only want max saturation for out-of-gamut colors. +1035 */ +1036 public static float maximizeSaturation(float L, float A, float B, float alpha) { +1037 L = Math.min(Math.max(L, 0f), 1f); +1038 A = Math.min(Math.max(A, 0f), 1f); +1039 B = Math.min(Math.max(B, 0f), 1f); +1040 alpha = Math.min(Math.max(alpha, 0f), 1f); +1041 final float A2 = (A - 0.5f); +1042 final float B2 = (B - 0.5f); +1043 final float hue = MathTools.atan2_(B2, A2); +1044 final int idx = (int) (L * 255.999f) << 8 | (int) (256f * hue); +1045 final float dist = GAMUT_DATA[idx]; +1046 return BitConversion.intBitsToFloat( +1047 (int) (alpha * 127.999f) << 25 | +1048 (int) (MathTools.sin_(hue) * dist + 128f) << 16 | +1049 (int) (MathTools.cos_(hue) * dist + 128f) << 8 | +1050 (int) (L * 255.999f)); +1051 } +1052 +1053 /** +1054 * Gets the hue of the given Oklab float color, but as Oklab understands hue rather than how HSL does. +1055 * This is different from {@link #hue(float)}, which uses HSL. This gives a float between 0 (inclusive) +1056 * and 1 (exclusive). +1057 * +1058 * @param packed a packed Oklab float color +1059 * @return a float between 0 (inclusive) and 1 (exclusive) that represents hue in the Oklab color space +1060 */ +1061 public static float oklabHue(final float packed) { +1062 final int decoded = BitConversion.floatToRawIntBits(packed); +1063 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +1064 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +1065 return MathTools.atan2_(B, A); +1066 } +1067 +1068 /** +1069 * Gets the saturation of the given Oklab float color, but as Oklab understands saturation rather than how HSL does. +1070 * Saturation here is a fraction of the chroma limit (see {@link #chromaLimit(float, float)}) for a given hue and +1071 * lightness, and is between 0 and 1. This gives a float between 0 (inclusive) and 1 (inclusive). +1072 * +1073 * @param packed a packed Oklab float color +1074 * @return a float between 0 (inclusive) and 1 (inclusive) that represents saturation in the Oklab color space +1075 */ +1076 public static float oklabSaturation(final float packed) { +1077 final int decoded = BitConversion.floatToRawIntBits(packed); +1078 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +1079 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +1080 final float hue = MathTools.atan2_(B, A); +1081 final int idx = (decoded & 0xff) << 8 | (int) (256f * hue); +1082 final float dist = GAMUT_DATA[idx]; +1083 return (float) Math.sqrt(A * A + B * B) * 256f / dist; +1084 } 1085 /** -1086 * Produces a random packed float color that is always in-gamut (and opaque) and should be uniformly distributed. -1087 * @param random a Random object (preferably a subclass of Random, like -1088 * {@link com.github.tommyettinger.ds.support.LaserRandom}) -1089 * @return a packed float color that is always in-gamut -1090 */ -1091 public static float randomColor(Random random) { -1092 float L = random.nextFloat(); -1093 float A = random.nextFloat(); -1094 float B = random.nextFloat(); -1095 while (!inGamut(L, A, B)) { -1096 L = random.nextFloat(); -1097 A = random.nextFloat(); -1098 B = random.nextFloat(); -1099 } -1100 return oklab(L, A, B, 1f); -1101 } -1102} +1086 * Gets the lightness of the given Oklab float color, but as Oklab understands lightness rather than how HSL does. +1087 * This is different from {@link #lightness(float)}, which uses HSL. This gives a float between 0 (inclusive) +1088 * and 1 (inclusive). +1089 * <br> +1090 * This is the same as {@link #channelL(float)}. +1091 * +1092 * @param packed a packed Oklab float color +1093 * @return a float between 0 (inclusive) and 1 (inclusive) that represents lightness in the Oklab color space +1094 */ +1095 public static float oklabLightness(final float packed){ +1096 return (BitConversion.floatToRawIntBits(packed) & 0xff) / 255f; +1097 } +1098 +1099 /** +1100 * A different way to specify an Oklab color, using hue, saturation, lightness, and alpha like a normal HSL(A) color +1101 * but calculating them directly in the Oklab color space. This is more efficient than +1102 * {@link #floatGetHSL(float, float, float, float)}, but for colors with less than 0.5f lightness, it can be very +1103 * unpredictable in how it handles saturation. Most colors between 0.5 and 0.75 hue that also have less than 0.5 +1104 * lightness are extremely desaturated and close to gray, regardless of what you give for saturation, and these +1105 * colors suddenly jump to very saturated around 0.75 hue and higher. To avoid this issue, you may prefer using +1106 * {@link #oklabByHCL(float, float, float, float)}, which takes an absolute chroma as opposed to the saturation here +1107 * (which is a fraction of the maximum chroma). +1108 * <br> +1109 * Note that this takes a different value for its {@code hue} that the method {@link #hue(float)} produces, just +1110 * like its {@code saturation} and the method {@link #saturation(float)}, and {@code lightness} and the method +1111 * {@link #lightness(float)}. The hue is just distributed differently, and the lightness should be equivalent to +1112 * {@link #channelL(float)}, but the saturation here refers to what fraction the chroma should be of the maximum +1113 * chroma for the given hue and lightness. You can use {@link #oklabHue(float)}, {@link #oklabSaturation(float)}, +1114 * and {@link #oklabLightness(float)} to get the hue, saturation, and lightness values from an existing color that +1115 * this will understand ({@link #alpha(float)} too). +1116 * @param hue between 0 and 1, usually, but this will automatically wrap if too high or too low +1117 * @param saturation will be clamped between 0 and 1 +1118 * @param lightness will be clamped between 0 and 1 +1119 * @param alpha will be clamped between 0 and 1 +1120 * @return a packed Oklab float color that tries to match the requested hue, saturation, and lightness +1121 */ +1122 public static float oklabByHSL(float hue, float saturation, float lightness, float alpha) { +1123 lightness = Math.min(Math.max(lightness, 0f), 1f); +1124 saturation = Math.min(Math.max(saturation, 0f), 1f); +1125 hue -= (int)(hue + 0x1p14) - 0x4000; +1126 alpha = Math.min(Math.max(alpha, 0f), 1f); +1127 final int idx = (int) (lightness * 255.999f) << 8 | (int) (256f * hue); +1128 final float dist = GAMUT_DATA[idx] * saturation; +1129 return BitConversion.intBitsToFloat( +1130 (int) (alpha * 127.999f) << 25 | +1131 (int) (MathTools.sin_(hue) * dist + 128f) << 16 | +1132 (int) (MathTools.cos_(hue) * dist + 128f) << 8 | +1133 (int) (lightness * 255.999f)); +1134 } +1135 +1136 /** +1137 * A different way to specify an Oklab color, using hue, chroma, lightness, and alpha something like a normal HSL(A) +1138 * color but calculating them directly in the Oklab color space. This has you specify the desired chroma directly, +1139 * as obtainable with {@link #chroma(float)}, rather than the saturation, which is a fraction of the maximum chroma +1140 * (saturation is what {@link #oklabByHSL(float, float, float, float)} uses). Note that this takes a different value +1141 * for its {@code hue} that the method {@link #hue(float)} produces, just like {@code lightness} and the method +1142 * {@link #lightness(float)}. The hue is just distributed differently, and the lightness should be equivalent to +1143 * {@link #channelL(float)}. If you use this to get two colors with the same chroma and lightness, but different +1144 * hue, then the resulting colors should have similar colorfulness unless one or both chroma values exceeded the +1145 * gamut limit (you can get this limit with {@link #chromaLimit(float, float)}). If a chroma value given is greater +1146 * than the chroma limit, this clamps chroma to that limit. You can use {@link #oklabHue(float)}, +1147 * {@link #chroma(float)}, and {@link #oklabLightness(float)} to get the hue, chroma, and lightness values from an +1148 * existing color that this will understand ({@link #alpha(float)} too). +1149 * @param hue between 0 and 1, usually, but this will automatically wrap if too high or too low +1150 * @param chroma will be clamped between 0 and the maximum chroma possible for the given hue and lightness +1151 * @param lightness will be clamped between 0 and 1 +1152 * @param alpha will be clamped between 0 and 1 +1153 * @return a packed Oklab float color that tries to match the requested hue, chroma, and lightness +1154 */ +1155 public static float oklabByHCL(float hue, float chroma, float lightness, float alpha) { +1156 lightness = Math.min(Math.max(lightness, 0f), 1f); +1157 chroma = Math.max(chroma, 0f); +1158 hue -= (int)(hue + 0x1p14) - 0x4000; +1159 alpha = Math.min(Math.max(alpha, 0f), 1f); +1160 final int idx = (int) (lightness * 255.999f) << 8 | (int) (256f * hue); +1161 final float dist = Math.min(chroma * 128f, GAMUT_DATA[idx]); +1162 return BitConversion.intBitsToFloat( +1163 (int) (alpha * 127.999f) << 25 | +1164 (int) (MathTools.sin_(hue) * dist + 128f) << 16 | +1165 (int) (MathTools.cos_(hue) * dist + 128f) << 8 | +1166 (int) (lightness * 255.999f)); +1167 } +1168 +1169 /** +1170 * Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside +1171 * the gamut at the same lightness, or if it is already in-gamut, returns the color as-is. +1172 * @param packed a packed float color in Oklab format; often this color is not in-gamut +1173 * @return the first color this finds that is in-gamut, as if it was moving toward a grayscale color with the same L +1174 * @see #inGamut(float) You can use inGamut() if you just want to check whether a color is in-gamut. +1175 */ +1176 public static float limitToGamut(final float packed) { +1177 final int decoded = BitConversion.floatToRawIntBits(packed); +1178 final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +1179 final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +1180 final float hue = MathTools.atan2_(B, A); +1181 final int idx = (decoded & 0xff) << 8 | (int) (256f * hue); +1182 final float dist = GAMUT_DATA[idx]; +1183 if (dist * 0x1p-8f >= (float) Math.sqrt(A * A + B * B)) +1184 return packed; +1185 return BitConversion.intBitsToFloat( +1186 (decoded & 0xFE0000FF) | +1187 (int) (MathTools.cos_(hue) * dist + 128f) << 8 | +1188 (int) (MathTools.sin_(hue) * dist + 128f) << 16); +1189 } +1190 +1191 /** +1192 * Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside +1193 * the gamut at the same lightness, or if it is already in-gamut, returns the color as-is. This always produces +1194 * an opaque color. +1195 * @param L lightness component; will be clamped between 0 and 1 if it isn't already +1196 * @param A green-to-red chromatic component; will be clamped between 0 and 1 if it isn't already +1197 * @param B blue-to-yellow chromatic component; will be clamped between 0 and 1 if it isn't already +1198 * @return the first color this finds that is in-gamut, as if it was moving toward a grayscale color with the same L +1199 * @see #inGamut(float, float, float) You can use inGamut() if you just want to check whether a color is in-gamut. +1200 */ +1201 public static float limitToGamut(float L, float A, float B) { +1202 return limitToGamut(L, A, B, 1f); +1203 } +1204 +1205 /** +1206 * Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside +1207 * the gamut at the same lightness, or if it is already in-gamut, returns the color as-is. +1208 * @param L lightness component; will be clamped between 0 and 1 if it isn't already +1209 * @param A green-to-red chromatic component; will be clamped between 0 and 1 if it isn't already +1210 * @param B blue-to-yellow chromatic component; will be clamped between 0 and 1 if it isn't already +1211 * @param alpha alpha component; will be clamped between 0 and 1 if it isn't already +1212 * @return the first color this finds that is in-gamut, as if it was moving toward a grayscale color with the same L +1213 * @see #inGamut(float, float, float) You can use inGamut() if you just want to check whether a color is in-gamut. +1214 */ +1215 public static float limitToGamut(float L, float A, float B, float alpha) { +1216 L = Math.min(Math.max(L, 0f), 1f); +1217 A = Math.min(Math.max(A, 0f), 1f); +1218 B = Math.min(Math.max(B, 0f), 1f); +1219 alpha = Math.min(Math.max(alpha, 0f), 1f); +1220 final float A2 = (A - 0.5f); +1221 final float B2 = (B - 0.5f); +1222 final float hue = MathTools.atan2_(B2, A2); +1223 final int idx = (int) (L * 255.999f) << 8 | (int)(256f * hue); +1224 final float dist = GAMUT_DATA[idx]; +1225 if(dist * 0x1p-9F >= (float) Math.sqrt(A2 * A2 + B2 * B2)) +1226 return oklab(L, A, B, alpha); +1227 return BitConversion.intBitsToFloat( +1228 (int) (alpha * 127.999f) << 25 | +1229 (int) (MathTools.sin_(hue) * dist + 128f) << 16 | +1230 (int) (MathTools.cos_(hue) * dist + 128f) << 8 | +1231 (int) (L * 255.999f)); +1232 } +1233 /** +1234 * Given a packed float Oklab color, this edits its L, A, B, and alpha channels by adding the corresponding "add" +1235 * parameter and then clamping. This returns a different float value (of course, the given float can't be edited +1236 * in-place). You can give a value of 0 for any "add" parameter you want to stay unchanged. This clamps the +1237 * resulting color to remain in-gamut, so it should be safe to convert it back to RGBA. +1238 * @param encoded a packed float Oklab color +1239 * @param addL how much to add to the L channel; typically in the -1 to 1 range +1240 * @param addA how much to add to the A channel; typically in the -1 to 1 range +1241 * @param addB how much to add to the B channel; typically in the -1 to 1 range +1242 * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range +1243 * @return a packed float Oklab color with the requested edits applied to {@code encoded} +1244 */ +1245 public static float editOklab(float encoded, float addL, float addA, float addB, float addAlpha) { +1246 return editOklab(encoded, addL, addA, addB, addAlpha, 1f, 1f, 1f, 1f); +1247 } +1248 /** +1249 * Given a packed float Oklab color, this edits its L, A, B, and alpha channels by first multiplying each channel by +1250 * the corresponding "mul" parameter and then adding the corresponding "add" parameter, before clamping. This means +1251 * the lightness value {@code L} is multiplied by {@code mulL}, then has {@code addL} added, and then is clamped to +1252 * the normal range for L (0 to 1). This returns a different float value (of course, the given float can't be edited +1253 * in-place). You can give a value of 0 for any "add" parameter you want to stay unchanged, or a value of 1 for any +1254 * "mul" parameter that shouldn't change. Note that this manipulates A and B in the -0.5 to 0.5 range, so if you +1255 * multiply by a small number like {@code 0.25f}, then this will produce a less-saturated color, and if you multiply +1256 * by a larger number like {@code 4f}, then you will get a much more-saturated color. This clamps the resulting +1257 * color to remain in-gamut, so it should be safe to convert it back to RGBA. +1258 * @param encoded a packed float Oklab color +1259 * @param addL how much to add to the L channel; typically in the -1 to 1 range +1260 * @param addA how much to add to the A channel; typically in the -1 to 1 range +1261 * @param addB how much to add to the B channel; typically in the -1 to 1 range +1262 * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range +1263 * @param mulL how much to multiply the L channel by; should be non-negative +1264 * @param mulA how much to multiply the A channel by; usually non-negative (not always) +1265 * @param mulB how much to multiply the B channel by; usually non-negative (not always) +1266 * @param mulAlpha how much to multiply the alpha channel by; should be non-negative +1267 * @return a packed float Oklab color with the requested edits applied to {@code encoded} +1268 */ +1269 public static float editOklab(float encoded, float addL, float addA, float addB, float addAlpha, +1270 float mulL, float mulA, float mulB, float mulAlpha) { +1271 final int decoded = BitConversion.floatToRawIntBits(encoded); +1272 float L = (decoded & 0xff) / 255f; +1273 float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +1274 float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +1275 float alpha = (decoded >>> 25) / 127f; +1276 +1277 L = Math.min(Math.max(L * mulL + addL, 0f), 1f); +1278 A = Math.min(Math.max(A * mulA + addA * 2f, -1f), 1f) * 0.5f; +1279 B = Math.min(Math.max(B * mulB + addB * 2f, -1f), 1f) * 0.5f; +1280 alpha = Math.min(Math.max(alpha * mulAlpha + addAlpha, 0f), 1f); +1281 final float hue = MathTools.atan2_(B, A); +1282 final int idx = (int) (L * 255.999f) << 8 | (int)(256f * hue); +1283 final float dist = GAMUT_DATA[idx] ; +1284 if(dist * 0x1p-9f >= (float) Math.sqrt(A * A + B * B)) +1285 return oklab(L, A + 0.5f, B + 0.5f, alpha); +1286 return BitConversion.intBitsToFloat( +1287 (int) (alpha * 127.999f) << 25 | +1288 (int) (MathTools.sin_(hue) * dist + 128f) << 16 | +1289 (int) (MathTools.cos_(hue) * dist + 128f) << 8 | +1290 (int) (L * 255.999f)); +1291 } +1292 +1293 /** +1294 * Produces a random packed float color that is always in-gamut (and opaque) and should be uniformly distributed. +1295 * @param random a Random object (preferably a subclass of Random, like +1296 * {@link com.github.tommyettinger.ds.support.LaserRandom}) +1297 * @return a packed float color that is always in-gamut +1298 */ +1299 public static float randomColor(Random random) { +1300 float L = random.nextFloat(); +1301 float A = random.nextFloat(); +1302 float B = random.nextFloat(); +1303 while (!inGamut(L, A, B)) { +1304 L = random.nextFloat(); +1305 A = random.nextFloat(); +1306 B = random.nextFloat(); +1307 } +1308 return oklab(L, A, B, 1f); +1309 } +1310} diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/rgb/ColorTools.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/rgb/ColorTools.html index 50d70597..f58e98e8 100644 --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/rgb/ColorTools.html +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/rgb/ColorTools.html @@ -488,72 +488,117 @@ 475 } 476 477 /** -478 * Makes a quasi-randomly-edited variant on the given {@code color}, allowing typically a small amount of -479 * {@code variance} (such as 0.05 to 0.25) between the given color and what this can return. The {@code seed} should -480 * be different each time this is called, and can be obtained from a random number generator to make the colors more -481 * random, or can be incremented on each call. If the seed is only incremented or decremented, then this shouldn't -482 * produce two similar colors in a row unless variance is very small. The variance affects the R, G, and B of the -483 * generated color equally, and each of those channels can go up or down by the given variance as long as the total -484 * distance isn't greater than the variance. -485 * @param color a packed float color, as produced by {@link #rgb(float, float, float, float)} -486 * @param seed a long seed that should be different on each call; should not be 0 -487 * @param variance max amount of difference between the given color and the generated color; always less than 1 -488 * @return a generated packed float color that should be at least somewhat different from {@code color} -489 */ -490 public static float randomEdit(final float color, long seed, final float variance) { -491 final int decoded = BitConversion.floatToRawIntBits(color); -492 final float r = (decoded & 0xff) / 255f; -493 final float g = (decoded >>> 8 & 0xff) / 255f; -494 final float b = (decoded >>> 16 & 0xff) / 255f; -495 final float limit = variance * variance; -496 float dist, x, y, z; -497 for (int j = 0; j < 50; j++) { -498 x = (((seed * 0xD1B54A32D192ED03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance; -499 y = (((seed * 0xABC98388FB8FAC03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance; -500 z = (((seed * 0x8CB92BA72F3D8DD7L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance; -501 seed += 0x9E3779B97F4A7C15L; -502 dist = x * x + y * y + z * z; -503 x += r; -504 y += g; -505 z += b; -506 if(dist <= limit) -507 return BitConversion.intBitsToFloat((decoded & 0xFE000000) | ((int)(z * 255.999f) << 16 & 0xFF0000) -508 | ((int)(y * 255.999f) << 8 & 0xFF00) | (int)(x * 255.999f)); -509 } -510 return color; -511 } -512 -513 /** -514 * Produces a random packed float color that is always opaque and should be uniformly distributed. -515 * @param random a Random object (or preferably a subclass of Random, like {@link com.github.tommyettinger.ds.support.LaserRandom}) -516 * @return a packed float color that is always opaque -517 */ -518 public static float randomColor(Random random) { -519 final float r = random.nextFloat(), g = random.nextFloat(), b = random.nextFloat(); -520 return BitConversion.intBitsToFloat(0xFE000000 -521 | ((int) (b * 256f) << 16 & 0xFF0000) -522 | ((int) (g * 256f) << 8 & 0xFF00) -523 | ((int) (r * 256f) & 0xFF)); -524 } -525 -526 /** -527 * Limited-use; like {@link #randomColor(Random)} but for cases where you already have three floats (r, g, and b) -528 * distributed how you want. This can be somewhat useful if you are using a "subrandom" or "quasi-random" sequence, -529 * like the Halton, Sobol, or R3 sequences, to get 3D points and map them to colors. It can also be useful if you -530 * want to randomly generate the RGB channels yourself and track the values produced, as you would if you wanted to -531 * avoid generating too many colors with high blue, for instance. -532 * @param r red value to use; will be clamped between 0 and 1 -533 * @param g green value to use; will be clamped between 0 and 1 -534 * @param b blue value to use; will be clamped between 0 and 1 -535 * @return a packed float color that is always opaque -536 */ -537 public static float subrandomColor(float r, float g, float b) { -538 return BitConversion.intBitsToFloat(0xFE000000 -539 | ((int) Math.min(Math.max(b * 256f, 0), 255.999f) << 16 & 0xFF0000) -540 | ((int) Math.min(Math.max(g * 256f, 0), 255.999f) << 8 & 0xFF00) -541 | ((int) Math.min(Math.max(r * 256f, 0), 255.999f) & 0xFF)); -542 } -543} +478 * Given a packed float RGB color, this edits its red, green, blue, and alpha channels by adding the corresponding +479 * "add" parameter and then clamping. Each value is considered in the 0 to 1 range. This returns a different float +480 * value (of course, the given float can't be edited in-place). You can give a value of 0 for any "add" parameter +481 * you want to stay unchanged. +482 * @param encoded a packed float RGB color +483 * @param addR how much to add to the R channel; typically in the -1 to 1 range +484 * @param addG how much to add to the G channel; typically in the -1 to 1 range +485 * @param addB how much to add to the B channel; typically in the -1 to 1 range +486 * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range +487 * @return a packed float RGB color with the requested edits applied to {@code encoded} +488 */ +489 public static float editRGB(float encoded, float addR, float addG, float addB, float addAlpha){ +490 return editRGB(encoded, addR, addG, addB, addAlpha, 1f, 1f, 1f, 1f); +491 } +492 +493 /** +494 * Given a packed float RGB color, this edits its red, green, blue, and alpha channels by first multiplying each +495 * channel by the corresponding "mul" parameter and then adding the corresponding "add" parameter, before clamping. +496 * This means the red value {@code R} (which is considered in the 0 to 1 range) is multiplied by {@code mulR}, then +497 * has {@code addR} added, and then is clamped to the normal range for R (0 to 1). This returns a different float +498 * value (of course, the given float can't be edited in-place). You can give a value of 0 for any "add" parameter +499 * you want to stay unchanged, or a value of 1 for any "mul" parameter that shouldn't change. +500 * @param encoded a packed float RGB color +501 * @param addR how much to add to the R channel; typically in the -1 to 1 range +502 * @param addG how much to add to the G channel; typically in the -1 to 1 range +503 * @param addB how much to add to the B channel; typically in the -1 to 1 range +504 * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range +505 * @param mulR how much to multiply the R channel by; should be non-negative +506 * @param mulG how much to multiply the G channel by; should be non-negative +507 * @param mulB how much to multiply the B channel by; should be non-negative +508 * @param mulAlpha how much to multiply the alpha channel by; should be non-negative +509 * @return a packed float RGB color with the requested edits applied to {@code encoded} +510 */ +511 public static float editRGB(float encoded, float addR, float addG, float addB, float addAlpha, +512 float mulR, float mulG, float mulB, float mulAlpha){ +513 final int s = BitConversion.floatToRawIntBits(encoded), r = s & 0xFF, g = s >>> 8 & 0xFF, b = s >>> 16 & 0xFF, +514 a = s >>> 25; +515 return BitConversion.intBitsToFloat( +516 Math.max(0, Math.min(255, (int) (r * mulR + addR * 255.999f))) | +517 Math.max(0, Math.min(255, (int) (g * mulG + addG * 255.999f))) << 8 | +518 Math.max(0, Math.min(255, (int) (b * mulB + addB * 255.999f))) << 16 | +519 Math.max(0, Math.min(127, (int) (a * mulAlpha + addAlpha * 127.999f))) << 25); +520 } +521 +522 /** +523 * Makes a quasi-randomly-edited variant on the given {@code color}, allowing typically a small amount of +524 * {@code variance} (such as 0.05 to 0.25) between the given color and what this can return. The {@code seed} should +525 * be different each time this is called, and can be obtained from a random number generator to make the colors more +526 * random, or can be incremented on each call. If the seed is only incremented or decremented, then this shouldn't +527 * produce two similar colors in a row unless variance is very small. The variance affects the R, G, and B of the +528 * generated color equally, and each of those channels can go up or down by the given variance as long as the total +529 * distance isn't greater than the variance. +530 * @param color a packed float color, as produced by {@link #rgb(float, float, float, float)} +531 * @param seed a long seed that should be different on each call; should not be 0 +532 * @param variance max amount of difference between the given color and the generated color; always less than 1 +533 * @return a generated packed float color that should be at least somewhat different from {@code color} +534 */ +535 public static float randomEdit(final float color, long seed, final float variance) { +536 final int decoded = BitConversion.floatToRawIntBits(color); +537 final float r = (decoded & 0xff) / 255f; +538 final float g = (decoded >>> 8 & 0xff) / 255f; +539 final float b = (decoded >>> 16 & 0xff) / 255f; +540 final float limit = variance * variance; +541 float dist, x, y, z; +542 for (int j = 0; j < 50; j++) { +543 x = (((seed * 0xD1B54A32D192ED03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance; +544 y = (((seed * 0xABC98388FB8FAC03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance; +545 z = (((seed * 0x8CB92BA72F3D8DD7L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance; +546 seed += 0x9E3779B97F4A7C15L; +547 dist = x * x + y * y + z * z; +548 x += r; +549 y += g; +550 z += b; +551 if(dist <= limit) +552 return BitConversion.intBitsToFloat((decoded & 0xFE000000) | ((int)(z * 255.999f) << 16 & 0xFF0000) +553 | ((int)(y * 255.999f) << 8 & 0xFF00) | (int)(x * 255.999f)); +554 } +555 return color; +556 } +557 +558 /** +559 * Produces a random packed float color that is always opaque and should be uniformly distributed. +560 * @param random a Random object (or preferably a subclass of Random, like {@link com.github.tommyettinger.ds.support.LaserRandom}) +561 * @return a packed float color that is always opaque +562 */ +563 public static float randomColor(Random random) { +564 final float r = random.nextFloat(), g = random.nextFloat(), b = random.nextFloat(); +565 return BitConversion.intBitsToFloat(0xFE000000 +566 | ((int) (b * 256f) << 16 & 0xFF0000) +567 | ((int) (g * 256f) << 8 & 0xFF00) +568 | ((int) (r * 256f) & 0xFF)); +569 } +570 +571 /** +572 * Limited-use; like {@link #randomColor(Random)} but for cases where you already have three floats (r, g, and b) +573 * distributed how you want. This can be somewhat useful if you are using a "subrandom" or "quasi-random" sequence, +574 * like the Halton, Sobol, or R3 sequences, to get 3D points and map them to colors. It can also be useful if you +575 * want to randomly generate the RGB channels yourself and track the values produced, as you would if you wanted to +576 * avoid generating too many colors with high blue, for instance. +577 * @param r red value to use; will be clamped between 0 and 1 +578 * @param g green value to use; will be clamped between 0 and 1 +579 * @param b blue value to use; will be clamped between 0 and 1 +580 * @return a packed float color that is always opaque +581 */ +582 public static float subrandomColor(float r, float g, float b) { +583 return BitConversion.intBitsToFloat(0xFE000000 +584 | ((int) Math.min(Math.max(b * 256f, 0), 255.999f) << 16 & 0xFF0000) +585 | ((int) Math.min(Math.max(g * 256f, 0), 255.999f) << 8 & 0xFF00) +586 | ((int) Math.min(Math.max(r * 256f, 0), 255.999f) & 0xFF)); +587 } +588} diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/rgb/SimplePalette.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/rgb/SimplePalette.html index b311232c..ebd839d2 100644 --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/rgb/SimplePalette.html +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/rgb/SimplePalette.html @@ -18,884 +18,882 @@ 005import com.github.tommyettinger.ds.ObjectList; 006import com.github.tommyettinger.colorful.pure.FloatColors; 007 -008import java.util.Comparator; +008import static com.github.tommyettinger.colorful.pure.rgb.ColorTools.*; 009 -010import static com.github.tommyettinger.colorful.pure.rgb.ColorTools.*; -011 -012/** -013 * A palette of predefined colors as packed RGB floats, the kind {@link ColorTools} works with, plus a way to describe -014 * colors by combinations and adjustments. The description code is probably what you would use this class for; it -015 * revolves around {@link #parseDescription(String)}, which takes a color description String and returns a packed float -016 * color. The color descriptions look like "darker rich mint sage", where the order of the words doesn't matter. They -017 * can optionally include lightness changes (light/dark), and saturation changes (rich/dull), and must include one or -018 * more color names that will be mixed together (repeats are allowed to use a color more heavily). The changes can be -019 * suffixed with "er", "est", or "most", such as "duller", "lightest", or "richmost", to progressively increase their -020 * effect on lightness or saturation. +010/** +011 * A palette of predefined colors as packed RGB floats, the kind {@link ColorTools} works with, plus a way to describe +012 * colors by combinations and adjustments. The description code is probably what you would use this class for; it +013 * revolves around {@link #parseDescription(String)}, which takes a color description String and returns a packed float +014 * color. The color descriptions look like "darker rich mint sage", where the order of the words doesn't matter. They +015 * can optionally include lightness changes (light/dark), and saturation changes (rich/dull), and must include one or +016 * more color names that will be mixed together (repeats are allowed to use a color more heavily). The changes can be +017 * suffixed with "er", "est", or "most", such as "duller", "lightest", or "richmost", to progressively increase their +018 * effect on lightness or saturation. +019 * <br> +020 * The rest of this is about the same as in {@link Palette}. 021 * <br> -022 * The rest of this is about the same as in {@link Palette}. -023 * <br> -024 * You can access colors by their constant name, such as {@code CACTUS}, by the {@link #NAMED} map using -025 * {@code NAMED.get("cactus", 0f)}, or by index in the FloatList called {@link #LIST}. Note that to access a float -026 * color from NAMED, you need to give a default value if the name is not found; {@code 0f} is a good default because it -027 * is used for fully-transparent. You can access the names in a specific order with {@link #NAMES} (which is -028 * alphabetical), {@link #NAMES_BY_HUE} (which is sorted by the hue of the matching color, from red to yellow to blue -029 * (with gray around here) to purple to red again), or {@link #NAMES_BY_LIGHTNESS} (which is sorted by the intensity of -030 * the matching color, from darkest to lightest). Having a name lets you look up the matching color in {@link #NAMED}. -031 */ -032public class SimplePalette { -033 /** -034 * You can look up colors by name here; the names are lower-case, and the colors are packed floats in rgba format. -035 */ -036 public static final ObjectFloatOrderedMap<String> NAMED = new ObjectFloatOrderedMap<>(60); -037 /** -038 * Stores alternative names for colors in {@link #NAMED}, like "grey" as an alias for {@link #GRAY} or "gold" as an -039 * alias for {@link #SAFFRON}. Currently, the list of aliases is as follows: -040 * <ul> -041 * <li>"grey" maps to {@link #GRAY},</li> -042 * <li>"gold" maps to {@link #SAFFRON},</li> -043 * <li>"puce" maps to {@link #MAUVE},</li> -044 * <li>"sand" maps to {@link #TAN},</li> -045 * <li>"skin" maps to {@link #PEACH},</li> -046 * <li>"coral" maps to {@link #SALMON},</li> -047 * <li>"azure" maps to {@link #SKY}, and</li> -048 * <li>"ocean" maps to {@link #TEAL}, and</li> -049 * <li>"sapphire" maps to {@link #COBALT}.</li> -050 * </ul> -051 * Note that these aliases are not duplicated in {@link #NAMES}, {@link #NAMES_BY_HUE}, or -052 * {@link #NAMES_BY_LIGHTNESS}; they are primarily there so blind attempts to name a color might still work. -053 */ -054 public static final ObjectFloatOrderedMap<String> ALIASES = new ObjectFloatOrderedMap<>(10); -055 /** -056 * Lists the packed float color values in this, in no particular order. Does not include duplicates from aliases. -057 */ -058 public static final FloatList LIST = new FloatList(50); -059 -060 /** -061 * This color constant "transparent" has RGBA8888 code {@code 00000000}, R 0.0, G 0.0, B 0.0, alpha 0.0, hue 0.0, and saturation 0.0. -062 * It can be represented as a packed float with the constant {@code 0x0.0p0F}. -063 * <pre> -064 * <font style='background-color: #000000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;@&nbsp;</font> -065 * <font style='background-color: #000000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;@&nbsp;</font><font style='background-color: #000000; color: #888888'>&nbsp;@&nbsp;</font> -066 * <font style='background-color: #000000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #ffffff'>&nbsp;@&nbsp;</font> -067 * </pre> -068 */ -069 public static final float TRANSPARENT = 0x0.0p0F; -070 static { NAMED.put("transparent", 0x0.0p0F); LIST.add(0x0.0p0F); } -071 -072 /** -073 * This color constant "black" has RGBA8888 code {@code 000000FF}, R 0.0, G 0.0, B 0.0, alpha 1.0, hue 0.0, and saturation 0.0. -074 * It can be represented as a packed float with the constant {@code -0x1.0p125F}. -075 * <pre> -076 * <font style='background-color: #000000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;@&nbsp;</font> -077 * <font style='background-color: #000000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;@&nbsp;</font><font style='background-color: #000000; color: #888888'>&nbsp;@&nbsp;</font> -078 * <font style='background-color: #000000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #ffffff'>&nbsp;@&nbsp;</font> -079 * </pre> -080 */ -081 public static final float BLACK = -0x1.0p125F; -082 static { NAMED.put("black", -0x1.0p125F); LIST.add(-0x1.0p125F); } -083 -084 /** -085 * This color constant "gray" has RGBA8888 code {@code 808080FF}, R 0.5019608, G 0.5019608, B 0.5019608, alpha 1.0, hue 0.0, and saturation 0.0. -086 * It can be represented as a packed float with the constant {@code -0x1.0101p126F}. -087 * <pre> -088 * <font style='background-color: #808080;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #808080; color: #000000'>&nbsp;@&nbsp;</font> -089 * <font style='background-color: #808080;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #808080'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #808080'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #808080'>&nbsp;@&nbsp;</font><font style='background-color: #808080; color: #888888'>&nbsp;@&nbsp;</font> -090 * <font style='background-color: #808080;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #808080; color: #ffffff'>&nbsp;@&nbsp;</font> -091 * </pre> -092 */ -093 public static final float GRAY = -0x1.0101p126F; -094 static { NAMED.put("gray", -0x1.0101p126F); LIST.add(-0x1.0101p126F); } -095 -096 /** -097 * This color constant "silver" has RGBA8888 code {@code B6B6B6FF}, R 0.7137255, G 0.7137255, B 0.7137255, alpha 1.0, hue 0.0, and saturation 0.0. -098 * It can be represented as a packed float with the constant {@code -0x1.6d6d6cp126F}. -099 * <pre> -100 * <font style='background-color: #B6B6B6;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #B6B6B6; color: #000000'>&nbsp;@&nbsp;</font> -101 * <font style='background-color: #B6B6B6;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #B6B6B6'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #B6B6B6'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #B6B6B6'>&nbsp;@&nbsp;</font><font style='background-color: #B6B6B6; color: #888888'>&nbsp;@&nbsp;</font> -102 * <font style='background-color: #B6B6B6;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #B6B6B6; color: #ffffff'>&nbsp;@&nbsp;</font> -103 * </pre> -104 */ -105 public static final float SILVER = -0x1.6d6d6cp126F; -106 static { NAMED.put("silver", -0x1.6d6d6cp126F); LIST.add(-0x1.6d6d6cp126F); } -107 -108 /** -109 * This color constant "white" has RGBA8888 code {@code FFFFFFFF}, R 1.0, G 1.0, B 1.0, alpha 1.0, hue 0.0, and saturation 0.0. -110 * It can be represented as a packed float with the constant {@code -0x1.fffffep126F}. -111 * <pre> -112 * <font style='background-color: #FFFFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFFFFF; color: #000000'>&nbsp;@&nbsp;</font> -113 * <font style='background-color: #FFFFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFFFFF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFFFFF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFFFFF'>&nbsp;@&nbsp;</font><font style='background-color: #FFFFFF; color: #888888'>&nbsp;@&nbsp;</font> -114 * <font style='background-color: #FFFFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFFFFF; color: #ffffff'>&nbsp;@&nbsp;</font> -115 * </pre> -116 */ -117 public static final float WHITE = -0x1.fffffep126F; -118 static { NAMED.put("white", -0x1.fffffep126F); LIST.add(-0x1.fffffep126F); } -119 -120 /** -121 * This color constant "red" has RGBA8888 code {@code FF0000FF}, R 1.0, G 0.0, B 0.0, alpha 1.0, hue 0.0, and saturation 1.0. -122 * It can be represented as a packed float with the constant {@code -0x1.0001fep125F}. -123 * <pre> -124 * <font style='background-color: #FF0000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF0000; color: #000000'>&nbsp;@&nbsp;</font> -125 * <font style='background-color: #FF0000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FF0000'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FF0000'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FF0000'>&nbsp;@&nbsp;</font><font style='background-color: #FF0000; color: #888888'>&nbsp;@&nbsp;</font> -126 * <font style='background-color: #FF0000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF0000; color: #ffffff'>&nbsp;@&nbsp;</font> -127 * </pre> -128 */ -129 public static final float RED = -0x1.0001fep125F; -130 static { NAMED.put("red", -0x1.0001fep125F); LIST.add(-0x1.0001fep125F); } -131 -132 /** -133 * This color constant "orange" has RGBA8888 code {@code FF7F00FF}, R 1.0, G 0.49803922, B 0.0, alpha 1.0, hue 0.08300654, and saturation 1.0. -134 * It can be represented as a packed float with the constant {@code -0x1.00fffep125F}. -135 * <pre> -136 * <font style='background-color: #FF7F00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF7F00; color: #000000'>&nbsp;@&nbsp;</font> -137 * <font style='background-color: #FF7F00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FF7F00'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FF7F00'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FF7F00'>&nbsp;@&nbsp;</font><font style='background-color: #FF7F00; color: #888888'>&nbsp;@&nbsp;</font> -138 * <font style='background-color: #FF7F00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF7F00; color: #ffffff'>&nbsp;@&nbsp;</font> -139 * </pre> -140 */ -141 public static final float ORANGE = -0x1.00fffep125F; -142 static { NAMED.put("orange", -0x1.00fffep125F); LIST.add(-0x1.00fffep125F); } -143 -144 /** -145 * This color constant "yellow" has RGBA8888 code {@code FFFF00FF}, R 1.0, G 1.0, B 0.0, alpha 1.0, hue 0.16666667, and saturation 1.0. -146 * It can be represented as a packed float with the constant {@code -0x1.01fffep125F}. -147 * <pre> -148 * <font style='background-color: #FFFF00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFFF00; color: #000000'>&nbsp;@&nbsp;</font> -149 * <font style='background-color: #FFFF00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFFF00'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFFF00'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFFF00'>&nbsp;@&nbsp;</font><font style='background-color: #FFFF00; color: #888888'>&nbsp;@&nbsp;</font> -150 * <font style='background-color: #FFFF00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFFF00; color: #ffffff'>&nbsp;@&nbsp;</font> -151 * </pre> -152 */ -153 public static final float YELLOW = -0x1.01fffep125F; -154 static { NAMED.put("yellow", -0x1.01fffep125F); LIST.add(-0x1.01fffep125F); } -155 -156 /** -157 * This color constant "green" has RGBA8888 code {@code 00FF00FF}, R 0.0, G 1.0, B 0.0, alpha 1.0, hue 0.33333334, and saturation 1.0. -158 * It can be represented as a packed float with the constant {@code -0x1.01fep125F}. -159 * <pre> -160 * <font style='background-color: #00FF00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #00FF00; color: #000000'>&nbsp;@&nbsp;</font> -161 * <font style='background-color: #00FF00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #00FF00'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #00FF00'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #00FF00'>&nbsp;@&nbsp;</font><font style='background-color: #00FF00; color: #888888'>&nbsp;@&nbsp;</font> -162 * <font style='background-color: #00FF00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #00FF00; color: #ffffff'>&nbsp;@&nbsp;</font> -163 * </pre> -164 */ -165 public static final float GREEN = -0x1.01fep125F; -166 static { NAMED.put("green", -0x1.01fep125F); LIST.add(-0x1.01fep125F); } -167 -168 /** -169 * This color constant "blue" has RGBA8888 code {@code 0000FFFF}, R 0.0, G 0.0, B 1.0, alpha 1.0, hue 0.6666667, and saturation 1.0. -170 * It can be represented as a packed float with the constant {@code -0x1.fep126F}. -171 * <pre> -172 * <font style='background-color: #0000FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #0000FF; color: #000000'>&nbsp;@&nbsp;</font> -173 * <font style='background-color: #0000FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #0000FF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #0000FF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #0000FF'>&nbsp;@&nbsp;</font><font style='background-color: #0000FF; color: #888888'>&nbsp;@&nbsp;</font> -174 * <font style='background-color: #0000FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #0000FF; color: #ffffff'>&nbsp;@&nbsp;</font> -175 * </pre> -176 */ -177 public static final float BLUE = -0x1.fep126F; -178 static { NAMED.put("blue", -0x1.fep126F); LIST.add(-0x1.fep126F); } -179 -180 /** -181 * This color constant "indigo" has RGBA8888 code {@code 520FE0FF}, R 0.32156864, G 0.05882353, B 0.8784314, alpha 1.0, hue 0.7200957, and saturation 0.81960785. -182 * It can be represented as a packed float with the constant {@code -0x1.c01ea4p126F}. -183 * <pre> -184 * <font style='background-color: #520FE0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #520FE0; color: #000000'>&nbsp;@&nbsp;</font> -185 * <font style='background-color: #520FE0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #520FE0'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #520FE0'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #520FE0'>&nbsp;@&nbsp;</font><font style='background-color: #520FE0; color: #888888'>&nbsp;@&nbsp;</font> -186 * <font style='background-color: #520FE0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #520FE0; color: #ffffff'>&nbsp;@&nbsp;</font> -187 * </pre> -188 */ -189 public static final float INDIGO = -0x1.c01ea4p126F; -190 static { NAMED.put("indigo", -0x1.c01ea4p126F); LIST.add(-0x1.c01ea4p126F); } -191 -192 /** -193 * This color constant "violet" has RGBA8888 code {@code 9040EFFF}, R 0.5647059, G 0.2509804, B 0.9372549, alpha 1.0, hue 0.74285716, and saturation 0.6862745. -194 * It can be represented as a packed float with the constant {@code -0x1.de812p126F}. -195 * <pre> -196 * <font style='background-color: #9040EF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #9040EF; color: #000000'>&nbsp;@&nbsp;</font> -197 * <font style='background-color: #9040EF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #9040EF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #9040EF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #9040EF'>&nbsp;@&nbsp;</font><font style='background-color: #9040EF; color: #888888'>&nbsp;@&nbsp;</font> -198 * <font style='background-color: #9040EF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #9040EF; color: #ffffff'>&nbsp;@&nbsp;</font> -199 * </pre> -200 */ -201 public static final float VIOLET = -0x1.de812p126F; -202 static { NAMED.put("violet", -0x1.de812p126F); LIST.add(-0x1.de812p126F); } -203 -204 /** -205 * This color constant "purple" has RGBA8888 code {@code C000FFFF}, R 0.7529412, G 0.0, B 1.0, alpha 1.0, hue 0.7921569, and saturation 1.0. -206 * It can be represented as a packed float with the constant {@code -0x1.fe018p126F}. -207 * <pre> -208 * <font style='background-color: #C000FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C000FF; color: #000000'>&nbsp;@&nbsp;</font> -209 * <font style='background-color: #C000FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #C000FF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #C000FF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #C000FF'>&nbsp;@&nbsp;</font><font style='background-color: #C000FF; color: #888888'>&nbsp;@&nbsp;</font> -210 * <font style='background-color: #C000FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C000FF; color: #ffffff'>&nbsp;@&nbsp;</font> -211 * </pre> -212 */ -213 public static final float PURPLE = -0x1.fe018p126F; -214 static { NAMED.put("purple", -0x1.fe018p126F); LIST.add(-0x1.fe018p126F); } -215 -216 /** -217 * This color constant "brown" has RGBA8888 code {@code 8F573BFF}, R 0.56078434, G 0.34117648, B 0.23137255, alpha 1.0, hue 0.055555552, and saturation 0.3294118. -218 * It can be represented as a packed float with the constant {@code -0x1.76af1ep125F}. -219 * <pre> -220 * <font style='background-color: #8F573B;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #8F573B; color: #000000'>&nbsp;@&nbsp;</font> -221 * <font style='background-color: #8F573B;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #8F573B'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #8F573B'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #8F573B'>&nbsp;@&nbsp;</font><font style='background-color: #8F573B; color: #888888'>&nbsp;@&nbsp;</font> -222 * <font style='background-color: #8F573B;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #8F573B; color: #ffffff'>&nbsp;@&nbsp;</font> -223 * </pre> -224 */ -225 public static final float BROWN = -0x1.76af1ep125F; -226 static { NAMED.put("brown", -0x1.76af1ep125F); LIST.add(-0x1.76af1ep125F); } -227 -228 /** -229 * This color constant "pink" has RGBA8888 code {@code FFA0E0FF}, R 1.0, G 0.627451, B 0.8784314, alpha 1.0, hue 0.8877193, and saturation 0.372549. -230 * It can be represented as a packed float with the constant {@code -0x1.c141fep126F}. -231 * <pre> -232 * <font style='background-color: #FFA0E0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFA0E0; color: #000000'>&nbsp;@&nbsp;</font> -233 * <font style='background-color: #FFA0E0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFA0E0'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFA0E0'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFA0E0'>&nbsp;@&nbsp;</font><font style='background-color: #FFA0E0; color: #888888'>&nbsp;@&nbsp;</font> -234 * <font style='background-color: #FFA0E0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFA0E0; color: #ffffff'>&nbsp;@&nbsp;</font> -235 * </pre> -236 */ -237 public static final float PINK = -0x1.c141fep126F; -238 static { NAMED.put("pink", -0x1.c141fep126F); LIST.add(-0x1.c141fep126F); } -239 -240 /** -241 * This color constant "magenta" has RGBA8888 code {@code F500F5FF}, R 0.9607843, G 0.0, B 0.9607843, alpha 1.0, hue 0.8333333, and saturation 0.9607843. -242 * It can be represented as a packed float with the constant {@code -0x1.ea01eap126F}. -243 * <pre> -244 * <font style='background-color: #F500F5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #F500F5; color: #000000'>&nbsp;@&nbsp;</font> -245 * <font style='background-color: #F500F5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #F500F5'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #F500F5'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #F500F5'>&nbsp;@&nbsp;</font><font style='background-color: #F500F5; color: #888888'>&nbsp;@&nbsp;</font> -246 * <font style='background-color: #F500F5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #F500F5; color: #ffffff'>&nbsp;@&nbsp;</font> -247 * </pre> -248 */ -249 public static final float MAGENTA = -0x1.ea01eap126F; -250 static { NAMED.put("magenta", -0x1.ea01eap126F); LIST.add(-0x1.ea01eap126F); } -251 -252 /** -253 * This color constant "brick" has RGBA8888 code {@code D5524AFF}, R 0.8352941, G 0.32156864, B 0.2901961, alpha 1.0, hue 0.009592325, and saturation 0.54509807. -254 * It can be represented as a packed float with the constant {@code -0x1.94a5aap125F}. -255 * <pre> -256 * <font style='background-color: #D5524A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D5524A; color: #000000'>&nbsp;@&nbsp;</font> -257 * <font style='background-color: #D5524A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #D5524A'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #D5524A'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #D5524A'>&nbsp;@&nbsp;</font><font style='background-color: #D5524A; color: #888888'>&nbsp;@&nbsp;</font> -258 * <font style='background-color: #D5524A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D5524A; color: #ffffff'>&nbsp;@&nbsp;</font> -259 * </pre> -260 */ -261 public static final float BRICK = -0x1.94a5aap125F; -262 static { NAMED.put("brick", -0x1.94a5aap125F); LIST.add(-0x1.94a5aap125F); } -263 -264 /** -265 * This color constant "ember" has RGBA8888 code {@code F55A32FF}, R 0.9607843, G 0.3529412, B 0.19607843, alpha 1.0, hue 0.034188036, and saturation 0.7647059. -266 * It can be represented as a packed float with the constant {@code -0x1.64b5eap125F}. -267 * <pre> -268 * <font style='background-color: #F55A32;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #F55A32; color: #000000'>&nbsp;@&nbsp;</font> -269 * <font style='background-color: #F55A32;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #F55A32'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #F55A32'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #F55A32'>&nbsp;@&nbsp;</font><font style='background-color: #F55A32; color: #888888'>&nbsp;@&nbsp;</font> -270 * <font style='background-color: #F55A32;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #F55A32; color: #ffffff'>&nbsp;@&nbsp;</font> -271 * </pre> -272 */ -273 public static final float EMBER = -0x1.64b5eap125F; -274 static { NAMED.put("ember", -0x1.64b5eap125F); LIST.add(-0x1.64b5eap125F); } -275 -276 /** -277 * This color constant "salmon" has RGBA8888 code {@code FF6262FF}, R 1.0, G 0.38431373, B 0.38431373, alpha 1.0, hue 0.0, and saturation 0.6156863. -278 * It can be represented as a packed float with the constant {@code -0x1.c4c5fep125F}. -279 * <pre> -280 * <font style='background-color: #FF6262;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF6262; color: #000000'>&nbsp;@&nbsp;</font> -281 * <font style='background-color: #FF6262;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FF6262'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FF6262'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FF6262'>&nbsp;@&nbsp;</font><font style='background-color: #FF6262; color: #888888'>&nbsp;@&nbsp;</font> -282 * <font style='background-color: #FF6262;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF6262; color: #ffffff'>&nbsp;@&nbsp;</font> -283 * </pre> -284 */ -285 public static final float SALMON = -0x1.c4c5fep125F; -286 static { NAMED.put("salmon", -0x1.c4c5fep125F); LIST.add(-0x1.c4c5fep125F); } -287 -288 /** -289 * This color constant "chocolate" has RGBA8888 code {@code 683818FF}, R 0.40784314, G 0.21960784, B 0.09411765, alpha 1.0, hue 0.066666655, and saturation 0.3137255. -290 * It can be represented as a packed float with the constant {@code -0x1.3070dp125F}. -291 * <pre> -292 * <font style='background-color: #683818;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #683818; color: #000000'>&nbsp;@&nbsp;</font> -293 * <font style='background-color: #683818;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #683818'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #683818'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #683818'>&nbsp;@&nbsp;</font><font style='background-color: #683818; color: #888888'>&nbsp;@&nbsp;</font> -294 * <font style='background-color: #683818;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #683818; color: #ffffff'>&nbsp;@&nbsp;</font> -295 * </pre> -296 */ -297 public static final float CHOCOLATE = -0x1.3070dp125F; -298 static { NAMED.put("chocolate", -0x1.3070dp125F); LIST.add(-0x1.3070dp125F); } -299 -300 /** -301 * This color constant "tan" has RGBA8888 code {@code D2B48CFF}, R 0.8235294, G 0.7058824, B 0.54901963, alpha 1.0, hue 0.0952381, and saturation 0.2745098. -302 * It can be represented as a packed float with the constant {@code -0x1.1969a4p126F}. -303 * <pre> -304 * <font style='background-color: #D2B48C;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D2B48C; color: #000000'>&nbsp;@&nbsp;</font> -305 * <font style='background-color: #D2B48C;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #D2B48C'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #D2B48C'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #D2B48C'>&nbsp;@&nbsp;</font><font style='background-color: #D2B48C; color: #888888'>&nbsp;@&nbsp;</font> -306 * <font style='background-color: #D2B48C;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D2B48C; color: #ffffff'>&nbsp;@&nbsp;</font> -307 * </pre> -308 */ -309 public static final float TAN = -0x1.1969a4p126F; -310 static { NAMED.put("tan", -0x1.1969a4p126F); LIST.add(-0x1.1969a4p126F); } -311 -312 /** -313 * This color constant "bronze" has RGBA8888 code {@code CE8E31FF}, R 0.80784315, G 0.5568628, B 0.19215687, alpha 1.0, hue 0.09872612, and saturation 0.6156863. -314 * It can be represented as a packed float with the constant {@code -0x1.631d9cp125F}. -315 * <pre> -316 * <font style='background-color: #CE8E31;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #CE8E31; color: #000000'>&nbsp;@&nbsp;</font> -317 * <font style='background-color: #CE8E31;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #CE8E31'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #CE8E31'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #CE8E31'>&nbsp;@&nbsp;</font><font style='background-color: #CE8E31; color: #888888'>&nbsp;@&nbsp;</font> -318 * <font style='background-color: #CE8E31;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #CE8E31; color: #ffffff'>&nbsp;@&nbsp;</font> -319 * </pre> -320 */ -321 public static final float BRONZE = -0x1.631d9cp125F; -322 static { NAMED.put("bronze", -0x1.631d9cp125F); LIST.add(-0x1.631d9cp125F); } -323 -324 /** -325 * This color constant "cinnamon" has RGBA8888 code {@code D2691DFF}, R 0.8235294, G 0.4117647, B 0.11372549, alpha 1.0, hue 0.06998159, and saturation 0.70980394. -326 * It can be represented as a packed float with the constant {@code -0x1.3ad3a4p125F}. -327 * <pre> -328 * <font style='background-color: #D2691D;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D2691D; color: #000000'>&nbsp;@&nbsp;</font> -329 * <font style='background-color: #D2691D;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #D2691D'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #D2691D'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #D2691D'>&nbsp;@&nbsp;</font><font style='background-color: #D2691D; color: #888888'>&nbsp;@&nbsp;</font> -330 * <font style='background-color: #D2691D;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D2691D; color: #ffffff'>&nbsp;@&nbsp;</font> -331 * </pre> -332 */ -333 public static final float CINNAMON = -0x1.3ad3a4p125F; -334 static { NAMED.put("cinnamon", -0x1.3ad3a4p125F); LIST.add(-0x1.3ad3a4p125F); } -335 -336 /** -337 * This color constant "apricot" has RGBA8888 code {@code FFA828FF}, R 1.0, G 0.65882355, B 0.15686275, alpha 1.0, hue 0.09922481, and saturation 0.84313726. -338 * It can be represented as a packed float with the constant {@code -0x1.5151fep125F}. -339 * <pre> -340 * <font style='background-color: #FFA828;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFA828; color: #000000'>&nbsp;@&nbsp;</font> -341 * <font style='background-color: #FFA828;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFA828'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFA828'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFA828'>&nbsp;@&nbsp;</font><font style='background-color: #FFA828; color: #888888'>&nbsp;@&nbsp;</font> -342 * <font style='background-color: #FFA828;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFA828; color: #ffffff'>&nbsp;@&nbsp;</font> -343 * </pre> -344 */ -345 public static final float APRICOT = -0x1.5151fep125F; -346 static { NAMED.put("apricot", -0x1.5151fep125F); LIST.add(-0x1.5151fep125F); } -347 -348 /** -349 * This color constant "peach" has RGBA8888 code {@code FFBF81FF}, R 1.0, G 0.7490196, B 0.5058824, alpha 1.0, hue 0.08201058, and saturation 0.49411762. -350 * It can be represented as a packed float with the constant {@code -0x1.037ffep126F}. -351 * <pre> -352 * <font style='background-color: #FFBF81;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFBF81; color: #000000'>&nbsp;@&nbsp;</font> -353 * <font style='background-color: #FFBF81;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFBF81'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFBF81'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFBF81'>&nbsp;@&nbsp;</font><font style='background-color: #FFBF81; color: #888888'>&nbsp;@&nbsp;</font> -354 * <font style='background-color: #FFBF81;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFBF81; color: #ffffff'>&nbsp;@&nbsp;</font> -355 * </pre> -356 */ -357 public static final float PEACH = -0x1.037ffep126F; -358 static { NAMED.put("peach", -0x1.037ffep126F); LIST.add(-0x1.037ffep126F); } -359 -360 /** -361 * This color constant "pear" has RGBA8888 code {@code D3E330FF}, R 0.827451, G 0.8901961, B 0.1882353, alpha 1.0, hue 0.18156426, and saturation 0.7019608. -362 * It can be represented as a packed float with the constant {@code -0x1.61c7a6p125F}. -363 * <pre> -364 * <font style='background-color: #D3E330;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D3E330; color: #000000'>&nbsp;@&nbsp;</font> -365 * <font style='background-color: #D3E330;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #D3E330'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #D3E330'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #D3E330'>&nbsp;@&nbsp;</font><font style='background-color: #D3E330; color: #888888'>&nbsp;@&nbsp;</font> -366 * <font style='background-color: #D3E330;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D3E330; color: #ffffff'>&nbsp;@&nbsp;</font> -367 * </pre> -368 */ -369 public static final float PEAR = -0x1.61c7a6p125F; -370 static { NAMED.put("pear", -0x1.61c7a6p125F); LIST.add(-0x1.61c7a6p125F); } -371 -372 /** -373 * This color constant "saffron" has RGBA8888 code {@code FFD510FF}, R 1.0, G 0.8352941, B 0.0627451, alpha 1.0, hue 0.13737796, and saturation 0.9372549. -374 * It can be represented as a packed float with the constant {@code -0x1.21abfep125F}. -375 * <pre> -376 * <font style='background-color: #FFD510;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFD510; color: #000000'>&nbsp;@&nbsp;</font> -377 * <font style='background-color: #FFD510;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFD510'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFD510'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFD510'>&nbsp;@&nbsp;</font><font style='background-color: #FFD510; color: #888888'>&nbsp;@&nbsp;</font> -378 * <font style='background-color: #FFD510;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFD510; color: #ffffff'>&nbsp;@&nbsp;</font> -379 * </pre> -380 */ -381 public static final float SAFFRON = -0x1.21abfep125F; -382 static { NAMED.put("saffron", -0x1.21abfep125F); LIST.add(-0x1.21abfep125F); } -383 -384 /** -385 * This color constant "butter" has RGBA8888 code {@code FFF288FF}, R 1.0, G 0.9490196, B 0.53333336, alpha 1.0, hue 0.14845939, and saturation 0.46666664. -386 * It can be represented as a packed float with the constant {@code -0x1.11e5fep126F}. -387 * <pre> -388 * <font style='background-color: #FFF288;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFF288; color: #000000'>&nbsp;@&nbsp;</font> -389 * <font style='background-color: #FFF288;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFF288'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFF288'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFF288'>&nbsp;@&nbsp;</font><font style='background-color: #FFF288; color: #888888'>&nbsp;@&nbsp;</font> -390 * <font style='background-color: #FFF288;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFF288; color: #ffffff'>&nbsp;@&nbsp;</font> -391 * </pre> -392 */ -393 public static final float BUTTER = -0x1.11e5fep126F; -394 static { NAMED.put("butter", -0x1.11e5fep126F); LIST.add(-0x1.11e5fep126F); } -395 -396 /** -397 * This color constant "chartreuse" has RGBA8888 code {@code C8FF41FF}, R 0.78431374, G 1.0, B 0.25490198, alpha 1.0, hue 0.21491227, and saturation 0.745098. -398 * It can be represented as a packed float with the constant {@code -0x1.83ff9p125F}. -399 * <pre> -400 * <font style='background-color: #C8FF41;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C8FF41; color: #000000'>&nbsp;@&nbsp;</font> -401 * <font style='background-color: #C8FF41;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #C8FF41'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #C8FF41'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #C8FF41'>&nbsp;@&nbsp;</font><font style='background-color: #C8FF41; color: #888888'>&nbsp;@&nbsp;</font> -402 * <font style='background-color: #C8FF41;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C8FF41; color: #ffffff'>&nbsp;@&nbsp;</font> -403 * </pre> -404 */ -405 public static final float CHARTREUSE = -0x1.83ff9p125F; -406 static { NAMED.put("chartreuse", -0x1.83ff9p125F); LIST.add(-0x1.83ff9p125F); } -407 -408 /** -409 * This color constant "cactus" has RGBA8888 code {@code 30A000FF}, R 0.1882353, G 0.627451, B 0.0, alpha 1.0, hue 0.28333336, and saturation 0.627451. -410 * It can be represented as a packed float with the constant {@code -0x1.01406p125F}. -411 * <pre> -412 * <font style='background-color: #30A000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #30A000; color: #000000'>&nbsp;@&nbsp;</font> -413 * <font style='background-color: #30A000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #30A000'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #30A000'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #30A000'>&nbsp;@&nbsp;</font><font style='background-color: #30A000; color: #888888'>&nbsp;@&nbsp;</font> -414 * <font style='background-color: #30A000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #30A000; color: #ffffff'>&nbsp;@&nbsp;</font> -415 * </pre> -416 */ -417 public static final float CACTUS = -0x1.01406p125F; -418 static { NAMED.put("cactus", -0x1.01406p125F); LIST.add(-0x1.01406p125F); } -419 -420 /** -421 * This color constant "lime" has RGBA8888 code {@code 93D300FF}, R 0.5764706, G 0.827451, B 0.0, alpha 1.0, hue 0.21721959, and saturation 0.827451. -422 * It can be represented as a packed float with the constant {@code -0x1.01a726p125F}. -423 * <pre> -424 * <font style='background-color: #93D300;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #93D300; color: #000000'>&nbsp;@&nbsp;</font> -425 * <font style='background-color: #93D300;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #93D300'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #93D300'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #93D300'>&nbsp;@&nbsp;</font><font style='background-color: #93D300; color: #888888'>&nbsp;@&nbsp;</font> -426 * <font style='background-color: #93D300;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #93D300; color: #ffffff'>&nbsp;@&nbsp;</font> -427 * </pre> -428 */ -429 public static final float LIME = -0x1.01a726p125F; -430 static { NAMED.put("lime", -0x1.01a726p125F); LIST.add(-0x1.01a726p125F); } -431 -432 /** -433 * This color constant "olive" has RGBA8888 code {@code 818000FF}, R 0.5058824, G 0.5019608, B 0.0, alpha 1.0, hue 0.16537468, and saturation 0.5058824. -434 * It can be represented as a packed float with the constant {@code -0x1.010102p125F}. -435 * <pre> -436 * <font style='background-color: #818000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #818000; color: #000000'>&nbsp;@&nbsp;</font> -437 * <font style='background-color: #818000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #818000'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #818000'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #818000'>&nbsp;@&nbsp;</font><font style='background-color: #818000; color: #888888'>&nbsp;@&nbsp;</font> -438 * <font style='background-color: #818000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #818000; color: #ffffff'>&nbsp;@&nbsp;</font> -439 * </pre> -440 */ -441 public static final float OLIVE = -0x1.010102p125F; -442 static { NAMED.put("olive", -0x1.010102p125F); LIST.add(-0x1.010102p125F); } -443 -444 /** -445 * This color constant "fern" has RGBA8888 code {@code 4E7942FF}, R 0.30588236, G 0.4745098, B 0.25882354, alpha 1.0, hue 0.2969697, and saturation 0.21568626. -446 * It can be represented as a packed float with the constant {@code -0x1.84f29cp125F}. -447 * <pre> -448 * <font style='background-color: #4E7942;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #4E7942; color: #000000'>&nbsp;@&nbsp;</font> -449 * <font style='background-color: #4E7942;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #4E7942'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #4E7942'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #4E7942'>&nbsp;@&nbsp;</font><font style='background-color: #4E7942; color: #888888'>&nbsp;@&nbsp;</font> -450 * <font style='background-color: #4E7942;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #4E7942; color: #ffffff'>&nbsp;@&nbsp;</font> -451 * </pre> -452 */ -453 public static final float FERN = -0x1.84f29cp125F; -454 static { NAMED.put("fern", -0x1.84f29cp125F); LIST.add(-0x1.84f29cp125F); } -455 -456 /** -457 * This color constant "moss" has RGBA8888 code {@code 204608FF}, R 0.1254902, G 0.27450982, B 0.03137255, alpha 1.0, hue 0.26881722, and saturation 0.24313727. -458 * It can be represented as a packed float with the constant {@code -0x1.108c4p125F}. -459 * <pre> -460 * <font style='background-color: #204608;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #204608; color: #000000'>&nbsp;@&nbsp;</font> -461 * <font style='background-color: #204608;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #204608'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #204608'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #204608'>&nbsp;@&nbsp;</font><font style='background-color: #204608; color: #888888'>&nbsp;@&nbsp;</font> -462 * <font style='background-color: #204608;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #204608; color: #ffffff'>&nbsp;@&nbsp;</font> -463 * </pre> -464 */ -465 public static final float MOSS = -0x1.108c4p125F; -466 static { NAMED.put("moss", -0x1.108c4p125F); LIST.add(-0x1.108c4p125F); } -467 -468 /** -469 * This color constant "celery" has RGBA8888 code {@code 7DFF73FF}, R 0.49019608, G 1.0, B 0.4509804, alpha 1.0, hue 0.32142857, and saturation 0.5490196. -470 * It can be represented as a packed float with the constant {@code -0x1.e7fefap125F}. -471 * <pre> -472 * <font style='background-color: #7DFF73;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #7DFF73; color: #000000'>&nbsp;@&nbsp;</font> -473 * <font style='background-color: #7DFF73;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #7DFF73'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #7DFF73'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #7DFF73'>&nbsp;@&nbsp;</font><font style='background-color: #7DFF73; color: #888888'>&nbsp;@&nbsp;</font> -474 * <font style='background-color: #7DFF73;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #7DFF73; color: #ffffff'>&nbsp;@&nbsp;</font> -475 * </pre> -476 */ -477 public static final float CELERY = -0x1.e7fefap125F; -478 static { NAMED.put("celery", -0x1.e7fefap125F); LIST.add(-0x1.e7fefap125F); } -479 -480 /** -481 * This color constant "sage" has RGBA8888 code {@code ABE3C5FF}, R 0.67058825, G 0.8901961, B 0.77254903, alpha 1.0, hue 0.4107143, and saturation 0.21960783. -482 * It can be represented as a packed float with the constant {@code -0x1.8bc756p126F}. -483 * <pre> -484 * <font style='background-color: #ABE3C5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ABE3C5; color: #000000'>&nbsp;@&nbsp;</font> -485 * <font style='background-color: #ABE3C5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #ABE3C5'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #ABE3C5'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #ABE3C5'>&nbsp;@&nbsp;</font><font style='background-color: #ABE3C5; color: #888888'>&nbsp;@&nbsp;</font> -486 * <font style='background-color: #ABE3C5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ABE3C5; color: #ffffff'>&nbsp;@&nbsp;</font> -487 * </pre> -488 */ -489 public static final float SAGE = -0x1.8bc756p126F; -490 static { NAMED.put("sage", -0x1.8bc756p126F); LIST.add(-0x1.8bc756p126F); } -491 -492 /** -493 * This color constant "jade" has RGBA8888 code {@code 3FBF3FFF}, R 0.24705882, G 0.7490196, B 0.24705882, alpha 1.0, hue 0.33333334, and saturation 0.5019608. -494 * It can be represented as a packed float with the constant {@code -0x1.7f7e7ep125F}. -495 * <pre> -496 * <font style='background-color: #3FBF3F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3FBF3F; color: #000000'>&nbsp;@&nbsp;</font> -497 * <font style='background-color: #3FBF3F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #3FBF3F'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #3FBF3F'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #3FBF3F'>&nbsp;@&nbsp;</font><font style='background-color: #3FBF3F; color: #888888'>&nbsp;@&nbsp;</font> -498 * <font style='background-color: #3FBF3F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3FBF3F; color: #ffffff'>&nbsp;@&nbsp;</font> -499 * </pre> -500 */ -501 public static final float JADE = -0x1.7f7e7ep125F; -502 static { NAMED.put("jade", -0x1.7f7e7ep125F); LIST.add(-0x1.7f7e7ep125F); } -503 -504 /** -505 * This color constant "cyan" has RGBA8888 code {@code 00FFFFFF}, R 0.0, G 1.0, B 1.0, alpha 1.0, hue 0.5, and saturation 1.0. -506 * It can be represented as a packed float with the constant {@code -0x1.fffep126F}. -507 * <pre> -508 * <font style='background-color: #00FFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #00FFFF; color: #000000'>&nbsp;@&nbsp;</font> -509 * <font style='background-color: #00FFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #00FFFF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #00FFFF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #00FFFF'>&nbsp;@&nbsp;</font><font style='background-color: #00FFFF; color: #888888'>&nbsp;@&nbsp;</font> -510 * <font style='background-color: #00FFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #00FFFF; color: #ffffff'>&nbsp;@&nbsp;</font> -511 * </pre> -512 */ -513 public static final float CYAN = -0x1.fffep126F; -514 static { NAMED.put("cyan", -0x1.fffep126F); LIST.add(-0x1.fffep126F); } -515 -516 /** -517 * This color constant "mint" has RGBA8888 code {@code 7FFFD4FF}, R 0.49803922, G 1.0, B 0.83137256, alpha 1.0, hue 0.44401044, and saturation 0.50196075. -518 * It can be represented as a packed float with the constant {@code -0x1.a9fefep126F}. -519 * <pre> -520 * <font style='background-color: #7FFFD4;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #7FFFD4; color: #000000'>&nbsp;@&nbsp;</font> -521 * <font style='background-color: #7FFFD4;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #7FFFD4'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #7FFFD4'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #7FFFD4'>&nbsp;@&nbsp;</font><font style='background-color: #7FFFD4; color: #888888'>&nbsp;@&nbsp;</font> -522 * <font style='background-color: #7FFFD4;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #7FFFD4; color: #ffffff'>&nbsp;@&nbsp;</font> -523 * </pre> -524 */ -525 public static final float MINT = -0x1.a9fefep126F; -526 static { NAMED.put("mint", -0x1.a9fefep126F); LIST.add(-0x1.a9fefep126F); } -527 -528 /** -529 * This color constant "teal" has RGBA8888 code {@code 007F7FFF}, R 0.0, G 0.49803922, B 0.49803922, alpha 1.0, hue 0.5, and saturation 0.49803922. -530 * It can be represented as a packed float with the constant {@code -0x1.fefep125F}. -531 * <pre> -532 * <font style='background-color: #007F7F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #007F7F; color: #000000'>&nbsp;@&nbsp;</font> -533 * <font style='background-color: #007F7F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #007F7F'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #007F7F'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #007F7F'>&nbsp;@&nbsp;</font><font style='background-color: #007F7F; color: #888888'>&nbsp;@&nbsp;</font> -534 * <font style='background-color: #007F7F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #007F7F; color: #ffffff'>&nbsp;@&nbsp;</font> -535 * </pre> -536 */ -537 public static final float TEAL = -0x1.fefep125F; -538 static { NAMED.put("teal", -0x1.fefep125F); LIST.add(-0x1.fefep125F); } -539 -540 /** -541 * This color constant "turquoise" has RGBA8888 code {@code 2ED6C9FF}, R 0.18039216, G 0.8392157, B 0.7882353, alpha 1.0, hue 0.48710316, and saturation 0.65882355. -542 * It can be represented as a packed float with the constant {@code -0x1.93ac5cp126F}. -543 * <pre> -544 * <font style='background-color: #2ED6C9;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #2ED6C9; color: #000000'>&nbsp;@&nbsp;</font> -545 * <font style='background-color: #2ED6C9;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #2ED6C9'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #2ED6C9'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #2ED6C9'>&nbsp;@&nbsp;</font><font style='background-color: #2ED6C9; color: #888888'>&nbsp;@&nbsp;</font> -546 * <font style='background-color: #2ED6C9;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #2ED6C9; color: #ffffff'>&nbsp;@&nbsp;</font> -547 * </pre> -548 */ -549 public static final float TURQUOISE = -0x1.93ac5cp126F; -550 static { NAMED.put("turquoise", -0x1.93ac5cp126F); LIST.add(-0x1.93ac5cp126F); } -551 -552 /** -553 * This color constant "sky" has RGBA8888 code {@code 10C0E0FF}, R 0.0627451, G 0.7529412, B 0.8784314, alpha 1.0, hue 0.5256411, and saturation 0.8156863. -554 * It can be represented as a packed float with the constant {@code -0x1.c1802p126F}. -555 * <pre> -556 * <font style='background-color: #10C0E0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #10C0E0; color: #000000'>&nbsp;@&nbsp;</font> -557 * <font style='background-color: #10C0E0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #10C0E0'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #10C0E0'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #10C0E0'>&nbsp;@&nbsp;</font><font style='background-color: #10C0E0; color: #888888'>&nbsp;@&nbsp;</font> -558 * <font style='background-color: #10C0E0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #10C0E0; color: #ffffff'>&nbsp;@&nbsp;</font> -559 * </pre> -560 */ -561 public static final float SKY = -0x1.c1802p126F; -562 static { NAMED.put("sky", -0x1.c1802p126F); LIST.add(-0x1.c1802p126F); } -563 -564 /** -565 * This color constant "cobalt" has RGBA8888 code {@code 0046ABFF}, R 0.0, G 0.27450982, B 0.67058825, alpha 1.0, hue 0.5984406, and saturation 0.67058825. -566 * It can be represented as a packed float with the constant {@code -0x1.568cp126F}. -567 * <pre> -568 * <font style='background-color: #0046AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #0046AB; color: #000000'>&nbsp;@&nbsp;</font> -569 * <font style='background-color: #0046AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #0046AB'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #0046AB'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #0046AB'>&nbsp;@&nbsp;</font><font style='background-color: #0046AB; color: #888888'>&nbsp;@&nbsp;</font> -570 * <font style='background-color: #0046AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #0046AB; color: #ffffff'>&nbsp;@&nbsp;</font> -571 * </pre> -572 */ -573 public static final float COBALT = -0x1.568cp126F; -574 static { NAMED.put("cobalt", -0x1.568cp126F); LIST.add(-0x1.568cp126F); } -575 -576 /** -577 * This color constant "denim" has RGBA8888 code {@code 3088B8FF}, R 0.1882353, G 0.53333336, B 0.72156864, alpha 1.0, hue 0.5588235, and saturation 0.53333336. -578 * It can be represented as a packed float with the constant {@code -0x1.71106p126F}. -579 * <pre> -580 * <font style='background-color: #3088B8;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3088B8; color: #000000'>&nbsp;@&nbsp;</font> -581 * <font style='background-color: #3088B8;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #3088B8'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #3088B8'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #3088B8'>&nbsp;@&nbsp;</font><font style='background-color: #3088B8; color: #888888'>&nbsp;@&nbsp;</font> -582 * <font style='background-color: #3088B8;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3088B8; color: #ffffff'>&nbsp;@&nbsp;</font> -583 * </pre> -584 */ -585 public static final float DENIM = -0x1.71106p126F; -586 static { NAMED.put("denim", -0x1.71106p126F); LIST.add(-0x1.71106p126F); } -587 -588 /** -589 * This color constant "navy" has RGBA8888 code {@code 000080FF}, R 0.0, G 0.0, B 0.5019608, alpha 1.0, hue 0.6666667, and saturation 0.5019608. -590 * It can be represented as a packed float with the constant {@code -0x1.0p126F}. -591 * <pre> -592 * <font style='background-color: #000080;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000080; color: #000000'>&nbsp;@&nbsp;</font> -593 * <font style='background-color: #000080;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000080'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #000080'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #000080'>&nbsp;@&nbsp;</font><font style='background-color: #000080; color: #888888'>&nbsp;@&nbsp;</font> -594 * <font style='background-color: #000080;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000080; color: #ffffff'>&nbsp;@&nbsp;</font> -595 * </pre> -596 */ -597 public static final float NAVY = -0x1.0p126F; -598 static { NAMED.put("navy", -0x1.0p126F); LIST.add(-0x1.0p126F); } -599 -600 /** -601 * This color constant "lavender" has RGBA8888 code {@code B991FFFF}, R 0.7254902, G 0.5686275, B 1.0, alpha 1.0, hue 0.72727275, and saturation 0.43137252. -602 * It can be represented as a packed float with the constant {@code -0x1.ff2372p126F}. -603 * <pre> -604 * <font style='background-color: #B991FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #B991FF; color: #000000'>&nbsp;@&nbsp;</font> -605 * <font style='background-color: #B991FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #B991FF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #B991FF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #B991FF'>&nbsp;@&nbsp;</font><font style='background-color: #B991FF; color: #888888'>&nbsp;@&nbsp;</font> -606 * <font style='background-color: #B991FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #B991FF; color: #ffffff'>&nbsp;@&nbsp;</font> -607 * </pre> -608 */ -609 public static final float LAVENDER = -0x1.ff2372p126F; -610 static { NAMED.put("lavender", -0x1.ff2372p126F); LIST.add(-0x1.ff2372p126F); } -611 -612 /** -613 * This color constant "plum" has RGBA8888 code {@code BE0DC6FF}, R 0.74509805, G 0.050980393, B 0.7764706, alpha 1.0, hue 0.82612616, and saturation 0.7254902. -614 * It can be represented as a packed float with the constant {@code -0x1.8c1b7cp126F}. -615 * <pre> -616 * <font style='background-color: #BE0DC6;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #BE0DC6; color: #000000'>&nbsp;@&nbsp;</font> -617 * <font style='background-color: #BE0DC6;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #BE0DC6'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #BE0DC6'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #BE0DC6'>&nbsp;@&nbsp;</font><font style='background-color: #BE0DC6; color: #888888'>&nbsp;@&nbsp;</font> -618 * <font style='background-color: #BE0DC6;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #BE0DC6; color: #ffffff'>&nbsp;@&nbsp;</font> -619 * </pre> -620 */ -621 public static final float PLUM = -0x1.8c1b7cp126F; -622 static { NAMED.put("plum", -0x1.8c1b7cp126F); LIST.add(-0x1.8c1b7cp126F); } -623 -624 /** -625 * This color constant "mauve" has RGBA8888 code {@code AB73ABFF}, R 0.67058825, G 0.4509804, B 0.67058825, alpha 1.0, hue 0.8333334, and saturation 0.21960786. -626 * It can be represented as a packed float with the constant {@code -0x1.56e756p126F}. -627 * <pre> -628 * <font style='background-color: #AB73AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #AB73AB; color: #000000'>&nbsp;@&nbsp;</font> -629 * <font style='background-color: #AB73AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #AB73AB'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #AB73AB'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #AB73AB'>&nbsp;@&nbsp;</font><font style='background-color: #AB73AB; color: #888888'>&nbsp;@&nbsp;</font> -630 * <font style='background-color: #AB73AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #AB73AB; color: #ffffff'>&nbsp;@&nbsp;</font> -631 * </pre> -632 */ -633 public static final float MAUVE = -0x1.56e756p126F; -634 static { NAMED.put("mauve", -0x1.56e756p126F); LIST.add(-0x1.56e756p126F); } -635 -636 /** -637 * This color constant "rose" has RGBA8888 code {@code E61E78FF}, R 0.9019608, G 0.11764706, B 0.47058824, alpha 1.0, hue 0.925, and saturation 0.78431374. -638 * It can be represented as a packed float with the constant {@code -0x1.f03dccp125F}. -639 * <pre> -640 * <font style='background-color: #E61E78;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #E61E78; color: #000000'>&nbsp;@&nbsp;</font> -641 * <font style='background-color: #E61E78;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #E61E78'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #E61E78'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #E61E78'>&nbsp;@&nbsp;</font><font style='background-color: #E61E78; color: #888888'>&nbsp;@&nbsp;</font> -642 * <font style='background-color: #E61E78;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #E61E78; color: #ffffff'>&nbsp;@&nbsp;</font> -643 * </pre> -644 */ -645 public static final float ROSE = -0x1.f03dccp125F; -646 static { NAMED.put("rose", -0x1.f03dccp125F); LIST.add(-0x1.f03dccp125F); } -647 -648 /** -649 * This color constant "raspberry" has RGBA8888 code {@code 911437FF}, R 0.5686275, G 0.078431375, B 0.21568628, alpha 1.0, hue 0.9533333, and saturation 0.4901961. -650 * It can be represented as a packed float with the constant {@code -0x1.6e2922p125F}. -651 * <pre> -652 * <font style='background-color: #911437;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #911437; color: #000000'>&nbsp;@&nbsp;</font> -653 * <font style='background-color: #911437;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #911437'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #911437'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #911437'>&nbsp;@&nbsp;</font><font style='background-color: #911437; color: #888888'>&nbsp;@&nbsp;</font> -654 * <font style='background-color: #911437;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #911437; color: #ffffff'>&nbsp;@&nbsp;</font> -655 * </pre> -656 */ -657 public static final float RASPBERRY = -0x1.6e2922p125F; -658 static { NAMED.put("raspberry", -0x1.6e2922p125F); LIST.add(-0x1.6e2922p125F); } -659 -660 /** -661 * All names for colors in this palette, in alphabetical order. You can fetch the corresponding packed float color -662 * by looking up a name in {@link #NAMED}. -663 */ -664 public static final ObjectList<String> NAMES = NAMED.order(); -665 static { -666 NAMED.setDefaultValue(TRANSPARENT); -667 NAMES.sort(null); -668 } -669 /** -670 * All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to -671 * blue. You can fetch the corresponding packed float color by looking up a name in {@link #NAMED}. -672 */ -673 public static final ObjectList<String> NAMES_BY_HUE = new ObjectList<>(NAMES); -674 /** -675 * The packed IPT float colors that correspond to items in {@link #NAMES_BY_HUE}, with the same order. -676 */ -677 public static final FloatList COLORS_BY_HUE = new FloatList(NAMES_BY_HUE.size()); -678 /** -679 * All names for colors in this palette, sorted by lightness from black to white. You can fetch the -680 * corresponding packed float color by looking up a name in {@link #NAMED}. -681 */ -682 public static final ObjectList<String> NAMES_BY_LIGHTNESS = new ObjectList<>(NAMES); -683 static { -684 NAMES_BY_HUE.sort((o1, o2) -> { -685 final float c1 = NAMED.get(o1), c2 = NAMED.get(o2); -686 final float s1 = saturation(c1), s2 = saturation(c2); -687 // a packed float color with a sign bit of 0 (a non-negative number) is mostly transparent. -688 // this also considers 0x80000000 transparent, but it's almost at the threshold. -689 if(c1 >= 0f) return -10000; -690 else if(c2 >= 0f) return 10000; -691 else if(s1 <= 0.05f && s2 > 0.05f) -692 return -1000; -693 else if(s1 > 0.05f && s2 <= 0.05f) -694 return 1000; -695 else if(s1 <= 0.05f && s2 <= 0.05f) -696 return (int)Math.signum(lightness(c1) - lightness(c2)); -697 else -698 return 2 * (int)Math.signum(hue(c1) - hue(c2)) -699 + (int)Math.signum(lightness(c1) - lightness(c2)); -700 }); -701 for(String name : NAMES_BY_HUE) { -702 COLORS_BY_HUE.add(NAMED.get(name)); -703 } -704 NAMES_BY_LIGHTNESS.sort((o1, o2) -> Float.compare(lightness(NAMED.get(o1)), lightness(NAMED.get(o2)))); -705 } +022 * You can access colors by their constant name, such as {@code CACTUS}, by the {@link #NAMED} map using +023 * {@code NAMED.get("cactus", 0f)}, or by index in the FloatList called {@link #LIST}. Note that to access a float +024 * color from NAMED, you need to give a default value if the name is not found; {@code 0f} is a good default because it +025 * is used for fully-transparent. You can access the names in a specific order with {@link #NAMES} (which is +026 * alphabetical), {@link #NAMES_BY_HUE} (which is sorted by the hue of the matching color, from red to yellow to blue +027 * (with gray around here) to purple to red again), or {@link #NAMES_BY_LIGHTNESS} (which is sorted by the intensity of +028 * the matching color, from darkest to lightest). Having a name lets you look up the matching color in {@link #NAMED}. +029 */ +030public class SimplePalette { +031 /** +032 * You can look up colors by name here; the names are lower-case, and the colors are packed floats in rgba format. +033 */ +034 public static final ObjectFloatOrderedMap<String> NAMED = new ObjectFloatOrderedMap<>(60); +035 /** +036 * Stores alternative names for colors in {@link #NAMED}, like "grey" as an alias for {@link #GRAY} or "gold" as an +037 * alias for {@link #SAFFRON}. Currently, the list of aliases is as follows: +038 * <ul> +039 * <li>"grey" maps to {@link #GRAY},</li> +040 * <li>"gold" maps to {@link #SAFFRON},</li> +041 * <li>"puce" maps to {@link #MAUVE},</li> +042 * <li>"sand" maps to {@link #TAN},</li> +043 * <li>"skin" maps to {@link #PEACH},</li> +044 * <li>"coral" maps to {@link #SALMON},</li> +045 * <li>"azure" maps to {@link #SKY}, and</li> +046 * <li>"ocean" maps to {@link #TEAL}, and</li> +047 * <li>"sapphire" maps to {@link #COBALT}.</li> +048 * </ul> +049 * Note that these aliases are not duplicated in {@link #NAMES}, {@link #NAMES_BY_HUE}, or +050 * {@link #NAMES_BY_LIGHTNESS}; they are primarily there so blind attempts to name a color might still work. +051 */ +052 public static final ObjectFloatOrderedMap<String> ALIASES = new ObjectFloatOrderedMap<>(10); +053 /** +054 * Lists the packed float color values in this, in no particular order. Does not include duplicates from aliases. +055 */ +056 public static final FloatList LIST = new FloatList(50); +057 +058 /** +059 * This color constant "transparent" has RGBA8888 code {@code 00000000}, R 0.0, G 0.0, B 0.0, alpha 0.0, hue 0.0, and saturation 0.0. +060 * It can be represented as a packed float with the constant {@code 0x0.0p0F}. +061 * <pre> +062 * <font style='background-color: #000000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;@&nbsp;</font> +063 * <font style='background-color: #000000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;@&nbsp;</font><font style='background-color: #000000; color: #888888'>&nbsp;@&nbsp;</font> +064 * <font style='background-color: #000000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #ffffff'>&nbsp;@&nbsp;</font> +065 * </pre> +066 */ +067 public static final float TRANSPARENT = 0x0.0p0F; +068 static { NAMED.put("transparent", 0x0.0p0F); LIST.add(0x0.0p0F); } +069 +070 /** +071 * This color constant "black" has RGBA8888 code {@code 000000FF}, R 0.0, G 0.0, B 0.0, alpha 1.0, hue 0.0, and saturation 0.0. +072 * It can be represented as a packed float with the constant {@code -0x1.0p125F}. +073 * <pre> +074 * <font style='background-color: #000000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;@&nbsp;</font> +075 * <font style='background-color: #000000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;@&nbsp;</font><font style='background-color: #000000; color: #888888'>&nbsp;@&nbsp;</font> +076 * <font style='background-color: #000000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #ffffff'>&nbsp;@&nbsp;</font> +077 * </pre> +078 */ +079 public static final float BLACK = -0x1.0p125F; +080 static { NAMED.put("black", -0x1.0p125F); LIST.add(-0x1.0p125F); } +081 +082 /** +083 * This color constant "gray" has RGBA8888 code {@code 808080FF}, R 0.5019608, G 0.5019608, B 0.5019608, alpha 1.0, hue 0.0, and saturation 0.0. +084 * It can be represented as a packed float with the constant {@code -0x1.0101p126F}. +085 * <pre> +086 * <font style='background-color: #808080;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #808080; color: #000000'>&nbsp;@&nbsp;</font> +087 * <font style='background-color: #808080;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #808080'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #808080'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #808080'>&nbsp;@&nbsp;</font><font style='background-color: #808080; color: #888888'>&nbsp;@&nbsp;</font> +088 * <font style='background-color: #808080;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #808080; color: #ffffff'>&nbsp;@&nbsp;</font> +089 * </pre> +090 */ +091 public static final float GRAY = -0x1.0101p126F; +092 static { NAMED.put("gray", -0x1.0101p126F); LIST.add(-0x1.0101p126F); } +093 +094 /** +095 * This color constant "silver" has RGBA8888 code {@code B6B6B6FF}, R 0.7137255, G 0.7137255, B 0.7137255, alpha 1.0, hue 0.0, and saturation 0.0. +096 * It can be represented as a packed float with the constant {@code -0x1.6d6d6cp126F}. +097 * <pre> +098 * <font style='background-color: #B6B6B6;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #B6B6B6; color: #000000'>&nbsp;@&nbsp;</font> +099 * <font style='background-color: #B6B6B6;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #B6B6B6'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #B6B6B6'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #B6B6B6'>&nbsp;@&nbsp;</font><font style='background-color: #B6B6B6; color: #888888'>&nbsp;@&nbsp;</font> +100 * <font style='background-color: #B6B6B6;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #B6B6B6; color: #ffffff'>&nbsp;@&nbsp;</font> +101 * </pre> +102 */ +103 public static final float SILVER = -0x1.6d6d6cp126F; +104 static { NAMED.put("silver", -0x1.6d6d6cp126F); LIST.add(-0x1.6d6d6cp126F); } +105 +106 /** +107 * This color constant "white" has RGBA8888 code {@code FFFFFFFF}, R 1.0, G 1.0, B 1.0, alpha 1.0, hue 0.0, and saturation 0.0. +108 * It can be represented as a packed float with the constant {@code -0x1.fffffep126F}. +109 * <pre> +110 * <font style='background-color: #FFFFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFFFFF; color: #000000'>&nbsp;@&nbsp;</font> +111 * <font style='background-color: #FFFFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFFFFF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFFFFF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFFFFF'>&nbsp;@&nbsp;</font><font style='background-color: #FFFFFF; color: #888888'>&nbsp;@&nbsp;</font> +112 * <font style='background-color: #FFFFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFFFFF; color: #ffffff'>&nbsp;@&nbsp;</font> +113 * </pre> +114 */ +115 public static final float WHITE = -0x1.fffffep126F; +116 static { NAMED.put("white", -0x1.fffffep126F); LIST.add(-0x1.fffffep126F); } +117 +118 /** +119 * This color constant "red" has RGBA8888 code {@code FF0000FF}, R 1.0, G 0.0, B 0.0, alpha 1.0, hue 0.0, and saturation 1.0. +120 * It can be represented as a packed float with the constant {@code -0x1.0001fep125F}. +121 * <pre> +122 * <font style='background-color: #FF0000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF0000; color: #000000'>&nbsp;@&nbsp;</font> +123 * <font style='background-color: #FF0000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FF0000'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FF0000'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FF0000'>&nbsp;@&nbsp;</font><font style='background-color: #FF0000; color: #888888'>&nbsp;@&nbsp;</font> +124 * <font style='background-color: #FF0000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF0000; color: #ffffff'>&nbsp;@&nbsp;</font> +125 * </pre> +126 */ +127 public static final float RED = -0x1.0001fep125F; +128 static { NAMED.put("red", -0x1.0001fep125F); LIST.add(-0x1.0001fep125F); } +129 +130 /** +131 * This color constant "orange" has RGBA8888 code {@code FF7F00FF}, R 1.0, G 0.49803922, B 0.0, alpha 1.0, hue 0.08300654, and saturation 1.0. +132 * It can be represented as a packed float with the constant {@code -0x1.00fffep125F}. +133 * <pre> +134 * <font style='background-color: #FF7F00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF7F00; color: #000000'>&nbsp;@&nbsp;</font> +135 * <font style='background-color: #FF7F00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FF7F00'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FF7F00'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FF7F00'>&nbsp;@&nbsp;</font><font style='background-color: #FF7F00; color: #888888'>&nbsp;@&nbsp;</font> +136 * <font style='background-color: #FF7F00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF7F00; color: #ffffff'>&nbsp;@&nbsp;</font> +137 * </pre> +138 */ +139 public static final float ORANGE = -0x1.00fffep125F; +140 static { NAMED.put("orange", -0x1.00fffep125F); LIST.add(-0x1.00fffep125F); } +141 +142 /** +143 * This color constant "yellow" has RGBA8888 code {@code FFFF00FF}, R 1.0, G 1.0, B 0.0, alpha 1.0, hue 0.16666667, and saturation 1.0. +144 * It can be represented as a packed float with the constant {@code -0x1.01fffep125F}. +145 * <pre> +146 * <font style='background-color: #FFFF00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFFF00; color: #000000'>&nbsp;@&nbsp;</font> +147 * <font style='background-color: #FFFF00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFFF00'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFFF00'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFFF00'>&nbsp;@&nbsp;</font><font style='background-color: #FFFF00; color: #888888'>&nbsp;@&nbsp;</font> +148 * <font style='background-color: #FFFF00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFFF00; color: #ffffff'>&nbsp;@&nbsp;</font> +149 * </pre> +150 */ +151 public static final float YELLOW = -0x1.01fffep125F; +152 static { NAMED.put("yellow", -0x1.01fffep125F); LIST.add(-0x1.01fffep125F); } +153 +154 /** +155 * This color constant "green" has RGBA8888 code {@code 00FF00FF}, R 0.0, G 1.0, B 0.0, alpha 1.0, hue 0.33333334, and saturation 1.0. +156 * It can be represented as a packed float with the constant {@code -0x1.01fep125F}. +157 * <pre> +158 * <font style='background-color: #00FF00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #00FF00; color: #000000'>&nbsp;@&nbsp;</font> +159 * <font style='background-color: #00FF00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #00FF00'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #00FF00'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #00FF00'>&nbsp;@&nbsp;</font><font style='background-color: #00FF00; color: #888888'>&nbsp;@&nbsp;</font> +160 * <font style='background-color: #00FF00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #00FF00; color: #ffffff'>&nbsp;@&nbsp;</font> +161 * </pre> +162 */ +163 public static final float GREEN = -0x1.01fep125F; +164 static { NAMED.put("green", -0x1.01fep125F); LIST.add(-0x1.01fep125F); } +165 +166 /** +167 * This color constant "blue" has RGBA8888 code {@code 0000FFFF}, R 0.0, G 0.0, B 1.0, alpha 1.0, hue 0.6666667, and saturation 1.0. +168 * It can be represented as a packed float with the constant {@code -0x1.fep126F}. +169 * <pre> +170 * <font style='background-color: #0000FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #0000FF; color: #000000'>&nbsp;@&nbsp;</font> +171 * <font style='background-color: #0000FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #0000FF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #0000FF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #0000FF'>&nbsp;@&nbsp;</font><font style='background-color: #0000FF; color: #888888'>&nbsp;@&nbsp;</font> +172 * <font style='background-color: #0000FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #0000FF; color: #ffffff'>&nbsp;@&nbsp;</font> +173 * </pre> +174 */ +175 public static final float BLUE = -0x1.fep126F; +176 static { NAMED.put("blue", -0x1.fep126F); LIST.add(-0x1.fep126F); } +177 +178 /** +179 * This color constant "indigo" has RGBA8888 code {@code 520FE0FF}, R 0.32156864, G 0.05882353, B 0.8784314, alpha 1.0, hue 0.7200957, and saturation 0.81960785. +180 * It can be represented as a packed float with the constant {@code -0x1.c01ea4p126F}. +181 * <pre> +182 * <font style='background-color: #520FE0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #520FE0; color: #000000'>&nbsp;@&nbsp;</font> +183 * <font style='background-color: #520FE0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #520FE0'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #520FE0'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #520FE0'>&nbsp;@&nbsp;</font><font style='background-color: #520FE0; color: #888888'>&nbsp;@&nbsp;</font> +184 * <font style='background-color: #520FE0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #520FE0; color: #ffffff'>&nbsp;@&nbsp;</font> +185 * </pre> +186 */ +187 public static final float INDIGO = -0x1.c01ea4p126F; +188 static { NAMED.put("indigo", -0x1.c01ea4p126F); LIST.add(-0x1.c01ea4p126F); } +189 +190 /** +191 * This color constant "violet" has RGBA8888 code {@code 9040EFFF}, R 0.5647059, G 0.2509804, B 0.9372549, alpha 1.0, hue 0.74285716, and saturation 0.6862745. +192 * It can be represented as a packed float with the constant {@code -0x1.de812p126F}. +193 * <pre> +194 * <font style='background-color: #9040EF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #9040EF; color: #000000'>&nbsp;@&nbsp;</font> +195 * <font style='background-color: #9040EF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #9040EF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #9040EF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #9040EF'>&nbsp;@&nbsp;</font><font style='background-color: #9040EF; color: #888888'>&nbsp;@&nbsp;</font> +196 * <font style='background-color: #9040EF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #9040EF; color: #ffffff'>&nbsp;@&nbsp;</font> +197 * </pre> +198 */ +199 public static final float VIOLET = -0x1.de812p126F; +200 static { NAMED.put("violet", -0x1.de812p126F); LIST.add(-0x1.de812p126F); } +201 +202 /** +203 * This color constant "purple" has RGBA8888 code {@code C000FFFF}, R 0.7529412, G 0.0, B 1.0, alpha 1.0, hue 0.7921569, and saturation 1.0. +204 * It can be represented as a packed float with the constant {@code -0x1.fe018p126F}. +205 * <pre> +206 * <font style='background-color: #C000FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C000FF; color: #000000'>&nbsp;@&nbsp;</font> +207 * <font style='background-color: #C000FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #C000FF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #C000FF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #C000FF'>&nbsp;@&nbsp;</font><font style='background-color: #C000FF; color: #888888'>&nbsp;@&nbsp;</font> +208 * <font style='background-color: #C000FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C000FF; color: #ffffff'>&nbsp;@&nbsp;</font> +209 * </pre> +210 */ +211 public static final float PURPLE = -0x1.fe018p126F; +212 static { NAMED.put("purple", -0x1.fe018p126F); LIST.add(-0x1.fe018p126F); } +213 +214 /** +215 * This color constant "brown" has RGBA8888 code {@code 8F573BFF}, R 0.56078434, G 0.34117648, B 0.23137255, alpha 1.0, hue 0.055555552, and saturation 0.3294118. +216 * It can be represented as a packed float with the constant {@code -0x1.76af1ep125F}. +217 * <pre> +218 * <font style='background-color: #8F573B;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #8F573B; color: #000000'>&nbsp;@&nbsp;</font> +219 * <font style='background-color: #8F573B;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #8F573B'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #8F573B'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #8F573B'>&nbsp;@&nbsp;</font><font style='background-color: #8F573B; color: #888888'>&nbsp;@&nbsp;</font> +220 * <font style='background-color: #8F573B;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #8F573B; color: #ffffff'>&nbsp;@&nbsp;</font> +221 * </pre> +222 */ +223 public static final float BROWN = -0x1.76af1ep125F; +224 static { NAMED.put("brown", -0x1.76af1ep125F); LIST.add(-0x1.76af1ep125F); } +225 +226 /** +227 * This color constant "pink" has RGBA8888 code {@code FFA0E0FF}, R 1.0, G 0.627451, B 0.8784314, alpha 1.0, hue 0.8877193, and saturation 0.372549. +228 * It can be represented as a packed float with the constant {@code -0x1.c141fep126F}. +229 * <pre> +230 * <font style='background-color: #FFA0E0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFA0E0; color: #000000'>&nbsp;@&nbsp;</font> +231 * <font style='background-color: #FFA0E0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFA0E0'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFA0E0'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFA0E0'>&nbsp;@&nbsp;</font><font style='background-color: #FFA0E0; color: #888888'>&nbsp;@&nbsp;</font> +232 * <font style='background-color: #FFA0E0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFA0E0; color: #ffffff'>&nbsp;@&nbsp;</font> +233 * </pre> +234 */ +235 public static final float PINK = -0x1.c141fep126F; +236 static { NAMED.put("pink", -0x1.c141fep126F); LIST.add(-0x1.c141fep126F); } +237 +238 /** +239 * This color constant "magenta" has RGBA8888 code {@code F500F5FF}, R 0.9607843, G 0.0, B 0.9607843, alpha 1.0, hue 0.8333333, and saturation 0.9607843. +240 * It can be represented as a packed float with the constant {@code -0x1.ea01eap126F}. +241 * <pre> +242 * <font style='background-color: #F500F5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #F500F5; color: #000000'>&nbsp;@&nbsp;</font> +243 * <font style='background-color: #F500F5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #F500F5'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #F500F5'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #F500F5'>&nbsp;@&nbsp;</font><font style='background-color: #F500F5; color: #888888'>&nbsp;@&nbsp;</font> +244 * <font style='background-color: #F500F5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #F500F5; color: #ffffff'>&nbsp;@&nbsp;</font> +245 * </pre> +246 */ +247 public static final float MAGENTA = -0x1.ea01eap126F; +248 static { NAMED.put("magenta", -0x1.ea01eap126F); LIST.add(-0x1.ea01eap126F); } +249 +250 /** +251 * This color constant "brick" has RGBA8888 code {@code D5524AFF}, R 0.8352941, G 0.32156864, B 0.2901961, alpha 1.0, hue 0.009592325, and saturation 0.54509807. +252 * It can be represented as a packed float with the constant {@code -0x1.94a5aap125F}. +253 * <pre> +254 * <font style='background-color: #D5524A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D5524A; color: #000000'>&nbsp;@&nbsp;</font> +255 * <font style='background-color: #D5524A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #D5524A'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #D5524A'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #D5524A'>&nbsp;@&nbsp;</font><font style='background-color: #D5524A; color: #888888'>&nbsp;@&nbsp;</font> +256 * <font style='background-color: #D5524A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D5524A; color: #ffffff'>&nbsp;@&nbsp;</font> +257 * </pre> +258 */ +259 public static final float BRICK = -0x1.94a5aap125F; +260 static { NAMED.put("brick", -0x1.94a5aap125F); LIST.add(-0x1.94a5aap125F); } +261 +262 /** +263 * This color constant "ember" has RGBA8888 code {@code F55A32FF}, R 0.9607843, G 0.3529412, B 0.19607843, alpha 1.0, hue 0.034188036, and saturation 0.7647059. +264 * It can be represented as a packed float with the constant {@code -0x1.64b5eap125F}. +265 * <pre> +266 * <font style='background-color: #F55A32;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #F55A32; color: #000000'>&nbsp;@&nbsp;</font> +267 * <font style='background-color: #F55A32;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #F55A32'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #F55A32'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #F55A32'>&nbsp;@&nbsp;</font><font style='background-color: #F55A32; color: #888888'>&nbsp;@&nbsp;</font> +268 * <font style='background-color: #F55A32;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #F55A32; color: #ffffff'>&nbsp;@&nbsp;</font> +269 * </pre> +270 */ +271 public static final float EMBER = -0x1.64b5eap125F; +272 static { NAMED.put("ember", -0x1.64b5eap125F); LIST.add(-0x1.64b5eap125F); } +273 +274 /** +275 * This color constant "salmon" has RGBA8888 code {@code FF6262FF}, R 1.0, G 0.38431373, B 0.38431373, alpha 1.0, hue 0.0, and saturation 0.6156863. +276 * It can be represented as a packed float with the constant {@code -0x1.c4c5fep125F}. +277 * <pre> +278 * <font style='background-color: #FF6262;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF6262; color: #000000'>&nbsp;@&nbsp;</font> +279 * <font style='background-color: #FF6262;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FF6262'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FF6262'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FF6262'>&nbsp;@&nbsp;</font><font style='background-color: #FF6262; color: #888888'>&nbsp;@&nbsp;</font> +280 * <font style='background-color: #FF6262;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF6262; color: #ffffff'>&nbsp;@&nbsp;</font> +281 * </pre> +282 */ +283 public static final float SALMON = -0x1.c4c5fep125F; +284 static { NAMED.put("salmon", -0x1.c4c5fep125F); LIST.add(-0x1.c4c5fep125F); } +285 +286 /** +287 * This color constant "chocolate" has RGBA8888 code {@code 683818FF}, R 0.40784314, G 0.21960784, B 0.09411765, alpha 1.0, hue 0.066666655, and saturation 0.3137255. +288 * It can be represented as a packed float with the constant {@code -0x1.3070dp125F}. +289 * <pre> +290 * <font style='background-color: #683818;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #683818; color: #000000'>&nbsp;@&nbsp;</font> +291 * <font style='background-color: #683818;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #683818'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #683818'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #683818'>&nbsp;@&nbsp;</font><font style='background-color: #683818; color: #888888'>&nbsp;@&nbsp;</font> +292 * <font style='background-color: #683818;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #683818; color: #ffffff'>&nbsp;@&nbsp;</font> +293 * </pre> +294 */ +295 public static final float CHOCOLATE = -0x1.3070dp125F; +296 static { NAMED.put("chocolate", -0x1.3070dp125F); LIST.add(-0x1.3070dp125F); } +297 +298 /** +299 * This color constant "tan" has RGBA8888 code {@code D2B48CFF}, R 0.8235294, G 0.7058824, B 0.54901963, alpha 1.0, hue 0.0952381, and saturation 0.2745098. +300 * It can be represented as a packed float with the constant {@code -0x1.1969a4p126F}. +301 * <pre> +302 * <font style='background-color: #D2B48C;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D2B48C; color: #000000'>&nbsp;@&nbsp;</font> +303 * <font style='background-color: #D2B48C;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #D2B48C'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #D2B48C'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #D2B48C'>&nbsp;@&nbsp;</font><font style='background-color: #D2B48C; color: #888888'>&nbsp;@&nbsp;</font> +304 * <font style='background-color: #D2B48C;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D2B48C; color: #ffffff'>&nbsp;@&nbsp;</font> +305 * </pre> +306 */ +307 public static final float TAN = -0x1.1969a4p126F; +308 static { NAMED.put("tan", -0x1.1969a4p126F); LIST.add(-0x1.1969a4p126F); } +309 +310 /** +311 * This color constant "bronze" has RGBA8888 code {@code CE8E31FF}, R 0.80784315, G 0.5568628, B 0.19215687, alpha 1.0, hue 0.09872612, and saturation 0.6156863. +312 * It can be represented as a packed float with the constant {@code -0x1.631d9cp125F}. +313 * <pre> +314 * <font style='background-color: #CE8E31;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #CE8E31; color: #000000'>&nbsp;@&nbsp;</font> +315 * <font style='background-color: #CE8E31;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #CE8E31'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #CE8E31'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #CE8E31'>&nbsp;@&nbsp;</font><font style='background-color: #CE8E31; color: #888888'>&nbsp;@&nbsp;</font> +316 * <font style='background-color: #CE8E31;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #CE8E31; color: #ffffff'>&nbsp;@&nbsp;</font> +317 * </pre> +318 */ +319 public static final float BRONZE = -0x1.631d9cp125F; +320 static { NAMED.put("bronze", -0x1.631d9cp125F); LIST.add(-0x1.631d9cp125F); } +321 +322 /** +323 * This color constant "cinnamon" has RGBA8888 code {@code D2691DFF}, R 0.8235294, G 0.4117647, B 0.11372549, alpha 1.0, hue 0.06998159, and saturation 0.70980394. +324 * It can be represented as a packed float with the constant {@code -0x1.3ad3a4p125F}. +325 * <pre> +326 * <font style='background-color: #D2691D;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D2691D; color: #000000'>&nbsp;@&nbsp;</font> +327 * <font style='background-color: #D2691D;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #D2691D'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #D2691D'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #D2691D'>&nbsp;@&nbsp;</font><font style='background-color: #D2691D; color: #888888'>&nbsp;@&nbsp;</font> +328 * <font style='background-color: #D2691D;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D2691D; color: #ffffff'>&nbsp;@&nbsp;</font> +329 * </pre> +330 */ +331 public static final float CINNAMON = -0x1.3ad3a4p125F; +332 static { NAMED.put("cinnamon", -0x1.3ad3a4p125F); LIST.add(-0x1.3ad3a4p125F); } +333 +334 /** +335 * This color constant "apricot" has RGBA8888 code {@code FFA828FF}, R 1.0, G 0.65882355, B 0.15686275, alpha 1.0, hue 0.09922481, and saturation 0.84313726. +336 * It can be represented as a packed float with the constant {@code -0x1.5151fep125F}. +337 * <pre> +338 * <font style='background-color: #FFA828;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFA828; color: #000000'>&nbsp;@&nbsp;</font> +339 * <font style='background-color: #FFA828;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFA828'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFA828'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFA828'>&nbsp;@&nbsp;</font><font style='background-color: #FFA828; color: #888888'>&nbsp;@&nbsp;</font> +340 * <font style='background-color: #FFA828;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFA828; color: #ffffff'>&nbsp;@&nbsp;</font> +341 * </pre> +342 */ +343 public static final float APRICOT = -0x1.5151fep125F; +344 static { NAMED.put("apricot", -0x1.5151fep125F); LIST.add(-0x1.5151fep125F); } +345 +346 /** +347 * This color constant "peach" has RGBA8888 code {@code FFBF81FF}, R 1.0, G 0.7490196, B 0.5058824, alpha 1.0, hue 0.08201058, and saturation 0.49411762. +348 * It can be represented as a packed float with the constant {@code -0x1.037ffep126F}. +349 * <pre> +350 * <font style='background-color: #FFBF81;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFBF81; color: #000000'>&nbsp;@&nbsp;</font> +351 * <font style='background-color: #FFBF81;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFBF81'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFBF81'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFBF81'>&nbsp;@&nbsp;</font><font style='background-color: #FFBF81; color: #888888'>&nbsp;@&nbsp;</font> +352 * <font style='background-color: #FFBF81;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFBF81; color: #ffffff'>&nbsp;@&nbsp;</font> +353 * </pre> +354 */ +355 public static final float PEACH = -0x1.037ffep126F; +356 static { NAMED.put("peach", -0x1.037ffep126F); LIST.add(-0x1.037ffep126F); } +357 +358 /** +359 * This color constant "pear" has RGBA8888 code {@code D3E330FF}, R 0.827451, G 0.8901961, B 0.1882353, alpha 1.0, hue 0.18156426, and saturation 0.7019608. +360 * It can be represented as a packed float with the constant {@code -0x1.61c7a6p125F}. +361 * <pre> +362 * <font style='background-color: #D3E330;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D3E330; color: #000000'>&nbsp;@&nbsp;</font> +363 * <font style='background-color: #D3E330;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #D3E330'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #D3E330'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #D3E330'>&nbsp;@&nbsp;</font><font style='background-color: #D3E330; color: #888888'>&nbsp;@&nbsp;</font> +364 * <font style='background-color: #D3E330;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D3E330; color: #ffffff'>&nbsp;@&nbsp;</font> +365 * </pre> +366 */ +367 public static final float PEAR = -0x1.61c7a6p125F; +368 static { NAMED.put("pear", -0x1.61c7a6p125F); LIST.add(-0x1.61c7a6p125F); } +369 +370 /** +371 * This color constant "saffron" has RGBA8888 code {@code FFD510FF}, R 1.0, G 0.8352941, B 0.0627451, alpha 1.0, hue 0.13737796, and saturation 0.9372549. +372 * It can be represented as a packed float with the constant {@code -0x1.21abfep125F}. +373 * <pre> +374 * <font style='background-color: #FFD510;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFD510; color: #000000'>&nbsp;@&nbsp;</font> +375 * <font style='background-color: #FFD510;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFD510'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFD510'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFD510'>&nbsp;@&nbsp;</font><font style='background-color: #FFD510; color: #888888'>&nbsp;@&nbsp;</font> +376 * <font style='background-color: #FFD510;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFD510; color: #ffffff'>&nbsp;@&nbsp;</font> +377 * </pre> +378 */ +379 public static final float SAFFRON = -0x1.21abfep125F; +380 static { NAMED.put("saffron", -0x1.21abfep125F); LIST.add(-0x1.21abfep125F); } +381 +382 /** +383 * This color constant "butter" has RGBA8888 code {@code FFF288FF}, R 1.0, G 0.9490196, B 0.53333336, alpha 1.0, hue 0.14845939, and saturation 0.46666664. +384 * It can be represented as a packed float with the constant {@code -0x1.11e5fep126F}. +385 * <pre> +386 * <font style='background-color: #FFF288;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFF288; color: #000000'>&nbsp;@&nbsp;</font> +387 * <font style='background-color: #FFF288;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFF288'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFF288'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFF288'>&nbsp;@&nbsp;</font><font style='background-color: #FFF288; color: #888888'>&nbsp;@&nbsp;</font> +388 * <font style='background-color: #FFF288;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFF288; color: #ffffff'>&nbsp;@&nbsp;</font> +389 * </pre> +390 */ +391 public static final float BUTTER = -0x1.11e5fep126F; +392 static { NAMED.put("butter", -0x1.11e5fep126F); LIST.add(-0x1.11e5fep126F); } +393 +394 /** +395 * This color constant "chartreuse" has RGBA8888 code {@code C8FF41FF}, R 0.78431374, G 1.0, B 0.25490198, alpha 1.0, hue 0.21491227, and saturation 0.745098. +396 * It can be represented as a packed float with the constant {@code -0x1.83ff9p125F}. +397 * <pre> +398 * <font style='background-color: #C8FF41;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C8FF41; color: #000000'>&nbsp;@&nbsp;</font> +399 * <font style='background-color: #C8FF41;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #C8FF41'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #C8FF41'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #C8FF41'>&nbsp;@&nbsp;</font><font style='background-color: #C8FF41; color: #888888'>&nbsp;@&nbsp;</font> +400 * <font style='background-color: #C8FF41;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C8FF41; color: #ffffff'>&nbsp;@&nbsp;</font> +401 * </pre> +402 */ +403 public static final float CHARTREUSE = -0x1.83ff9p125F; +404 static { NAMED.put("chartreuse", -0x1.83ff9p125F); LIST.add(-0x1.83ff9p125F); } +405 +406 /** +407 * This color constant "cactus" has RGBA8888 code {@code 30A000FF}, R 0.1882353, G 0.627451, B 0.0, alpha 1.0, hue 0.28333336, and saturation 0.627451. +408 * It can be represented as a packed float with the constant {@code -0x1.01406p125F}. +409 * <pre> +410 * <font style='background-color: #30A000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #30A000; color: #000000'>&nbsp;@&nbsp;</font> +411 * <font style='background-color: #30A000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #30A000'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #30A000'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #30A000'>&nbsp;@&nbsp;</font><font style='background-color: #30A000; color: #888888'>&nbsp;@&nbsp;</font> +412 * <font style='background-color: #30A000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #30A000; color: #ffffff'>&nbsp;@&nbsp;</font> +413 * </pre> +414 */ +415 public static final float CACTUS = -0x1.01406p125F; +416 static { NAMED.put("cactus", -0x1.01406p125F); LIST.add(-0x1.01406p125F); } +417 +418 /** +419 * This color constant "lime" has RGBA8888 code {@code 93D300FF}, R 0.5764706, G 0.827451, B 0.0, alpha 1.0, hue 0.21721959, and saturation 0.827451. +420 * It can be represented as a packed float with the constant {@code -0x1.01a726p125F}. +421 * <pre> +422 * <font style='background-color: #93D300;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #93D300; color: #000000'>&nbsp;@&nbsp;</font> +423 * <font style='background-color: #93D300;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #93D300'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #93D300'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #93D300'>&nbsp;@&nbsp;</font><font style='background-color: #93D300; color: #888888'>&nbsp;@&nbsp;</font> +424 * <font style='background-color: #93D300;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #93D300; color: #ffffff'>&nbsp;@&nbsp;</font> +425 * </pre> +426 */ +427 public static final float LIME = -0x1.01a726p125F; +428 static { NAMED.put("lime", -0x1.01a726p125F); LIST.add(-0x1.01a726p125F); } +429 +430 /** +431 * This color constant "olive" has RGBA8888 code {@code 818000FF}, R 0.5058824, G 0.5019608, B 0.0, alpha 1.0, hue 0.16537468, and saturation 0.5058824. +432 * It can be represented as a packed float with the constant {@code -0x1.010102p125F}. +433 * <pre> +434 * <font style='background-color: #818000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #818000; color: #000000'>&nbsp;@&nbsp;</font> +435 * <font style='background-color: #818000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #818000'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #818000'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #818000'>&nbsp;@&nbsp;</font><font style='background-color: #818000; color: #888888'>&nbsp;@&nbsp;</font> +436 * <font style='background-color: #818000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #818000; color: #ffffff'>&nbsp;@&nbsp;</font> +437 * </pre> +438 */ +439 public static final float OLIVE = -0x1.010102p125F; +440 static { NAMED.put("olive", -0x1.010102p125F); LIST.add(-0x1.010102p125F); } +441 +442 /** +443 * This color constant "fern" has RGBA8888 code {@code 4E7942FF}, R 0.30588236, G 0.4745098, B 0.25882354, alpha 1.0, hue 0.2969697, and saturation 0.21568626. +444 * It can be represented as a packed float with the constant {@code -0x1.84f29cp125F}. +445 * <pre> +446 * <font style='background-color: #4E7942;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #4E7942; color: #000000'>&nbsp;@&nbsp;</font> +447 * <font style='background-color: #4E7942;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #4E7942'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #4E7942'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #4E7942'>&nbsp;@&nbsp;</font><font style='background-color: #4E7942; color: #888888'>&nbsp;@&nbsp;</font> +448 * <font style='background-color: #4E7942;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #4E7942; color: #ffffff'>&nbsp;@&nbsp;</font> +449 * </pre> +450 */ +451 public static final float FERN = -0x1.84f29cp125F; +452 static { NAMED.put("fern", -0x1.84f29cp125F); LIST.add(-0x1.84f29cp125F); } +453 +454 /** +455 * This color constant "moss" has RGBA8888 code {@code 204608FF}, R 0.1254902, G 0.27450982, B 0.03137255, alpha 1.0, hue 0.26881722, and saturation 0.24313727. +456 * It can be represented as a packed float with the constant {@code -0x1.108c4p125F}. +457 * <pre> +458 * <font style='background-color: #204608;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #204608; color: #000000'>&nbsp;@&nbsp;</font> +459 * <font style='background-color: #204608;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #204608'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #204608'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #204608'>&nbsp;@&nbsp;</font><font style='background-color: #204608; color: #888888'>&nbsp;@&nbsp;</font> +460 * <font style='background-color: #204608;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #204608; color: #ffffff'>&nbsp;@&nbsp;</font> +461 * </pre> +462 */ +463 public static final float MOSS = -0x1.108c4p125F; +464 static { NAMED.put("moss", -0x1.108c4p125F); LIST.add(-0x1.108c4p125F); } +465 +466 /** +467 * This color constant "celery" has RGBA8888 code {@code 7DFF73FF}, R 0.49019608, G 1.0, B 0.4509804, alpha 1.0, hue 0.32142857, and saturation 0.5490196. +468 * It can be represented as a packed float with the constant {@code -0x1.e7fefap125F}. +469 * <pre> +470 * <font style='background-color: #7DFF73;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #7DFF73; color: #000000'>&nbsp;@&nbsp;</font> +471 * <font style='background-color: #7DFF73;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #7DFF73'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #7DFF73'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #7DFF73'>&nbsp;@&nbsp;</font><font style='background-color: #7DFF73; color: #888888'>&nbsp;@&nbsp;</font> +472 * <font style='background-color: #7DFF73;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #7DFF73; color: #ffffff'>&nbsp;@&nbsp;</font> +473 * </pre> +474 */ +475 public static final float CELERY = -0x1.e7fefap125F; +476 static { NAMED.put("celery", -0x1.e7fefap125F); LIST.add(-0x1.e7fefap125F); } +477 +478 /** +479 * This color constant "sage" has RGBA8888 code {@code ABE3C5FF}, R 0.67058825, G 0.8901961, B 0.77254903, alpha 1.0, hue 0.4107143, and saturation 0.21960783. +480 * It can be represented as a packed float with the constant {@code -0x1.8bc756p126F}. +481 * <pre> +482 * <font style='background-color: #ABE3C5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ABE3C5; color: #000000'>&nbsp;@&nbsp;</font> +483 * <font style='background-color: #ABE3C5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #ABE3C5'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #ABE3C5'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #ABE3C5'>&nbsp;@&nbsp;</font><font style='background-color: #ABE3C5; color: #888888'>&nbsp;@&nbsp;</font> +484 * <font style='background-color: #ABE3C5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ABE3C5; color: #ffffff'>&nbsp;@&nbsp;</font> +485 * </pre> +486 */ +487 public static final float SAGE = -0x1.8bc756p126F; +488 static { NAMED.put("sage", -0x1.8bc756p126F); LIST.add(-0x1.8bc756p126F); } +489 +490 /** +491 * This color constant "jade" has RGBA8888 code {@code 3FBF3FFF}, R 0.24705882, G 0.7490196, B 0.24705882, alpha 1.0, hue 0.33333334, and saturation 0.5019608. +492 * It can be represented as a packed float with the constant {@code -0x1.7f7e7ep125F}. +493 * <pre> +494 * <font style='background-color: #3FBF3F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3FBF3F; color: #000000'>&nbsp;@&nbsp;</font> +495 * <font style='background-color: #3FBF3F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #3FBF3F'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #3FBF3F'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #3FBF3F'>&nbsp;@&nbsp;</font><font style='background-color: #3FBF3F; color: #888888'>&nbsp;@&nbsp;</font> +496 * <font style='background-color: #3FBF3F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3FBF3F; color: #ffffff'>&nbsp;@&nbsp;</font> +497 * </pre> +498 */ +499 public static final float JADE = -0x1.7f7e7ep125F; +500 static { NAMED.put("jade", -0x1.7f7e7ep125F); LIST.add(-0x1.7f7e7ep125F); } +501 +502 /** +503 * This color constant "cyan" has RGBA8888 code {@code 00FFFFFF}, R 0.0, G 1.0, B 1.0, alpha 1.0, hue 0.5, and saturation 1.0. +504 * It can be represented as a packed float with the constant {@code -0x1.fffep126F}. +505 * <pre> +506 * <font style='background-color: #00FFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #00FFFF; color: #000000'>&nbsp;@&nbsp;</font> +507 * <font style='background-color: #00FFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #00FFFF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #00FFFF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #00FFFF'>&nbsp;@&nbsp;</font><font style='background-color: #00FFFF; color: #888888'>&nbsp;@&nbsp;</font> +508 * <font style='background-color: #00FFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #00FFFF; color: #ffffff'>&nbsp;@&nbsp;</font> +509 * </pre> +510 */ +511 public static final float CYAN = -0x1.fffep126F; +512 static { NAMED.put("cyan", -0x1.fffep126F); LIST.add(-0x1.fffep126F); } +513 +514 /** +515 * This color constant "mint" has RGBA8888 code {@code 7FFFD4FF}, R 0.49803922, G 1.0, B 0.83137256, alpha 1.0, hue 0.44401044, and saturation 0.50196075. +516 * It can be represented as a packed float with the constant {@code -0x1.a9fefep126F}. +517 * <pre> +518 * <font style='background-color: #7FFFD4;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #7FFFD4; color: #000000'>&nbsp;@&nbsp;</font> +519 * <font style='background-color: #7FFFD4;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #7FFFD4'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #7FFFD4'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #7FFFD4'>&nbsp;@&nbsp;</font><font style='background-color: #7FFFD4; color: #888888'>&nbsp;@&nbsp;</font> +520 * <font style='background-color: #7FFFD4;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #7FFFD4; color: #ffffff'>&nbsp;@&nbsp;</font> +521 * </pre> +522 */ +523 public static final float MINT = -0x1.a9fefep126F; +524 static { NAMED.put("mint", -0x1.a9fefep126F); LIST.add(-0x1.a9fefep126F); } +525 +526 /** +527 * This color constant "teal" has RGBA8888 code {@code 007F7FFF}, R 0.0, G 0.49803922, B 0.49803922, alpha 1.0, hue 0.5, and saturation 0.49803922. +528 * It can be represented as a packed float with the constant {@code -0x1.fefep125F}. +529 * <pre> +530 * <font style='background-color: #007F7F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #007F7F; color: #000000'>&nbsp;@&nbsp;</font> +531 * <font style='background-color: #007F7F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #007F7F'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #007F7F'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #007F7F'>&nbsp;@&nbsp;</font><font style='background-color: #007F7F; color: #888888'>&nbsp;@&nbsp;</font> +532 * <font style='background-color: #007F7F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #007F7F; color: #ffffff'>&nbsp;@&nbsp;</font> +533 * </pre> +534 */ +535 public static final float TEAL = -0x1.fefep125F; +536 static { NAMED.put("teal", -0x1.fefep125F); LIST.add(-0x1.fefep125F); } +537 +538 /** +539 * This color constant "turquoise" has RGBA8888 code {@code 2ED6C9FF}, R 0.18039216, G 0.8392157, B 0.7882353, alpha 1.0, hue 0.48710316, and saturation 0.65882355. +540 * It can be represented as a packed float with the constant {@code -0x1.93ac5cp126F}. +541 * <pre> +542 * <font style='background-color: #2ED6C9;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #2ED6C9; color: #000000'>&nbsp;@&nbsp;</font> +543 * <font style='background-color: #2ED6C9;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #2ED6C9'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #2ED6C9'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #2ED6C9'>&nbsp;@&nbsp;</font><font style='background-color: #2ED6C9; color: #888888'>&nbsp;@&nbsp;</font> +544 * <font style='background-color: #2ED6C9;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #2ED6C9; color: #ffffff'>&nbsp;@&nbsp;</font> +545 * </pre> +546 */ +547 public static final float TURQUOISE = -0x1.93ac5cp126F; +548 static { NAMED.put("turquoise", -0x1.93ac5cp126F); LIST.add(-0x1.93ac5cp126F); } +549 +550 /** +551 * This color constant "sky" has RGBA8888 code {@code 10C0E0FF}, R 0.0627451, G 0.7529412, B 0.8784314, alpha 1.0, hue 0.5256411, and saturation 0.8156863. +552 * It can be represented as a packed float with the constant {@code -0x1.c1802p126F}. +553 * <pre> +554 * <font style='background-color: #10C0E0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #10C0E0; color: #000000'>&nbsp;@&nbsp;</font> +555 * <font style='background-color: #10C0E0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #10C0E0'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #10C0E0'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #10C0E0'>&nbsp;@&nbsp;</font><font style='background-color: #10C0E0; color: #888888'>&nbsp;@&nbsp;</font> +556 * <font style='background-color: #10C0E0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #10C0E0; color: #ffffff'>&nbsp;@&nbsp;</font> +557 * </pre> +558 */ +559 public static final float SKY = -0x1.c1802p126F; +560 static { NAMED.put("sky", -0x1.c1802p126F); LIST.add(-0x1.c1802p126F); } +561 +562 /** +563 * This color constant "cobalt" has RGBA8888 code {@code 0046ABFF}, R 0.0, G 0.27450982, B 0.67058825, alpha 1.0, hue 0.5984406, and saturation 0.67058825. +564 * It can be represented as a packed float with the constant {@code -0x1.568cp126F}. +565 * <pre> +566 * <font style='background-color: #0046AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #0046AB; color: #000000'>&nbsp;@&nbsp;</font> +567 * <font style='background-color: #0046AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #0046AB'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #0046AB'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #0046AB'>&nbsp;@&nbsp;</font><font style='background-color: #0046AB; color: #888888'>&nbsp;@&nbsp;</font> +568 * <font style='background-color: #0046AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #0046AB; color: #ffffff'>&nbsp;@&nbsp;</font> +569 * </pre> +570 */ +571 public static final float COBALT = -0x1.568cp126F; +572 static { NAMED.put("cobalt", -0x1.568cp126F); LIST.add(-0x1.568cp126F); } +573 +574 /** +575 * This color constant "denim" has RGBA8888 code {@code 3088B8FF}, R 0.1882353, G 0.53333336, B 0.72156864, alpha 1.0, hue 0.5588235, and saturation 0.53333336. +576 * It can be represented as a packed float with the constant {@code -0x1.71106p126F}. +577 * <pre> +578 * <font style='background-color: #3088B8;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3088B8; color: #000000'>&nbsp;@&nbsp;</font> +579 * <font style='background-color: #3088B8;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #3088B8'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #3088B8'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #3088B8'>&nbsp;@&nbsp;</font><font style='background-color: #3088B8; color: #888888'>&nbsp;@&nbsp;</font> +580 * <font style='background-color: #3088B8;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3088B8; color: #ffffff'>&nbsp;@&nbsp;</font> +581 * </pre> +582 */ +583 public static final float DENIM = -0x1.71106p126F; +584 static { NAMED.put("denim", -0x1.71106p126F); LIST.add(-0x1.71106p126F); } +585 +586 /** +587 * This color constant "navy" has RGBA8888 code {@code 000080FF}, R 0.0, G 0.0, B 0.5019608, alpha 1.0, hue 0.6666667, and saturation 0.5019608. +588 * It can be represented as a packed float with the constant {@code -0x1.0p126F}. +589 * <pre> +590 * <font style='background-color: #000080;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000080; color: #000000'>&nbsp;@&nbsp;</font> +591 * <font style='background-color: #000080;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000080'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #000080'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #000080'>&nbsp;@&nbsp;</font><font style='background-color: #000080; color: #888888'>&nbsp;@&nbsp;</font> +592 * <font style='background-color: #000080;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000080; color: #ffffff'>&nbsp;@&nbsp;</font> +593 * </pre> +594 */ +595 public static final float NAVY = -0x1.0p126F; +596 static { NAMED.put("navy", -0x1.0p126F); LIST.add(-0x1.0p126F); } +597 +598 /** +599 * This color constant "lavender" has RGBA8888 code {@code B991FFFF}, R 0.7254902, G 0.5686275, B 1.0, alpha 1.0, hue 0.72727275, and saturation 0.43137252. +600 * It can be represented as a packed float with the constant {@code -0x1.ff2372p126F}. +601 * <pre> +602 * <font style='background-color: #B991FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #B991FF; color: #000000'>&nbsp;@&nbsp;</font> +603 * <font style='background-color: #B991FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #B991FF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #B991FF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #B991FF'>&nbsp;@&nbsp;</font><font style='background-color: #B991FF; color: #888888'>&nbsp;@&nbsp;</font> +604 * <font style='background-color: #B991FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #B991FF; color: #ffffff'>&nbsp;@&nbsp;</font> +605 * </pre> +606 */ +607 public static final float LAVENDER = -0x1.ff2372p126F; +608 static { NAMED.put("lavender", -0x1.ff2372p126F); LIST.add(-0x1.ff2372p126F); } +609 +610 /** +611 * This color constant "plum" has RGBA8888 code {@code BE0DC6FF}, R 0.74509805, G 0.050980393, B 0.7764706, alpha 1.0, hue 0.82612616, and saturation 0.7254902. +612 * It can be represented as a packed float with the constant {@code -0x1.8c1b7cp126F}. +613 * <pre> +614 * <font style='background-color: #BE0DC6;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #BE0DC6; color: #000000'>&nbsp;@&nbsp;</font> +615 * <font style='background-color: #BE0DC6;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #BE0DC6'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #BE0DC6'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #BE0DC6'>&nbsp;@&nbsp;</font><font style='background-color: #BE0DC6; color: #888888'>&nbsp;@&nbsp;</font> +616 * <font style='background-color: #BE0DC6;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #BE0DC6; color: #ffffff'>&nbsp;@&nbsp;</font> +617 * </pre> +618 */ +619 public static final float PLUM = -0x1.8c1b7cp126F; +620 static { NAMED.put("plum", -0x1.8c1b7cp126F); LIST.add(-0x1.8c1b7cp126F); } +621 +622 /** +623 * This color constant "mauve" has RGBA8888 code {@code AB73ABFF}, R 0.67058825, G 0.4509804, B 0.67058825, alpha 1.0, hue 0.8333334, and saturation 0.21960786. +624 * It can be represented as a packed float with the constant {@code -0x1.56e756p126F}. +625 * <pre> +626 * <font style='background-color: #AB73AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #AB73AB; color: #000000'>&nbsp;@&nbsp;</font> +627 * <font style='background-color: #AB73AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #AB73AB'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #AB73AB'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #AB73AB'>&nbsp;@&nbsp;</font><font style='background-color: #AB73AB; color: #888888'>&nbsp;@&nbsp;</font> +628 * <font style='background-color: #AB73AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #AB73AB; color: #ffffff'>&nbsp;@&nbsp;</font> +629 * </pre> +630 */ +631 public static final float MAUVE = -0x1.56e756p126F; +632 static { NAMED.put("mauve", -0x1.56e756p126F); LIST.add(-0x1.56e756p126F); } +633 +634 /** +635 * This color constant "rose" has RGBA8888 code {@code E61E78FF}, R 0.9019608, G 0.11764706, B 0.47058824, alpha 1.0, hue 0.925, and saturation 0.78431374. +636 * It can be represented as a packed float with the constant {@code -0x1.f03dccp125F}. +637 * <pre> +638 * <font style='background-color: #E61E78;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #E61E78; color: #000000'>&nbsp;@&nbsp;</font> +639 * <font style='background-color: #E61E78;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #E61E78'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #E61E78'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #E61E78'>&nbsp;@&nbsp;</font><font style='background-color: #E61E78; color: #888888'>&nbsp;@&nbsp;</font> +640 * <font style='background-color: #E61E78;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #E61E78; color: #ffffff'>&nbsp;@&nbsp;</font> +641 * </pre> +642 */ +643 public static final float ROSE = -0x1.f03dccp125F; +644 static { NAMED.put("rose", -0x1.f03dccp125F); LIST.add(-0x1.f03dccp125F); } +645 +646 /** +647 * This color constant "raspberry" has RGBA8888 code {@code 911437FF}, R 0.5686275, G 0.078431375, B 0.21568628, alpha 1.0, hue 0.9533333, and saturation 0.4901961. +648 * It can be represented as a packed float with the constant {@code -0x1.6e2922p125F}. +649 * <pre> +650 * <font style='background-color: #911437;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #911437; color: #000000'>&nbsp;@&nbsp;</font> +651 * <font style='background-color: #911437;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #911437'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #911437'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #911437'>&nbsp;@&nbsp;</font><font style='background-color: #911437; color: #888888'>&nbsp;@&nbsp;</font> +652 * <font style='background-color: #911437;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #911437; color: #ffffff'>&nbsp;@&nbsp;</font> +653 * </pre> +654 */ +655 public static final float RASPBERRY = -0x1.6e2922p125F; +656 static { NAMED.put("raspberry", -0x1.6e2922p125F); LIST.add(-0x1.6e2922p125F); } +657 +658 /** +659 * All names for colors in this palette, in alphabetical order. You can fetch the corresponding packed float color +660 * by looking up a name in {@link #NAMED}. +661 */ +662 public static final ObjectList<String> NAMES = NAMED.order(); +663 static { +664 NAMED.setDefaultValue(TRANSPARENT); +665 NAMES.sort(null); +666 } +667 /** +668 * All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to +669 * blue. You can fetch the corresponding packed float color by looking up a name in {@link #NAMED}. +670 */ +671 public static final ObjectList<String> NAMES_BY_HUE = new ObjectList<>(NAMES); +672 /** +673 * The packed IPT float colors that correspond to items in {@link #NAMES_BY_HUE}, with the same order. +674 */ +675 public static final FloatList COLORS_BY_HUE = new FloatList(NAMES_BY_HUE.size()); +676 /** +677 * All names for colors in this palette, sorted by lightness from black to white. You can fetch the +678 * corresponding packed float color by looking up a name in {@link #NAMED}. +679 */ +680 public static final ObjectList<String> NAMES_BY_LIGHTNESS = new ObjectList<>(NAMES); +681 static { +682 NAMES_BY_HUE.sort((o1, o2) -> { +683 final float c1 = NAMED.get(o1), c2 = NAMED.get(o2); +684 final float s1 = saturation(c1), s2 = saturation(c2); +685 // a packed float color with a sign bit of 0 (a non-negative number) is mostly transparent. +686 // this also considers 0x80000000 transparent, but it's almost at the threshold. +687 if(c1 >= 0f) return -10000; +688 else if(c2 >= 0f) return 10000; +689 else if(s1 <= 0.05f && s2 > 0.05f) +690 return -1000; +691 else if(s1 > 0.05f && s2 <= 0.05f) +692 return 1000; +693 else if(s1 <= 0.05f && s2 <= 0.05f) +694 return (int)Math.signum(lightness(c1) - lightness(c2)); +695 else +696 return 2 * (int)Math.signum(hue(c1) - hue(c2)) +697 + (int)Math.signum(lightness(c1) - lightness(c2)); +698 }); +699 for(String name : NAMES_BY_HUE) { +700 COLORS_BY_HUE.add(NAMED.get(name)); +701 } +702 NAMES_BY_LIGHTNESS.sort((o1, o2) -> Float.compare(lightness(NAMED.get(o1)), lightness(NAMED.get(o2)))); +703 } +704 +705 private static final FloatList mixing = new FloatList(4); 706 -707 private static final FloatList mixing = new FloatList(4); -708 -709 /** -710 * Parses a color description and returns the approximate color it describes, as a packed float color. -711 * Color descriptions consist of one or more lower-case words, separated by non-alphabetical characters (typically -712 * spaces and/or hyphens). Any word that is the name of a color in this SimplePalette will be looked up in -713 * {@link #NAMED} and tracked; if there is more than one of these color name words, the colors will be mixed using -714 * {@link FloatColors#mix(float[], int, int)}, or if there is just one color name word, then the corresponding color -715 * will be used. The special adjectives "light" and "dark" change the intensity of the described color; likewise, -716 * "rich" and "dull" change the saturation (the difference of the chromatic channels from grayscale). All of these -717 * adjectives can have "-er" or "-est" appended to make their effect twice or three times as strong. Technically, -718 * the chars appended to an adjective don't matter, only their count, so "lightaa" is the same as "lighter" and -719 * "richcat" is the same as "richest". There's an unofficial fourth level as well, used when any 4 characters are -720 * appended to an adjective (as in "darkmost"); it has four times the effect of the original adjective. If a color -721 * name or adjective is invalid, it is considered the same as adding the color {@link #TRANSPARENT}. -722 * <br> -723 * Examples of valid descriptions include "blue", "dark green", "duller red", "peach pink", "indigo purple mauve", -724 * and "lightest richer apricot-olive". -725 * @param description a color description, as a lower-case String matching the above format -726 * @return a packed float color as described -727 */ -728 public static float parseDescription(final String description) { -729 float intensity = 0f, saturation = 0f; -730 final String[] terms = description.split("[^a-zA-Z]+"); -731 mixing.clear(); -732 for(String term : terms) { -733 if (term == null || term.isEmpty()) continue; -734 final int len = term.length(); -735 switch (term.charAt(0)) { -736 case 'l': -737 if (len > 2 && term.charAt(2) == 'g') { -738 switch (len) { -739 case 9: +707 /** +708 * Parses a color description and returns the approximate color it describes, as a packed float color. +709 * Color descriptions consist of one or more lower-case words, separated by non-alphabetical characters (typically +710 * spaces and/or hyphens). Any word that is the name of a color in this SimplePalette will be looked up in +711 * {@link #NAMED} and tracked; if there is more than one of these color name words, the colors will be mixed using +712 * {@link FloatColors#mix(float[], int, int)}, or if there is just one color name word, then the corresponding color +713 * will be used. The special adjectives "light" and "dark" change the intensity of the described color; likewise, +714 * "rich" and "dull" change the saturation (the difference of the chromatic channels from grayscale). All of these +715 * adjectives can have "-er" or "-est" appended to make their effect twice or three times as strong. Technically, +716 * the chars appended to an adjective don't matter, only their count, so "lightaa" is the same as "lighter" and +717 * "richcat" is the same as "richest". There's an unofficial fourth level as well, used when any 4 characters are +718 * appended to an adjective (as in "darkmost"); it has four times the effect of the original adjective. If a color +719 * name or adjective is invalid, it is considered the same as adding the color {@link #TRANSPARENT}. +720 * <br> +721 * Examples of valid descriptions include "blue", "dark green", "duller red", "peach pink", "indigo purple mauve", +722 * and "lightest richer apricot-olive". +723 * @param description a color description, as a lower-case String matching the above format +724 * @return a packed float color as described +725 */ +726 public static float parseDescription(final String description) { +727 float intensity = 0f, saturation = 0f; +728 final String[] terms = description.split("[^a-zA-Z]+"); +729 mixing.clear(); +730 for(String term : terms) { +731 if (term == null || term.isEmpty()) continue; +732 final int len = term.length(); +733 switch (term.charAt(0)) { +734 case 'l': +735 if (len > 2 && term.charAt(2) == 'g') { +736 switch (len) { +737 case 9: +738 intensity += 0.085f; +739 case 8: 740 intensity += 0.085f; -741 case 8: +741 case 7: 742 intensity += 0.085f; -743 case 7: +743 case 5: 744 intensity += 0.085f; -745 case 5: -746 intensity += 0.085f; -747 break; -748 default: -749 mixing.add(TRANSPARENT); -750 break; -751 } -752 } else { -753 mixing.add(NAMED.get(term)); -754 } -755 break; -756 case 'r': -757 if (len > 1 && term.charAt(1) == 'i') { -758 switch (len) { -759 case 8: +745 break; +746 default: +747 mixing.add(TRANSPARENT); +748 break; +749 } +750 } else { +751 mixing.add(NAMED.get(term)); +752 } +753 break; +754 case 'r': +755 if (len > 1 && term.charAt(1) == 'i') { +756 switch (len) { +757 case 8: +758 saturation += 0.175f; +759 case 7: 760 saturation += 0.175f; -761 case 7: +761 case 6: 762 saturation += 0.175f; -763 case 6: +763 case 4: 764 saturation += 0.175f; -765 case 4: -766 saturation += 0.175f; -767 break; -768 default: -769 mixing.add(TRANSPARENT); -770 break; -771 } -772 } else { -773 mixing.add(NAMED.get(term)); -774 } -775 break; -776 case 'd': -777 if (len > 1 && term.charAt(1) == 'a') { -778 switch (len) { -779 case 8: +765 break; +766 default: +767 mixing.add(TRANSPARENT); +768 break; +769 } +770 } else { +771 mixing.add(NAMED.get(term)); +772 } +773 break; +774 case 'd': +775 if (len > 1 && term.charAt(1) == 'a') { +776 switch (len) { +777 case 8: +778 intensity -= 0.085f; +779 case 7: 780 intensity -= 0.085f; -781 case 7: +781 case 6: 782 intensity -= 0.085f; -783 case 6: +783 case 4: 784 intensity -= 0.085f; -785 case 4: -786 intensity -= 0.085f; -787 break; -788 default: -789 mixing.add(TRANSPARENT); -790 break; -791 } -792 } else if (len > 1 && term.charAt(1) == 'u') { -793 switch (len) { -794 case 8: +785 break; +786 default: +787 mixing.add(TRANSPARENT); +788 break; +789 } +790 } else if (len > 1 && term.charAt(1) == 'u') { +791 switch (len) { +792 case 8: +793 saturation -= 0.175f; +794 case 7: 795 saturation -= 0.175f; -796 case 7: +796 case 6: 797 saturation -= 0.175f; -798 case 6: +798 case 4: 799 saturation -= 0.175f; -800 case 4: -801 saturation -= 0.175f; -802 break; -803 default: -804 mixing.add(TRANSPARENT); -805 break; -806 } -807 } else { -808 mixing.add(NAMED.get(term)); -809 } -810 break; -811 default: -812 mixing.add(NAMED.get(term)); -813 break; -814 } -815 } -816 float result = FloatColors.mix(mixing.items, 0, mixing.size()); -817 if(result == 0f) return result; -818 -819 return toEditedFloat(result, 0f, saturation, intensity, 0f); -820 } -821 private static final ObjectList<String> namesByHue = new ObjectList<>(NAMES_BY_HUE); -822 private static final FloatList colorsByHue = new FloatList(COLORS_BY_HUE); -823 static { -824 int trn = namesByHue.indexOf("transparent"); -825 namesByHue.removeAt(trn); -826 colorsByHue.removeAt(trn); -827 ALIASES.put("grey", GRAY); -828 ALIASES.put("gold", SAFFRON); -829 ALIASES.put("puce", MAUVE); -830 ALIASES.put("sand", TAN); -831 ALIASES.put("skin", PEACH); // Yes, I am aware that there is more than one skin color, but this can only map to one. -832 ALIASES.put("coral", SALMON); -833 ALIASES.put("azure", SKY); -834 ALIASES.put("ocean", TEAL); -835 ALIASES.put("sapphire", COBALT); -836 NAMED.putAll(ALIASES); -837 } -838 /** -839 * Given a color as a packed RGBA float, this finds the closest description it can to match the given color while -840 * using at most {@code mixCount} colors to mix in. You should only use small numbers for mixCount, like 1 to 3; -841 * this can take quite a while to run otherwise. This returns a String description that can be passed to -842 * {@link #parseDescription(String)}. It is likely that this will use very contrasting colors if mixCount is 2 or -843 * greater and the color to match is desaturated or brownish. -844 * @param rgb a packed RGBA float color to attempt to match -845 * @param mixCount how many color names this will use in the returned description -846 * @return a description that can be fed to {@link #parseDescription(String)} to get a similar color -847 */ -848 public static String bestMatch(final float rgb, int mixCount) { -849 mixCount = Math.max(1, mixCount); -850 float oklab = com.github.tommyettinger.colorful.pure.oklab.ColorTools.fromRGBA(rgb); -851 float bestDistance = Float.POSITIVE_INFINITY; -852 final int paletteSize = namesByHue.size(), colorTries = (int)Math.pow(paletteSize, mixCount), totalTries = colorTries * 81; -853 final float targetL = com.github.tommyettinger.colorful.pure.oklab.ColorTools.channelL(oklab), targetA = com.github.tommyettinger.colorful.pure.oklab.ColorTools.channelA(oklab), targetB = com.github.tommyettinger.colorful.pure.oklab.ColorTools.channelB(oklab); -854 final String[] lightAdjectives = {"darkmost ", "darkest ", "darker ", "dark ", "", "light ", "lighter ", "lightest ", "lightmost "}; -855 final String[] satAdjectives = {"dullmost ", "dullest ", "duller ", "dull ", "", "rich ", "richer ", "richest ", "richmost "}; -856 mixing.clear(); -857 for (int i = 0; i < mixCount; i++) { -858 mixing.add(colorsByHue.get(0)); -859 } -860 int bestCode = 0; -861 for (int c = 0; c < totalTries; c++) { -862 for (int i = 0, e = 1; i < mixCount; i++, e *= paletteSize) { -863 mixing.set(i, colorsByHue.get((c / e) % paletteSize)); -864 } -865 int idxI = ((c / colorTries) % 9 - 4), idxS = (c / (colorTries * 9) - 4); -866 -867 final float result = com.github.tommyettinger.colorful.pure.oklab.ColorTools.fromRGBA( -868 toEditedFloat(FloatColors.mix(mixing.items, 0, mixCount), 0f, 0.175f * idxS, 0.085f * idxI, 0f)); -869 -870 final float dL = com.github.tommyettinger.colorful.pure.oklab.ColorTools.channelL(result) - targetL; -871 final float dA = com.github.tommyettinger.colorful.pure.oklab.ColorTools.channelA(result) - targetA; -872 final float dB = com.github.tommyettinger.colorful.pure.oklab.ColorTools.channelB(result) - targetB; -873 if(bestDistance > (bestDistance = Math.min(dL * dL + dA * dA + dB * dB, bestDistance))) -874 bestCode = c; -875 } -876 -877 StringBuilder description = new StringBuilder(lightAdjectives[(bestCode / colorTries) % 9] + satAdjectives[bestCode / (colorTries * 9)]); -878 for (int i = 0, e = 1; i < mixCount; e *= paletteSize) { -879 description.append(namesByHue.get((bestCode / e) % paletteSize)); -880 if(++i < mixCount) -881 description.append(' '); -882 } -883 return description.toString(); -884 } -885} +800 break; +801 default: +802 mixing.add(TRANSPARENT); +803 break; +804 } +805 } else { +806 mixing.add(NAMED.get(term)); +807 } +808 break; +809 default: +810 mixing.add(NAMED.get(term)); +811 break; +812 } +813 } +814 float result = FloatColors.mix(mixing.items, 0, mixing.size()); +815 if(result == 0f) return result; +816 +817 return toEditedFloat(result, 0f, saturation, intensity, 0f); +818 } +819 private static final ObjectList<String> namesByHue = new ObjectList<>(NAMES_BY_HUE); +820 private static final FloatList colorsByHue = new FloatList(COLORS_BY_HUE); +821 static { +822 int trn = namesByHue.indexOf("transparent"); +823 namesByHue.removeAt(trn); +824 colorsByHue.removeAt(trn); +825 ALIASES.put("grey", GRAY); +826 ALIASES.put("gold", SAFFRON); +827 ALIASES.put("puce", MAUVE); +828 ALIASES.put("sand", TAN); +829 ALIASES.put("skin", PEACH); // Yes, I am aware that there is more than one skin color, but this can only map to one. +830 ALIASES.put("coral", SALMON); +831 ALIASES.put("azure", SKY); +832 ALIASES.put("ocean", TEAL); +833 ALIASES.put("sapphire", COBALT); +834 NAMED.putAll(ALIASES); +835 } +836 /** +837 * Given a color as a packed RGBA float, this finds the closest description it can to match the given color while +838 * using at most {@code mixCount} colors to mix in. You should only use small numbers for mixCount, like 1 to 3; +839 * this can take quite a while to run otherwise. This returns a String description that can be passed to +840 * {@link #parseDescription(String)}. It is likely that this will use very contrasting colors if mixCount is 2 or +841 * greater and the color to match is desaturated or brownish. +842 * @param rgb a packed RGBA float color to attempt to match +843 * @param mixCount how many color names this will use in the returned description +844 * @return a description that can be fed to {@link #parseDescription(String)} to get a similar color +845 */ +846 public static String bestMatch(final float rgb, int mixCount) { +847 mixCount = Math.max(1, mixCount); +848 float oklab = com.github.tommyettinger.colorful.pure.oklab.ColorTools.fromRGBA(rgb); +849 float bestDistance = Float.POSITIVE_INFINITY; +850 final int paletteSize = namesByHue.size(), colorTries = (int)Math.pow(paletteSize, mixCount), totalTries = colorTries * 81; +851 final float targetL = com.github.tommyettinger.colorful.pure.oklab.ColorTools.channelL(oklab), targetA = com.github.tommyettinger.colorful.pure.oklab.ColorTools.channelA(oklab), targetB = com.github.tommyettinger.colorful.pure.oklab.ColorTools.channelB(oklab); +852 final String[] lightAdjectives = {"darkmost ", "darkest ", "darker ", "dark ", "", "light ", "lighter ", "lightest ", "lightmost "}; +853 final String[] satAdjectives = {"dullmost ", "dullest ", "duller ", "dull ", "", "rich ", "richer ", "richest ", "richmost "}; +854 mixing.clear(); +855 for (int i = 0; i < mixCount; i++) { +856 mixing.add(colorsByHue.get(0)); +857 } +858 int bestCode = 0; +859 for (int c = 0; c < totalTries; c++) { +860 for (int i = 0, e = 1; i < mixCount; i++, e *= paletteSize) { +861 mixing.set(i, colorsByHue.get((c / e) % paletteSize)); +862 } +863 int idxI = ((c / colorTries) % 9 - 4), idxS = (c / (colorTries * 9) - 4); +864 +865 final float result = com.github.tommyettinger.colorful.pure.oklab.ColorTools.fromRGBA( +866 toEditedFloat(FloatColors.mix(mixing.items, 0, mixCount), 0f, 0.175f * idxS, 0.085f * idxI, 0f)); +867 +868 final float dL = com.github.tommyettinger.colorful.pure.oklab.ColorTools.channelL(result) - targetL; +869 final float dA = com.github.tommyettinger.colorful.pure.oklab.ColorTools.channelA(result) - targetA; +870 final float dB = com.github.tommyettinger.colorful.pure.oklab.ColorTools.channelB(result) - targetB; +871 if(bestDistance > (bestDistance = Math.min(dL * dL + dA * dA + dB * dB, bestDistance))) +872 bestCode = c; +873 } +874 +875 StringBuilder description = new StringBuilder(lightAdjectives[(bestCode / colorTries) % 9] + satAdjectives[bestCode / (colorTries * 9)]); +876 for (int i = 0, e = 1; i < mixCount; e *= paletteSize) { +877 description.append(namesByHue.get((bestCode / e) % paletteSize)); +878 if(++i < mixCount) +879 description.append(' '); +880 } +881 return description.toString(); +882 } +883} diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ycwcm/ColorTools.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ycwcm/ColorTools.html index 03607e77..c233aa9b 100644 --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ycwcm/ColorTools.html +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ycwcm/ColorTools.html @@ -787,82 +787,141 @@ 774 final float y = (decoded & 0xff) / 255f; 775 final float cw = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; 776 final float cm = ((decoded >>> 16 & 0xff) - 127.5f) / 255f; -777 float y2 = y, cw2 = cw, cm2 = cm; +777 float cw2 = cw, cm2 = cm; 778 for (int attempt = 31; attempt >= 0; attempt--) { -779 final float r = y2 + 0.625f * cw2 - cm2; -780 final float g = y2 - 0.375f * cw2 + cm2; -781 final float b = y2 - 0.375f * cw2 - cm2; +779 final float r = y + 0.625f * cw2 - cm2; +780 final float g = y - 0.375f * cw2 + cm2; +781 final float b = y - 0.375f * cw2 - cm2; 782 if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f) 783 break; 784 final float progress = attempt * 0x1p-5f; -785 y2 = MathTools.lerp(0.5f, y, progress); -786 cw2 = MathTools.lerp(0, cw, progress); -787 cm2 = MathTools.lerp(0, cm, progress); -788 } -789 return ycwcm(y2, cw2 * 0.5f + 0.5f, cm2 * 0.5f + 0.5f, (decoded >>> 25) / 127f); -790 } -791 -792 /** -793 * Iteratively checks whether the given YCwCm color is in-gamut, and either brings the color closer to 50% gray if -794 * it isn't in-gamut, or returns it as soon as it is in-gamut. This always produces an opaque color. -795 * @param y luma component; will be clamped between 0 and 1 if it isn't already -796 * @param cw chromatic warmth component; will be clamped between 0 and 1 if it isn't already -797 * @param cm chromatic mildness component; will be clamped between 0 and 1 if it isn't already -798 * @return the first color this finds that is between the given YCwCm color and 50% gray, and is in-gamut -799 * @see #inGamut(float, float, float) You can use inGamut() if you just want to check whether a color is in-gamut. -800 */ -801 public static float limitToGamut(float y, float cw, float cm) { -802 return limitToGamut(y, cw, cm, 1f); -803 } -804 -805 /** -806 * Iteratively checks whether the given YCwCm color is in-gamut, and either brings the color closer to 50% gray if -807 * it isn't in-gamut, or returns it as soon as it is in-gamut. -808 * @param y luma component; will be clamped between 0 and 1 if it isn't already -809 * @param cw chromatic warmth component; will be clamped between 0 and 1 if it isn't already -810 * @param cm chromatic mildness component; will be clamped between 0 and 1 if it isn't already -811 * @param a alpha component; will be clamped between 0 and 1 if it isn't already -812 * @return the first color this finds that is between the given YCwCm color and 50% gray, and is in-gamut -813 * @see #inGamut(float, float, float) You can use inGamut() if you just want to check whether a color is in-gamut. -814 */ -815 public static float limitToGamut(float y, float cw, float cm, float a) -816 { -817 float y2 = y = Math.min(Math.max(y, 0f), 1f); -818 float cw2 = cw = Math.min(Math.max((cw - 0.5f) * 2f, -1f), 1f); -819 float cm2 = cm = Math.min(Math.max((cm - 0.5f) * 2f, -1f), 1f); -820 for (int attempt = 31; attempt >= 0; attempt--) { -821 final float r = y2 + 0.625f * cw2 - cm2; -822 final float g = y2 - 0.375f * cw2 + cm2; -823 final float b = y2 - 0.375f * cw2 - cm2; -824 if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f) -825 break; -826 final float progress = attempt * 0x1p-5f; -827 y2 = MathTools.lerp(0.5f, y, progress); -828 cw2 = MathTools.lerp(0, cw, progress); -829 cm2 = MathTools.lerp(0, cm, progress); -830 } -831 return ycwcm(y2, cw2 * 0.5f + 0.5f, cm2 * 0.5f + 0.5f, Math.min(Math.max(a, 0f), 1f)); -832 } -833 -834 -835 -836 /** -837 * Produces a random packed float color that is always in-gamut and should be uniformly distributed. -838 * @param random a Random object (or preferably a subclass of Random, like {@link com.github.tommyettinger.ds.support.LaserRandom}) -839 * @return a random opaque packed float color that is always in-gamut -840 */ -841 public static float randomColor(Random random) { -842 final float yr = +0.375f, wr = +0.5f, mr = +0.0f; -843 final float yg = +0.500f, wg = +0.0f, mg = +0.5f; -844 final float yb = +0.125f, wb = -0.5f, mb = -0.5f; -845 final float r = random.nextFloat(), g = random.nextFloat(), b = random.nextFloat(); -846 return BitConversion.intBitsToFloat(0xFE000000 -847 | ((int) ((mr * r + mg * g + mb * b) * 128f + 128f) << 16 & 0xFF0000) -848 | ((int) ((wr * r + wg * g + wb * b) * 128f + 128f) << 8 & 0xFF00) -849 | ((int) ((yr * r + yg * g + yb * b) * 256f) & 0xFF)); -850 } -851 -852} +785 cw2 = MathTools.lerp(0, cw, progress); +786 cm2 = MathTools.lerp(0, cm, progress); +787 } +788 return ycwcm(y, cw2 * 0.5f + 0.5f, cm2 * 0.5f + 0.5f, (decoded >>> 25) / 127f); +789 } +790 +791 /** +792 * Iteratively checks whether the given YCwCm color is in-gamut, and either brings the color closer to 50% gray if +793 * it isn't in-gamut, or returns it as soon as it is in-gamut. This always produces an opaque color. +794 * @param y luma component; will be clamped between 0 and 1 if it isn't already +795 * @param cw chromatic warmth component; will be clamped between 0 and 1 if it isn't already +796 * @param cm chromatic mildness component; will be clamped between 0 and 1 if it isn't already +797 * @return the first color this finds that is between the given YCwCm color and 50% gray, and is in-gamut +798 * @see #inGamut(float, float, float) You can use inGamut() if you just want to check whether a color is in-gamut. +799 */ +800 public static float limitToGamut(float y, float cw, float cm) { +801 return limitToGamut(y, cw, cm, 1f); +802 } +803 +804 /** +805 * Iteratively checks whether the given YCwCm color is in-gamut, and either brings the color closer to 50% gray if +806 * it isn't in-gamut, or returns it as soon as it is in-gamut. +807 * @param y luma component; will be clamped between 0 and 1 if it isn't already +808 * @param cw chromatic warmth component; will be clamped between 0 and 1 if it isn't already +809 * @param cm chromatic mildness component; will be clamped between 0 and 1 if it isn't already +810 * @param a alpha component; will be clamped between 0 and 1 if it isn't already +811 * @return the first color this finds that is between the given YCwCm color and 50% gray, and is in-gamut +812 * @see #inGamut(float, float, float) You can use inGamut() if you just want to check whether a color is in-gamut. +813 */ +814 public static float limitToGamut(float y, float cw, float cm, float a) +815 { +816 float y2 = Math.min(Math.max(y, 0f), 1f); +817 float cw2 = cw = Math.min(Math.max((cw - 0.5f) * 2f, -1f), 1f); +818 float cm2 = cm = Math.min(Math.max((cm - 0.5f) * 2f, -1f), 1f); +819 for (int attempt = 31; attempt >= 0; attempt--) { +820 final float r = y2 + 0.625f * cw2 - cm2; +821 final float g = y2 - 0.375f * cw2 + cm2; +822 final float b = y2 - 0.375f * cw2 - cm2; +823 if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f) +824 break; +825 final float progress = attempt * 0x1p-5f; +826 cw2 = MathTools.lerp(0, cw, progress); +827 cm2 = MathTools.lerp(0, cm, progress); +828 } +829 return ycwcm(y2, cw2 * 0.5f + 0.5f, cm2 * 0.5f + 0.5f, Math.min(Math.max(a, 0f), 1f)); +830 } +831 +832 /** +833 * Given a packed float YCwCm color, this edits its luma (Y), chromatic warmth (Cw), chromatic mildness (Cm), and +834 * alpha channels by adding the corresponding "add" parameter and then clamping. This returns a different float +835 * value (of course, the given float can't be edited in-place). You can give a value of 0 for any "add" parameter +836 * you want to stay unchanged. This clamps the resulting color to remain in-gamut, so it should be safe to convert +837 * it back to RGBA. +838 * @param encoded a packed float YCwCm color +839 * @param addY how much to add to the luma channel; typically in the -1 to 1 range +840 * @param addCw how much to add to the chromatic warmth channel; typically in the -2 to 2 range +841 * @param addCm how much to add to the chromatic mildness channel; typically in the -2 to 2 range +842 * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range +843 * @return a packed float YCwCm color with the requested edits applied to {@code encoded} +844 */ +845 public static float editYCwCm(float encoded, float addY, float addCw, float addCm, float addAlpha) { +846 return editYCwCm(encoded, addY, addCw, addCm, addAlpha, 1f, 1f, 1f, 1f); +847 } +848 /** +849 * Given a packed float YCwCm color, this edits its luma (Y), chromatic warmth (Cw), chromatic mildness (Cm), and +850 * alpha channels by first multiplying each channel by the corresponding "mul" parameter and then adding the +851 * corresponding "add" parameter, before clamping. This means the luma value is multiplied by {@code mulY}, then has +852 * {@code addY} added, and then is clamped to the normal range for luma (0 to 1). This returns a different float +853 * value (of course, the given float can't be edited in-place). You can give a value of 0 for any "add" parameter +854 * you want to stay unchanged, or a value of 1 for any "mul" parameter that shouldn't change. Note that this +855 * manipulates chromatic warmth and mildness in the -1 to 1 range, so if you multiply by a small number like +856 * {@code 0.25f}, then this will produce a less-saturated color, and if you multiply by a larger number like +857 * {@code 4f}, then you will get a much more-saturated color. This clamps the resulting color to remain in-gamut, +858 * so it should be safe to convert it back to RGBA. +859 * @param encoded a packed float YCwCm color +860 * @param addY how much to add to the luma channel; typically in the -1 to 1 range +861 * @param addCw how much to add to the chromatic warmth channel; typically in the -2 to 2 range +862 * @param addCm how much to add to the chromatic mildness channel; typically in the -2 to 2 range +863 * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range +864 * @param mulY how much to multiply the luma channel by; should be non-negative +865 * @param mulCw how much to multiply the chromatic warmth channel by; usually non-negative (not always) +866 * @param mulCm how much to multiply the chromatic mildness channel by; usually non-negative (not always) +867 * @param mulAlpha how much to multiply the alpha channel by; should be non-negative +868 * @return a packed float YCwCm color with the requested edits applied to {@code encoded} +869 */ +870 public static float editYCwCm(float encoded, float addY, float addCw, float addCm, float addAlpha, +871 float mulY, float mulCw, float mulCm, float mulAlpha) { +872 final int decoded = BitConversion.floatToRawIntBits(encoded); +873 float y = (decoded & 0xff) / 255f; +874 float cw = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +875 float cm = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +876 float alpha = (decoded >>> 25) / 127f; +877 +878 float y2 = Math.min(Math.max(y * mulY + addY, 0f), 1f); +879 float cw2 = cw = Math.min(Math.max(cw * mulCw + addCw, -1f), 1f); +880 float cm2 = cm = Math.min(Math.max(cm * mulCm + addCm, -1f), 1f); +881 alpha = Math.min(Math.max(alpha * mulAlpha + addAlpha, 0f), 1f); +882 for (int attempt = 31; attempt >= 0; attempt--) { +883 final float r = y2 + 0.625f * cw2 - cm2; +884 final float g = y2 - 0.375f * cw2 + cm2; +885 final float b = y2 - 0.375f * cw2 - cm2; +886 if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f) +887 break; +888 final float progress = attempt * 0x1p-5f; +889 cw2 = MathTools.lerp(0, cw, progress); +890 cm2 = MathTools.lerp(0, cm, progress); +891 } +892 return ycwcm(y2, cw2 * 0.5f + 0.5f, cm2 * 0.5f + 0.5f, alpha); +893 } +894 +895 /** +896 * Produces a random packed float color that is always in-gamut and should be uniformly distributed. +897 * @param random a Random object (or preferably a subclass of Random, like {@link com.github.tommyettinger.ds.support.LaserRandom}) +898 * @return a random opaque packed float color that is always in-gamut +899 */ +900 public static float randomColor(Random random) { +901 final float yr = +0.375f, wr = +0.5f, mr = +0.0f; +902 final float yg = +0.500f, wg = +0.0f, mg = +0.5f; +903 final float yb = +0.125f, wb = -0.5f, mb = -0.5f; +904 final float r = random.nextFloat(), g = random.nextFloat(), b = random.nextFloat(); +905 return BitConversion.intBitsToFloat(0xFE000000 +906 | ((int) ((mr * r + mg * g + mb * b) * 128f + 128f) << 16 & 0xFF0000) +907 | ((int) ((wr * r + wg * g + wb * b) * 128f + 128f) << 8 & 0xFF00) +908 | ((int) ((yr * r + yg * g + yb * b) * 256f) & 0xFF)); +909 } +910 +911} diff --git a/docs/colorful/apidocs/allclasses-index.html b/docs/colorful/apidocs/allclasses-index.html index a1e912cb..c571522e 100644 --- a/docs/colorful/apidocs/allclasses-index.html +++ b/docs/colorful/apidocs/allclasses-index.html @@ -3,7 +3,7 @@ -All Classes (colorful 0.5.2-SNAPSHOT API) +All Classes (colorful 0.6.0 API) @@ -162,7 +162,7 @@

        All Classes

    -
    Constants that contain the critical shader code to construct a ShaderProgram that can render the rest of this +
    Shader code to construct a ShaderProgram that can render the specialized colors produced by the rest of this library.
    diff --git a/docs/colorful/apidocs/allpackages-index.html b/docs/colorful/apidocs/allpackages-index.html index 8bbe2d4f..f618fa22 100644 --- a/docs/colorful/apidocs/allpackages-index.html +++ b/docs/colorful/apidocs/allpackages-index.html @@ -3,7 +3,7 @@ -All Packages (colorful 0.5.2-SNAPSHOT API) +All Packages (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/FloatColors.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/FloatColors.html index 8a067848..f65e1b57 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/FloatColors.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/FloatColors.html @@ -3,7 +3,7 @@ -FloatColors (colorful 0.5.2-SNAPSHOT API) +FloatColors (colorful 0.6.0 API) @@ -74,13 +74,13 @@

    Class FloatColors

    -
    java.lang.Object +
    java.lang.Object
    com.github.tommyettinger.colorful.FloatColors

    public class FloatColors -extends Object
    +extends Object
    Various utility methods for working with colors encoded as packed floats in any of the formats this can use.
    Created by Tommy Ettinger on 12/2/2019.
    @@ -208,8 +208,8 @@

    Method Summary

    -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • @@ -347,10 +347,10 @@

    lerpFloatColors

    float end, float change)
    Interpolates from the packed float color start towards end by change. Both start and end should be packed colors, - as from ColorTools.ycwcm(float, float, float, float) or + as from ColorTools.oklab(float, float, float, float) or ColorTools.ipt(float, float, float, float), and change can be between 0f (keep start) and 1f (only use end). Both start and end should use the same color space; that is, both - could be produced using YCwCm, both could be produced using IPT, or both could be libGDX-native RGB, but they + could be produced using Oklab, both could be produced using IPT, or both could be libGDX-native RGB, but they can't mix. This is a good way to reduce allocations of temporary Colors.
    Parameters:
    @@ -370,11 +370,11 @@

    lerpFloatColorsBlended

    float change)
    Interpolates from the packed float color start towards end by change, but keeps the alpha of start and uses the alpha of end as an extra factor that can affect how much to change. Both start and end should be packed colors, - as from ColorTools.ycwcm(float, float, float, float) or - ColorTools.ipt(float, float, float, float), and change can be between 0f - (keep start) and 1f (only use end). Both start and end should use the same color space; that is, both could be - produced using YCwCm, or both could be produced using IPT, but not a mix of the two. This is a good way to - reduce allocations of temporary Colors.
    + as from ColorTools.ipt(float, float, float, float) or + ColorTools.ycwcm(float, float, float, float), and change can be between 0f (keep start) and 1f (only use + end). Both start and end should use the same color space; that is, both could be produced using IPT_HQ, or both + could be produced using YCwCm, but not a mix of the two. This is a good way to reduce allocations of temporary + Colors.
  • Parameters:
    start - the starting color as a packed float; alpha will be preserved
    @@ -454,14 +454,16 @@

    mix

  • mix

    -
    public static float mix(float[] colors, +
    public static float mix(float[] colors, int offset, int size)
    Given several colors, this gets an even mix of all colors in equal measure. - If colors is null or has no items, this returns 0f (usually transparent in most color spaces).
    + If colors is null or has no items, this returns 0f (usually transparent in most color spaces). + This is mostly useful in conjunction with FloatArray, using its items + for colors, typically 0 for offset, and its size for size.
    Parameters:
    -
    colors - an array or varargs of packed float colors; all should use the same color space
    +
    colors - an array of packed float colors; all should use the same color space
    offset - the index of the first item in colors to use
    size - how many items from colors to use
    Returns:
    diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/Shaders.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/Shaders.html index 6596b3d5..4b8eda84 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/Shaders.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/Shaders.html @@ -3,7 +3,7 @@ -Shaders (colorful 0.5.2-SNAPSHOT API) +Shaders (colorful 0.6.0 API) @@ -74,18 +74,33 @@

    Class Shaders

  • -
    java.lang.Object +
    java.lang.Object
    com.github.tommyettinger.colorful.Shaders

    -
    public class Shaders -extends Object
    -
    Constants that contain the critical shader code to construct a ShaderProgram that can render the rest of this +
    public class Shaders +extends Object
    +
    Shader code to construct a ShaderProgram that can render the specialized colors produced by the rest of this library. The shader code is meant for use in a SpriteBatch; a convenience - method, makeBatch(), is provided to generate and return a SpriteBatch that uses the correct ShaderProgram. + method, makeBatch(), is provided to generate and return a SpriteBatch that uses a correct ShaderProgram. + Many of the shaders here are experimental and meant as a basis for user code, rather than a complete solution. + If you aren't familiar with shaders in libGDX, see this + libGDX wiki article for more information.
    - Created by Tommy Ettinger on 12/2/2019.
    + Many of these shaders would need at least some changing to work with kinds of + Batch that aren't SpriteBatch (or at least very similar). You should compare + the names of uniform variables in the vertex and fragment shader if you use a different kind of Batch; if all + of them are the same and there are the same amount, then you should be able to use these shaders without issue. +
    + Note that you don't need to specify a shader from here at all if you use a ColorfulBatch from this library! + There is a ColorfulBatch in each of the color space subpackages, such as rgb, oklab, and ipt. + All of those allow a multiplicative "tweak" to each color channel before an additive change is applied to that + channel; to contrast, all of the shaders here can only permit one or the other for a given channel. ColorfulBatch may + act oddly if it has to interact with SpriteBatch-specific classes like Sprite, + so there are ColorfulSprite classes that also allow setting the "tweak" and additive change per-sprite. Still, it can + be a good idea to use the shaders here if you have an existing SpriteBatch, or want to use the various experimental + shaders as a test-bed.
    @@ -305,8 +331,8 @@

    Method Summary

  • -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • @@ -321,8 +347,8 @@

    Field Details

  • vertexShader

    -
    public static final String vertexShader
    -
    This is the default vertex shader from libGDX.
    +
    public static final String vertexShader
    +
    This is the default vertex shader from libGDX. It is used without change by most of the fragment shaders here.
    See Also:
    Constant Field Values
    @@ -332,7 +358,7 @@

    vertexShader

  • fragmentShaderRGBA

    -
    public static final String fragmentShaderRGBA
    +
    public static final String fragmentShaderRGBA
    A simple shader that uses additive blending with "normal" RGBA colors (alpha is still multiplicative). With the default SpriteBatch ShaderProgram, white is the neutral color, 50% gray darkens a color by about 50%, and black darkens a color to black, but nothing can brighten a color. With this, 50% gray is the neutral color, @@ -340,7 +366,12 @@

    fragmentShaderRGBA

    RGB channels (darkening and desaturating, but not to black unless the color is already somewhat dark). When tinting with white, this looks like The Mona Lisa on the left, when tinting with 50% gray, it makes no change, and when tinting with black, it almost reaches all black, but some - faint part of the image is still barely visible.
    + faint part of the image is still barely visible. +
    + You can generate RGB colors using any of various methods in the rgb package, such as + ColorTools.rgb(float, float, float, float). +
    + Meant for use with vertexShader.
  • See Also:
    Constant Field Values
    @@ -350,17 +381,24 @@

    fragmentShaderRGBA

  • fragmentShaderGammaRGBA

    -
    public static final String fragmentShaderGammaRGBA
    -
    A simple shader that uses multiplicative blending with "normal" RGBA colors, but internally uses gamma correction - to make changes in color smoother. With the default SpriteBatch ShaderProgram, white is the neutral color, 50% - gray darkens a color by about 50%, and black darkens a color to black, but nothing can brighten a color. With - this, 50% gray is the neutral color, white multiplies the RGB channels by about 2 (brightening it and slightly - desaturating it), and black multiplies the RGB channels by 0 (reducing the color always to black). When tinting - with white, this looks like The Mona Lisa on the left; when tinting - with 50% gray, it makes no change, and when tinting with black, it produces an all-black image. -
    - Credit for finding this goes to CypherCove, who uses a similar version in - gdx=tween.
    +
    public static final String fragmentShaderGammaRGBA
    +
    A simple shader that uses multiplicative blending with "normal" RGBA colors, and is simpler than + fragmentShaderRGBA but can make changes in color smoother. With the default SpriteBatch ShaderProgram, + white is the neutral color, 50% gray darkens a color by about 50%, and black darkens a color to black, but + nothing can brighten a color. With this, 50% gray is the neutral color, white multiplies the RGB channels by + 2.0 (brightening it and slightly desaturating it), and black multiplies the RGB channels by 0 (reducing the color + always to black). When tinting with white, this looks like The Mona + Lisa on the left; when tinting with 50% gray, it makes no change, and when tinting with black, it produces an + all-black image. +
    + You can generate RGB colors using any of various methods in the rgb package, such as + ColorTools.rgb(float, float, float, float). +
    + Meant for use with vertexShader. +
    + An earlier version of this attempted to use some useful code by CypherCove in gdx-tween, but the current version + doesn't share any code, and doesn't really do any gamma correction either. It does less... gamma... un-correction + than fragmentShaderRGBA, though, so if the source images are gamma-corrected this should be fine.
    See Also:
    Constant Field Values
    @@ -370,14 +408,19 @@

    fragmentShaderGammaRGBA

  • fragmentShader

    -
    public static final String fragmentShader
    +
    public static final String fragmentShader
    Where the magic happens; this converts a batch color from the YCwCm format (used by colorful's ycwcm package) to RGBA. The vertex color will be split up into 4 channels just as a normal shader does, but the channels here are luma, chromatic warmth, chromatic mildness, and alpha; alpha acts just like a typical RGBA shader, but the others are additive instead of multiplicative, with 0.5 as a neutral value. This does not support the "tweak" features that ColorfulBatch does, which include multiplicative counterparts to the additive operations this supports on luma, chromatic warmth, and chromatic mildness, plus a contrast adjustment. If you want to adjust - contrast globally, you can use makeBatch(float) to set the contrast for a new Batch with a new shader.
    + contrast globally, you can use makeBatch(float) to set the contrast for a new Batch with a new shader. +
    + You can generate RGB colors using any of various methods in the rgb package, such as + ColorTools.rgb(float, float, float, float). +
    + Meant for use with vertexShader.
  • See Also:
    Constant Field Values
    @@ -387,12 +430,17 @@

    fragmentShader

  • fragmentShaderHigherContrast

    -
    public static final String fragmentShaderHigherContrast
    +
    public static final String fragmentShaderHigherContrast
    A variant on fragmentShader that adjusts luma to make mid-range colors darker, while keeping light colors light. This is not the same as ColorfulBatch even when the contrast for ColorfulBatch's tweak is the same as what this uses (1.375 here, which is roughly 0.875f in a tweak value). ColorfulBatch does some work in the vertex shader so it may be a little faster than this approach, and it seems to have less severe effects on - the overall brightness of an image that has adjusted contrast.
    + the overall brightness of an image that has adjusted contrast. +
    + You can generate YCwCm colors using any of various methods in the ycwcm package, such as + ColorTools.ycwcm(float, float, float, float). +
    + Meant for use with vertexShader.
  • See Also:
    Constant Field Values
    @@ -402,18 +450,23 @@

    fragmentShaderHigherContrast

  • fragmentShaderLowerContrast

    -
    public static final String fragmentShaderLowerContrast
    +
    public static final String fragmentShaderLowerContrast
    An alternative shader that effectively reduces luma contrast, bringing all but the darkest colors to the upper-mid luma range. This is not the same as ColorfulBatch even when the contrast for ColorfulBatch's tweak is the same as what this uses (0.625 here, which is roughly 0.125f in a tweak value). ColorfulBatch does some work in the vertex shader so it may be a little faster than this approach, and it seems to have less severe - effects on the overall brightness of an image that has adjusted contrast.
    + effects on the overall brightness of an image that has adjusted contrast. +
    + You can generate YCwCm colors using any of various methods in the ycwcm package, such as + ColorTools.ycwcm(float, float, float, float). +
    + Meant for use with vertexShader.
  • fragmentShaderIPT

    -
    public static String fragmentShaderIPT
    +
    public static String fragmentShaderIPT
    Similar to fragmentShader, but this uses the very perceptually-accurate IPT color space as described by Ebner and Fairchild, instead of the custom YCwCm color space. IPT doesn't really need that much more computation to be done by the shader, but tends to make gradual changes in color much smoother. If comparing to YCwCm, then @@ -429,37 +482,69 @@

    fragmentShaderIPT

    more green, yellow, brown, or orange. Where protan can be viewed as going from cool to warm as its value increases, tritan can be viewed as going from artificial to natural, or perhaps fluid to solid. Alpha is treated exactly as it is in the standard libGDX fragment shader, with the alpha in the batch color multiplied by the - alpha in the image pixel to get the result alpha.
    + alpha in the image pixel to get the result alpha. +
    + You can generate IPT colors using any of various methods in the ipt package, such as + ColorTools.ipt(float, float, float, float). Note that IPT is + intended to share an API with the ipt_hq package, but IPT_HQ is usually preferred. +
    + Meant for use with vertexShader.
  • fragmentShaderIPT_HQ

    - +
    Just like fragmentShaderIPT, but gamma-corrects the input and output RGB values (which improves lightness uniformity) and uses an exponential step internally to change how colors are distributed within the gamut. These steps are more computationally expensive than the bare-bones ones in fragmentShaderIPT, but - they seem to improve some aspects of color transitions quite a bit.
    + they seem to improve some aspects of color transitions quite a bit. +
    + You can generate IPT_HQ colors using any of various methods in the ipt_hq package, such as + ColorTools.ipt(float, float, float, float). Note that IPT_HQ is + intended to share an API with the ipt package, but IPT_HQ is usually preferred. +
    + Meant for use with vertexShader.
  • fragmentShaderOklab

    -
    public static String fragmentShaderOklab
    -
    Just like fragmentShaderIPT_HQ, but uses the Oklab color space instead of the very similar IPT_HQ one.
    +
    public static String fragmentShaderOklab
    +
    Just like fragmentShaderIPT_HQ, but uses the Oklab color space instead of the very similar IPT_HQ one. + This also gamma-corrects the inputs and outputs, though it uses subtly different math internally. Oklab colors + tend to have more variation on their L channel, which represents lightness, than their A or B channels, which + represent green-to-red and blue-to-yellow chromatic axes; indeed, A and B tend to be no more than about 1/6 away + from their middle point at 1/2, which is used for grayscale. This is normal for Oklab, and allows colors to be + compared for approximate difference using Euclidean distance. Importantly, Oklab preserves the meaning of its L + channel (lightness) very well when comparing two arbitrary colors, while also doing well when comparing chroma + (see ColorTools.chroma(float). +
    + You can generate Oklab colors using any of various methods in the oklab package, such as + ColorTools.oklab(float, float, float, float). +
    + Meant for use with vertexShader.
  • vertexShaderHSI

    -
    public static final String vertexShaderHSI
    +
    public static final String vertexShaderHSI
    A vertex shader that does the bulk of processing HSI-format batch colors and converting them to a format fragmentShaderHSI can use. Since HSI is only a cylindrical/spherical adaptation of IPT, with identical I components and the combination of H and S in polar coordinates mapping to P and T in Cartesian coordinates, the fragment shader this is used with can be any that expects an IPT color (currently only fragmentShaderIPT does this, and it's the same as fragmentShaderHSI). This vertex shader does a lot more than most vertex shaders here, but since it is executed relatively rarely (unless you're drawing many - 1-pixel textures), there shouldn't be a heavy performance penalty.
    + 1-pixel textures), there shouldn't be a heavy performance penalty. +
    + There is no special code to generate HSI colors; you can use + ColorTools.ipt(float, float, float, float), or any ColorTools + method that generates a packed float color directly from the channel values, to specify hue, saturation, + intensity, and alpha in that order. You can also just specify the batch color directly with + SpriteBatch.setColor(float, float, float, float), taking the channels in the same order as above. +
    + EXPERIMENTAL. Meant more for reading and editing than serious usage.
  • See Also:
    Constant Field Values
    @@ -469,14 +554,30 @@

    vertexShaderHSI

  • fragmentShaderHSI

    -
    public static String fragmentShaderHSI
    +
    public static String fragmentShaderHSI
    +
    This is an alias for fragmentShaderIPT. If used with vertexShaderHSI, you can specify a batch + color using an HSL-like system. +
    + There is no special code to generate HSI colors; you can use + ColorTools.ipt(float, float, float, float), or any ColorTools + method that generates a packed float color directly from the channel values, to specify hue, saturation, + intensity, and alpha in that order. You can also just specify the batch color directly with + SpriteBatch.setColor(float, float, float, float), taking the channels in the same order as above. +
    + Meant for use with vertexShaderHSI.
  • partialCodeHSL

    -
    public static final String partialCodeHSL
    -
    Credit to Sam Hocevar, https://gamedev.stackexchange.com/a/59808 .
    +
    public static final String partialCodeHSL
    +
    Not a full shader, this is a snippet used by most of the other HSL-based shaders to implement the complex + rgb2hsl() and hsl2rgb() methods. There are also comments in the code snippet that you can use if you want to + change the distribution of colors across the color wheel. +
    + Credit to Sam Hocevar, https://gamedev.stackexchange.com/a/59808 . +
    + EXPERIMENTAL. Meant more for reading and editing than serious usage.
    See Also:
    Constant Field Values
    @@ -486,10 +587,14 @@

    partialCodeHSL

  • partialCodeHSLStretched

    -
    public static final String partialCodeHSLStretched
    +
    public static final String partialCodeHSLStretched
    Adjusted-hue version of partialCodeHSL, supplying HSL to-and-from RGB conversions with a smaller range - of hue used for cyan and a larger range for orange. Not currently used. Credit to Sam Hocevar, - https://gamedev.stackexchange.com/a/59808 .
    + of hue used for cyan and a larger range for orange. Not currently used. This is pretty much only meant so people + reading the source code and trying different variations on HSL can see some of the attempts I made. +
    + Credit to Sam Hocevar, https://gamedev.stackexchange.com/a/59808 . +
    + EXPERIMENTAL. Meant more for reading and editing than serious usage.
  • See Also:
    Constant Field Values
    @@ -497,9 +602,29 @@

    partialCodeHSLStretched

  • +
    +

    partialHueRodrigues

    +
    public static final String partialHueRodrigues
    +
    This GLSL snippet takes an RGB vec3 and a float that represents a hue rotation in radians, and returns the + rotated RGB vec3. It is not a full shader, and is used by inserting it into shader code to provide the applyHue() + method to that code. +
    + Credit for this challenging method goes to Andrey-Postelzhuk, + Unity Forums.
    +
    +
    See Also:
    +
    Constant Field Values
    +
    +
    +
  • +
  • fragmentShaderHSL

    -
    public static final String fragmentShaderHSL
    +
    public static final String fragmentShaderHSL
    +
    Treats the color as hue, saturation, lightness, and... uh... well, this is pretty much only useful when the batch + color's a is 1 . You probably want fragmentShaderHSLC or fragmentShaderHSLA. +
    + EXPERIMENTAL. Meant more for reading and editing than serious usage.
    See Also:
    Constant Field Values
    @@ -509,7 +634,11 @@

    fragmentShaderHSL

  • fragmentShaderRotateHSL

    -
    public static final String fragmentShaderRotateHSL
    +
    public static final String fragmentShaderRotateHSL
    +
    I can't even remember what this does, to be honest. It's probably not what you want. Instead, you probably want + fragmentShaderHSLC or fragmentShaderHSLA. +
    + EXPERIMENTAL. Meant more for reading and editing than serious usage.
    See Also:
    Constant Field Values
    @@ -519,9 +648,9 @@

    fragmentShaderRotateHSL

  • vertexShaderHSLC

    -
    public static final String vertexShaderHSLC
    -
    This is the default vertex shader from libGDX, but also sets a varying value for contrast. It is needed if you - use fragmentShaderHSLC.
    +
    public static final String vertexShaderHSLC
    +
    This is similar to the default vertex shader from libGDX, but also sets a varying value for contrast. It is + needed if you use fragmentShaderHSLC.
    See Also:
    Constant Field Values
    @@ -531,14 +660,19 @@

    vertexShaderHSLC

  • fragmentShaderHSLC

    -
    public static final String fragmentShaderHSLC
    -
    Allows changing Hue/Saturation/Lightness/Contrast, with hue as a rotation. Expects the vertex shader to be - vertexShaderHSLC, which sets varying float v_lightFix so contrast can use it. +
    public static final String fragmentShaderHSLC
    +
    Allows changing Hue/Saturation/Lightness/Contrast, with hue as a rotation. If hue continuously goes from 0 to 1, + then 0 to 1, 0 to 1, and so on, then this will smoothly rotate the hue of the image. +
    + You can generate HSLC colors using methods like FloatColors.rgb2hsl(float, float, float, float).
    Credit for HLSL version goes to Andrey-Postelzhuk, Unity Forums. The YCC adaptation, and different approach to contrast (this has close to neutral contrast when a is 0.5, - while the original had a fair bit higher contrast than expected), is from this codebase.
    + while the original had a fair bit higher contrast than expected), is from this codebase. +
    + Meant only for use with vertexShaderHSLC, which sets varying float v_lightFix so contrast can + use it.
    See Also:
    Constant Field Values
    @@ -548,13 +682,16 @@

    fragmentShaderHSLC

  • fragmentShaderHSLA

    -
    public static final String fragmentShaderHSLA
    -
    Allows changing Hue/Saturation/Lightness/Alpha, with hue as a rotation. Expects the vertex shader to be - vertexShader, unlike what fragmentShaderHSLC expects. +
    public static final String fragmentShaderHSLA
    +
    Allows changing Hue/Saturation/Lightness/Alpha, with hue as a rotation. +
    + You can generate HSLA colors using methods like FloatColors.rgb2hsl(float, float, float, float).
    Credit for HLSL version goes to Andrey-Postelzhuk, Unity Forums. - The YCC adaptation, and change to use alpha, is from this codebase.
    + The YCC adaptation, and change to use alpha, is from this codebase. +
    + Meant to be used with vertexShader, unlike what fragmentShaderHSLC expects.
    See Also:
    Constant Field Values
    @@ -562,25 +699,17 @@

    fragmentShaderHSLA

  • -
    -

    hueRodrigues

    -
    public static final String hueRodrigues
    -
    GLSL: Takes an RGB vec3 and a float that represents a hue rotation in radians, and returns the rotated RGB vec3. - Credit for this challenging method goes to Andrey-Postelzhuk, - Unity Forums.
    -
    -
    See Also:
    -
    Constant Field Values
    -
    -
    -
  • -
  • fragmentShaderHSLC2

    -
    public static final String fragmentShaderHSLC2
    +
    public static final String fragmentShaderHSLC2
    Generally a lower-quality hue rotation than fragmentShaderHSLC; this is here as a work in progress. - Expects the vertex shader to be vertexShaderHSLC, which sets varying float v_lightFix so - contrast can use it.
    +
    + You can generate HSLC colors using methods like FloatColors.rgb2hsl(float, float, float, float). +
    + Meant to be used with vertexShaderHSLC, which sets varying float v_lightFix so + contrast can use it. +
    + EXPERIMENTAL. Meant more for reading and editing than serious usage.
  • See Also:
    Constant Field Values
    @@ -590,10 +719,15 @@

    fragmentShaderHSLC2

  • fragmentShaderHSLC3

    -
    public static final String fragmentShaderHSLC3
    +
    public static final String fragmentShaderHSLC3
    Cycles lightness in a psychedelic way as hue and lightness change; not a general-purpose usage. - Expects the vertex shader to be vertexShaderHSLC, which sets varying float v_lightFix so - contrast can use it.
    +
    + You can generate HSLC colors using methods like FloatColors.rgb2hsl(float, float, float, float). +
    + Meant to be used with vertexShaderHSLC, which sets varying float v_lightFix so + contrast can use it. +
    + EXPERIMENTAL. Meant more for reading and editing than serious usage.
  • See Also:
    Constant Field Values
    @@ -603,11 +737,15 @@

    fragmentShaderHSLC3

  • fragmentShaderHSLPsychedelic

    -
    public static final String fragmentShaderHSLPsychedelic
    +
    public static final String fragmentShaderHSLPsychedelic
    Cycles hue, but not lightness; otherwise this is like fragmentShaderHSLC3 without contrast, and keeping - alpha intact. - Internally, this uses Sam Hocevar's RGB/HSL conversion instead of Andrey-Postelzhuk's HSLC code. - Expects the vertex shader to be vertexShader, not the HSLC variant.
    + alpha intact. Internally, this uses Sam Hocevar's RGB/HSL conversion instead of Andrey-Postelzhuk's HSLC code. +
    + You can generate HSLA colors using methods like FloatColors.rgb2hsl(float, float, float, float). +
    + Expects the vertex shader to be vertexShader, not the HSLC variant. +
    + EXPERIMENTAL. Meant more for reading and editing than serious usage.
  • See Also:
    Constant Field Values
    @@ -617,7 +755,7 @@

    fragmentShaderHSLPsychedelic

  • fragmentShaderHSLP

    -
    public static final String fragmentShaderHSLP
    +
    public static final String fragmentShaderHSLP
    One of the more useful HSL shaders here, this takes a batch color as hue, saturation, lightness, and power, with hue as a target hue and power used to determine how much of the target color should be used. There is no neutral value for hue, saturation, or lightness, but if power is 0, then the source color will be used @@ -625,7 +763,9 @@

    fragmentShaderHSLP

    0.0 to 1.0, with 0.0 as red, about 0.3 as green, about 0.6 as blue, etc. Saturation is specified from 0.0 to 1.0, with 0.0 as grayscale and 1.0 as a fully-saturated target color. Lightness is specified from 0.0 to 1.0, with 0.0 as black, the 0.3 to 0.7 range as most colors, and 1.0 white; saturation is clamped to a smaller value as - lightness moves away from 0.5 (toward black or white).
    + lightness moves away from 0.5 (toward black or white). +
    + You can generate HSL(P) colors using methods like FloatColors.rgb2hsl(float, float, float, float).
  • See Also:
    Constant Field Values
    @@ -635,7 +775,14 @@

    fragmentShaderHSLP

  • fragmentShaderReplacement

    -
    public static final String fragmentShaderReplacement
    +
    public static final String fragmentShaderReplacement
    +
    This is supposed to look for RGBA colors that are similar to search, and if it finds + one, to replace it with replace (also an RGBA color). It isn't great at the searching part. +
    + You can generate RGB colors using any of various methods in the rgb package, such as + ColorTools.rgb(float, float, float, float). +
    + EXPERIMENTAL. Meant more for reading and editing than serious usage.
    See Also:
    Constant Field Values
    @@ -645,13 +792,18 @@

    fragmentShaderReplacement

  • fragmentShaderFlatLightness

    - +
    A drop-in replacement for the default fragment shader that eliminates lightness differences in the output colors. Specifically, it does the normal SpriteBatch shader's step with the multiplicative batch color, converts to IPT, sets intensity to 0.5, shrinks the P and T components so the color is less saturated, and then converts back to - an RGBA color. Editing this shader is strongly encouraged to fit your needs! + an RGBA color. Even though this uses IPT internally, it expects the batch color to be normal RGBA. +
    + Editing this shader is strongly encouraged to fit your needs!
    - This uses vertexShader, as usual.
    + You can generate RGB colors using any of various methods in the rgb package, such as + ColorTools.rgb(float, float, float, float). +
    + Meant for use with vertexShader.
  • See Also:
    a per-sprite-configurable version of this
    @@ -661,7 +813,7 @@

    fragmentShaderFlatLightness

  • fragmentShaderConfigurableContrast

    - +
    A specialized shader that can reduce lightness differences in the output colors, saturate/desaturate them, and can be configured to use some of the existing lightness in the image to add to a main flat lightness. Specifically, it takes the fragment color (typically a pixel in a texture), converts to IPT, does a calculation @@ -672,7 +824,11 @@

    fragmentShaderConfigurableContrast

    slightly reduce saturation (g), sharply flatten the original texture's lightness (b), and leave alpha alone (a): 0.7, 0.4, 0.2, 1.0 .
    - This uses vertexShader, as usual.
    + This doesn't use a standard type of color; you should use something like + ColorTools.rgb(float, float, float, float) to set the channels in + the specific way this uses them. +
    + Meant for use with vertexShader.
  • See Also:
    if you only need one contrast setting and still want to set color tints
    @@ -682,20 +838,32 @@

    fragmentShaderConfigurableContrast

  • vertexShaderDayNight

    - +
    A day/night cycle shader that can be used without any other parts of this library. This only needs setting the uniform u_timeOfDay to any float; the rate at which you change this float affects how fast the day/night cycle occurs. This is meant to be used with fragmentShaderDayNight. Together, they make the color adjustment go from bluish and dark at night, to purplish at dawn, to orange/yellow and bright at mid-day, toward - red at dusk, and then back to bluish at night.
    + red at dusk, and then back to bluish at night. This uses an RGBA batch color. +
    + Editing this shader is strongly encouraged to fit your needs! The time-based variables st, ct, and dd can all be + adjusted to increase or decrease the strength of the effect, and their effects can also be adjusted upon v_color + and v_tweak. +
    + You can generate RGB colors using any of various methods in the rgb package, such as + ColorTools.rgb(float, float, float, float).
  • fragmentShaderDayNight

    - +
    The fragment shader counterpart to vertexShaderDayNight; must be used with that vertex shader. See its - docs for more info, particularly about the one uniform this needs set.
    + docs for more info, particularly about the one uniform this needs set. This uses an RGBA batch color. +
    + You can generate RGB colors using any of various methods in the rgb package, such as + ColorTools.rgb(float, float, float, float). +
    + Meant only for use with vertexShaderDayNight.
  • @@ -709,7 +877,7 @@

    Constructor Details

  • Shaders

    -
    public Shaders()
    +
    public Shaders()
  • @@ -723,10 +891,13 @@

    Method Details

  • makeRGBAShader

    -
    public static com.badlogic.gdx.graphics.glutils.ShaderProgram makeRGBAShader()
    +
    public static com.badlogic.gdx.graphics.glutils.ShaderProgram makeRGBAShader()
    A simple helper method that builds the simplest shader here; this shader allows tinting with light colors to lighten an image. You can assign the result to a SpriteBatch with its - SpriteBatch.setShader(ShaderProgram) method.
    + SpriteBatch.setShader(ShaderProgram) method. +
    + You can generate RGB colors using any of various methods in the rgb package, such as + ColorTools.rgb(float, float, float, float).
  • Returns:
    a ShaderProgram that uses the RGBA shader fragmentShaderRGBA
    @@ -736,10 +907,13 @@

    makeRGBAShader

  • makeGammaRGBAShader

    -
    public static com.badlogic.gdx.graphics.glutils.ShaderProgram makeGammaRGBAShader()
    +
    public static com.badlogic.gdx.graphics.glutils.ShaderProgram makeGammaRGBAShader()
    A simple helper method that builds the simplest shader here; this shader allows tinting with light colors to lighten an image, and also smooths changes well. You can assign the result to a SpriteBatch with its - SpriteBatch.setShader(ShaderProgram) method.
    + SpriteBatch.setShader(ShaderProgram) method. +
    + You can generate RGB colors using any of various methods in the rgb package, such as + ColorTools.rgb(float, float, float, float).
  • Returns:
    a ShaderProgram that uses the RGBA shader fragmentShaderGammaRGBA
    @@ -749,12 +923,15 @@

    makeGammaRGBAShader

  • makeBatch

    -
    public static com.badlogic.gdx.graphics.g2d.SpriteBatch makeBatch()
    +
    public static com.badlogic.gdx.graphics.g2d.SpriteBatch makeBatch()
    Prepares and returns a new SpriteBatch that uses the default vertexShader and fragmentShader from this class, making it able to render YCwCm colors from the ycwcm package. It won't be a ColorfulBatch (those can adjust colors in more ways); you can simply use new ColorfulBatch() to make one of those. Note that a SpriteBatch like this produces won't be able to render a ColorfulSprite, - but ColorfulBatch can.
    + but ColorfulBatch can. +
    + You can generate YCwCm colors using any of various methods in the ycwcm package, such as + ColorTools.ycwcm(float, float, float, float).
    Returns:
    a freshly allocated SpriteBatch that will also have a new ShaderProgram for rendering YCwCm
    @@ -764,7 +941,7 @@

    makeBatch

  • makeBatch

    -
    public static com.badlogic.gdx.graphics.g2d.SpriteBatch makeBatch(float contrast)
    +
    public static com.badlogic.gdx.graphics.g2d.SpriteBatch makeBatch(float contrast)
    Prepares and returns a new SpriteBatch that uses the default vertexShader and fragmentShader from this class, making it able to render YCwCm colors from the ycwcm package. This also takes a contrast parameter; if greater than 1.0 it will make light colors lighter and dark colors darker, while @@ -774,7 +951,10 @@

    makeBatch

    won't be able to render a ColorfulSprite, but ColorfulBatch can. ColorfulBatch also will calculate contrast differently from the shader this uses, including doing some work in the vertex shader (which may be faster). It also takes a contrast in its tweak value that is limited to a 0.0 to 1.0 range, rather than 0.1 to - 2.0 here (this can technically tolerate 0.01 to 10.0, but those extremes aren't recommended).
    + 2.0 here (this can technically tolerate 0.01 to 10.0, but those extremes aren't recommended). +
    + You can generate YCwCm colors using any of various methods in the ycwcm package, such as + ColorTools.ycwcm(float, float, float, float).
    Parameters:
    contrast - how much contrast should be emphasized; higher than 1.0 is more contrasting, and this should usually be between 0.1 and 2.0
    @@ -786,7 +966,7 @@

    makeBatch

  • makeBatchHSLC

    -
    public static com.badlogic.gdx.graphics.g2d.SpriteBatch makeBatchHSLC()
    +
    public static com.badlogic.gdx.graphics.g2d.SpriteBatch makeBatchHSLC()
    Prepares and returns a new SpriteBatch that uses vertexShaderHSLC and fragmentShaderHSLC from this class, making it interpret the SpriteBatch's color, as set by SpriteBatch.setColor(float, float, float, float), to be hue rotation, saturation change, lightness @@ -797,7 +977,10 @@

    makeBatchHSLC

    darker towards 0.0, lighter towards 1.0 (any lightness above 0.5 will brighten the image, unlike the default shader and batch color). Contrast affects changes in lightness; low contrast makes all lightness closer to the mid-range, while high contrast makes even small changes in the mid-range of an image's color have stark lightness - changes in the result. Note, this does not support changing an image's alpha with the batch color.
    + changes in the result. Note, this does not support changing an image's alpha with the batch color. +
    + You can generate HSLC colors using FloatColors.rgb2hsl(float, float, float, float), using the last + parameter to store contrast.
    Returns:
    a freshly allocated SpriteBatch that will also have a new ShaderProgram for rendering HSLC
    diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/TrigTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/TrigTools.html index b874e112..a8ea59fc 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/TrigTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/TrigTools.html @@ -3,7 +3,7 @@ -TrigTools (colorful 0.5.2-SNAPSHOT API) +TrigTools (colorful 0.6.0 API) @@ -74,13 +74,13 @@

    Class TrigTools

    -
    java.lang.Object +
    java.lang.Object
    com.github.tommyettinger.colorful.TrigTools

    public class TrigTools -extends Object
    +extends Object
    Some alternative approximations to sin(), cos(), asin(), acos(), atan(), and atan2(), including the option to measure most values in turns instead of radians (where 1 turn equals 2pi radians). The convention here is to have methods that take input in turns or produce output in turns use a _ suffix, like sin_(double), for turns to @@ -256,66 +256,66 @@

    Method Summary

    static double
    cos​(double radians)
    -
    A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x +
    A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x faster cos() calls in benchmarking; if you have access to libGDX you should consider its sometimes-more-precise and sometimes-faster MathUtils.cos() method.
    static float
    cos​(float radians)
    -
    A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x +
    A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x faster cos() calls in benchmarking, and both takes and returns floats; if you have access to libGDX you should consider its more-precise and sometimes-faster MathUtils.cos() method.
    static double
    cos_​(double turns)
    -
    A variation on Math.cos(double) that takes its input as a fraction of a turn instead of in radians; one +
    A variation on Math.cos(double) that takes its input as a fraction of a turn instead of in radians; one turn is equal to 360 degrees or two*PI radians.
    static float
    cos_​(float turns)
    -
    A variation on Math.cos(double) that takes its input as a fraction of a turn instead of in radians (it +
    A variation on Math.cos(double) that takes its input as a fraction of a turn instead of in radians (it also takes and returns a float); one turn is equal to 360 degrees or two*PI radians.
    static float
    cosDegrees​(float degrees)
    -
    A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x +
    A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x faster cos() calls in benchmarking, and both takes and returns floats; if you have access to libGDX, you should consider its more-precise and sometimes-faster MathUtils.cosDeg() method.
    static double
    sin​(double radians)
    -
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x +
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x faster sin() calls in benchmarking; if you have access to libGDX you should consider its sometimes-more-precise and sometimes-faster MathUtils.sin() method.
    static float
    sin​(float radians)
    -
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x +
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x faster sin() calls in benchmarking, and both takes and returns floats; if you have access to libGDX you should consider its more-precise and sometimes-faster MathUtils.sin() method.
    static double
    sin_​(double turns)
    -
    A variation on Math.sin(double) that takes its input as a fraction of a turn instead of in radians; one +
    A variation on Math.sin(double) that takes its input as a fraction of a turn instead of in radians; one turn is equal to 360 degrees or two*PI radians.
    static float
    sin_​(float turns)
    -
    A variation on Math.sin(double) that takes its input as a fraction of a turn instead of in radians (it +
    A variation on Math.sin(double) that takes its input as a fraction of a turn instead of in radians (it also takes and returns a float); one turn is equal to 360 degrees or two*PI radians.
    static float
    sinDegrees​(float degrees)
    -
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x +
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x faster sin() calls in benchmarking, and both takes and returns floats; if you have access to libGDX, you should consider its more-precise and sometimes-faster MathUtils.sinDeg() method.
    @@ -323,8 +323,8 @@

    Method Summary

    -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • @@ -354,15 +354,15 @@

    Method Details

    sin

    public static double sin(double radians)
    -
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x +
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x faster sin() calls in benchmarking; if you have access to libGDX you should consider its sometimes-more-precise and sometimes-faster MathUtils.sin() method. Because this method doesn't rely on a lookup table, where libGDX's MathUtils does, applications that have a bottleneck on memory may perform better with this method than with MathUtils. Takes the same arguments Math.sin() does, so one angle in radians, which may technically be any double (but this will lose precision on fairly large doubles, such as those that are - larger than Long.MAX_VALUE, because those doubles themselves will lose precision at that scale). This + larger than Long.MAX_VALUE, because those doubles themselves will lose precision at that scale). This is closely related to a cubic sway, but the shape of the output when graphed is almost identical to - sin(). The difference between the result of this method and Math.sin(double) should be under 0.0011 at + sin(). The difference between the result of this method and Math.sin(double) should be under 0.0011 at all points between -pi and pi, with an average difference of about 0.0005; not all points have been checked for potentially higher errors, though.
    @@ -387,15 +387,15 @@

    sin

    cos

    public static double cos(double radians)
    -
    A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x +
    A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x faster cos() calls in benchmarking; if you have access to libGDX you should consider its sometimes-more-precise and sometimes-faster MathUtils.cos() method. Because this method doesn't rely on a lookup table, where libGDX's MathUtils does, applications that have a bottleneck on memory may perform better with this method than with MathUtils. Takes the same arguments Math.cos() does, so one angle in radians, which may technically be any double (but this will lose precision on fairly large doubles, such as those that are - larger than Long.MAX_VALUE, because those doubles themselves will lose precision at that scale). This + larger than Long.MAX_VALUE, because those doubles themselves will lose precision at that scale). This is closely related to a cubic sway, but the shape of the output when graphed is almost identical to - cos(). The difference between the result of this method and Math.cos(double) should be under 0.0011 at + cos(). The difference between the result of this method and Math.cos(double) should be under 0.0011 at all points between -pi and pi, with an average difference of about 0.0005; not all points have been checked for potentially higher errors, though.
    @@ -420,15 +420,15 @@

    cos

    sin

    public static float sin(float radians)
    -
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x +
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x faster sin() calls in benchmarking, and both takes and returns floats; if you have access to libGDX you should consider its more-precise and sometimes-faster MathUtils.sin() method. Because this method doesn't rely on a lookup table, where libGDX's MathUtils does, applications that have a bottleneck on memory may perform better with this method than with MathUtils. Takes the same arguments Math.sin() does, so one angle in radians, which may technically be any float (but this will lose precision on fairly large floats, such as those that are - larger than Integer.MAX_VALUE, because those floats themselves will lose precision at that scale). This + larger than Integer.MAX_VALUE, because those floats themselves will lose precision at that scale). This is closely related to a cubic sway, but the shape of the output when graphed is almost identical to - sin(). The difference between the result of this method and Math.sin(double) should be under 0.0011 at + sin(). The difference between the result of this method and Math.sin(double) should be under 0.0011 at all points between -pi and pi, with an average difference of about 0.0005; not all points have been checked for potentially higher errors, though.
    @@ -453,15 +453,15 @@

    sin

    cos

    public static float cos(float radians)
    -
    A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x +
    A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x faster cos() calls in benchmarking, and both takes and returns floats; if you have access to libGDX you should consider its more-precise and sometimes-faster MathUtils.cos() method. Because this method doesn't rely on a lookup table, where libGDX's MathUtils does, applications that have a bottleneck on memory may perform better with this method than with MathUtils. Takes the same arguments Math.cos() does, so one angle in radians, which may technically be any float (but this will lose precision on fairly large floats, such as those that are - larger than Integer.MAX_VALUE, because those floats themselves will lose precision at that scale). This + larger than Integer.MAX_VALUE, because those floats themselves will lose precision at that scale). This is closely related to a cubic sway, but the shape of the output when graphed is almost identical to - cos(). The difference between the result of this method and Math.cos(double) should be under 0.0011 at + cos(). The difference between the result of this method and Math.cos(double) should be under 0.0011 at all points between -pi and pi, with an average difference of about 0.0005; not all points have been checked for potentially higher errors, though.
    @@ -486,14 +486,14 @@

    cos

    sinDegrees

    public static float sinDegrees(float degrees)
    -
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x +
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x faster sin() calls in benchmarking, and both takes and returns floats; if you have access to libGDX, you should consider its more-precise and sometimes-faster MathUtils.sinDeg() method. Because this method doesn't rely on a lookup table, where libGDX's MathUtils does, applications that have a bottleneck on memory may perform better with this method than with MathUtils. Takes one angle in degrees, which may technically be any float (but this will lose precision on fairly large floats, such as those that are - larger than Integer.MAX_VALUE, because those floats themselves will lose precision at that scale). The - difference between the result of this method and Math.sin(double) should be under 0.0011 at + larger than Integer.MAX_VALUE, because those floats themselves will lose precision at that scale). The + difference between the result of this method and Math.sin(double) should be under 0.0011 at all points between -360 and 360, with an average difference of about 0.0005; not all points have been checked for potentially higher errors, though.
    @@ -521,14 +521,14 @@

    sinDegrees

    cosDegrees

    public static float cosDegrees(float degrees)
    -
    A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x +
    A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x faster cos() calls in benchmarking, and both takes and returns floats; if you have access to libGDX, you should consider its more-precise and sometimes-faster MathUtils.cosDeg() method. Because this method doesn't rely on a lookup table, where libGDX's MathUtils does, applications that have a bottleneck on memory may perform better with this method than with MathUtils. Takes one angle in degrees, which may technically be any float (but this will lose precision on fairly large floats, such as those that are - larger than Integer.MAX_VALUE, because those floats themselves will lose precision at that scale). The - difference between the result of this method and Math.cos(double) should be under 0.0011 at + larger than Integer.MAX_VALUE, because those floats themselves will lose precision at that scale). The + difference between the result of this method and Math.cos(double) should be under 0.0011 at all points between -360 and 360, with an average difference of about 0.0005; not all points have been checked for potentially higher errors, though.
    @@ -556,7 +556,7 @@

    cosDegrees

    sin_

    public static double sin_(double turns)
    -
    A variation on Math.sin(double) that takes its input as a fraction of a turn instead of in radians; one +
    A variation on Math.sin(double) that takes its input as a fraction of a turn instead of in radians; one turn is equal to 360 degrees or two*PI radians. This can be useful as a building block for other measurements; to make a sine method that takes its input in grad (with 400 grad equal to 360 degrees), you would just divide the grad value by 400.0 (or multiply it by 0.0025) and pass it to this method. Similarly for binary degrees, also @@ -586,7 +586,7 @@

    sin_

    cos_

    public static double cos_(double turns)
    -
    A variation on Math.cos(double) that takes its input as a fraction of a turn instead of in radians; one +
    A variation on Math.cos(double) that takes its input as a fraction of a turn instead of in radians; one turn is equal to 360 degrees or two*PI radians. This can be useful as a building block for other measurements; to make a cosine method that takes its input in grad (with 400 grad equal to 360 degrees), you would just divide the grad value by 400.0 (or multiply it by 0.0025) and pass it to this method. Similarly for binary degrees, also @@ -616,7 +616,7 @@

    cos_

    sin_

    public static float sin_(float turns)
    -
    A variation on Math.sin(double) that takes its input as a fraction of a turn instead of in radians (it +
    A variation on Math.sin(double) that takes its input as a fraction of a turn instead of in radians (it also takes and returns a float); one turn is equal to 360 degrees or two*PI radians. This can be useful as a building block for other measurements; to make a sine method that takes its input in grad (with 400 grad equal to 360 degrees), you would just divide the grad value by 400.0 (or multiply it by 0.0025) and pass it to this @@ -647,7 +647,7 @@

    sin_

    cos_

    public static float cos_(float turns)
    -
    A variation on Math.cos(double) that takes its input as a fraction of a turn instead of in radians (it +
    A variation on Math.cos(double) that takes its input as a fraction of a turn instead of in radians (it also takes and returns a float); one turn is equal to 360 degrees or two*PI radians. This can be useful as a building block for other measurements; to make a cosine method that takes its input in grad (with 400 grad equal to 360 degrees), you would just divide the grad value by 400.0 (or multiply it by 0.0025) and pass it to this @@ -680,7 +680,7 @@

    atan

    public static double atan(double i)
    Arc tangent approximation with very low error, using an algorithm from the 1955 research study "Approximations for Digital Computers," by RAND Corporation (this is sheet 9's algorithm, which is the - second-fastest and second-least precise). This method is usually much faster than Math.atan(double), + second-fastest and second-least precise). This method is usually much faster than Math.atan(double), but is somewhat less precise than Math's implementation.
    Parameters:
    @@ -696,7 +696,7 @@

    atan

    public static float atan(float i)
    Arc tangent approximation with very low error, using an algorithm from the 1955 research study "Approximations for Digital Computers," by RAND Corporation (this is sheet 9's algorithm, which is the - second-fastest and second-least precise). This method is usually much faster than Math.atan(double), + second-fastest and second-least precise). This method is usually much faster than Math.atan(double), but is somewhat less precise than Math's implementation.
    Parameters:
    @@ -714,7 +714,7 @@

    atan2

    Close approximation of the frequently-used trigonometric method atan2, with higher precision than libGDX's atan2 approximation. Maximum error is below 0.00009 radians. Takes y and x (in that unusual order) as doubles, and returns the angle from the origin to that point in radians. - It is about 5 times faster than Math.atan2(double, double) (roughly 12 ns instead of roughly 62 ns for + It is about 5 times faster than Math.atan2(double, double) (roughly 12 ns instead of roughly 62 ns for Math, on Java 8 HotSpot). It is slightly faster than libGDX' MathUtils approximation of the same method; MathUtils seems to have worse average error, though.
    @@ -744,7 +744,7 @@

    atan2

    Close approximation of the frequently-used trigonometric method atan2, with higher precision than libGDX's atan2 approximation. Maximum error is below 0.00009 radians. Takes y and x (in that unusual order) as floats, and returns the angle from the origin to that point in radians. - It is about 5 times faster than Math.atan2(double, double) (roughly 12 ns instead of roughly 62 ns for + It is about 5 times faster than Math.atan2(double, double) (roughly 12 ns instead of roughly 62 ns for Math, on Java 8 HotSpot). It is slightly faster than libGDX' MathUtils approximation of the same method; MathUtils seems to have worse average error, though.
    @@ -830,7 +830,7 @@

    atanDegrees

    public static double atanDegrees(double i)
    Arc tangent approximation measured in degrees, using an algorithm from the 1955 research study "Approximations for Digital Computers," by RAND Corporation (this is sheet 9's algorithm, which is the - second-fastest and second-least precise). This method is usually much faster than Math.atan(double), + second-fastest and second-least precise). This method is usually much faster than Math.atan(double), but is somewhat less precise than Math's implementation. This implementation can return negative or positive results in degrees.
    @@ -847,7 +847,7 @@

    atanDegrees

    public static float atanDegrees(float i)
    Arc tangent approximation measured in degrees, using an algorithm from the 1955 research study "Approximations for Digital Computers," by RAND Corporation (this is sheet 9's algorithm, which is the - second-fastest and second-least precise). This method is usually much faster than Math.atan(double), + second-fastest and second-least precise). This method is usually much faster than Math.atan(double), but is somewhat less precise than Math's implementation. This implementation can return negative or positive results in degrees.
    @@ -866,7 +866,7 @@

    atan2Degrees

    Close approximation of the frequently-used trigonometric method atan2 measured in degrees, with higher precision than libGDX's atan2 approximation. The range for this is -180 to 180. Takes y and x (in that unusual order) as doubles, and returns the angle from the origin to that point in degrees. - It is about 5 times faster than Math.atan2(double, double) (roughly 12 ns instead of roughly 62 ns for + It is about 5 times faster than Math.atan2(double, double) (roughly 12 ns instead of roughly 62 ns for Math, on Java 8 HotSpot). It is slightly faster than libGDX' MathUtils approximation of the same method; MathUtils seems to have worse average error, as well.
    @@ -895,7 +895,7 @@

    atan2Degrees

    Close approximation of the frequently-used trigonometric method atan2 measured in degrees, with higher precision than libGDX's atan2 approximation. The range for this is -180 to 180. Takes y and x (in that unusual order) as floats, and returns the angle from the origin to that point in degrees. - It is about 5 times faster than Math.atan2(double, double) (roughly 12 ns instead of roughly 62 ns for + It is about 5 times faster than Math.atan2(double, double) (roughly 12 ns instead of roughly 62 ns for Math, on Java 8 HotSpot). It is slightly faster than libGDX' MathUtils approximation of the same method; MathUtils seems to have worse average error, as well.
    @@ -976,7 +976,7 @@

    asin

    public static float asin(float x)
    Arc sine approximation with very low error, using an algorithm from the 1955 research study "Approximations for Digital Computers," by RAND Corporation (this is sheet 35's algorithm, which is the fastest - and least precise). This method is usually much faster than Math.asin(double), but is somewhat less + and least precise). This method is usually much faster than Math.asin(double), but is somewhat less precise than Math's implementation. It is currently the same as libGDX's approximation in their MathUtils.
    Parameters:
    @@ -992,7 +992,7 @@

    acos

    public static float acos(float x)
    Arc cosine approximation with very low error, using an algorithm from the 1955 research study "Approximations for Digital Computers," by RAND Corporation (this is sheet 35's algorithm, which is the fastest - and least precise). This method is usually much faster than Math.acos(double), but is somewhat less + and least precise). This method is usually much faster than Math.acos(double), but is somewhat less precise than Math's implementation. It is currently the same as libGDX's approximation in their MathUtils.
    Accuracy: absolute error 0.000028450, relative error -0.000000011, max error 0.000067548 .
    @@ -1010,7 +1010,7 @@

    asin

    public static double asin(double x)
    Arc sine approximation with very low error, using an algorithm from the 1955 research study "Approximations for Digital Computers," by RAND Corporation (this is sheet 35's algorithm, which is the fastest - and least precise). This method is usually much faster than Math.asin(double), but is somewhat less + and least precise). This method is usually much faster than Math.asin(double), but is somewhat less precise than Math's implementation. It is currently the same as libGDX's approximation in their MathUtils, except that this takes a double and returns a double.
    @@ -1029,7 +1029,7 @@

    acos

    public static double acos(double x)
    Arc cosine approximation with very low error, using an algorithm from the 1955 research study "Approximations for Digital Computers," by RAND Corporation (this is sheet 35's algorithm, which is the fastest - and least precise). This method is usually much faster than Math.acos(double), but is somewhat less + and least precise). This method is usually much faster than Math.acos(double), but is somewhat less precise than Math's implementation. It is currently the same as libGDX's approximation in their MathUtils, except that this takes a double and returns a double.
    diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/class-use/FloatColors.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/class-use/FloatColors.html index fdc8f0f1..51695fec 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/class-use/FloatColors.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/class-use/FloatColors.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.FloatColors (colorful 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.FloatColors (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/class-use/Shaders.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/class-use/Shaders.html index 1b76056a..71f5dbf0 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/class-use/Shaders.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/class-use/Shaders.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.Shaders (colorful 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.Shaders (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/class-use/TrigTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/class-use/TrigTools.html index 4cb0b3a3..9cfa2800 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/class-use/TrigTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/class-use/TrigTools.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.TrigTools (colorful 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.TrigTools (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/ColorTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/ColorTools.html index cfc3d7d0..c07a07fe 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/ColorTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/ColorTools.html @@ -3,7 +3,7 @@ -ColorTools (colorful 0.5.2-SNAPSHOT API) +ColorTools (colorful 0.6.0 API) @@ -74,13 +74,13 @@

    Class ColorTools

    -
    java.lang.Object +
    java.lang.Object
    com.github.tommyettinger.colorful.ipt.ColorTools

    -
    public class ColorTools -extends Object
    +
    public class ColorTools +extends Object
    Contains code for manipulating colors as int, packed float, and Color values in the IPT color space. IPT has more perceptually-uniform handling of hue than some other color spaces, like YCwCm, and even though the version here gives up the complex exponential adjustments to various components that the original IPT @@ -162,6 +162,31 @@

    Method Summary

    Brings the chromatic components of start closer to grayscale by change (desaturating them).
    static float
    +
    editIPT​(float encoded, + float addI, + float addP, + float addT, + float addAlpha)
    +
    +
    Given a packed float IPT color, this edits its intensity, protan, tritan, and alpha channels by adding the + corresponding "add" parameter and then clamping.
    +
    +
    static float
    +
    editIPT​(float encoded, + float addI, + float addP, + float addT, + float addAlpha, + float mulI, + float mulP, + float mulT, + float mulAlpha)
    +
    +
    Given a packed float IPT color, this edits its intensity, protan, tritan, and alpha channels by first + multiplying each channel by the corresponding "mul" parameter and then adding the corresponding "add" parameter, + before clamping.
    +
    +
    static float
    enrich​(float start, float change)
    @@ -334,7 +359,7 @@

    Method Summary

    Interpolates from the packed float color start towards a warmer color (orange to magenta) by change.
    static float
    -
    randomColor​(Random random)
    +
    randomColor​(Random random)
    Produces a random packed float color that is always in-gamut and should be uniformly distributed.
    @@ -386,41 +411,48 @@

    Method Summary

    Gets a variation on the packed float color basis as another packed float that has its hue, saturation, lightness, and opacity adjusted by the specified amounts.
    -
    static float
    -
    toRGBA​(float packed)
    +
    static com.badlogic.gdx.graphics.Color
    +
    toIPTColor​(com.badlogic.gdx.graphics.Color editing, + float ipt)
    +
    Writes an IPT-format packed float color (the format produced by ipt(float, float, float, float)) + into an IPT-format Color called editing.
    +
    +
    static float
    +
    toRGBA​(float packed)
    +
    Converts a packed float color in the format produced by ipt(float, float, float, float) to a packed float in RGBA format.
    -
    static int
    -
    toRGBA8888​(float packed)
    -
    +
    static int
    +
    toRGBA8888​(float packed)
    +
    Converts a packed float color in the format produced by ipt(float, float, float, float) to an RGBA8888 int.
    -
    static float
    -
    tritan​(float encoded)
    -
    +
    static float
    +
    tritan​(float encoded)
    +
    The "tritan" of the given packed float in IPT format, which when combined with protan describes the hue and saturation of a color; ranges from 0f to 1f .
    -
    static float
    -
    tritanDown​(float start, +
    static float
    +
    tritanDown​(float start, float change)
    -
    +
    Interpolates from the packed float color start towards an "artificial" color (between blue and purple) by change.
    -
    static float
    -
    tritanUp​(float start, +
    static float
    +
    tritanUp​(float start, float change)
    -
    +
    Interpolates from the packed float color start towards a "natural" color (between green and orange) by change.
    -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • @@ -435,7 +467,7 @@

    Constructor Details

  • ColorTools

    -
    public ColorTools()
    +
    public ColorTools()
  • @@ -449,7 +481,7 @@

    Method Details

  • ipt

    -
    public static float ipt(float intens, +
    public static float ipt(float intens, float protan, float tritan, float alpha)
    @@ -483,7 +515,7 @@

    ipt

  • toRGBA8888

    -
    public static int toRGBA8888(float packed)
    +
    public static int toRGBA8888(float packed)
    Converts a packed float color in the format produced by ipt(float, float, float, float) to an RGBA8888 int. This format of int can be used with Pixmap and in some other places in libGDX.
    @@ -497,7 +529,7 @@

    toRGBA8888

  • toRGBA

    -
    public static float toRGBA(float packed)
    +
    public static float toRGBA(float packed)
    Converts a packed float color in the format produced by ipt(float, float, float, float) to a packed float in RGBA format. This format of float can be used with the standard SpriteBatch and in some other places in libGDX.
    @@ -512,7 +544,7 @@

    toRGBA

  • toColor

    -
    public static com.badlogic.gdx.graphics.Color toColor(com.badlogic.gdx.graphics.Color editing, +
    public static com.badlogic.gdx.graphics.Color toColor(com.badlogic.gdx.graphics.Color editing, float packed)
    Writes an IPT-format packed float color (the format produced by ipt(float, float, float, float)) into an RGBA8888 Color as used by libGDX (called editing).
    @@ -526,9 +558,28 @@

    toColor

  • +
    +

    toIPTColor

    +
    public static com.badlogic.gdx.graphics.Color toIPTColor(com.badlogic.gdx.graphics.Color editing, + float ipt)
    +
    Writes an IPT-format packed float color (the format produced by ipt(float, float, float, float)) + into an IPT-format Color called editing. This is mostly useful if the rest of your application expects + colors in IPT format, such as because you use Shaders.fragmentShaderIPT or ColorfulBatch. +
    + Internally, this simply calls Color.abgr8888ToColor(Color, float) and returns the edited Color.
    +
    +
    Parameters:
    +
    editing - a libGDX Color that will be filled in-place with the color ipt, unchanged from its color space
    +
    ipt - a packed float color, as produced by ipt(float, float, float, float)
    +
    Returns:
    +
    an RGBA8888 int color
    +
    +
    +
  • +
  • fromRGBA8888

    -
    public static float fromRGBA8888(int rgba)
    +
    public static float fromRGBA8888(int rgba)
    Takes a color encoded as an RGBA8888 int and converts to a packed float in the IPT format this uses.
    Parameters:
    @@ -541,7 +592,7 @@

    fromRGBA8888

  • fromRGBA

    -
    public static float fromRGBA(float packed)
    +
    public static float fromRGBA(float packed)
    Takes a color encoded as an RGBA8888 packed float and converts to a packed float in the IPT format this uses.
    Parameters:
    @@ -554,7 +605,7 @@

    fromRGBA

  • fromColor

    -
    public static float fromColor(com.badlogic.gdx.graphics.Color color)
    +
    public static float fromColor(com.badlogic.gdx.graphics.Color color)
    Takes a libGDX Color that uses RGBA8888 channels and converts to a packed float in the IPT format this uses.
    Parameters:
    @@ -567,7 +618,7 @@

    fromColor

  • fromRGBA

    -
    public static float fromRGBA(float r, +
    public static float fromRGBA(float r, float g, float b, float a)
    @@ -586,7 +637,7 @@

    fromRGBA

  • redInt

    -
    public static int redInt(float encoded)
    +
    public static int redInt(float encoded)
    Gets the red channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    Parameters:
    @@ -599,7 +650,7 @@

    redInt

  • greenInt

    -
    public static int greenInt(float encoded)
    +
    public static int greenInt(float encoded)
    Gets the green channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    Parameters:
    @@ -612,7 +663,7 @@

    greenInt

  • blueInt

    -
    public static int blueInt(float encoded)
    +
    public static int blueInt(float encoded)
    Gets the blue channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    Parameters:
    @@ -625,7 +676,7 @@

    blueInt

  • alphaInt

    -
    public static int alphaInt(float encoded)
    +
    public static int alphaInt(float encoded)
    Gets the alpha channel value of the given encoded color, as an even int ranging from 0 to 254, inclusive. Because of how alpha is stored in libGDX, no odd-number values are possible for alpha.
    @@ -639,7 +690,7 @@

    alphaInt

  • red

    -
    public static float red(float encoded)
    +
    public static float red(float encoded)
    Gets the red channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -652,7 +703,7 @@

    red

  • green

    -
    public static float green(float encoded)
    +
    public static float green(float encoded)
    Gets the green channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -665,7 +716,7 @@

    green

  • blue

    -
    public static float blue(float encoded)
    +
    public static float blue(float encoded)
    Gets the blue channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -678,7 +729,7 @@

    blue

  • alpha

    -
    public static float alpha(float encoded)
    +
    public static float alpha(float encoded)
    Gets the alpha channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -691,7 +742,7 @@

    alpha

  • floatGetHSL

    -
    public static float floatGetHSL(float hue, +
    public static float floatGetHSL(float hue, float saturation, float lightness, float opacity)
    @@ -717,7 +768,7 @@

    floatGetHSL

  • saturation

    -
    public static float saturation(float encoded)
    +
    public static float saturation(float encoded)
    Gets the saturation of the given encoded color, as a float ranging from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -730,13 +781,13 @@

    saturation

  • lightness

    -
    public static float lightness(float encoded)
    +
    public static float lightness(float encoded)
  • hue

    -
    public static float hue(float encoded)
    +
    public static float hue(float encoded)
    Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased) to 1f (exclusive, red and approaching purple if decreased).
    @@ -751,7 +802,7 @@

    hue

  • intensity

    -
    public static float intensity(float encoded)
    +
    public static float intensity(float encoded)
    The "intensity" of the given packed float in IPT format, which is like its lightness; ranges from 0.0f to 1.0f . You can edit the intensity of a color with lighten(float, float) and darken(float, float).
    @@ -766,7 +817,7 @@

    intensity

  • protan

    -
    public static float protan(float encoded)
    +
    public static float protan(float encoded)
    The "protan" of the given packed float in IPT format, which when combined with tritan describes the hue and saturation of a color; ranges from 0f to 1f . If protan is 0f, the color will be cooler, more green or blue; if protan is 1f, the color will be warmer, from magenta to orange. You can edit the protan of a color with @@ -782,7 +833,7 @@

    protan

  • tritan

    -
    public static float tritan(float encoded)
    +
    public static float tritan(float encoded)
    The "tritan" of the given packed float in IPT format, which when combined with protan describes the hue and saturation of a color; ranges from 0f to 1f . If tritan is 0f, the color will be more "artificial", more blue or purple; if tritan is 1f, the color will be more "natural", from green to yellow to orange. You can edit @@ -798,7 +849,7 @@

    tritan

  • toEditedFloat

    -
    public static float toEditedFloat(float basis, +
    public static float toEditedFloat(float basis, float hue, float saturation, float light, @@ -831,7 +882,7 @@

    toEditedFloat

  • lighten

    -
    public static float lighten(float start, +
    public static float lighten(float start, float change)
    Interpolates from the packed float color start towards white by change. While change should be between 0f (return start as-is) and 1f (return white), start should be a packed color, as from @@ -852,7 +903,7 @@

    lighten

  • darken

    -
    public static float darken(float start, +
    public static float darken(float start, float change)
    Interpolates from the packed float color start towards black by change. While change should be between 0f (return start as-is) and 1f (return black), start should be a packed color, as from @@ -873,7 +924,7 @@

    darken

  • protanUp

    -
    public static float protanUp(float start, +
    public static float protanUp(float start, float change)
    Interpolates from the packed float color start towards a warmer color (orange to magenta) by change. While change should be between 0f (return start as-is) and 1f (return fully warmed), start should be a packed color, as from @@ -895,7 +946,7 @@

    protanUp

  • protanDown

    -
    public static float protanDown(float start, +
    public static float protanDown(float start, float change)
    Interpolates from the packed float color start towards a cooler color (green to blue) by change. While change should be between 0f (return start as-is) and 1f (return fully cooled), start should be a packed color, as from @@ -917,7 +968,7 @@

    protanDown

  • tritanUp

    -
    public static float tritanUp(float start, +
    public static float tritanUp(float start, float change)
    Interpolates from the packed float color start towards a "natural" color (between green and orange) by change. While change should be between 0f (return start as-is) and 1f (return fully natural), start should be a packed color, as @@ -939,7 +990,7 @@

    tritanUp

  • tritanDown

    -
    public static float tritanDown(float start, +
    public static float tritanDown(float start, float change)
    Interpolates from the packed float color start towards an "artificial" color (between blue and purple) by change. While change should be between 0f (return start as-is) and 1f (return fully artificial), start should be a packed color, as @@ -961,7 +1012,7 @@

    tritanDown

  • blot

    -
    public static float blot(float start, +
    public static float blot(float start, float change)
    Interpolates from the packed float color start towards that color made opaque by change. While change should be between 0f (return start as-is) and 1f (return start with full alpha), start should be a packed color, as from @@ -982,7 +1033,7 @@

    blot

  • fade

    -
    public static float fade(float start, +
    public static float fade(float start, float change)
    Interpolates from the packed float color start towards transparent by change. While change should be between 0 (return start as-is) and 1f (return the color with 0 alpha), start should be a packed color, as from @@ -1003,7 +1054,7 @@

    fade

  • dullen

    -
    public static float dullen(float start, +
    public static float dullen(float start, float change)
    Brings the chromatic components of start closer to grayscale by change (desaturating them). While change should be between 0f (return start as-is) and 1f (return fully gray), start should be a packed color, as @@ -1023,7 +1074,7 @@

    dullen

  • enrich

    -
    public static float enrich(float start, +
    public static float enrich(float start, float change)
    Pushes the chromatic components of start away from grayscale by change (saturating them). While change should be between 0f (return start as-is) and 1f (return maximally saturated), start should be a packed color, as @@ -1045,7 +1096,7 @@

    enrich

  • inverseLightness

    -
    public static float inverseLightness(float mainColor, +
    public static float inverseLightness(float mainColor, float contrastingColor)
    Given a packed float IPT color mainColor and another IPT color that it should be made to contrast with, gets a packed float IPT color with roughly inverted intnsity but the same chromatic channels and opacity (P and T @@ -1069,7 +1120,7 @@

    inverseLightness

  • differentiateLightness

    -
    public static float differentiateLightness(float mainColor, +
    public static float differentiateLightness(float mainColor, float contrastingColor)
    Given a packed float IPT color mainColor and another IPT color that it should be made to contrast with, gets a packed float IPT color with I that should be quite different from contrastingColor's I, @@ -1092,7 +1143,7 @@

    differentiateLightness

  • offsetLightness

    -
    public static float offsetLightness(float mainColor)
    +
    public static float offsetLightness(float mainColor)
    Pretty simple; adds 0.5 to the given color's I and wraps it around if it would go above 1.0, then averages that with the original I. This means light colors become darker, and dark colors become lighter, with almost all results in the middle-range of possible lightness.
    @@ -1107,7 +1158,7 @@

    offsetLightness

  • lessenChange

    -
    public static float lessenChange(float color, +
    public static float lessenChange(float color, float fraction)
    Makes the additive IPT color stored in color cause less of a change when used as a tint, as if it were mixed with neutral gray. When fraction is 1.0, this returns color unchanged; when fraction is 0.0, it @@ -1125,7 +1176,7 @@

    lessenChange

  • randomEdit

    -
    public static float randomEdit(float color, +
    public static float randomEdit(float color, long seed, float variance)
    Makes a quasi-randomly-edited variant on the given color, allowing typically a small amount of @@ -1149,7 +1200,7 @@

    randomEdit

  • inGamut

    -
    public static boolean inGamut(float packed)
    +
    public static boolean inGamut(float packed)
    Returns true if the given packed float color, as IPT, is valid to convert losslessly back to RGBA.
    Parameters:
    @@ -1162,7 +1213,7 @@

    inGamut

  • inGamut

    -
    public static boolean inGamut(float i, +
    public static boolean inGamut(float i, float p, float t)
    Returns true if the given IPT values are valid to convert losslessly back to RGBA.
    @@ -1179,7 +1230,7 @@

    inGamut

  • limitToGamut

    -
    public static float limitToGamut(float packed)
    +
    public static float limitToGamut(float packed)
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it isn't in-gamut, or returns it as soon as it is in-gamut.
    @@ -1195,7 +1246,7 @@

    limitToGamut

  • limitToGamut

    -
    public static float limitToGamut(float i, +
    public static float limitToGamut(float i, float p, float t)
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it @@ -1215,7 +1266,7 @@

    limitToGamut

  • limitToGamut

    -
    public static float limitToGamut(float i, +
    public static float limitToGamut(float i, float p, float t, float a)
    @@ -1235,9 +1286,71 @@

    limitToGamut

  • +
    +

    editIPT

    +
    public static float editIPT(float encoded, + float addI, + float addP, + float addT, + float addAlpha)
    +
    Given a packed float IPT color, this edits its intensity, protan, tritan, and alpha channels by adding the + corresponding "add" parameter and then clamping. This returns a different float value (of course, the given float + can't be edited in-place). You can give a value of 0 for any "add" parameter you want to stay unchanged. This + clamps the resulting color to remain in-gamut, so it should be safe to convert it back to RGBA.
    +
    +
    Parameters:
    +
    encoded - a packed float IPT color
    +
    addI - how much to add to the intensity channel; typically in the -1 to 1 range
    +
    addP - how much to add to the protan channel; typically in the -2 to 2 range
    +
    addT - how much to add to the tritan channel; typically in the -2 to 2 range
    +
    addAlpha - how much to add to the alpha channel; typically in the -1 to 1 range
    +
    Returns:
    +
    a packed float IPT color with the requested edits applied to encoded
    +
    +
    +
  • +
  • +
    +

    editIPT

    +
    public static float editIPT(float encoded, + float addI, + float addP, + float addT, + float addAlpha, + float mulI, + float mulP, + float mulT, + float mulAlpha)
    +
    Given a packed float IPT color, this edits its intensity, protan, tritan, and alpha channels by first + multiplying each channel by the corresponding "mul" parameter and then adding the corresponding "add" parameter, + before clamping. This means the intensity value is multiplied by mulI, then has addI added, and + then is clamped to the normal range for intensity (0 to 1). This returns a different float value (of course, the + given float can't be edited in-place). You can give a value of 0 for any "add" parameter you want to stay + unchanged, or a value of 1 for any "mul" parameter that shouldn't change. Note that this manipulates protan and + tritan in the -1 to 1 range, so if you multiply by a small number like 0.25f, then this will produce a + less-saturated color, and if you multiply by a larger number like 4f, then you will get a much + more-saturated color. This clamps the resulting color to remain in-gamut, so it should be safe to convert it back + to RGBA.
    +
    +
    Parameters:
    +
    encoded - a packed float IPT color
    +
    addI - how much to add to the intensity channel; typically in the -1 to 1 range
    +
    addP - how much to add to the protan channel; typically in the -2 to 2 range
    +
    addT - how much to add to the tritan channel; typically in the -2 to 2 range
    +
    addAlpha - how much to add to the alpha channel; typically in the -1 to 1 range
    +
    mulI - how much to multiply the intensity channel by; should be non-negative
    +
    mulP - how much to multiply the protan channel by; usually non-negative (not always)
    +
    mulT - how much to multiply the tritan channel by; usually non-negative (not always)
    +
    mulAlpha - how much to multiply the alpha channel by; should be non-negative
    +
    Returns:
    +
    a packed float IPT color with the requested edits applied to encoded
    +
    +
    +
  • +
  • fromHSI

    -
    public static float fromHSI(float packed)
    +
    public static float fromHSI(float packed)
    Converts from a packed float in HSI format to a packed float in IPT format.
    Parameters:
    @@ -1250,7 +1363,7 @@

    fromHSI

  • fromHSI

    -
    public static float fromHSI(float hue, +
    public static float fromHSI(float hue, float saturation, float intensity, float alpha)
    @@ -1270,7 +1383,7 @@

    fromHSI

  • randomColor

    -
    public static float randomColor(Random random)
    +
    public static float randomColor(Random random)
    Produces a random packed float color that is always in-gamut and should be uniformly distributed.
    Parameters:
    @@ -1283,7 +1396,7 @@

    randomColor

  • subrandomColor

    -
    public static float subrandomColor(float r, +
    public static float subrandomColor(float r, float g, float b)
    Limited-use; like randomColor(Random) but for cases where you already have three floats (r, g, and b) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/ColorfulBatch.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/ColorfulBatch.html index 41f3ef46..54da2e22 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/ColorfulBatch.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/ColorfulBatch.html @@ -3,7 +3,7 @@ -ColorfulBatch (colorful 0.5.2-SNAPSHOT API) +ColorfulBatch (colorful 0.6.0 API) @@ -74,7 +74,7 @@

    Class ColorfulBatch

    -
    java.lang.Object +
    java.lang.Object
    com.github.tommyettinger.colorful.ipt.ColorfulBatch
    @@ -84,7 +84,7 @@

    Class ColorfulBatch


  • public class ColorfulBatch -extends Object +extends Object implements com.badlogic.gdx.graphics.g2d.Batch
    A substitute for SpriteBatch that adds an additional attribute to store an extra color's worth of channels, used to modify the intensity and chromatic channels of a color by multiplication @@ -162,7 +162,7 @@

    Field Summary

    protected float
     
    -
    static String
    +
    static String
     
    static float
    @@ -545,8 +545,8 @@

    Method Summary

  • -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • @@ -571,7 +571,7 @@

    SPRITE_SIZE

  • TWEAK_ATTRIBUTE

    -
    public static final String TWEAK_ATTRIBUTE
    +
    public static final String TWEAK_ATTRIBUTE
    See Also:
    Constant Field Values
    diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/ColorfulSprite.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/ColorfulSprite.html index 5d618fac..6eb88579 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/ColorfulSprite.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/ColorfulSprite.html @@ -3,7 +3,7 @@ -ColorfulSprite (colorful 0.5.2-SNAPSHOT API) +ColorfulSprite (colorful 0.6.0 API) @@ -74,7 +74,7 @@

    Class ColorfulSprite

  • -
    java.lang.Object +
    java.lang.Object
    com.badlogic.gdx.graphics.g2d.TextureRegion
    com.github.tommyettinger.colorful.ipt.ColorfulSprite
    @@ -448,8 +448,8 @@

    Method Summary

    Methods inherited from class com.badlogic.gdx.graphics.g2d.TextureRegion

    getRegionHeight, getRegionWidth, getRegionX, getRegionY, getTexture, getU, getU2, getV, getV2, isFlipX, isFlipY, setRegion, setRegion, setRegion, setRegion, setRegionHeight, setRegionWidth, setRegionX, setRegionY, setTexture, split, split
    -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/Palette.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/Palette.html index 7bbb3f08..4e9ff069 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/Palette.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/Palette.html @@ -3,7 +3,7 @@ -Palette (colorful 0.5.2-SNAPSHOT API) +Palette (colorful 0.6.0 API) @@ -74,13 +74,13 @@

    Class Palette

  • -
    java.lang.Object +
    java.lang.Object
    com.github.tommyettinger.colorful.ipt.Palette

    public class Palette -extends Object
    +extends Object
    A palette of predefined colors as packed IPT floats, the kind ColorTools works with. You can access colors by their constant name, such as OCEAN_BLUE, by the NAMED map using NAMED.get("Ocean Blue", 0f), or by index in the FloatArray called LIST. Note that to access a float @@ -841,21 +841,21 @@

    Field Summary

    This color constant "Mush" has RGBA8888 code B1B10AFF, intensity 0.5411765, protan 0.4745098, tritan 0.80784315, alpha 1.0, hue 0.16913939, and saturation 0.6568773.
    -
    static com.badlogic.gdx.utils.ObjectFloatMap<String>
    +
    static com.badlogic.gdx.utils.ObjectFloatMap<String>
     
    -
    static com.badlogic.gdx.utils.Array<String>
    +
    static com.badlogic.gdx.utils.Array<String>
    All names for colors in this palette, in alphabetical order.
    -
    static com.badlogic.gdx.utils.Array<String>
    +
    static com.badlogic.gdx.utils.Array<String>
    All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to blue.
    -
    static com.badlogic.gdx.utils.Array<String>
    +
    static com.badlogic.gdx.utils.Array<String>
    All names for colors in this palette, sorted by lightness from black to white.
    @@ -1448,8 +1448,8 @@

    Method Summary

    -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • @@ -1464,7 +1464,7 @@

    Field Details

  • NAMED

    -
    public static final com.badlogic.gdx.utils.ObjectFloatMap<String> NAMED
    +
    public static final com.badlogic.gdx.utils.ObjectFloatMap<String> NAMED
  • @@ -5828,7 +5828,7 @@

    RASPBERRY

  • NAMES

    -
    public static final com.badlogic.gdx.utils.Array<String> NAMES
    +
    public static final com.badlogic.gdx.utils.Array<String> NAMES
    All names for colors in this palette, in alphabetical order. You can fetch the corresponding packed float color by looking up a name in NAMED.
    @@ -5836,7 +5836,7 @@

    NAMES

  • NAMES_BY_HUE

    -
    public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_HUE
    +
    public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_HUE
    All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to blue. You can fetch the corresponding packed float color by looking up a name in NAMED.
    @@ -5844,7 +5844,7 @@

    NAMES_BY_HUE

  • NAMES_BY_LIGHTNESS

    -
    public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_LIGHTNESS
    +
    public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_LIGHTNESS
    All names for colors in this palette, sorted by lightness from black to white. You can fetch the corresponding packed float color by looking up a name in NAMED.
    diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/ColorTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/ColorTools.html index acae0457..5c1ca79d 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/ColorTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/ColorTools.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.ipt.ColorTools (colorful 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.ipt.ColorTools (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/ColorfulBatch.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/ColorfulBatch.html index 685a9683..361838bd 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/ColorfulBatch.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/ColorfulBatch.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.ipt.ColorfulBatch (colorful 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.ipt.ColorfulBatch (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/ColorfulSprite.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/ColorfulSprite.html index bc2a66ef..781c0c9e 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/ColorfulSprite.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/ColorfulSprite.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.ipt.ColorfulSprite (colorful 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.ipt.ColorfulSprite (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/Palette.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/Palette.html index 87fc088e..013a5435 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/Palette.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/Palette.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.ipt.Palette (colorful 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.ipt.Palette (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/package-summary.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/package-summary.html index 7a45f3f1..f31be12d 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/package-summary.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/package-summary.html @@ -3,7 +3,7 @@ -com.github.tommyettinger.colorful.ipt (colorful 0.5.2-SNAPSHOT API) +com.github.tommyettinger.colorful.ipt (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/package-tree.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/package-tree.html index f1615191..829393e0 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/package-tree.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/package-tree.html @@ -3,7 +3,7 @@ -com.github.tommyettinger.colorful.ipt Class Hierarchy (colorful 0.5.2-SNAPSHOT API) +com.github.tommyettinger.colorful.ipt Class Hierarchy (colorful 0.6.0 API) @@ -60,7 +60,7 @@

    Hierarchy For Package com.github.tommyettinger.colorful.ipt

    Class Hierarchy

      -
    • java.lang.Object +
    • java.lang.Object
      • com.github.tommyettinger.colorful.ipt.ColorfulBatch (implements com.badlogic.gdx.graphics.g2d.Batch)
      • com.github.tommyettinger.colorful.ipt.ColorTools
      • diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/package-use.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/package-use.html index 91fb9d9f..19ecb7d5 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/package-use.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/package-use.html @@ -3,7 +3,7 @@ -Uses of Package com.github.tommyettinger.colorful.ipt (colorful 0.5.2-SNAPSHOT API) +Uses of Package com.github.tommyettinger.colorful.ipt (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/ColorTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/ColorTools.html index 06f16999..ca6f7e64 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/ColorTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/ColorTools.html @@ -3,7 +3,7 @@ -ColorTools (colorful 0.5.2-SNAPSHOT API) +ColorTools (colorful 0.6.0 API) @@ -74,13 +74,13 @@

        Class ColorTools

  • -
    java.lang.Object +
    java.lang.Object
    com.github.tommyettinger.colorful.ipt_hq.ColorTools

    public class ColorTools -extends Object
    +extends Object
    Contains code for manipulating colors as int and packed float values in the IPT color space. IPT has more perceptually-uniform handling of hue than some other color spaces, like YCwCm, and this version goes further than the IPT package by performing gamma correction and all the @@ -162,6 +162,31 @@

    Method Summary

    Brings the chromatic components of start closer to grayscale by change (desaturating them).
    static float
    +
    editIPT​(float encoded, + float addI, + float addP, + float addT, + float addAlpha)
    +
    +
    Given a packed float IPT_HQ color, this edits its intensity, protan, tritan, and alpha channels by adding the + corresponding "add" parameter and then clamping.
    +
    +
    static float
    +
    editIPT​(float encoded, + float addI, + float addP, + float addT, + float addAlpha, + float mulI, + float mulP, + float mulT, + float mulAlpha)
    +
    +
    Given a packed float IPT_HQ color, this edits its intensity, protan, tritan, and alpha channels by first + multiplying each channel by the corresponding "mul" parameter and then adding the corresponding "add" parameter, + before clamping.
    +
    +
    static float
    enrich​(float start, float change)
    @@ -202,7 +227,7 @@

    Method Summary

    static float
    fromRGBA8888​(int rgba)
    -
    Takes a color encoded as an RGBA8888 int and converts to a packed float in the IPT format this uses.
    +
    Takes a color encoded as an RGBA8888 int and converts to a packed float in the IPT_HQ format this uses.
    static float
    green​(float encoded)
    @@ -275,7 +300,7 @@

    Method Summary

    static float
    limitToGamut​(float packed)
    -
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it +
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to grayscale if it isn't in-gamut, or returns it as soon as it is in-gamut.
    static float
    @@ -283,7 +308,7 @@

    Method Summary

    float p, float t)
    -
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it +
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to grayscale if it isn't in-gamut, or returns it as soon as it is in-gamut.
    static float
    @@ -292,7 +317,7 @@

    Method Summary

    float t, float a)
    -
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it +
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to grayscale if it isn't in-gamut, or returns it as soon as it is in-gamut.
    static float
    @@ -320,7 +345,7 @@

    Method Summary

    Interpolates from the packed float color start towards a warmer color (orange to magenta) by change.
    static float
    -
    randomColor​(Random random)
    +
    randomColor​(Random random)
    Produces a random packed float color that is always in-gamut and should be uniformly distributed.
    @@ -364,41 +389,48 @@

    Method Summary

    Gets a variation on the packed float color basis as another packed float that has its hue, saturation, lightness, and opacity adjusted by the specified amounts.
    -
    static float
    -
    toRGBA​(float packed)
    +
    static com.badlogic.gdx.graphics.Color
    +
    toIPTColor​(com.badlogic.gdx.graphics.Color editing, + float ipt)
    +
    Writes an IPT_HQ-format packed float color (the format produced by ipt(float, float, float, float)) + into an IPT_HQ-format Color called editing.
    +
    +
    static float
    +
    toRGBA​(float packed)
    +
    Converts a packed float color in the format produced by ipt(float, float, float, float) to a packed float in RGBA format.
    -
    static int
    -
    toRGBA8888​(float packed)
    -
    +
    static int
    +
    toRGBA8888​(float packed)
    +
    Converts a packed float color in the format produced by ipt(float, float, float, float) to an RGBA8888 int.
    -
    static float
    -
    tritan​(float encoded)
    -
    +
    static float
    +
    tritan​(float encoded)
    +
    The "tritan" of the given packed float in IPT format, which when combined with protan describes the hue and saturation of a color; ranges from 0f to 1f .
    -
    static float
    -
    tritanDown​(float start, +
    static float
    +
    tritanDown​(float start, float change)
    -
    +
    Interpolates from the packed float color start towards an "artificial" color (between blue and purple) by change.
    -
    static float
    -
    tritanUp​(float start, +
    static float
    +
    tritanUp​(float start, float change)
    -
    +
    Interpolates from the packed float color start towards a "natural" color (between green and orange) by change.
    -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • @@ -508,22 +540,41 @@

    toColor

  • +
    +

    toIPTColor

    +
    public static com.badlogic.gdx.graphics.Color toIPTColor(com.badlogic.gdx.graphics.Color editing, + float ipt)
    +
    Writes an IPT_HQ-format packed float color (the format produced by ipt(float, float, float, float)) + into an IPT_HQ-format Color called editing. This is mostly useful if the rest of your application expects + colors in IPT_HQ format, such as because you use Shaders.fragmentShaderIPT_HQ or ColorfulBatch. +
    + Internally, this simply calls Color.abgr8888ToColor(Color, float) and returns the edited Color.
    +
    +
    Parameters:
    +
    editing - a libGDX Color that will be filled in-place with the color ipt, unchanged from its color space
    +
    ipt - a packed float color, as produced by ipt(float, float, float, float)
    +
    Returns:
    +
    an RGBA8888 int color
    +
    +
    +
  • +
  • fromRGBA8888

    -
    public static float fromRGBA8888(int rgba)
    -
    Takes a color encoded as an RGBA8888 int and converts to a packed float in the IPT format this uses.
    +
    public static float fromRGBA8888(int rgba)
    +
    Takes a color encoded as an RGBA8888 int and converts to a packed float in the IPT_HQ format this uses.
    Parameters:
    rgba - an int with the channels (in order) red, green, blue, alpha; should have 8 bits per channel
    Returns:
    -
    a packed float as IPT, which this class can use
    +
    a packed float as IPT_HQ, which this class can use
  • fromRGBA

    -
    public static float fromRGBA(float packed)
    +
    public static float fromRGBA(float packed)
    Takes a color encoded as an RGBA8888 packed float and converts to a packed float in the IPT format this uses.
    Parameters:
    @@ -536,7 +587,7 @@

    fromRGBA

  • fromColor

    -
    public static float fromColor(com.badlogic.gdx.graphics.Color color)
    +
    public static float fromColor(com.badlogic.gdx.graphics.Color color)
    Takes a libGDX Color that uses RGBA8888 channels and converts to a packed float in the IPT format this uses.
    Parameters:
    @@ -549,7 +600,7 @@

    fromColor

  • fromRGBA

    -
    public static float fromRGBA(float r, +
    public static float fromRGBA(float r, float g, float b, float a)
    @@ -568,7 +619,7 @@

    fromRGBA

  • redInt

    -
    public static int redInt(float encoded)
    +
    public static int redInt(float encoded)
    Gets the red channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    Parameters:
    @@ -581,7 +632,7 @@

    redInt

  • greenInt

    -
    public static int greenInt(float encoded)
    +
    public static int greenInt(float encoded)
    Gets the green channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    Parameters:
    @@ -594,7 +645,7 @@

    greenInt

  • blueInt

    -
    public static int blueInt(float encoded)
    +
    public static int blueInt(float encoded)
    Gets the blue channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    Parameters:
    @@ -607,7 +658,7 @@

    blueInt

  • alphaInt

    -
    public static int alphaInt(float encoded)
    +
    public static int alphaInt(float encoded)
    Gets the alpha channel value of the given encoded color, as an even int ranging from 0 to 254, inclusive. Because of how alpha is stored in libGDX, no odd-number values are possible for alpha.
    @@ -621,7 +672,7 @@

    alphaInt

  • red

    -
    public static float red(float encoded)
    +
    public static float red(float encoded)
    Gets the red channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -634,7 +685,7 @@

    red

  • green

    -
    public static float green(float encoded)
    +
    public static float green(float encoded)
    Gets the green channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -647,7 +698,7 @@

    green

  • blue

    -
    public static float blue(float encoded)
    +
    public static float blue(float encoded)
    Gets the blue channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -660,7 +711,7 @@

    blue

  • alpha

    -
    public static float alpha(float encoded)
    +
    public static float alpha(float encoded)
    Gets the alpha channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -673,7 +724,7 @@

    alpha

  • floatGetHSL

    -
    public static float floatGetHSL(float hue, +
    public static float floatGetHSL(float hue, float saturation, float lightness, float opacity)
    @@ -699,7 +750,7 @@

    floatGetHSL

  • saturation

    -
    public static float saturation(float encoded)
    +
    public static float saturation(float encoded)
    Gets the saturation of the given encoded color, as a float ranging from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -712,13 +763,13 @@

    saturation

  • lightness

    -
    public static float lightness(float encoded)
    +
    public static float lightness(float encoded)
  • hue

    -
    public static float hue(float encoded)
    +
    public static float hue(float encoded)
    Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased) to 1f (exclusive, red and approaching purple if decreased).
    @@ -733,7 +784,7 @@

    hue

  • intensity

    -
    public static float intensity(float encoded)
    +
    public static float intensity(float encoded)
    The "intensity" of the given packed float in IPT format, which is like its lightness; ranges from 0.0f to 1.0f . You can edit the intensity of a color with lighten(float, float) and darken(float, float).
    @@ -748,7 +799,7 @@

    intensity

  • protan

    -
    public static float protan(float encoded)
    +
    public static float protan(float encoded)
    The "protan" of the given packed float in IPT format, which when combined with tritan describes the hue and saturation of a color; ranges from 0f to 1f . If protan is 0f, the color will be cooler, more green or blue; if protan is 1f, the color will be warmer, from magenta to orange. You can edit the protan of a color with @@ -764,7 +815,7 @@

    protan

  • tritan

    -
    public static float tritan(float encoded)
    +
    public static float tritan(float encoded)
    The "tritan" of the given packed float in IPT format, which when combined with protan describes the hue and saturation of a color; ranges from 0f to 1f . If tritan is 0f, the color will be more "artificial", more blue or purple; if tritan is 1f, the color will be more "natural", from green to yellow to orange. You can edit @@ -780,7 +831,7 @@

    tritan

  • toEditedFloat

    -
    public static float toEditedFloat(float basis, +
    public static float toEditedFloat(float basis, float hue, float saturation, float light, @@ -813,7 +864,7 @@

    toEditedFloat

  • lighten

    -
    public static float lighten(float start, +
    public static float lighten(float start, float change)
    Interpolates from the packed float color start towards white by change. While change should be between 0f (return start as-is) and 1f (return white), start should be a packed color, as from @@ -834,7 +885,7 @@

    lighten

  • darken

    -
    public static float darken(float start, +
    public static float darken(float start, float change)
    Interpolates from the packed float color start towards black by change. While change should be between 0f (return start as-is) and 1f (return black), start should be a packed color, as from @@ -855,7 +906,7 @@

    darken

  • protanUp

    -
    public static float protanUp(float start, +
    public static float protanUp(float start, float change)
    Interpolates from the packed float color start towards a warmer color (orange to magenta) by change. While change should be between 0f (return start as-is) and 1f (return fully warmed), start should be a packed color, as from @@ -877,7 +928,7 @@

    protanUp

  • protanDown

    -
    public static float protanDown(float start, +
    public static float protanDown(float start, float change)
    Interpolates from the packed float color start towards a cooler color (green to blue) by change. While change should be between 0f (return start as-is) and 1f (return fully cooled), start should be a packed color, as from @@ -899,7 +950,7 @@

    protanDown

  • tritanUp

    -
    public static float tritanUp(float start, +
    public static float tritanUp(float start, float change)
    Interpolates from the packed float color start towards a "natural" color (between green and orange) by change. While change should be between 0f (return start as-is) and 1f (return fully natural), start should be a packed color, as @@ -921,7 +972,7 @@

    tritanUp

  • tritanDown

    -
    public static float tritanDown(float start, +
    public static float tritanDown(float start, float change)
    Interpolates from the packed float color start towards an "artificial" color (between blue and purple) by change. While change should be between 0f (return start as-is) and 1f (return fully artificial), start should be a packed color, as @@ -943,7 +994,7 @@

    tritanDown

  • blot

    -
    public static float blot(float start, +
    public static float blot(float start, float change)
    Interpolates from the packed float color start towards that color made opaque by change. While change should be between 0f (return start as-is) and 1f (return start with full alpha), start should be a packed color, as from @@ -964,7 +1015,7 @@

    blot

  • fade

    -
    public static float fade(float start, +
    public static float fade(float start, float change)
    Interpolates from the packed float color start towards transparent by change. While change should be between 0 (return start as-is) and 1f (return the color with 0 alpha), start should be a packed color, as from @@ -985,7 +1036,7 @@

    fade

  • dullen

    -
    public static float dullen(float start, +
    public static float dullen(float start, float change)
    Brings the chromatic components of start closer to grayscale by change (desaturating them). While change should be between 0f (return start as-is) and 1f (return fully gray), start should be a packed color, as @@ -1005,7 +1056,7 @@

    dullen

  • enrich

    -
    public static float enrich(float start, +
    public static float enrich(float start, float change)
    Pushes the chromatic components of start away from grayscale by change (saturating them). While change should be between 0f (return start as-is) and 1f (return maximally saturated), start should be a packed color, as @@ -1027,7 +1078,7 @@

    enrich

  • inverseLightness

    -
    public static float inverseLightness(float mainColor, +
    public static float inverseLightness(float mainColor, float contrastingColor)
    Given a packed float IPT color mainColor and another IPT color that it should be made to contrast with, gets a packed float IPT color with roughly inverted intnsity but the same chromatic channels and opacity (P and T @@ -1051,7 +1102,7 @@

    inverseLightness

  • differentiateLightness

    -
    public static float differentiateLightness(float mainColor, +
    public static float differentiateLightness(float mainColor, float contrastingColor)
    Given a packed float IPT_HQ color mainColor and another IPT_HQ color that it should be made to contrast with, gets a packed float IPT_HQ color with I that should be quite different from contrastingColor's I, @@ -1074,7 +1125,7 @@

    differentiateLightness

  • offsetLightness

    -
    public static float offsetLightness(float mainColor)
    +
    public static float offsetLightness(float mainColor)
    Pretty simple; adds 0.5 to the given color's I and wraps it around if it would go above 1.0, then averages that with the original I. This means light colors become darker, and dark colors become lighter, with almost all results in the middle-range of possible lightness.
    @@ -1089,7 +1140,7 @@

    offsetLightness

  • lessenChange

    -
    public static float lessenChange(float color, +
    public static float lessenChange(float color, float fraction)
    Makes the additive IPT color stored in color cause less of a change when used as a tint, as if it were mixed with neutral gray. When fraction is 1.0, this returns color unchanged; when fraction is 0.0, it @@ -1107,7 +1158,7 @@

    lessenChange

  • randomEdit

    -
    public static float randomEdit(float color, +
    public static float randomEdit(float color, long seed, float variance)
    Makes a quasi-randomly-edited variant on the given color, allowing typically a small amount of @@ -1131,7 +1182,7 @@

    randomEdit

  • inGamut

    -
    public static boolean inGamut(float packed)
    +
    public static boolean inGamut(float packed)
    Returns true if the given packed float color, as IPT, is valid to convert losslessly back to RGBA.
    Parameters:
    @@ -1144,7 +1195,7 @@

    inGamut

  • inGamut

    -
    public static boolean inGamut(float i, +
    public static boolean inGamut(float i, float p, float t)
    Returns true if the given IPT values are valid to convert losslessly back to RGBA.
    @@ -1161,14 +1212,15 @@

    inGamut

  • limitToGamut

    -
    public static float limitToGamut(float packed)
    -
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it - isn't in-gamut, or returns it as soon as it is in-gamut.
    +
    public static float limitToGamut(float packed)
    +
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to grayscale if it + isn't in-gamut, or returns it as soon as it is in-gamut. Maintains the intensity of the color, only bringing + protan and tritan closer to grayscale.
    Parameters:
    packed - a packed float color in IPT format; often this color is not in-gamut
    Returns:
    -
    the first color this finds that is between the given IPT color and 50% gray, and is in-gamut
    +
    the first color this finds that is between the given IPT color and grayscale, and is in-gamut
    See Also:
    You can use inGamut() if you just want to check whether a color is in-gamut.
    @@ -1177,18 +1229,19 @@

    limitToGamut

  • limitToGamut

    -
    public static float limitToGamut(float i, +
    public static float limitToGamut(float i, float p, float t)
    -
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it - isn't in-gamut, or returns it as soon as it is in-gamut. This always produces an opaque color.
    +
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to grayscale if it + isn't in-gamut, or returns it as soon as it is in-gamut. Maintains the intensity of the color, only bringing + protan and tritan closer to grayscale. This always produces an opaque color.
    Parameters:
    i - intensity component; will be clamped between 0 and 1 if it isn't already
    p - protan component; will be clamped between 0 and 1 if it isn't already
    t - tritan component; will be clamped between 0 and 1 if it isn't already
    Returns:
    -
    the first color this finds that is between the given IPT color and 50% gray, and is in-gamut
    +
    the first color this finds that is between the given IPT color and grayscale, and is in-gamut
    See Also:
    You can use inGamut() if you just want to check whether a color is in-gamut.
    @@ -1197,11 +1250,11 @@

    limitToGamut

  • limitToGamut

    -
    public static float limitToGamut(float i, +
    public static float limitToGamut(float i, float p, float t, float a)
    -
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it +
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to grayscale if it isn't in-gamut, or returns it as soon as it is in-gamut.
    Parameters:
    @@ -1210,16 +1263,78 @@

    limitToGamut

    t - tritan component; will be clamped between 0 and 1 if it isn't already
    a - alpha component; will be clamped between 0 and 1 if it isn't already
    Returns:
    -
    the first color this finds that is between the given IPT color and 50% gray, and is in-gamut
    +
    the first color this finds that is between the given IPT color and grayscale, and is in-gamut
    See Also:
    You can use inGamut() if you just want to check whether a color is in-gamut.
  • +
    +

    editIPT

    +
    public static float editIPT(float encoded, + float addI, + float addP, + float addT, + float addAlpha)
    +
    Given a packed float IPT_HQ color, this edits its intensity, protan, tritan, and alpha channels by adding the + corresponding "add" parameter and then clamping. This returns a different float value (of course, the given float + can't be edited in-place). You can give a value of 0 for any "add" parameter you want to stay unchanged. This + clamps the resulting color to remain in-gamut, so it should be safe to convert it back to RGBA.
    +
    +
    Parameters:
    +
    encoded - a packed float IPT_HQ color
    +
    addI - how much to add to the intensity channel; typically in the -1 to 1 range
    +
    addP - how much to add to the protan channel; typically in the -2 to 2 range
    +
    addT - how much to add to the tritan channel; typically in the -2 to 2 range
    +
    addAlpha - how much to add to the alpha channel; typically in the -1 to 1 range
    +
    Returns:
    +
    a packed float IPT_HQ color with the requested edits applied to encoded
    +
    +
    +
  • +
  • +
    +

    editIPT

    +
    public static float editIPT(float encoded, + float addI, + float addP, + float addT, + float addAlpha, + float mulI, + float mulP, + float mulT, + float mulAlpha)
    +
    Given a packed float IPT_HQ color, this edits its intensity, protan, tritan, and alpha channels by first + multiplying each channel by the corresponding "mul" parameter and then adding the corresponding "add" parameter, + before clamping. This means the intensity value is multiplied by mulI, then has addI added, and + then is clamped to the normal range for intensity (0 to 1). This returns a different float value (of course, the + given float can't be edited in-place). You can give a value of 0 for any "add" parameter you want to stay + unchanged, or a value of 1 for any "mul" parameter that shouldn't change. Note that this manipulates protan and + tritan in the -1 to 1 range, so if you multiply by a small number like 0.25f, then this will produce a + less-saturated color, and if you multiply by a larger number like 4f, then you will get a much + more-saturated color. This clamps the resulting color to remain in-gamut, so it should be safe to convert it back + to RGBA.
    +
    +
    Parameters:
    +
    encoded - a packed float IPT_HQ color
    +
    addI - how much to add to the intensity channel; typically in the -1 to 1 range
    +
    addP - how much to add to the protan channel; typically in the -2 to 2 range
    +
    addT - how much to add to the tritan channel; typically in the -2 to 2 range
    +
    addAlpha - how much to add to the alpha channel; typically in the -1 to 1 range
    +
    mulI - how much to multiply the intensity channel by; should be non-negative
    +
    mulP - how much to multiply the protan channel by; usually non-negative (not always)
    +
    mulT - how much to multiply the tritan channel by; usually non-negative (not always)
    +
    mulAlpha - how much to multiply the alpha channel by; should be non-negative
    +
    Returns:
    +
    a packed float IPT_HQ color with the requested edits applied to encoded
    +
    +
    +
  • +
  • randomColor

    -
    public static float randomColor(Random random)
    +
    public static float randomColor(Random random)
    Produces a random packed float color that is always in-gamut and should be uniformly distributed.
    Parameters:
    diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/ColorfulBatch.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/ColorfulBatch.html index 5140dd51..40afb361 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/ColorfulBatch.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/ColorfulBatch.html @@ -3,7 +3,7 @@ -ColorfulBatch (colorful 0.5.2-SNAPSHOT API) +ColorfulBatch (colorful 0.6.0 API) @@ -74,7 +74,7 @@

    Class ColorfulBatch

  • -
    java.lang.Object +
    java.lang.Object
    com.github.tommyettinger.colorful.ipt_hq.ColorfulBatch
    @@ -84,7 +84,7 @@

    Class ColorfulBatch


  • public class ColorfulBatch -extends Object +extends Object implements com.badlogic.gdx.graphics.g2d.Batch
    A substitute for SpriteBatch that adds an additional attribute to store an extra color's worth of channels, used to modify the intensity and chromatic channels of a color by multiplication @@ -166,7 +166,7 @@

    Field Summary

    protected float
     
    -
    static String
    +
    static String
     
    static float
    @@ -549,8 +549,8 @@

    Method Summary

  • -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • @@ -575,7 +575,7 @@

    SPRITE_SIZE

  • TWEAK_ATTRIBUTE

    -
    public static final String TWEAK_ATTRIBUTE
    +
    public static final String TWEAK_ATTRIBUTE
    See Also:
    Constant Field Values
    diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/ColorfulSprite.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/ColorfulSprite.html index ef39bcb6..5b3363c0 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/ColorfulSprite.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/ColorfulSprite.html @@ -3,7 +3,7 @@ -ColorfulSprite (colorful 0.5.2-SNAPSHOT API) +ColorfulSprite (colorful 0.6.0 API) @@ -74,7 +74,7 @@

    Class ColorfulSprite

  • -
    java.lang.Object +
    java.lang.Object
    com.badlogic.gdx.graphics.g2d.TextureRegion
    com.github.tommyettinger.colorful.ipt_hq.ColorfulSprite
    @@ -448,8 +448,8 @@

    Method Summary

    Methods inherited from class com.badlogic.gdx.graphics.g2d.TextureRegion

    getRegionHeight, getRegionWidth, getRegionX, getRegionY, getTexture, getU, getU2, getV, getV2, isFlipX, isFlipY, setRegion, setRegion, setRegion, setRegion, setRegionHeight, setRegionWidth, setRegionX, setRegionY, setTexture, split, split
    -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/Palette.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/Palette.html index 91b1d319..de3ea882 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/Palette.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/Palette.html @@ -3,7 +3,7 @@ -Palette (colorful 0.5.2-SNAPSHOT API) +Palette (colorful 0.6.0 API) @@ -74,13 +74,13 @@

    Class Palette

  • -
    java.lang.Object +
    java.lang.Object
    com.github.tommyettinger.colorful.ipt_hq.Palette

    public class Palette -extends Object
    +extends Object
    A palette of predefined colors as packed IPT floats, the kind ColorTools works with. You can access colors by their constant name, such as OCEAN_BLUE, by the NAMED map using NAMED.get("Ocean Blue", 0f), or by index in the FloatArray called LIST. Note that to access a float @@ -841,21 +841,21 @@

    Field Summary

    This color constant "Mush" has RGBA8888 code B1B10AFF, intensity 0.627451, protan 0.45882353, tritan 0.7372549, alpha 1.0, hue 0.16808262, and saturation 0.6667582.
    -
    static com.badlogic.gdx.utils.ObjectFloatMap<String>
    +
    static com.badlogic.gdx.utils.ObjectFloatMap<String>
     
    -
    static com.badlogic.gdx.utils.Array<String>
    +
    static com.badlogic.gdx.utils.Array<String>
    All names for colors in this palette, in alphabetical order.
    -
    static com.badlogic.gdx.utils.Array<String>
    +
    static com.badlogic.gdx.utils.Array<String>
    All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to blue.
    -
    static com.badlogic.gdx.utils.Array<String>
    +
    static com.badlogic.gdx.utils.Array<String>
    All names for colors in this palette, sorted by lightness from black to white.
    @@ -1448,8 +1448,8 @@

    Method Summary

    -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • @@ -1464,7 +1464,7 @@

    Field Details

  • NAMED

    -
    public static final com.badlogic.gdx.utils.ObjectFloatMap<String> NAMED
    +
    public static final com.badlogic.gdx.utils.ObjectFloatMap<String> NAMED
  • @@ -5828,7 +5828,7 @@

    RASPBERRY

  • NAMES

    -
    public static final com.badlogic.gdx.utils.Array<String> NAMES
    +
    public static final com.badlogic.gdx.utils.Array<String> NAMES
    All names for colors in this palette, in alphabetical order. You can fetch the corresponding packed float color by looking up a name in NAMED.
    @@ -5836,7 +5836,7 @@

    NAMES

  • NAMES_BY_HUE

    -
    public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_HUE
    +
    public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_HUE
    All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to blue. You can fetch the corresponding packed float color by looking up a name in NAMED.
    @@ -5844,7 +5844,7 @@

    NAMES_BY_HUE

  • NAMES_BY_LIGHTNESS

    -
    public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_LIGHTNESS
    +
    public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_LIGHTNESS
    All names for colors in this palette, sorted by lightness from black to white. You can fetch the corresponding packed float color by looking up a name in NAMED.
    diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/SimplePalette.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/SimplePalette.html index db1fd5aa..3b1abdd2 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/SimplePalette.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/SimplePalette.html @@ -3,7 +3,7 @@ -SimplePalette (colorful 0.5.2-SNAPSHOT API) +SimplePalette (colorful 0.6.0 API) @@ -74,13 +74,13 @@

    Class SimplePalette

  • -
    java.lang.Object +
    java.lang.Object
    com.github.tommyettinger.colorful.ipt_hq.SimplePalette

    public class SimplePalette -extends Object
    +extends Object
    A palette of predefined colors as packed IPT_HQ floats, the kind ColorTools works with, plus a way to describe colors by combinations and adjustments. The description code is probably what you would use this class for; it revolves around parseDescription(String), which takes a color description String and returns a packed @@ -113,7 +113,7 @@

    Field Summary

    Modifier and Type
    Field
    Description
    -
    static com.badlogic.gdx.utils.ObjectFloatMap<String>
    +
    static com.badlogic.gdx.utils.ObjectFloatMap<String>
    Stores alternative names for colors in NAMED, like "grey" as an alias for GRAY or "gold" as an @@ -262,23 +262,23 @@

    Field Summary

    This color constant "moss" has RGBA8888 code 204608FF, intensity 0.25882354, protan 0.4392157, tritan 0.5882353, alpha 1.0, hue 0.27203476, and saturation 0.241091.
    -
    static com.badlogic.gdx.utils.ObjectFloatMap<String>
    +
    static com.badlogic.gdx.utils.ObjectFloatMap<String>
    You can look up colors by name here; the names are lower-case, and the colors are packed floats in rgba format.
    -
    static com.badlogic.gdx.utils.Array<String>
    +
    static com.badlogic.gdx.utils.Array<String>
    All names for colors in this palette, in alphabetical order.
    -
    static com.badlogic.gdx.utils.Array<String>
    +
    static com.badlogic.gdx.utils.Array<String>
    All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to blue.
    -
    static com.badlogic.gdx.utils.Array<String>
    +
    static com.badlogic.gdx.utils.Array<String>
    All names for colors in this palette, sorted by lightness from black to white.
    @@ -431,7 +431,7 @@

    Method Summary

    Appends IPT_HQ-compatible Color instances to the map in Colors, using the names in NAMES (which are "lower cased" instead of "ALL UPPER CASE").
    -
    static String
    +
    static String
    bestMatch​(float ipt_hq, int mixCount)
    @@ -445,7 +445,7 @@

    Method Summary

    ColorfulBatch or a Batch using Shaders.fragmentShaderIPT_HQ.
    static float
    -
    parseDescription​(String description)
    +
    parseDescription​(String description)
    Parses a color description and returns the approximate color it describes, as a packed float color.
    @@ -453,8 +453,8 @@

    Method Summary

    -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • @@ -469,14 +469,14 @@

    Field Details

  • NAMED

    -
    public static final com.badlogic.gdx.utils.ObjectFloatMap<String> NAMED
    +
    public static final com.badlogic.gdx.utils.ObjectFloatMap<String> NAMED
    You can look up colors by name here; the names are lower-case, and the colors are packed floats in rgba format.
  • ALIASES

    -
    public static final com.badlogic.gdx.utils.ObjectFloatMap<String> ALIASES
    +
    public static final com.badlogic.gdx.utils.ObjectFloatMap<String> ALIASES
    Stores alternative names for colors in NAMED, like "grey" as an alias for GRAY or "gold" as an alias for SAFFRON. Currently, the list of aliases is as follows:
      @@ -1354,7 +1354,7 @@

      RASPBERRY

    • NAMES

      -
      public static final com.badlogic.gdx.utils.Array<String> NAMES
      +
      public static final com.badlogic.gdx.utils.Array<String> NAMES
      All names for colors in this palette, in alphabetical order. You can fetch the corresponding packed float color by looking up a name in NAMED.
      @@ -1362,7 +1362,7 @@

      NAMES

    • NAMES_BY_HUE

      -
      public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_HUE
      +
      public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_HUE
      All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to blue. You can fetch the corresponding packed float color by looking up a name in NAMED.
      @@ -1376,7 +1376,7 @@

      COLORS_BY_HUE

    • NAMES_BY_LIGHTNESS

      -
      public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_LIGHTNESS
      +
      public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_LIGHTNESS
      All names for colors in this palette, sorted by lightness from black to white. You can fetch the corresponding packed float color by looking up a name in NAMED.
      @@ -1406,7 +1406,7 @@

      Method Details

    • parseDescription

      -
      public static float parseDescription(String description)
      +
      public static float parseDescription(String description)
      Parses a color description and returns the approximate color it describes, as a packed float color. Color descriptions consist of one or more lower-case words, separated by non-alphabetical characters (typically spaces and/or hyphens). Any word that is the name of a color in this SimplePalette will be looked up in @@ -1433,7 +1433,7 @@

      parseDescription

    • bestMatch

      -
      public static String bestMatch(float ipt_hq, +
      public static String bestMatch(float ipt_hq, int mixCount)
      Given a color as a packed IPT_HQ float, this finds the closest description it can to match the given color while using at most mixCount colors to mix in. You should only use small numbers for mixCount, like 1 to 3; diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/ColorTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/ColorTools.html index bab60dfe..a4eec166 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/ColorTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/ColorTools.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.ipt_hq.ColorTools (colorful 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.ipt_hq.ColorTools (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/ColorfulBatch.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/ColorfulBatch.html index 3e4f08db..567390fd 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/ColorfulBatch.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/ColorfulBatch.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.ipt_hq.ColorfulBatch (colorful 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.ipt_hq.ColorfulBatch (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/ColorfulSprite.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/ColorfulSprite.html index 7d8383a3..f467a832 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/ColorfulSprite.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/ColorfulSprite.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.ipt_hq.ColorfulSprite (colorful 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.ipt_hq.ColorfulSprite (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/Palette.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/Palette.html index fccb7307..679894a3 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/Palette.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/Palette.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.ipt_hq.Palette (colorful 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.ipt_hq.Palette (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/SimplePalette.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/SimplePalette.html index e5ae5890..0c31ae2f 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/SimplePalette.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/SimplePalette.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.ipt_hq.SimplePalette (colorful 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.ipt_hq.SimplePalette (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/package-summary.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/package-summary.html index 15d04574..3c1813bc 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/package-summary.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/package-summary.html @@ -3,7 +3,7 @@ -com.github.tommyettinger.colorful.ipt_hq (colorful 0.5.2-SNAPSHOT API) +com.github.tommyettinger.colorful.ipt_hq (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/package-tree.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/package-tree.html index ad415666..f60efa06 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/package-tree.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/package-tree.html @@ -3,7 +3,7 @@ -com.github.tommyettinger.colorful.ipt_hq Class Hierarchy (colorful 0.5.2-SNAPSHOT API) +com.github.tommyettinger.colorful.ipt_hq Class Hierarchy (colorful 0.6.0 API) @@ -60,7 +60,7 @@

      Hierarchy For Package com.github.tommyettinger.colorful.ipt_hq

      Class Hierarchy

        -
      • java.lang.Object +
      • java.lang.Object
        • com.github.tommyettinger.colorful.ipt_hq.ColorfulBatch (implements com.badlogic.gdx.graphics.g2d.Batch)
        • com.github.tommyettinger.colorful.ipt_hq.ColorTools
        • diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/package-use.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/package-use.html index 95d4f4da..76da2b18 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/package-use.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/package-use.html @@ -3,7 +3,7 @@ -Uses of Package com.github.tommyettinger.colorful.ipt_hq (colorful 0.5.2-SNAPSHOT API) +Uses of Package com.github.tommyettinger.colorful.ipt_hq (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/ColorTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/ColorTools.html index e821c6d3..30731d99 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/ColorTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/ColorTools.html @@ -3,7 +3,7 @@ -ColorTools (colorful 0.5.2-SNAPSHOT API) +ColorTools (colorful 0.6.0 API) @@ -74,13 +74,13 @@

          Class ColorTools

      -
      java.lang.Object +
      java.lang.Object
      com.github.tommyettinger.colorful.oklab.ColorTools

      -
      public class ColorTools -extends Object
      +
      public class ColorTools +extends Object
      Contains code for manipulating colors as int and packed float values in the Oklab color space. Oklab is a very new color space that builds on the same foundation as IPT, but seems to be better-calibrated for uniform lightness and colorfulness, instead of just the emphasis on uniform hue that IPT has. Relative to IPT, Oklab @@ -171,196 +171,260 @@

      Method Summary

      Gets the "chroma" or "colorfulness" of a given Oklab color.
      static float
      -
      darken​(float start, - float change)
      +
      chromaLimit​(float hue, + float lightness)
      -
      Interpolates from the packed float color start towards black by change.
      +
      Given a hue and lightness, this gets the (approximate) maximum chroma possible for that hue-lightness + combination.
      static float
      -
      differentiateLightness​(float mainColor, - float contrastingColor)
      +
      darken​(float start, + float change)
      +
      Interpolates from the packed float color start towards black by change.
      +
      +
      static float
      +
      differentiateLightness​(float mainColor, + float contrastingColor)
      +
      Given a packed float Oklab color mainColor and another Oklab color that it should be made to contrast with, gets a packed float Oklab color with L that should be quite different from contrastingColor's L, but the same chromatic channels and opacity (A and B are likely to be clamped if the result gets close to white or black).
      -
      static float
      -
      dullen​(float start, +
      static float
      +
      dullen​(float start, float change)
      -
      +
      Brings the chromatic components of start closer to grayscale by change (desaturating them).
      +
      static float
      +
      editOklab​(float encoded, + float addL, + float addA, + float addB, + float addAlpha)
      +
      +
      Given a packed float Oklab color, this edits its L, A, B, and alpha channels by adding the corresponding "add" + parameter and then clamping.
      +
      static float
      -
      enrich​(float start, - float change)
      +
      editOklab​(float encoded, + float addL, + float addA, + float addB, + float addAlpha, + float mulL, + float mulA, + float mulB, + float mulAlpha)
      -
      Pushes the chromatic components of start away from grayscale by change (saturating them).
      +
      Given a packed float Oklab color, this edits its L, A, B, and alpha channels by first multiplying each channel by + the corresponding "mul" parameter and then adding the corresponding "add" parameter, before clamping.
      static float
      -
      fade​(float start, +
      enrich​(float start, float change)
      -
      Interpolates from the packed float color start towards transparent by change.
      +
      Pushes the chromatic components of start away from grayscale by change (saturating them).
      static float
      -
      floatGetHSL​(float hue, - float saturation, - float lightness, - float opacity)
      +
      fade​(float start, + float change)
      -
      Gets a color as an Oklab packed float given floats representing hue, saturation, lightness, and opacity.
      +
      Interpolates from the packed float color start towards transparent by change.
      static float
      -
      fromColor​(com.badlogic.gdx.graphics.Color color)
      +
      floatGetHSL​(float hue, + float saturation, + float lightness, + float opacity)
      -
      Takes a libGDX Color that uses RGBA8888 channels and converts to a packed float in the Oklab format this uses.
      +
      Gets a color as an Oklab packed float given floats representing hue, saturation, lightness, and opacity.
      static float
      -
      fromRGBA​(float packed)
      +
      fromColor​(com.badlogic.gdx.graphics.Color color)
      -
      Takes a color encoded as an RGBA8888 packed float and converts to a packed float in the Oklab format this uses.
      +
      Takes a libGDX Color that uses RGBA8888 channels and converts to a packed float in the Oklab format this uses.
      static float
      -
      fromRGBA​(float r, +
      fromRGBA​(float packed)
      +
      +
      Takes a color encoded as an RGBA8888 packed float and converts to a packed float in the Oklab format this uses.
      +
      +
      static float
      +
      fromRGBA​(float r, float g, float b, float a)
      -
      +
      Takes RGBA components from 0.0 to 1.0 each and converts to a packed float in the Oklab format this uses.
      -
      static float
      -
      fromRGBA8888​(int rgba)
      -
      +
      static float
      +
      fromRGBA8888​(int rgba)
      +
      Takes a color encoded as an RGBA8888 int and converts to a packed float in the Oklab format this uses.
      -
      static byte
      -
      getRawGamutValue​(int index)
      -
      +
      static byte
      +
      getRawGamutValue​(int index)
      +
      Given a 1D int index between 0 and 65535 (both inclusive), this treats the 1D index as two parts (lightness and hue angle, both from 0 to 255) and gets the distance from grayscale to the edge of the gamut at that lightness and hue.
      -
      static float
      -
      green​(float encoded)
      -
      +
      static float
      +
      green​(float encoded)
      +
      Gets the green channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
      -
      static int
      -
      greenInt​(float encoded)
      -
      +
      static int
      +
      greenInt​(float encoded)
      +
      Gets the green channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
      -
      static float
      -
      hue​(float encoded)
      -
      +
      static float
      +
      hue​(float encoded)
      +
      Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased) to 1f (exclusive, red and approaching purple if decreased).
      -
      static boolean
      -
      inGamut​(float packed)
      -
      +
      static boolean
      +
      inGamut​(float packed)
      +
      Returns true if the given packed float color, as Oklab, is valid to convert losslessly back to RGBA.
      -
      static boolean
      -
      inGamut​(float L, +
      static boolean
      +
      inGamut​(float L, float A, float B)
      -
      +
      Returns true if the given Oklab values are valid to convert losslessly back to RGBA.
      -
      static float
      -
      inverseLightness​(float mainColor, +
      static float
      +
      inverseLightness​(float mainColor, float contrastingColor)
      -
      +
      Given a packed float Oklab color mainColor and another Oklab color that it should be made to contrast with, gets a packed float Oklab color with roughly inverted L but the same chromatic channels and opacity (A and B are likely to be clamped if the result gets close to white or black).
      -
      static float
      -
      lessenChange​(float color, +
      static float
      +
      lessenChange​(float color, float fraction)
      -
      +
      Makes the additive Oklab color stored in color cause less of a change when used as a tint, as if it were mixed with neutral gray.
      -
      static float
      -
      lighten​(float start, - float change)
      -
      -
      Interpolates from the packed float color start towards white by change.
      -
      static float
      -
      lightness​(float encoded)
      +
      lighten​(float start, + float change)
      -
      Defined as per HSL; normally you only need channelL(float) to get accurate lightness for Oklab.
      +
      Interpolates from the packed float color start towards white by change.
      static float
      -
      limitToGamut​(float packed)
      +
      lightness​(float encoded)
      -
      Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside - the gamut at the same lightness, or if it is already in-gamut, returns the color as-is.
      +
      Defined as per HSL; normally you only need channelL(float) to get accurate lightness for Oklab.
      static float
      -
      limitToGamut​(float L, - float A, - float B)
      +
      limitToGamut​(float packed)
      Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside the gamut at the same lightness, or if it is already in-gamut, returns the color as-is.
      static float
      -
      limitToGamut​(float L, +
      limitToGamut​(float L, float A, - float B, - float alpha)
      + float B)
      Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside the gamut at the same lightness, or if it is already in-gamut, returns the color as-is.
      static float
      -
      lowerA​(float start, - float change)
      +
      limitToGamut​(float L, + float A, + float B, + float alpha)
      -
      Interpolates from the packed float color start towards a cooler color (green to blue) by change.
      +
      Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside + the gamut at the same lightness, or if it is already in-gamut, returns the color as-is.
      static float
      -
      lowerB​(float start, +
      lowerA​(float start, float change)
      -
      Interpolates from the packed float color start towards an "artificial" color (between blue and purple) by change.
      +
      Interpolates from the packed float color start towards a cooler color (green to blue) by change.
      static float
      -
      maximizeSaturation​(float packed)
      +
      lowerB​(float start, + float change)
      +
      Interpolates from the packed float color start towards an "artificial" color (between blue and purple) by change.
      +
      +
      static float
      +
      maximizeSaturation​(float packed)
      +
      Gets the color with the same L as the Oklab color stored in the given packed float, but the furthest A B from gray possible for that lightness while keeping the same hue as the given color.
      -
      static float
      -
      maximizeSaturation​(float L, +
      static float
      +
      maximizeSaturation​(float L, float A, float B, float alpha)
      -
      +
      Gets the color with the same L as the Oklab color stored in the given packed float, but the furthest A B from gray possible for that lightness while keeping the same hue as the given color.
      -
      static float
      -
      offsetLightness​(float mainColor)
      -
      +
      static float
      +
      offsetLightness​(float mainColor)
      +
      Pretty simple; adds 0.5 to the given color's L and wraps it around if it would go above 1.0, then averages that with the original L.
      -
      static float
      -
      oklab​(float l, +
      static float
      +
      oklab​(float l, float a, float b, float alpha)
      -
      +
      Gets a packed float representation of a color given as 4 float components, here, L (luminance or lightness), A (a chromatic component ranging from greenish to reddish, called protan in IPT), B (a chromatic component ranging from bluish to yellowish, called tritan in IPT), and alpha (or opacity).
      +
      static float
      +
      oklabByHCL​(float hue, + float chroma, + float lightness, + float alpha)
      +
      +
      A different way to specify an Oklab color, using hue, chroma, lightness, and alpha something like a normal HSL(A) + color but calculating them directly in the Oklab color space.
      +
      +
      static float
      +
      oklabByHSL​(float hue, + float saturation, + float lightness, + float alpha)
      +
      +
      A different way to specify an Oklab color, using hue, saturation, lightness, and alpha like a normal HSL(A) color + but calculating them directly in the Oklab color space.
      +
      +
      static float
      +
      oklabHue​(float packed)
      +
      +
      Gets the hue of the given Oklab float color, but as Oklab understands hue rather than how HSL does.
      +
      +
      static float
      +
      oklabLightness​(float packed)
      +
      +
      Gets the lightness of the given Oklab float color, but as Oklab understands lightness rather than how HSL does.
      +
      +
      static float
      +
      oklabSaturation​(float packed)
      +
      +
      Gets the saturation of the given Oklab float color, but as Oklab understands saturation rather than how HSL does.
      +
      static float
      raiseA​(float start, float change)
      @@ -374,7 +438,7 @@

      Method Summary

      Interpolates from the packed float color start towards a "natural" color (between green and orange) by change.
      static float
      -
      randomColor​(Random random)
      +
      randomColor​(Random random)
      Produces a random packed float color that is always in-gamut (and opaque) and should be uniformly distributed.
      @@ -419,23 +483,30 @@

      Method Summary

      Gets a variation on the packed float color basis as another packed float that has its hue, saturation, lightness, and opacity adjusted by the specified amounts.
      -
      static float
      -
      toRGBA​(float packed)
      +
      static com.badlogic.gdx.graphics.Color
      +
      toOklabColor​(com.badlogic.gdx.graphics.Color editing, + float oklab)
      +
      Writes an Oklab-format packed float color (the format produced by oklab(float, float, float, float)) + into an Oklab-format Color called editing.
      +
      +
      static float
      +
      toRGBA​(float packed)
      +
      Converts a packed float color in the format produced by oklab(float, float, float, float) to a packed float in RGBA format.
      -
      static int
      -
      toRGBA8888​(float packed)
      -
      +
      static int
      +
      toRGBA8888​(float packed)
      +
      Converts a packed float color in the format produced by oklab(float, float, float, float) to an RGBA8888 int.
      -

      Methods inherited from class java.lang.Object

      -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      +

      Methods inherited from class java.lang.Object

      +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    @@ -450,7 +521,7 @@

    Constructor Details

  • ColorTools

    -
    public ColorTools()
    +
    public ColorTools()
  • @@ -464,7 +535,7 @@

    Method Details

  • oklab

    -
    public static float oklab(float l, +
    public static float oklab(float l, float a, float b, float alpha)
    @@ -502,7 +573,7 @@

    oklab

  • toRGBA8888

    -
    public static int toRGBA8888(float packed)
    +
    public static int toRGBA8888(float packed)
    Converts a packed float color in the format produced by oklab(float, float, float, float) to an RGBA8888 int. This format of int can be used with Pixmap and in some other places in libGDX.
    @@ -516,7 +587,7 @@

    toRGBA8888

  • toRGBA

    -
    public static float toRGBA(float packed)
    +
    public static float toRGBA(float packed)
    Converts a packed float color in the format produced by oklab(float, float, float, float) to a packed float in RGBA format. This format of float can be used with the standard SpriteBatch and in some other places in libGDX.
    @@ -531,7 +602,7 @@

    toRGBA

  • toColor

    -
    public static com.badlogic.gdx.graphics.Color toColor(com.badlogic.gdx.graphics.Color editing, +
    public static com.badlogic.gdx.graphics.Color toColor(com.badlogic.gdx.graphics.Color editing, float packed)
    Writes an Oklab-format packed float color (the format produced by oklab(float, float, float, float)) into an RGBA8888 Color as used by libGDX (called editing).
    @@ -545,9 +616,28 @@

    toColor

  • +
    +

    toOklabColor

    +
    public static com.badlogic.gdx.graphics.Color toOklabColor(com.badlogic.gdx.graphics.Color editing, + float oklab)
    +
    Writes an Oklab-format packed float color (the format produced by oklab(float, float, float, float)) + into an Oklab-format Color called editing. This is mostly useful if the rest of your application expects + colors in Oklab format, such as because you use Shaders.fragmentShaderOklab or ColorfulBatch. +
    + Internally, this simply calls Color.abgr8888ToColor(Color, float) and returns the edited Color.
    +
    +
    Parameters:
    +
    editing - a libGDX Color that will be filled in-place with the color oklab, unchanged from its color space
    +
    oklab - a packed float color, as produced by oklab(float, float, float, float)
    +
    Returns:
    +
    an RGBA8888 int color
    +
    +
    +
  • +
  • fromRGBA8888

    -
    public static float fromRGBA8888(int rgba)
    +
    public static float fromRGBA8888(int rgba)
    Takes a color encoded as an RGBA8888 int and converts to a packed float in the Oklab format this uses.
    Parameters:
    @@ -560,7 +650,7 @@

    fromRGBA8888

  • fromRGBA

    -
    public static float fromRGBA(float packed)
    +
    public static float fromRGBA(float packed)
    Takes a color encoded as an RGBA8888 packed float and converts to a packed float in the Oklab format this uses.
    Parameters:
    @@ -573,7 +663,7 @@

    fromRGBA

  • fromColor

    -
    public static float fromColor(com.badlogic.gdx.graphics.Color color)
    +
    public static float fromColor(com.badlogic.gdx.graphics.Color color)
    Takes a libGDX Color that uses RGBA8888 channels and converts to a packed float in the Oklab format this uses.
    Parameters:
    @@ -586,7 +676,7 @@

    fromColor

  • fromRGBA

    -
    public static float fromRGBA(float r, +
    public static float fromRGBA(float r, float g, float b, float a)
    @@ -605,7 +695,7 @@

    fromRGBA

  • redInt

    -
    public static int redInt(float encoded)
    +
    public static int redInt(float encoded)
    Gets the red channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    Parameters:
    @@ -618,7 +708,7 @@

    redInt

  • greenInt

    -
    public static int greenInt(float encoded)
    +
    public static int greenInt(float encoded)
    Gets the green channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    Parameters:
    @@ -631,7 +721,7 @@

    greenInt

  • blueInt

    -
    public static int blueInt(float encoded)
    +
    public static int blueInt(float encoded)
    Gets the blue channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    Parameters:
    @@ -644,7 +734,7 @@

    blueInt

  • alphaInt

    -
    public static int alphaInt(float encoded)
    +
    public static int alphaInt(float encoded)
    Gets the alpha channel value of the given encoded color, as an even int ranging from 0 to 254, inclusive. Because of how alpha is stored in libGDX, no odd-number values are possible for alpha.
    @@ -658,7 +748,7 @@

    alphaInt

  • red

    -
    public static float red(float encoded)
    +
    public static float red(float encoded)
    Gets the red channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -671,7 +761,7 @@

    red

  • green

    -
    public static float green(float encoded)
    +
    public static float green(float encoded)
    Gets the green channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -684,7 +774,7 @@

    green

  • blue

    -
    public static float blue(float encoded)
    +
    public static float blue(float encoded)
    Gets the blue channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -697,7 +787,7 @@

    blue

  • alpha

    -
    public static float alpha(float encoded)
    +
    public static float alpha(float encoded)
    Gets the alpha channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -710,27 +800,44 @@

    alpha

  • chroma

    -
    public static float chroma(float encoded)
    +
    public static float chroma(float encoded)
    Gets the "chroma" or "colorfulness" of a given Oklab color. Chroma is similar to saturation in that grayscale values have 0 saturation and 0 chroma, while brighter colors have high saturation and chroma. The difference is - that colors that are perceptually more-colorful have higher chroma that colors that are perceptually - less-colorful, regardless of hue, whereas saturation changes its range depending on how colorful a value can be - at its hue. That is, the most saturated color always has a saturation of 1, but if that color isn't perceptually - very colorful, it could have a chroma that is somewhat lower than 1. I don't yet know the range of this function, - other than it can't be negative, grayscale values have 0 chroma, and the most colorful values should be near 1, - maybe as high as the square root of 2.
    + that colors that are perceptually more-colorful have higher chroma than colors that are perceptually + less-colorful, regardless of hue, whereas saturation changes its meaning depending on the hue and lightness. That + is, the most saturated color for a given hue and lightness always has a saturation of 1, but if that color + isn't perceptually very colorful (as is the case for very dark and very light colors), it will have a chroma that + is much lower than the maximum. The result of this method can't be negative, grayscale values have very close to + 0 chroma, and the most colorful values (all very close to magenta) should have 0.31613f chroma.
  • Parameters:
    encoded - a color as a packed float that can be obtained by oklab(float, float, float, float)
    Returns:
    -
    a non-negative float that represents how colorful the given value is
    +
    a float between 0.0f and 0.31613f that represents how colorful the given value is
    +
    +
    +
  • +
  • +
    +

    chromaLimit

    +
    public static float chromaLimit(float hue, + float lightness)
    +
    Given a hue and lightness, this gets the (approximate) maximum chroma possible for that hue-lightness + combination. This is useful to know the bounds of chroma(float). This should be no greater + than 0.31613f .
    +
    +
    Parameters:
    +
    hue - the hue, typically between 0.0f and 1.0f, to look up
    +
    lightness - the lightness, clamped between 0.0f and 1.0f, to look up
    +
    Returns:
    +
    the maximum possible chroma for the given hue and lightness, between 0.0f and 0.31613f
  • floatGetHSL

    -
    public static float floatGetHSL(float hue, +
    public static float floatGetHSL(float hue, float saturation, float lightness, float opacity)
    @@ -741,7 +848,15 @@

    floatGetHSL

    a saturation of 1 is brightly colored, and values close to 1 will usually appear more distinct than values close to 0, especially if the hue is different. A lightness of 0.001f or less is always black (also using a shortcut if this is the case, respecting opacity), while a lightness of 1f is white. Very bright colors are mostly in a band - of high-saturation where lightness is 0.5f.
    + of high-saturation where lightness is 0.5f. +
    + This method considers its hue, saturation, and lightness parameters as the HSL color space does. You may instead + want the method oklabByHSL(float, float, float, float), which treats lightness exactly as Oklab does, + and handles hue and saturation with the Oklab color solid (which is shaped oddly) instead of the HSL color solid + (which is a bicone, with a wide cone pointing up attached at the base to another wide cone pointing down). + Using oklabByHSL() should be faster in many cases, and the lightness handling alone may be a reason to use it. + There is also oklabByHCL(float, float, float, float), which may be preferable if you want a specific + amount of chroma (colorful-ness) and no greater.
  • Parameters:
    hue - 0f to 1f, color wheel position
    @@ -756,9 +871,11 @@

    floatGetHSL

  • saturation

    -
    public static float saturation(float encoded)
    +
    public static float saturation(float encoded)
    Gets the saturation of the given encoded color as HSL would calculate it, as a float ranging from 0.0f to 1.0f, - inclusive. This is different from chroma(float); see that method's documentation for details.
    + inclusive. This is different from chroma(float); see that method's documentation for details. It is also + different from oklabSaturation(float), which gets the saturation as Oklab understands it rather than how + HSL understands it.
  • Parameters:
    encoded - a color as a packed float that can be obtained by oklab(float, float, float, float)
    @@ -770,9 +887,10 @@

    saturation

  • lightness

    -
    public static float lightness(float encoded)
    -
    Defined as per HSL; normally you only need channelL(float) to get accurate lightness for Oklab. - This ranges from 0.0f (black) to 1.0f (white).
    +
    public static float lightness(float encoded)
    +
    Defined as per HSL; normally you only need channelL(float) to get accurate lightness for Oklab. You can + also use oklabLightness(float), which is an alias for channelL(). This ranges from 0.0f (black) to 1.0f + (white).
    Parameters:
    encoded - a packed float Oklab color
    @@ -784,9 +902,11 @@

    lightness

  • hue

    -
    public static float hue(float encoded)
    +
    public static float hue(float encoded)
    Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased) - to 1f (exclusive, red and approaching purple if decreased).
    + to 1f (exclusive, red and approaching purple if decreased). You can also use oklabHue(float), which + positions the different hues at different values, somewhat, from this, but is more accurate to how Oklab handles + hues.
  • Parameters:
    encoded - a color as a packed float that can be obtained by oklab(float, float, float, float)
    @@ -799,7 +919,7 @@

    hue

  • channelL

    -
    public static float channelL(float encoded)
    +
    public static float channelL(float encoded)
    The "L" channel of the given packed float in Oklab format, which is its lightness; ranges from 0.0f to 1.0f . You can edit the L of a color with lighten(float, float) and darken(float, float).
    @@ -813,7 +933,7 @@

    channelL

  • channelA

    -
    public static float channelA(float encoded)
    +
    public static float channelA(float encoded)
    The "A" channel of the given packed float in Oklab format, which when combined with the B channel describes the hue and saturation of a color; ranges from 0f to 1f . If A is 0f, the color will be cooler, more green or blue; if A is 1f, the color will be warmer, from magenta to orange. You can edit the A of a color with @@ -829,7 +949,7 @@

    channelA

  • channelB

    -
    public static float channelB(float encoded)
    +
    public static float channelB(float encoded)
    The "B" channel of the given packed float in Oklab format, which when combined with the A channel describes the hue and saturation of a color; ranges from 0f to 1f . If B is 0f, the color will be more "artificial", more blue or purple; if B is 1f, the color will be more "natural", from green to yellow to orange. You can edit @@ -845,7 +965,7 @@

    channelB

  • toEditedFloat

    -
    public static float toEditedFloat(float basis, +
    public static float toEditedFloat(float basis, float hue, float saturation, float light, @@ -862,7 +982,10 @@

    toEditedFloat

    can't go above 1 or below 0, with an exception for hue, which can rotate around if lower or higher hues would be used. As an example, if you give this 0.4f for saturation, and the current color has saturation 0.7f, then the resulting color will have 1f for saturation. If you gave this -0.1f for saturation and the current color again - has saturation 0.7f, then resulting color will have 0.6f for saturation.
    + has saturation 0.7f, then resulting color will have 0.6f for saturation. +
    + You may want editOklab(float, float, float, float, float, float, float, float, float) instead, which + adjusts the L, A, B, and alpha channels directly instead of converting to HSL and back.
    Parameters:
    basis - a packed float color that will be used as the starting point to make the next color
    @@ -878,7 +1001,7 @@

    toEditedFloat

  • lighten

    -
    public static float lighten(float start, +
    public static float lighten(float start, float change)
    Interpolates from the packed float color start towards white by change. While change should be between 0f (return start as-is) and 1f (return white), start should be a packed color, as from @@ -899,7 +1022,7 @@

    lighten

  • darken

    -
    public static float darken(float start, +
    public static float darken(float start, float change)
    Interpolates from the packed float color start towards black by change. While change should be between 0f (return start as-is) and 1f (return black), start should be a packed color, as from @@ -920,7 +1043,7 @@

    darken

  • raiseA

    -
    public static float raiseA(float start, +
    public static float raiseA(float start, float change)
    Interpolates from the packed float color start towards a warmer color (orange to magenta) by change. While change should be between 0f (return start as-is) and 1f (return fully warmed), start should be a packed color, as from @@ -942,7 +1065,7 @@

    raiseA

  • lowerA

    -
    public static float lowerA(float start, +
    public static float lowerA(float start, float change)
    Interpolates from the packed float color start towards a cooler color (green to blue) by change. While change should be between 0f (return start as-is) and 1f (return fully cooled), start should be a packed color, as from @@ -964,7 +1087,7 @@

    lowerA

  • raiseB

    -
    public static float raiseB(float start, +
    public static float raiseB(float start, float change)
    Interpolates from the packed float color start towards a "natural" color (between green and orange) by change. While change should be between 0f (return start as-is) and 1f (return fully natural), start should be a packed color, as @@ -986,7 +1109,7 @@

    raiseB

  • lowerB

    -
    public static float lowerB(float start, +
    public static float lowerB(float start, float change)
    Interpolates from the packed float color start towards an "artificial" color (between blue and purple) by change. While change should be between 0f (return start as-is) and 1f (return fully artificial), start should be a packed color, as @@ -1008,7 +1131,7 @@

    lowerB

  • blot

    -
    public static float blot(float start, +
    public static float blot(float start, float change)
    Interpolates from the packed float color start towards that color made opaque by change. While change should be between 0f (return start as-is) and 1f (return start with full alpha), start should be a packed color, as from @@ -1029,7 +1152,7 @@

    blot

  • fade

    -
    public static float fade(float start, +
    public static float fade(float start, float change)
    Interpolates from the packed float color start towards transparent by change. While change should be between 0 (return start as-is) and 1f (return the color with 0 alpha), start should be a packed color, as from @@ -1050,7 +1173,7 @@

    fade

  • dullen

    -
    public static float dullen(float start, +
    public static float dullen(float start, float change)
    Brings the chromatic components of start closer to grayscale by change (desaturating them). While change should be between 0f (return start as-is) and 1f (return fully gray), start should be a packed color, as @@ -1070,7 +1193,7 @@

    dullen

  • enrich

    -
    public static float enrich(float start, +
    public static float enrich(float start, float change)
    Pushes the chromatic components of start away from grayscale by change (saturating them). While change should be between 0f (return start as-is) and 1f (return maximally saturated), start should be a packed color, as @@ -1091,7 +1214,7 @@

    enrich

  • inverseLightness

    -
    public static float inverseLightness(float mainColor, +
    public static float inverseLightness(float mainColor, float contrastingColor)
    Given a packed float Oklab color mainColor and another Oklab color that it should be made to contrast with, gets a packed float Oklab color with roughly inverted L but the same chromatic channels and opacity (A and B @@ -1117,7 +1240,7 @@

    inverseLightness

  • differentiateLightness

    -
    public static float differentiateLightness(float mainColor, +
    public static float differentiateLightness(float mainColor, float contrastingColor)
    Given a packed float Oklab color mainColor and another Oklab color that it should be made to contrast with, gets a packed float Oklab color with L that should be quite different from contrastingColor's L, @@ -1140,7 +1263,7 @@

    differentiateLightness

  • offsetLightness

    -
    public static float offsetLightness(float mainColor)
    +
    public static float offsetLightness(float mainColor)
    Pretty simple; adds 0.5 to the given color's L and wraps it around if it would go above 1.0, then averages that with the original L. This means light colors become darker, and dark colors become lighter, with almost all results in the middle-range of possible lightness.
    @@ -1155,7 +1278,7 @@

    offsetLightness

  • lessenChange

    -
    public static float lessenChange(float color, +
    public static float lessenChange(float color, float fraction)
    Makes the additive Oklab color stored in color cause less of a change when used as a tint, as if it were mixed with neutral gray. When fraction is 1.0, this returns color unchanged; when fraction is 0.0, it @@ -1173,7 +1296,7 @@

    lessenChange

  • randomEdit

    -
    public static float randomEdit(float color, +
    public static float randomEdit(float color, long seed, float variance)
    Makes a quasi-randomly-edited variant on the given color, allowing typically a small amount of @@ -1197,7 +1320,7 @@

    randomEdit

  • getRawGamutValue

    -
    public static byte getRawGamutValue(int index)
    +
    public static byte getRawGamutValue(int index)
    Given a 1D int index between 0 and 65535 (both inclusive), this treats the 1D index as two parts (lightness and hue angle, both from 0 to 255) and gets the distance from grayscale to the edge of the gamut at that lightness and hue. The index can be constructed from a lightness value L from 0 to 255, and a hue value H @@ -1230,7 +1353,7 @@

    getRawGamutValue

  • inGamut

    -
    public static boolean inGamut(float packed)
    +
    public static boolean inGamut(float packed)
    Returns true if the given packed float color, as Oklab, is valid to convert losslessly back to RGBA.
    Parameters:
    @@ -1243,7 +1366,7 @@

    inGamut

  • inGamut

    -
    public static boolean inGamut(float L, +
    public static boolean inGamut(float L, float A, float B)
    Returns true if the given Oklab values are valid to convert losslessly back to RGBA.
    @@ -1260,7 +1383,7 @@

    inGamut

  • maximizeSaturation

    -
    public static float maximizeSaturation(float packed)
    +
    public static float maximizeSaturation(float packed)
    Gets the color with the same L as the Oklab color stored in the given packed float, but the furthest A B from gray possible for that lightness while keeping the same hue as the given color. This is very similar to calling enrich(float, float) with a very large change value.
    @@ -1277,7 +1400,7 @@

    maximizeSaturation

  • maximizeSaturation

    -
    public static float maximizeSaturation(float L, +
    public static float maximizeSaturation(float L, float A, float B, float alpha)
    @@ -1293,14 +1416,126 @@

    maximizeSaturation

    Returns:
    the color that is as far from grayscale as this can get while keeping the L and hue of packed
    See Also:
    -
    You can use limitToGamut() if you only want max saturation for out-of-gamut colors.
    +
    You can use limitToGamut() if you only want max saturation + for out-of-gamut colors.
    +
  • +
    +
  • +
  • +
    +

    oklabHue

    +
    public static float oklabHue(float packed)
    +
    Gets the hue of the given Oklab float color, but as Oklab understands hue rather than how HSL does. + This is different from hue(float), which uses HSL. This gives a float between 0 (inclusive) + and 1 (exclusive).
    +
    +
    Parameters:
    +
    packed - a packed Oklab float color
    +
    Returns:
    +
    a float between 0 (inclusive) and 1 (exclusive) that represents hue in the Oklab color space
    +
    +
    +
  • +
  • +
    +

    oklabSaturation

    +
    public static float oklabSaturation(float packed)
    +
    Gets the saturation of the given Oklab float color, but as Oklab understands saturation rather than how HSL does. + Saturation here is a fraction of the chroma limit (see chromaLimit(float, float)) for a given hue and + lightness, and is between 0 and 1. This gives a float between 0 (inclusive) and 1 (inclusive).
    +
    +
    Parameters:
    +
    packed - a packed Oklab float color
    +
    Returns:
    +
    a float between 0 (inclusive) and 1 (inclusive) that represents saturation in the Oklab color space
    +
    +
    +
  • +
  • +
    +

    oklabLightness

    +
    public static float oklabLightness(float packed)
    +
    Gets the lightness of the given Oklab float color, but as Oklab understands lightness rather than how HSL does. + This is different from lightness(float), which uses HSL. This gives a float between 0 (inclusive) + and 1 (inclusive). +
    + This is the same as channelL(float).
    +
    +
    Parameters:
    +
    packed - a packed Oklab float color
    +
    Returns:
    +
    a float between 0 (inclusive) and 1 (inclusive) that represents lightness in the Oklab color space
    +
    +
    +
  • +
  • +
    +

    oklabByHSL

    +
    public static float oklabByHSL(float hue, + float saturation, + float lightness, + float alpha)
    +
    A different way to specify an Oklab color, using hue, saturation, lightness, and alpha like a normal HSL(A) color + but calculating them directly in the Oklab color space. This is more efficient than + floatGetHSL(float, float, float, float), but for colors with less than 0.5f lightness, it can be very + unpredictable in how it handles saturation. Most colors between 0.5 and 0.75 hue that also have less than 0.5 + lightness are extremely desaturated and close to gray, regardless of what you give for saturation, and these + colors suddenly jump to very saturated around 0.75 hue and higher. To avoid this issue, you may prefer using + oklabByHCL(float, float, float, float), which takes an absolute chroma as opposed to the saturation here + (which is a fraction of the maximum chroma). +
    + Note that this takes a different value for its hue that the method hue(float) produces, just + like its saturation and the method saturation(float), and lightness and the method + lightness(float). The hue is just distributed differently, and the lightness should be equivalent to + channelL(float), but the saturation here refers to what fraction the chroma should be of the maximum + chroma for the given hue and lightness. You can use oklabHue(float), oklabSaturation(float), + and oklabLightness(float) to get the hue, saturation, and lightness values from an existing color that + this will understand (alpha(float) too).
    +
    +
    Parameters:
    +
    hue - between 0 and 1, usually, but this will automatically wrap if too high or too low
    +
    saturation - will be clamped between 0 and 1
    +
    lightness - will be clamped between 0 and 1
    +
    alpha - will be clamped between 0 and 1
    +
    Returns:
    +
    a packed Oklab float color that tries to match the requested hue, saturation, and lightness
    +
    +
    +
  • +
  • +
    +

    oklabByHCL

    +
    public static float oklabByHCL(float hue, + float chroma, + float lightness, + float alpha)
    +
    A different way to specify an Oklab color, using hue, chroma, lightness, and alpha something like a normal HSL(A) + color but calculating them directly in the Oklab color space. This has you specify the desired chroma directly, + as obtainable with chroma(float), rather than the saturation, which is a fraction of the maximum chroma + (saturation is what oklabByHSL(float, float, float, float) uses). Note that this takes a different value + for its hue that the method hue(float) produces, just like lightness and the method + lightness(float). The hue is just distributed differently, and the lightness should be equivalent to + channelL(float). If you use this to get two colors with the same chroma and lightness, but different + hue, then the resulting colors should have similar colorfulness unless one or both chroma values exceeded the + gamut limit (you can get this limit with chromaLimit(float, float)). If a chroma value given is greater + than the chroma limit, this clamps chroma to that limit. You can use oklabHue(float), + chroma(float), and oklabLightness(float) to get the hue, chroma, and lightness values from an + existing color that this will understand (alpha(float) too).
    +
    +
    Parameters:
    +
    hue - between 0 and 1, usually, but this will automatically wrap if too high or too low
    +
    chroma - will be clamped between 0 and the maximum chroma possible for the given hue and lightness
    +
    lightness - will be clamped between 0 and 1
    +
    alpha - will be clamped between 0 and 1
    +
    Returns:
    +
    a packed Oklab float color that tries to match the requested hue, chroma, and lightness
  • limitToGamut

    -
    public static float limitToGamut(float packed)
    +
    public static float limitToGamut(float packed)
    Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside the gamut at the same lightness, or if it is already in-gamut, returns the color as-is.
    @@ -1316,7 +1551,7 @@

    limitToGamut

  • limitToGamut

    -
    public static float limitToGamut(float L, +
    public static float limitToGamut(float L, float A, float B)
    Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside @@ -1337,7 +1572,7 @@

    limitToGamut

  • limitToGamut

    -
    public static float limitToGamut(float L, +
    public static float limitToGamut(float L, float A, float B, float alpha)
    @@ -1357,9 +1592,70 @@

    limitToGamut

  • +
    +

    editOklab

    +
    public static float editOklab(float encoded, + float addL, + float addA, + float addB, + float addAlpha)
    +
    Given a packed float Oklab color, this edits its L, A, B, and alpha channels by adding the corresponding "add" + parameter and then clamping. This returns a different float value (of course, the given float can't be edited + in-place). You can give a value of 0 for any "add" parameter you want to stay unchanged. This clamps the + resulting color to remain in-gamut, so it should be safe to convert it back to RGBA.
    +
    +
    Parameters:
    +
    encoded - a packed float Oklab color
    +
    addL - how much to add to the L channel; typically in the -1 to 1 range
    +
    addA - how much to add to the A channel; typically in the -1 to 1 range
    +
    addB - how much to add to the B channel; typically in the -1 to 1 range
    +
    addAlpha - how much to add to the alpha channel; typically in the -1 to 1 range
    +
    Returns:
    +
    a packed float Oklab color with the requested edits applied to encoded
    +
    +
    +
  • +
  • +
    +

    editOklab

    +
    public static float editOklab(float encoded, + float addL, + float addA, + float addB, + float addAlpha, + float mulL, + float mulA, + float mulB, + float mulAlpha)
    +
    Given a packed float Oklab color, this edits its L, A, B, and alpha channels by first multiplying each channel by + the corresponding "mul" parameter and then adding the corresponding "add" parameter, before clamping. This means + the lightness value L is multiplied by mulL, then has addL added, and then is clamped to + the normal range for L (0 to 1). This returns a different float value (of course, the given float can't be edited + in-place). You can give a value of 0 for any "add" parameter you want to stay unchanged, or a value of 1 for any + "mul" parameter that shouldn't change. Note that this manipulates A and B in the -0.5 to 0.5 range, so if you + multiply by a small number like 0.25f, then this will produce a less-saturated color, and if you multiply + by a larger number like 4f, then you will get a much more-saturated color. This clamps the resulting + color to remain in-gamut, so it should be safe to convert it back to RGBA.
    +
    +
    Parameters:
    +
    encoded - a packed float Oklab color
    +
    addL - how much to add to the L channel; typically in the -1 to 1 range
    +
    addA - how much to add to the A channel; typically in the -1 to 1 range
    +
    addB - how much to add to the B channel; typically in the -1 to 1 range
    +
    addAlpha - how much to add to the alpha channel; typically in the -1 to 1 range
    +
    mulL - how much to multiply the L channel by; should be non-negative
    +
    mulA - how much to multiply the A channel by; usually non-negative (not always)
    +
    mulB - how much to multiply the B channel by; usually non-negative (not always)
    +
    mulAlpha - how much to multiply the alpha channel by; should be non-negative
    +
    Returns:
    +
    a packed float Oklab color with the requested edits applied to encoded
    +
    +
    +
  • +
  • randomColor

    -
    public static float randomColor(Random random)
    +
    public static float randomColor(Random random)
    Produces a random packed float color that is always in-gamut (and opaque) and should be uniformly distributed.
    Parameters:
    diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/ColorfulBatch.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/ColorfulBatch.html index 7fb2c01e..c2cf3689 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/ColorfulBatch.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/ColorfulBatch.html @@ -3,7 +3,7 @@ -ColorfulBatch (colorful 0.5.2-SNAPSHOT API) +ColorfulBatch (colorful 0.6.0 API) @@ -74,7 +74,7 @@

    Class ColorfulBatch

  • -
    java.lang.Object +
    java.lang.Object
    com.github.tommyettinger.colorful.oklab.ColorfulBatch
    @@ -84,7 +84,7 @@

    Class ColorfulBatch


  • public class ColorfulBatch -extends Object +extends Object implements com.badlogic.gdx.graphics.g2d.Batch
    A substitute for SpriteBatch that adds an additional attribute to store an extra color's worth of channels, used to modify the L, A, and B channels of a color by multiplication (called the @@ -163,7 +163,7 @@

    Field Summary

    protected float
     
    -
    static String
    +
    static String
     
    static float
    @@ -546,8 +546,8 @@

    Method Summary

  • -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • @@ -572,7 +572,7 @@

    SPRITE_SIZE

  • TWEAK_ATTRIBUTE

    -
    public static final String TWEAK_ATTRIBUTE
    +
    public static final String TWEAK_ATTRIBUTE
    See Also:
    Constant Field Values
    diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/ColorfulSprite.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/ColorfulSprite.html index 17b0458c..d29d39be 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/ColorfulSprite.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/ColorfulSprite.html @@ -3,7 +3,7 @@ -ColorfulSprite (colorful 0.5.2-SNAPSHOT API) +ColorfulSprite (colorful 0.6.0 API) @@ -74,7 +74,7 @@

    Class ColorfulSprite

  • -
    java.lang.Object +
    java.lang.Object
    com.badlogic.gdx.graphics.g2d.TextureRegion
    com.github.tommyettinger.colorful.oklab.ColorfulSprite
    @@ -448,8 +448,8 @@

    Method Summary

    Methods inherited from class com.badlogic.gdx.graphics.g2d.TextureRegion

    getRegionHeight, getRegionWidth, getRegionX, getRegionY, getTexture, getU, getU2, getV, getV2, isFlipX, isFlipY, setRegion, setRegion, setRegion, setRegion, setRegionHeight, setRegionWidth, setRegionX, setRegionY, setTexture, split, split
    -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/Palette.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/Palette.html index d755a69e..980a50ba 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/Palette.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/Palette.html @@ -3,7 +3,7 @@ -Palette (colorful 0.5.2-SNAPSHOT API) +Palette (colorful 0.6.0 API) @@ -74,13 +74,13 @@

    Class Palette

  • -
    java.lang.Object +
    java.lang.Object
    com.github.tommyettinger.colorful.oklab.Palette

    public class Palette -extends Object
    +extends Object
    A palette of predefined colors as packed IPT floats, the kind ColorTools works with. You can access colors by their constant name, such as OCEAN_BLUE, by the NAMED map using NAMED.get("Ocean Blue", 0f), or by index in the FloatArray called LIST. Note that to access a float @@ -841,20 +841,20 @@

    Field Summary

    This color constant "Mush" has RGBA8888 code B1B10AFF, L 0.7607843, A 0.47058824, B 0.5764706, alpha 1.0, hue 0.17038202, and saturation 0.62059957.
    -
    static com.badlogic.gdx.utils.ObjectFloatMap<String>
    +
    static com.badlogic.gdx.utils.ObjectFloatMap<String>
     
    -
    static com.badlogic.gdx.utils.Array<String>
    +
    static com.badlogic.gdx.utils.Array<String>
    All names for colors in this palette, in alphabetical order.
    -
    static com.badlogic.gdx.utils.Array<String>
    +
    static com.badlogic.gdx.utils.Array<String>
    All names for colors in this palette, sorted by hue from red to yellow to green to blue.
    -
    static com.badlogic.gdx.utils.Array<String>
    +
    static com.badlogic.gdx.utils.Array<String>
    All names for colors in this palette, sorted by lightness from black to white.
    @@ -1447,8 +1447,8 @@

    Method Summary

    -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • @@ -1463,7 +1463,7 @@

    Field Details

  • NAMED

    -
    public static final com.badlogic.gdx.utils.ObjectFloatMap<String> NAMED
    +
    public static final com.badlogic.gdx.utils.ObjectFloatMap<String> NAMED
  • @@ -5827,7 +5827,7 @@

    RASPBERRY

  • NAMES

    -
    public static final com.badlogic.gdx.utils.Array<String> NAMES
    +
    public static final com.badlogic.gdx.utils.Array<String> NAMES
    All names for colors in this palette, in alphabetical order. You can fetch the corresponding packed float color by looking up a name in NAMED.
    @@ -5835,7 +5835,7 @@

    NAMES

  • NAMES_BY_HUE

    -
    public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_HUE
    +
    public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_HUE
    All names for colors in this palette, sorted by hue from red to yellow to green to blue. You can fetch the corresponding packed float color by looking up a name in NAMED.
    @@ -5843,7 +5843,7 @@

    NAMES_BY_HUE

  • NAMES_BY_LIGHTNESS

    -
    public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_LIGHTNESS
    +
    public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_LIGHTNESS
    All names for colors in this palette, sorted by lightness from black to white. You can fetch the corresponding packed float color by looking up a name in NAMED.
    diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/SimplePalette.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/SimplePalette.html index 23ad293d..87b5b5be 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/SimplePalette.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/SimplePalette.html @@ -3,7 +3,7 @@ -SimplePalette (colorful 0.5.2-SNAPSHOT API) +SimplePalette (colorful 0.6.0 API) @@ -74,13 +74,13 @@

    Class SimplePalette

  • -
    java.lang.Object +
    java.lang.Object
    com.github.tommyettinger.colorful.oklab.SimplePalette

    public class SimplePalette -extends Object
    +extends Object
    A palette of predefined colors as packed RGB floats, the kind ColorTools works with, plus a way to describe colors by combinations and adjustments. The description code is probably what you would use this class for; it revolves around parseDescription(String), which takes a color description String and returns a packed float @@ -113,7 +113,7 @@

    Field Summary

    Modifier and Type
    Field
    Description
    -
    static com.badlogic.gdx.utils.ObjectFloatMap<String>
    +
    static com.badlogic.gdx.utils.ObjectFloatMap<String>
    Stores alternative names for colors in NAMED, like "grey" as an alias for GRAY or "gold" as an @@ -262,23 +262,23 @@

    Field Summary

    This color constant "moss" has RGBA8888 code 204608FF, L 0.3764706, A 0.45882353, B 0.5372549, alpha 1.0, hue 0.28017563, and saturation 0.23527473.
    -
    static com.badlogic.gdx.utils.ObjectFloatMap<String>
    +
    static com.badlogic.gdx.utils.ObjectFloatMap<String>
    You can look up colors by name here; the names are lower-case, and the colors are packed floats in rgba format.
    -
    static com.badlogic.gdx.utils.Array<String>
    +
    static com.badlogic.gdx.utils.Array<String>
    All names for colors in this palette, in alphabetical order.
    -
    static com.badlogic.gdx.utils.Array<String>
    +
    static com.badlogic.gdx.utils.Array<String>
    All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to blue.
    -
    static com.badlogic.gdx.utils.Array<String>
    +
    static com.badlogic.gdx.utils.Array<String>
    All names for colors in this palette, sorted by lightness from black to white.
    @@ -431,7 +431,7 @@

    Method Summary

    Appends Oklab-compatible Color instances to the map in Colors, using the names in NAMES (which are "lower cased" instead of "ALL UPPER CASE").
    -
    static String
    +
    static String
    bestMatch​(float oklab, int mixCount)
    @@ -445,7 +445,7 @@

    Method Summary

    ColorfulBatch or a Batch using Shaders.fragmentShaderOklab.
    static float
    -
    parseDescription​(String description)
    +
    parseDescription​(String description)
    Parses a color description and returns the approximate color it describes, as a packed float color.
    @@ -453,8 +453,8 @@

    Method Summary

    -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • @@ -469,14 +469,14 @@

    Field Details

  • NAMED

    -
    public static final com.badlogic.gdx.utils.ObjectFloatMap<String> NAMED
    +
    public static final com.badlogic.gdx.utils.ObjectFloatMap<String> NAMED
    You can look up colors by name here; the names are lower-case, and the colors are packed floats in rgba format.
  • ALIASES

    -
    public static final com.badlogic.gdx.utils.ObjectFloatMap<String> ALIASES
    +
    public static final com.badlogic.gdx.utils.ObjectFloatMap<String> ALIASES
    Stores alternative names for colors in NAMED, like "grey" as an alias for GRAY or "gold" as an alias for SAFFRON. Currently, the list of aliases is as follows:
      @@ -1354,7 +1354,7 @@

      RASPBERRY

    • NAMES

      -
      public static final com.badlogic.gdx.utils.Array<String> NAMES
      +
      public static final com.badlogic.gdx.utils.Array<String> NAMES
      All names for colors in this palette, in alphabetical order. You can fetch the corresponding packed float color by looking up a name in NAMED.
      @@ -1362,7 +1362,7 @@

      NAMES

    • NAMES_BY_HUE

      -
      public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_HUE
      +
      public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_HUE
      All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to blue. You can fetch the corresponding packed float color by looking up a name in NAMED.
      @@ -1376,7 +1376,7 @@

      COLORS_BY_HUE

    • NAMES_BY_LIGHTNESS

      -
      public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_LIGHTNESS
      +
      public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_LIGHTNESS
      All names for colors in this palette, sorted by lightness from black to white. You can fetch the corresponding packed float color by looking up a name in NAMED.
      @@ -1406,7 +1406,7 @@

      Method Details

    • parseDescription

      -
      public static float parseDescription(String description)
      +
      public static float parseDescription(String description)
      Parses a color description and returns the approximate color it describes, as a packed float color. Color descriptions consist of one or more lower-case words, separated by non-alphabetical characters (typically spaces and/or hyphens). Any word that is the name of a color in this SimplePalette will be looked up in @@ -1433,7 +1433,7 @@

      parseDescription

    • bestMatch

      -
      public static String bestMatch(float oklab, +
      public static String bestMatch(float oklab, int mixCount)
      Given a color as a packed Oklab float, this finds the closest description it can to match the given color while using at most mixCount colors to mix in. You should only use small numbers for mixCount, like 1 to 3; diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/class-use/ColorTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/class-use/ColorTools.html index 693e06e7..6e917a15 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/class-use/ColorTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/class-use/ColorTools.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.oklab.ColorTools (colorful 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.oklab.ColorTools (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/class-use/ColorfulBatch.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/class-use/ColorfulBatch.html index be8c35fe..dfeafa7b 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/class-use/ColorfulBatch.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/class-use/ColorfulBatch.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.oklab.ColorfulBatch (colorful 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.oklab.ColorfulBatch (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/class-use/ColorfulSprite.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/class-use/ColorfulSprite.html index 5ae873cd..95eedd6f 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/class-use/ColorfulSprite.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/class-use/ColorfulSprite.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.oklab.ColorfulSprite (colorful 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.oklab.ColorfulSprite (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/class-use/Palette.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/class-use/Palette.html index 26a36d7f..3f0cbde0 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/class-use/Palette.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/class-use/Palette.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.oklab.Palette (colorful 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.oklab.Palette (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/class-use/SimplePalette.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/class-use/SimplePalette.html index 1042c0c3..8399295f 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/class-use/SimplePalette.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/class-use/SimplePalette.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.oklab.SimplePalette (colorful 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.oklab.SimplePalette (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/package-summary.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/package-summary.html index 2b8431ad..b92b90a1 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/package-summary.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/package-summary.html @@ -3,7 +3,7 @@ -com.github.tommyettinger.colorful.oklab (colorful 0.5.2-SNAPSHOT API) +com.github.tommyettinger.colorful.oklab (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/package-tree.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/package-tree.html index 2a2ede6e..f6d58cd0 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/package-tree.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/package-tree.html @@ -3,7 +3,7 @@ -com.github.tommyettinger.colorful.oklab Class Hierarchy (colorful 0.5.2-SNAPSHOT API) +com.github.tommyettinger.colorful.oklab Class Hierarchy (colorful 0.6.0 API) @@ -60,7 +60,7 @@

      Hierarchy For Package com.github.tommyettinger.colorful.oklab<

      Class Hierarchy

        -
      • java.lang.Object +
      • java.lang.Object
        • com.github.tommyettinger.colorful.oklab.ColorfulBatch (implements com.badlogic.gdx.graphics.g2d.Batch)
        • com.github.tommyettinger.colorful.oklab.ColorTools
        • diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/package-use.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/package-use.html index d4a90b46..e23e17b5 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/package-use.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/package-use.html @@ -3,7 +3,7 @@ -Uses of Package com.github.tommyettinger.colorful.oklab (colorful 0.5.2-SNAPSHOT API) +Uses of Package com.github.tommyettinger.colorful.oklab (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/package-summary.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/package-summary.html index 20414b00..8463ab8b 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/package-summary.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/package-summary.html @@ -3,7 +3,7 @@ -com.github.tommyettinger.colorful (colorful 0.5.2-SNAPSHOT API) +com.github.tommyettinger.colorful (colorful 0.6.0 API) @@ -68,7 +68,7 @@

          Package com.github.tommyettinger.colorful

      -
      Constants that contain the critical shader code to construct a ShaderProgram that can render the rest of this +
      Shader code to construct a ShaderProgram that can render the specialized colors produced by the rest of this library.
      diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/package-tree.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/package-tree.html index 5cd5fc99..0b991d87 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/package-tree.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/package-tree.html @@ -3,7 +3,7 @@ -com.github.tommyettinger.colorful Class Hierarchy (colorful 0.5.2-SNAPSHOT API) +com.github.tommyettinger.colorful Class Hierarchy (colorful 0.6.0 API) @@ -60,7 +60,7 @@

      Hierarchy For Package com.github.tommyettinger.colorful

      Class Hierarchy

        -
      • java.lang.Object +
      • java.lang.Object
        • com.github.tommyettinger.colorful.FloatColors
        • com.github.tommyettinger.colorful.Shaders
        • diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/package-use.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/package-use.html index ba146b14..ac070cbb 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/package-use.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/package-use.html @@ -3,7 +3,7 @@ -Uses of Package com.github.tommyettinger.colorful (colorful 0.5.2-SNAPSHOT API) +Uses of Package com.github.tommyettinger.colorful (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/ColorTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/ColorTools.html index de121be3..32db0522 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/ColorTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/ColorTools.html @@ -3,7 +3,7 @@ -ColorTools (colorful 0.5.2-SNAPSHOT API) +ColorTools (colorful 0.6.0 API) @@ -74,13 +74,13 @@

          Class ColorTools

      -
      java.lang.Object +
      java.lang.Object
      com.github.tommyettinger.colorful.rgb.ColorTools

      -
      public class ColorTools -extends Object
      +
      public class ColorTools +extends Object
      Contains code for manipulating colors as int, packed float, and Color values in the RGB color space. All of these colors have an alpha channel as well as red, green, and blue; the package name isn't "rgba" because "ycwcm" and "ipt" don't mention alpha either and they also have that channel. RGB is the standard mode @@ -155,6 +155,30 @@

      Method Summary

      contrastingColor's lightness, but the same chromatic channels and opacity.
      static float
      +
      editRGB​(float encoded, + float addR, + float addG, + float addB, + float addAlpha)
      +
      +
      Given a packed float RGB color, this edits its red, green, blue, and alpha channels by adding the corresponding + "add" parameter and then clamping.
      +
      +
      static float
      +
      editRGB​(float encoded, + float addR, + float addG, + float addB, + float addAlpha, + float mulR, + float mulG, + float mulB, + float mulAlpha)
      +
      +
      Given a packed float RGB color, this edits its red, green, blue, and alpha channels by first multiplying each + channel by the corresponding "mul" parameter and then adding the corresponding "add" parameter, before clamping.
      +
      +
      static float
      fade​(float start, float change)
      @@ -227,13 +251,49 @@

      Method Summary

      lightness​(float encoded)
       
      static float
      -
      offsetLightness​(float mainColor)
      +
      lowerB​(float start, + float change)
      +
      +
      Interpolates from the packed float color start to decrease its blue channel by change.
      +
      +
      static float
      +
      lowerG​(float start, + float change)
      +
      +
      Interpolates from the packed float color start to decrease its green channel by change.
      +
      +
      static float
      +
      lowerR​(float start, + float change)
      +
      Interpolates from the packed float color start to decrease its red channel by change.
      +
      +
      static float
      +
      offsetLightness​(float mainColor)
      +
      Pretty simple; adds 0.5 to the given color's lightness (calculated by converting it to Oklab internally) and wraps it around if it would go above 1.0, then averages that with the original lightness.
      +
      static float
      +
      raiseB​(float start, + float change)
      +
      +
      Interpolates from the packed float color start to increase its blue channel by change.
      +
      +
      static float
      +
      raiseG​(float start, + float change)
      +
      +
      Interpolates from the packed float color start to increase its green channel by change.
      +
      +
      static float
      +
      raiseR​(float start, + float change)
      +
      +
      Interpolates from the packed float color start to increase its red channel by change.
      +
      static float
      -
      randomColor​(Random random)
      +
      randomColor​(Random random)
      Produces a random packed float color that is always opaque and should be uniformly distributed.
      @@ -304,8 +364,8 @@

      Method Summary

      -

      Methods inherited from class java.lang.Object

      -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      +

      Methods inherited from class java.lang.Object

      +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    @@ -320,7 +380,7 @@

    Constructor Details

  • ColorTools

    -
    public ColorTools()
    +
    public ColorTools()
  • @@ -334,7 +394,7 @@

    Method Details

  • rgb

    -
    public static float rgb(float red, +
    public static float rgb(float red, float green, float blue, float alpha)
    @@ -362,7 +422,7 @@

    rgb

  • toColor

    -
    public static com.badlogic.gdx.graphics.Color toColor(com.badlogic.gdx.graphics.Color editing, +
    public static com.badlogic.gdx.graphics.Color toColor(com.badlogic.gdx.graphics.Color editing, float packed)
    Writes an RGB-format packed float color (the format produced by rgb(float, float, float, float)) into an RGBA8888 Color as used by libGDX (called editing).
    @@ -378,7 +438,7 @@

    toColor

  • toRGBA8888

    -
    public static int toRGBA8888(float packed)
    +
    public static int toRGBA8888(float packed)
    Converts a packed float color in the format produced by rgb(float, float, float, float) to an RGBA8888 int. This format of int can be used with Pixmap and in some other places in libGDX.
    @@ -392,7 +452,7 @@

    toRGBA8888

  • fromRGBA8888

    -
    public static float fromRGBA8888(int rgba)
    +
    public static float fromRGBA8888(int rgba)
    Takes a color encoded as an RGBA8888 int and converts to a packed float in the RGB format this uses.
    Parameters:
    @@ -405,7 +465,7 @@

    fromRGBA8888

  • fromColor

    -
    public static float fromColor(com.badlogic.gdx.graphics.Color color)
    +
    public static float fromColor(com.badlogic.gdx.graphics.Color color)
    Takes a libGDX Color that uses RGBA8888 channels and converts to a packed float in the RGB format this uses.
    Parameters:
    @@ -418,7 +478,7 @@

    fromColor

  • fromRGBA

    -
    public static float fromRGBA(float r, +
    public static float fromRGBA(float r, float g, float b, float a)
    @@ -437,7 +497,7 @@

    fromRGBA

  • redInt

    -
    public static int redInt(float encoded)
    +
    public static int redInt(float encoded)
    Gets the red channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    Parameters:
    @@ -450,7 +510,7 @@

    redInt

  • greenInt

    -
    public static int greenInt(float encoded)
    +
    public static int greenInt(float encoded)
    Gets the green channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    Parameters:
    @@ -463,7 +523,7 @@

    greenInt

  • blueInt

    -
    public static int blueInt(float encoded)
    +
    public static int blueInt(float encoded)
    Gets the blue channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    Parameters:
    @@ -476,7 +536,7 @@

    blueInt

  • alphaInt

    -
    public static int alphaInt(float encoded)
    +
    public static int alphaInt(float encoded)
    Gets the alpha channel value of the given encoded color, as an even int ranging from 0 to 254, inclusive. Because of how alpha is stored in libGDX, no odd-number values are possible for alpha.
    @@ -490,7 +550,7 @@

    alphaInt

  • red

    -
    public static float red(float encoded)
    +
    public static float red(float encoded)
    Gets the red channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -503,7 +563,7 @@

    red

  • green

    -
    public static float green(float encoded)
    +
    public static float green(float encoded)
    Gets the green channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -516,7 +576,7 @@

    green

  • blue

    -
    public static float blue(float encoded)
    +
    public static float blue(float encoded)
    Gets the blue channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -529,7 +589,7 @@

    blue

  • alpha

    -
    public static float alpha(float encoded)
    +
    public static float alpha(float encoded)
    Gets the alpha channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -542,7 +602,7 @@

    alpha

  • floatGetHSL

    -
    public static float floatGetHSL(float hue, +
    public static float floatGetHSL(float hue, float saturation, float lightness, float opacity)
    @@ -568,7 +628,7 @@

    floatGetHSL

  • saturation

    -
    public static float saturation(float encoded)
    +
    public static float saturation(float encoded)
    Gets the saturation of the given encoded color, as a float ranging from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -581,13 +641,13 @@

    saturation

  • lightness

    -
    public static float lightness(float encoded)
    +
    public static float lightness(float encoded)
  • hue

    -
    public static float hue(float encoded)
    +
    public static float hue(float encoded)
    Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased) to 1f (exclusive, red and approaching purple if decreased).
    @@ -602,7 +662,7 @@

    hue

  • toEditedFloat

    -
    public static float toEditedFloat(float basis, +
    public static float toEditedFloat(float basis, float hue, float saturation, float light, @@ -635,7 +695,7 @@

    toEditedFloat

  • lighten

    -
    public static float lighten(float start, +
    public static float lighten(float start, float change)
    Interpolates from the packed float color start towards white by change. While change should be between 0f (return start as-is) and 1f (return white), start should be a packed color, as from @@ -656,7 +716,7 @@

    lighten

  • darken

    -
    public static float darken(float start, +
    public static float darken(float start, float change)
    Interpolates from the packed float color start towards black by change. While change should be between 0f (return start as-is) and 1f (return black), start should be a packed color, as from @@ -675,9 +735,141 @@

    darken

  • +
    +

    raiseR

    +
    public static float raiseR(float start, + float change)
    +
    Interpolates from the packed float color start to increase its red channel by change. + While change must be between 0f (return start as-is) and 1f (return maximum red), start should be a packed + color, as from rgb(float, float, float, float). This is a good way to reduce allocations of temporary + Colors, and is a little more efficient and clear than using + FloatColors.lerpFloatColors(float, float, float) to lerp towards a more-red color. Unlike + FloatColors.lerpFloatColors(float, float, float), this keeps the other channels of start as-is.
    +
    +
    Parameters:
    +
    start - the starting color as a packed float
    +
    change - how much to change start to a more-red color, as a float between 0 and 1; higher means more red
    +
    Returns:
    +
    a packed float that represents a color between start and a more red color
    +
    See Also:
    +
    the counterpart method that makes a float color less red
    +
    +
    +
  • +
  • +
    +

    lowerR

    +
    public static float lowerR(float start, + float change)
    +
    Interpolates from the packed float color start to decrease its red channel by change. + While change must be between 0f (return start as-is) and 1f (return minimum red), start should be a packed + color, as from rgb(float, float, float, float). This is a good way to reduce allocations of temporary + Colors, and is a little more efficient and clear than using + FloatColors.lerpFloatColors(float, float, float) to lerp towards a less-red color. Unlike + FloatColors.lerpFloatColors(float, float, float), this keeps the other channels of start as-is.
    +
    +
    Parameters:
    +
    start - the starting color as a packed float
    +
    change - how much to change start to a less-red color, as a float between 0 and 1; higher means less red
    +
    Returns:
    +
    a packed float that represents a color between start and a less red color
    +
    See Also:
    +
    the counterpart method that makes a float color more red
    +
    +
    +
  • +
  • +
    +

    raiseG

    +
    public static float raiseG(float start, + float change)
    +
    Interpolates from the packed float color start to increase its green channel by change. + While change must be between 0f (return start as-is) and 1f (return maximum green), start should be a packed + color, as from rgb(float, float, float, float). This is a good way to reduce allocations of temporary + Colors, and is a little more efficient and clear than using + FloatColors.lerpFloatColors(float, float, float) to lerp towards a more-green color. Unlike + FloatColors.lerpFloatColors(float, float, float), this keeps the other channels of start as-is.
    +
    +
    Parameters:
    +
    start - the starting color as a packed float
    +
    change - how much to change start to a more-green color, as a float between 0 and 1; higher means more green
    +
    Returns:
    +
    a packed float that represents a color between start and a more green color
    +
    See Also:
    +
    the counterpart method that makes a float color less green
    +
    +
    +
  • +
  • +
    +

    lowerG

    +
    public static float lowerG(float start, + float change)
    +
    Interpolates from the packed float color start to decrease its green channel by change. + While change must be between 0f (return start as-is) and 1f (return minimum green), start should be a packed + color, as from rgb(float, float, float, float). This is a good way to reduce allocations of temporary + Colors, and is a little more efficient and clear than using + FloatColors.lerpFloatColors(float, float, float) to lerp towards a less-green color. Unlike + FloatColors.lerpFloatColors(float, float, float), this keeps the other channels of start as-is.
    +
    +
    Parameters:
    +
    start - the starting color as a packed float
    +
    change - how much to change start to a less-green color, as a float between 0 and 1; higher means less green
    +
    Returns:
    +
    a packed float that represents a color between start and a less green color
    +
    See Also:
    +
    the counterpart method that makes a float color more green
    +
    +
    +
  • +
  • +
    +

    raiseB

    +
    public static float raiseB(float start, + float change)
    +
    Interpolates from the packed float color start to increase its blue channel by change. + While change must be between 0f (return start as-is) and 1f (return maximum blue), start should be a packed + color, as from rgb(float, float, float, float). This is a good way to reduce allocations of temporary + Colors, and is a little more efficient and clear than using + FloatColors.lerpFloatColors(float, float, float) to lerp towards a more-blue color. Unlike + FloatColors.lerpFloatColors(float, float, float), this keeps the other channels of start as-is.
    +
    +
    Parameters:
    +
    start - the starting color as a packed float
    +
    change - how much to change start to a more-blue color, as a float between 0 and 1; higher means more blue
    +
    Returns:
    +
    a packed float that represents a color between start and a more blue color
    +
    See Also:
    +
    the counterpart method that makes a float color less blue
    +
    +
    +
  • +
  • +
    +

    lowerB

    +
    public static float lowerB(float start, + float change)
    +
    Interpolates from the packed float color start to decrease its blue channel by change. + While change must be between 0f (return start as-is) and 1f (return minimum blue), start should be a packed + color, as from rgb(float, float, float, float). This is a good way to reduce allocations of temporary + Colors, and is a little more efficient and clear than using + FloatColors.lerpFloatColors(float, float, float) to lerp towards a less-blue color. Unlike + FloatColors.lerpFloatColors(float, float, float), this keeps the other channels of start as-is.
    +
    +
    Parameters:
    +
    start - the starting color as a packed float
    +
    change - how much to change start to a less-blue color, as a float between 0 and 1; higher means less blue
    +
    Returns:
    +
    a packed float that represents a color between start and a less blue color
    +
    See Also:
    +
    the counterpart method that makes a float color more blue
    +
    +
    +
  • +
  • blot

    -
    public static float blot(float start, +
    public static float blot(float start, float change)
    Interpolates from the packed float color start towards that color made opaque by change. While change should be between 0f (return start as-is) and 1f (return start with full alpha), start should be a packed color, as from @@ -698,7 +890,7 @@

    blot

  • fade

    -
    public static float fade(float start, +
    public static float fade(float start, float change)
    Interpolates from the packed float color start towards transparent by change. While change should be between 0 (return start as-is) and 1f (return the color with 0 alpha), start should be a packed color, as from @@ -719,7 +911,7 @@

    fade

  • inverseLightness

    -
    public static float inverseLightness(float mainColor, +
    public static float inverseLightness(float mainColor, float contrastingColor)
    Given a packed float RGBA color mainColor and another RGBA color that it should be made to contrast with, gets a packed float RGBA color with roughly inverted lightness (how the Oklab color space interprets it), but the @@ -743,7 +935,7 @@

    inverseLightness

  • differentiateLightness

    -
    public static float differentiateLightness(float mainColor, +
    public static float differentiateLightness(float mainColor, float contrastingColor)
    Given a packed float RGBA color mainColor and another RGBA color that it should be made to contrast with, gets a packed float RGBA color with lightness that should be quite different from @@ -766,7 +958,7 @@

    differentiateLightness

  • offsetLightness

    -
    public static float offsetLightness(float mainColor)
    +
    public static float offsetLightness(float mainColor)
    Pretty simple; adds 0.5 to the given color's lightness (calculated by converting it to Oklab internally) and wraps it around if it would go above 1.0, then averages that with the original lightness. This means light colors become darker, and dark colors become lighter, with almost all results in the middle-range of possible lightness.
    @@ -781,7 +973,7 @@

    offsetLightness

  • lessenChange

    -
    public static float lessenChange(float color, +
    public static float lessenChange(float color, float fraction)
    Makes the additive RGBA color stored in color cause less of a change when used as a tint, as if it were mixed with neutral gray. When fraction is 1.0, this returns color unchanged; when fraction is 0.0, it @@ -797,9 +989,67 @@

    lessenChange

  • +
    +

    editRGB

    +
    public static float editRGB(float encoded, + float addR, + float addG, + float addB, + float addAlpha)
    +
    Given a packed float RGB color, this edits its red, green, blue, and alpha channels by adding the corresponding + "add" parameter and then clamping. Each value is considered in the 0 to 1 range. This returns a different float + value (of course, the given float can't be edited in-place). You can give a value of 0 for any "add" parameter + you want to stay unchanged.
    +
    +
    Parameters:
    +
    encoded - a packed float RGB color
    +
    addR - how much to add to the R channel; typically in the -1 to 1 range
    +
    addG - how much to add to the G channel; typically in the -1 to 1 range
    +
    addB - how much to add to the B channel; typically in the -1 to 1 range
    +
    addAlpha - how much to add to the alpha channel; typically in the -1 to 1 range
    +
    Returns:
    +
    a packed float RGB color with the requested edits applied to encoded
    +
    +
    +
  • +
  • +
    +

    editRGB

    +
    public static float editRGB(float encoded, + float addR, + float addG, + float addB, + float addAlpha, + float mulR, + float mulG, + float mulB, + float mulAlpha)
    +
    Given a packed float RGB color, this edits its red, green, blue, and alpha channels by first multiplying each + channel by the corresponding "mul" parameter and then adding the corresponding "add" parameter, before clamping. + This means the red value R (which is considered in the 0 to 1 range) is multiplied by mulR, then + has addR added, and then is clamped to the normal range for R (0 to 1). This returns a different float + value (of course, the given float can't be edited in-place). You can give a value of 0 for any "add" parameter + you want to stay unchanged, or a value of 1 for any "mul" parameter that shouldn't change.
    +
    +
    Parameters:
    +
    encoded - a packed float RGB color
    +
    addR - how much to add to the R channel; typically in the -1 to 1 range
    +
    addG - how much to add to the G channel; typically in the -1 to 1 range
    +
    addB - how much to add to the B channel; typically in the -1 to 1 range
    +
    addAlpha - how much to add to the alpha channel; typically in the -1 to 1 range
    +
    mulR - how much to multiply the R channel by; should be non-negative
    +
    mulG - how much to multiply the G channel by; should be non-negative
    +
    mulB - how much to multiply the B channel by; should be non-negative
    +
    mulAlpha - how much to multiply the alpha channel by; should be non-negative
    +
    Returns:
    +
    a packed float RGB color with the requested edits applied to encoded
    +
    +
    +
  • +
  • randomEdit

    -
    public static float randomEdit(float color, +
    public static float randomEdit(float color, long seed, float variance)
    Makes a quasi-randomly-edited variant on the given color, allowing typically a small amount of @@ -822,7 +1072,7 @@

    randomEdit

  • randomColor

    -
    public static float randomColor(Random random)
    +
    public static float randomColor(Random random)
    Produces a random packed float color that is always opaque and should be uniformly distributed.
    Parameters:
    @@ -835,7 +1085,7 @@

    randomColor

  • subrandomColor

    -
    public static float subrandomColor(float r, +
    public static float subrandomColor(float r, float g, float b)
    Limited-use; like randomColor(Random) but for cases where you already have three floats (r, g, and b) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/ColorfulBatch.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/ColorfulBatch.html index cbb6a2d6..63d272be 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/ColorfulBatch.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/ColorfulBatch.html @@ -3,7 +3,7 @@ -ColorfulBatch (colorful 0.5.2-SNAPSHOT API) +ColorfulBatch (colorful 0.6.0 API) @@ -74,7 +74,7 @@

    Class ColorfulBatch

    -
    java.lang.Object +
    java.lang.Object
    com.github.tommyettinger.colorful.rgb.ColorfulBatch
    @@ -84,7 +84,7 @@

    Class ColorfulBatch


  • public class ColorfulBatch -extends Object +extends Object implements com.badlogic.gdx.graphics.g2d.Batch
    A substitute for SpriteBatch that adds an additional attribute to store an extra color's worth of channels, used to modify the RGB channels of a color by multiplication (called the "tweak") @@ -162,7 +162,7 @@

    Field Summary

    protected float
     
    -
    static String
    +
    static String
     
    static float
    @@ -545,8 +545,8 @@

    Method Summary

  • -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • @@ -571,7 +571,7 @@

    SPRITE_SIZE

  • TWEAK_ATTRIBUTE

    -
    public static final String TWEAK_ATTRIBUTE
    +
    public static final String TWEAK_ATTRIBUTE
    See Also:
    Constant Field Values
    diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/ColorfulSprite.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/ColorfulSprite.html index 333d7188..7c26b79a 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/ColorfulSprite.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/ColorfulSprite.html @@ -3,7 +3,7 @@ -ColorfulSprite (colorful 0.5.2-SNAPSHOT API) +ColorfulSprite (colorful 0.6.0 API) @@ -74,7 +74,7 @@

    Class ColorfulSprite

  • -
    java.lang.Object +
    java.lang.Object
    com.badlogic.gdx.graphics.g2d.TextureRegion
    com.github.tommyettinger.colorful.rgb.ColorfulSprite
    @@ -447,8 +447,8 @@

    Method Summary

    Methods inherited from class com.badlogic.gdx.graphics.g2d.TextureRegion

    getRegionHeight, getRegionWidth, getRegionX, getRegionY, getTexture, getU, getU2, getV, getV2, isFlipX, isFlipY, setRegion, setRegion, setRegion, setRegion, setRegionHeight, setRegionWidth, setRegionX, setRegionY, setTexture, split, split
    -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/Palette.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/Palette.html index e11e4cac..ba28d3f2 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/Palette.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/Palette.html @@ -3,7 +3,7 @@ -Palette (colorful 0.5.2-SNAPSHOT API) +Palette (colorful 0.6.0 API) @@ -74,13 +74,13 @@

    Class Palette

    -
    java.lang.Object +
    java.lang.Object
    com.github.tommyettinger.colorful.rgb.Palette

    public class Palette -extends Object
    +extends Object
    A palette of predefined colors as packed RGB(A) floats, the kind ColorTools works with. You can access colors by their constant name, such as OCEAN_BLUE, by the NAMED map using NAMED.get("Ocean Blue", 0f), or by index in the FloatArray called LIST. Note that to access a float @@ -841,21 +841,21 @@

    Field Summary

    This color constant "Mush" has RGBA8888 code B1B10AFF, hue 0.16666667, saturation 0.654902, lightness 0.36666664, and alpha 1.0.
    -
    static com.badlogic.gdx.utils.ObjectFloatMap<String>
    +
    static com.badlogic.gdx.utils.ObjectFloatMap<String>
     
    -
    static com.badlogic.gdx.utils.Array<String>
    +
    static com.badlogic.gdx.utils.Array<String>
    All names for colors in this palette, in alphabetical order.
    -
    static com.badlogic.gdx.utils.Array<String>
    +
    static com.badlogic.gdx.utils.Array<String>
    All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to blue.
    -
    static com.badlogic.gdx.utils.Array<String>
    +
    static com.badlogic.gdx.utils.Array<String>
    All names for colors in this palette, sorted by lightness from black to white.
    @@ -1442,8 +1442,8 @@

    Method Summary

    -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • @@ -1458,7 +1458,7 @@

    Field Details

  • NAMED

    -
    public static final com.badlogic.gdx.utils.ObjectFloatMap<String> NAMED
    +
    public static final com.badlogic.gdx.utils.ObjectFloatMap<String> NAMED
  • @@ -5822,7 +5822,7 @@

    RASPBERRY

  • NAMES

    -
    public static final com.badlogic.gdx.utils.Array<String> NAMES
    +
    public static final com.badlogic.gdx.utils.Array<String> NAMES
    All names for colors in this palette, in alphabetical order. You can fetch the corresponding packed float color by looking up a name in NAMED.
    @@ -5830,7 +5830,7 @@

    NAMES

  • NAMES_BY_HUE

    -
    public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_HUE
    +
    public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_HUE
    All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to blue. You can fetch the corresponding packed float color by looking up a name in NAMED.
    @@ -5838,7 +5838,7 @@

    NAMES_BY_HUE

  • NAMES_BY_LIGHTNESS

    -
    public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_LIGHTNESS
    +
    public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_LIGHTNESS
    All names for colors in this palette, sorted by lightness from black to white. You can fetch the corresponding packed float color by looking up a name in NAMED.
    diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/SimplePalette.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/SimplePalette.html index 516ca5b2..05568182 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/SimplePalette.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/SimplePalette.html @@ -3,7 +3,7 @@ -SimplePalette (colorful 0.5.2-SNAPSHOT API) +SimplePalette (colorful 0.6.0 API) @@ -74,13 +74,13 @@

    Class SimplePalette

  • -
    java.lang.Object +
    java.lang.Object
    com.github.tommyettinger.colorful.rgb.SimplePalette

    public class SimplePalette -extends Object
    +extends Object
    A palette of predefined colors as packed RGB floats, the kind ColorTools works with, plus a way to describe colors by combinations and adjustments. The description code is probably what you would use this class for; it revolves around parseDescription(String), which takes a color description String and returns a packed float @@ -111,7 +111,7 @@

    Field Summary

    Modifier and Type
    Field
    Description
    -
    static com.badlogic.gdx.utils.ObjectFloatMap<String>
    +
    static com.badlogic.gdx.utils.ObjectFloatMap<String>
    Stores alternative names for colors in NAMED, like "grey" as an alias for GRAY or "gold" as an @@ -260,23 +260,23 @@

    Field Summary

    This color constant "moss" has RGBA8888 code 204608FF, R 0.1254902, G 0.27450982, B 0.03137255, alpha 1.0, hue 0.26881722, and saturation 0.24313727.
    -
    static com.badlogic.gdx.utils.ObjectFloatMap<String>
    +
    static com.badlogic.gdx.utils.ObjectFloatMap<String>
    You can look up colors by name here; the names are lower-case, and the colors are packed floats in rgba format.
    -
    static com.badlogic.gdx.utils.Array<String>
    +
    static com.badlogic.gdx.utils.Array<String>
    All names for colors in this palette, in alphabetical order.
    -
    static com.badlogic.gdx.utils.Array<String>
    +
    static com.badlogic.gdx.utils.Array<String>
    All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to blue.
    -
    static com.badlogic.gdx.utils.Array<String>
    +
    static com.badlogic.gdx.utils.Array<String>
    All names for colors in this palette, sorted by lightness from black to white.
    @@ -429,7 +429,7 @@

    Method Summary

    Appends standard RGBA Color instances to the map in Colors, using the names in NAMES (which are "lower cased" instead of "ALL UPPER CASE").
    -
    static String
    +
    static String
    bestMatch​(float rgb, int mixCount)
    @@ -437,7 +437,7 @@

    Method Summary

    using at most mixCount colors to mix in.
    static float
    -
    parseDescription​(String description)
    +
    parseDescription​(String description)
    Parses a color description and returns the approximate color it describes, as a packed float color.
    @@ -445,8 +445,8 @@

    Method Summary

    -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • @@ -461,14 +461,14 @@

    Field Details

  • NAMED

    -
    public static final com.badlogic.gdx.utils.ObjectFloatMap<String> NAMED
    +
    public static final com.badlogic.gdx.utils.ObjectFloatMap<String> NAMED
    You can look up colors by name here; the names are lower-case, and the colors are packed floats in rgba format.
  • ALIASES

    -
    public static final com.badlogic.gdx.utils.ObjectFloatMap<String> ALIASES
    +
    public static final com.badlogic.gdx.utils.ObjectFloatMap<String> ALIASES
    Stores alternative names for colors in NAMED, like "grey" as an alias for GRAY or "gold" as an alias for SAFFRON. Currently, the list of aliases is as follows:
      @@ -1346,7 +1346,7 @@

      RASPBERRY

    • NAMES

      -
      public static final com.badlogic.gdx.utils.Array<String> NAMES
      +
      public static final com.badlogic.gdx.utils.Array<String> NAMES
      All names for colors in this palette, in alphabetical order. You can fetch the corresponding packed float color by looking up a name in NAMED.
      @@ -1354,7 +1354,7 @@

      NAMES

    • NAMES_BY_HUE

      -
      public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_HUE
      +
      public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_HUE
      All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to blue. You can fetch the corresponding packed float color by looking up a name in NAMED.
      @@ -1368,7 +1368,7 @@

      COLORS_BY_HUE

    • NAMES_BY_LIGHTNESS

      -
      public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_LIGHTNESS
      +
      public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_LIGHTNESS
      All names for colors in this palette, sorted by lightness from black to white. You can fetch the corresponding packed float color by looking up a name in NAMED.
      @@ -1398,7 +1398,7 @@

      Method Details

    • parseDescription

      -
      public static float parseDescription(String description)
      +
      public static float parseDescription(String description)
      Parses a color description and returns the approximate color it describes, as a packed float color. Color descriptions consist of one or more lower-case words, separated by non-alphabetical characters (typically spaces and/or hyphens). Any word that is the name of a color in this SimplePalette will be looked up in @@ -1425,7 +1425,7 @@

      parseDescription

    • bestMatch

      -
      public static String bestMatch(float rgb, +
      public static String bestMatch(float rgb, int mixCount)
      Given a color as a packed RGBA float, this finds the closest description it can to match the given color while using at most mixCount colors to mix in. You should only use small numbers for mixCount, like 1 to 3; diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/class-use/ColorTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/class-use/ColorTools.html index 47290d7a..67788cd0 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/class-use/ColorTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/class-use/ColorTools.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.rgb.ColorTools (colorful 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.rgb.ColorTools (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/class-use/ColorfulBatch.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/class-use/ColorfulBatch.html index 0446d5ed..b60fa14c 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/class-use/ColorfulBatch.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/class-use/ColorfulBatch.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.rgb.ColorfulBatch (colorful 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.rgb.ColorfulBatch (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/class-use/ColorfulSprite.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/class-use/ColorfulSprite.html index 43ba5e36..fac9c112 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/class-use/ColorfulSprite.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/class-use/ColorfulSprite.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.rgb.ColorfulSprite (colorful 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.rgb.ColorfulSprite (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/class-use/Palette.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/class-use/Palette.html index 6978bcc9..59468b87 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/class-use/Palette.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/class-use/Palette.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.rgb.Palette (colorful 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.rgb.Palette (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/class-use/SimplePalette.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/class-use/SimplePalette.html index ad46eca7..4420eadb 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/class-use/SimplePalette.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/class-use/SimplePalette.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.rgb.SimplePalette (colorful 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.rgb.SimplePalette (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/package-summary.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/package-summary.html index d9c71e78..674481c5 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/package-summary.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/package-summary.html @@ -3,7 +3,7 @@ -com.github.tommyettinger.colorful.rgb (colorful 0.5.2-SNAPSHOT API) +com.github.tommyettinger.colorful.rgb (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/package-tree.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/package-tree.html index 4c826d73..d50d87f0 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/package-tree.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/package-tree.html @@ -3,7 +3,7 @@ -com.github.tommyettinger.colorful.rgb Class Hierarchy (colorful 0.5.2-SNAPSHOT API) +com.github.tommyettinger.colorful.rgb Class Hierarchy (colorful 0.6.0 API) @@ -60,7 +60,7 @@

      Hierarchy For Package com.github.tommyettinger.colorful.rgb

      Class Hierarchy

        -
      • java.lang.Object +
      • java.lang.Object
        • com.github.tommyettinger.colorful.rgb.ColorfulBatch (implements com.badlogic.gdx.graphics.g2d.Batch)
        • com.github.tommyettinger.colorful.rgb.ColorTools
        • diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/package-use.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/package-use.html index 008b3162..afebe8f8 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/package-use.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/rgb/package-use.html @@ -3,7 +3,7 @@ -Uses of Package com.github.tommyettinger.colorful.rgb (colorful 0.5.2-SNAPSHOT API) +Uses of Package com.github.tommyettinger.colorful.rgb (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/ColorTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/ColorTools.html index 53227d3a..27c9de5f 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/ColorTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/ColorTools.html @@ -3,7 +3,7 @@ -ColorTools (colorful 0.5.2-SNAPSHOT API) +ColorTools (colorful 0.6.0 API) @@ -74,13 +74,13 @@

          Class ColorTools

      -
      java.lang.Object +
      java.lang.Object
      com.github.tommyettinger.colorful.ycwcm.ColorTools

      -
      public class ColorTools -extends Object
      +
      public class ColorTools +extends Object
      Contains code for manipulating colors as int, packed float, and Color values in the YCwCm color space.
      @@ -176,6 +176,31 @@

      Method Summary

      Brings the chromatic components of start closer to grayscale by change (desaturating them).
      static float
      +
      editYCwCm​(float encoded, + float addY, + float addCw, + float addCm, + float addAlpha)
      +
      +
      Given a packed float YCwCm color, this edits its luma (Y), chromatic warmth (Cw), chromatic mildness (Cm), and + alpha channels by adding the corresponding "add" parameter and then clamping.
      +
      +
      static float
      +
      editYCwCm​(float encoded, + float addY, + float addCw, + float addCm, + float addAlpha, + float mulY, + float mulCw, + float mulCm, + float mulAlpha)
      +
      +
      Given a packed float YCwCm color, this edits its luma (Y), chromatic warmth (Cw), chromatic mildness (Cm), and + alpha channels by first multiplying each channel by the corresponding "mul" parameter and then adding the + corresponding "add" parameter, before clamping.
      +
      +
      static float
      enrich​(float start, float change)
      @@ -306,7 +331,7 @@

      Method Summary

      with the original Y.
      static float
      -
      randomColor​(Random random)
      +
      randomColor​(Random random)
      Produces a random packed float color that is always in-gamut and should be uniformly distributed.
      @@ -339,27 +364,41 @@

      Method Summary

      Interpolates from the packed float color start towards a bolder color (between blue and red) by change.
      -
      static float
      -
      toEditedFloat​(float basis, +
      static com.badlogic.gdx.graphics.Color
      +
      toColor​(com.badlogic.gdx.graphics.Color editing, + float packed)
      +
      +
      Writes a YCwCm-format packed float color (the format produced by ycwcm(float, float, float, float)) + into an RGBA8888 Color as used by libGDX (called editing).
      +
      +
      static float
      +
      toEditedFloat​(float basis, float hue, float saturation, float light, float opacity)
      -
      +
      Gets a variation on the packed float color basis as another packed float that has its hue, saturation, lightness, and opacity adjusted by the specified amounts.
      -
      static float
      -
      toRGBA​(float packed)
      -
      +
      static float
      +
      toRGBA​(float packed)
      +
      Converts a packed float color in the format produced by ycwcm(float, float, float, float) to a packed float in RGBA format.
      -
      static int
      -
      toRGBA8888​(float packed)
      -
      +
      static int
      +
      toRGBA8888​(float packed)
      +
      Converts a packed float color in the format produced by ycwcm(float, float, float, float) to an RGBA8888 int.
      +
      static com.badlogic.gdx.graphics.Color
      +
      toYCwCmColor​(com.badlogic.gdx.graphics.Color editing, + float ycwcm)
      +
      +
      Writes a YCwCm-format packed float color (the format produced by ycwcm(float, float, float, float)) + into a YCwCm-format Color called editing.
      +
      static float
      warm​(float start, float change)
      @@ -385,8 +424,8 @@

      Method Summary

      -

      Methods inherited from class java.lang.Object

      -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      +

      Methods inherited from class java.lang.Object

      +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    @@ -401,7 +440,7 @@

    Constructor Details

  • ColorTools

    -
    public ColorTools()
    +
    public ColorTools()
  • @@ -415,7 +454,7 @@

    Method Details

  • ycwcm

    -
    public static float ycwcm(float luma, +
    public static float ycwcm(float luma, float warm, float mild, float alpha)
    @@ -448,7 +487,7 @@

    ycwcm

  • toRGBA8888

    -
    public static int toRGBA8888(float packed)
    +
    public static int toRGBA8888(float packed)
    Converts a packed float color in the format produced by ycwcm(float, float, float, float) to an RGBA8888 int. This format of int can be used with Pixmap and in some other places in libGDX.
    @@ -460,9 +499,44 @@

    toRGBA8888

  • +
    +

    toColor

    +
    public static com.badlogic.gdx.graphics.Color toColor(com.badlogic.gdx.graphics.Color editing, + float packed)
    +
    Writes a YCwCm-format packed float color (the format produced by ycwcm(float, float, float, float)) + into an RGBA8888 Color as used by libGDX (called editing).
    +
    +
    Parameters:
    +
    editing - a libGDX color that will be filled in-place with an RGBA conversion of packed
    +
    packed - a packed float color, as produced by ycwcm(float, float, float, float)
    +
    Returns:
    +
    an RGBA8888 int color
    +
    +
    +
  • +
  • +
    +

    toYCwCmColor

    +
    public static com.badlogic.gdx.graphics.Color toYCwCmColor(com.badlogic.gdx.graphics.Color editing, + float ycwcm)
    +
    Writes a YCwCm-format packed float color (the format produced by ycwcm(float, float, float, float)) + into a YCwCm-format Color called editing. This is mostly useful if the rest of your application expects + colors in YCwCm format, such as because you use Shaders.fragmentShaderOklab or ColorfulBatch. +
    + Internally, this simply calls Color.abgr8888ToColor(Color, float) and returns the edited Color.
    +
    +
    Parameters:
    +
    editing - a libGDX Color that will be filled in-place with the color ycwcm, unchanged from its color space
    +
    ycwcm - a packed float color, as produced by ycwcm(float, float, float, float)
    +
    Returns:
    +
    an RGBA8888 int color
    +
    +
    +
  • +
  • toRGBA

    -
    public static float toRGBA(float packed)
    +
    public static float toRGBA(float packed)
    Converts a packed float color in the format produced by ycwcm(float, float, float, float) to a packed float in RGBA format. This format of float can be used with the standard SpriteBatch and in some other places in libGDX.
    @@ -477,7 +551,7 @@

    toRGBA

  • fromRGBA8888

    -
    public static float fromRGBA8888(int rgba)
    +
    public static float fromRGBA8888(int rgba)
    Takes a color encoded as an RGBA8888 int and converts to a packed float in the YCwCm this uses.
    Parameters:
    @@ -490,7 +564,7 @@

    fromRGBA8888

  • fromRGBA

    -
    public static float fromRGBA(float packed)
    +
    public static float fromRGBA(float packed)
    Takes a color encoded as an RGBA8888 packed float and converts to a packed float in the YCwCm this uses.
    Parameters:
    @@ -503,7 +577,7 @@

    fromRGBA

  • fromColor

    -
    public static float fromColor(com.badlogic.gdx.graphics.Color color)
    +
    public static float fromColor(com.badlogic.gdx.graphics.Color color)
    Takes a libGDX Color that uses RGBA8888 channels and converts to a packed float in the YCwCm this uses.
    Parameters:
    @@ -516,7 +590,7 @@

    fromColor

  • fromRGBA

    -
    public static float fromRGBA(float r, +
    public static float fromRGBA(float r, float g, float b, float a)
    @@ -535,7 +609,7 @@

    fromRGBA

  • redInt

    -
    public static int redInt(float encoded)
    +
    public static int redInt(float encoded)
    Gets the red channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    Parameters:
    @@ -548,7 +622,7 @@

    redInt

  • greenInt

    -
    public static int greenInt(float encoded)
    +
    public static int greenInt(float encoded)
    Gets the green channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    Parameters:
    @@ -561,7 +635,7 @@

    greenInt

  • blueInt

    -
    public static int blueInt(float encoded)
    +
    public static int blueInt(float encoded)
    Gets the blue channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    Parameters:
    @@ -574,7 +648,7 @@

    blueInt

  • alphaInt

    -
    public static int alphaInt(float encoded)
    +
    public static int alphaInt(float encoded)
    Gets the alpha channel value of the given encoded color, as an even int ranging from 0 to 254, inclusive. Because of how alpha is stored in libGDX, no odd-number values are possible for alpha.
    @@ -588,7 +662,7 @@

    alphaInt

  • red

    -
    public static float red(float encoded)
    +
    public static float red(float encoded)
    Gets the red channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -601,7 +675,7 @@

    red

  • green

    -
    public static float green(float encoded)
    +
    public static float green(float encoded)
    Gets the green channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -614,7 +688,7 @@

    green

  • blue

    -
    public static float blue(float encoded)
    +
    public static float blue(float encoded)
    Gets the blue channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -627,7 +701,7 @@

    blue

  • alpha

    -
    public static float alpha(float encoded)
    +
    public static float alpha(float encoded)
    Gets the alpha channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -640,7 +714,7 @@

    alpha

  • floatGetHSL

    -
    public static float floatGetHSL(float hue, +
    public static float floatGetHSL(float hue, float saturation, float lightness, float opacity)
    @@ -666,7 +740,7 @@

    floatGetHSL

  • saturation

    -
    public static float saturation(float encoded)
    +
    public static float saturation(float encoded)
    Gets the saturation of the given encoded color, as a float ranging from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -679,13 +753,13 @@

    saturation

  • lightness

    -
    public static float lightness(float encoded)
    +
    public static float lightness(float encoded)
  • hue

    -
    public static float hue(float encoded)
    +
    public static float hue(float encoded)
    Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased) to 1f (exclusive, red and approaching purple if decreased).
    @@ -700,7 +774,7 @@

    hue

  • luma

    -
    public static float luma(float encoded)
    +
    public static float luma(float encoded)
    The "luma" of the given packed float in YCwCm format, which is like its lightness; ranges from 0.0f to 1.0f . YCwCm is useful for modifications to colors:
      @@ -723,7 +797,7 @@

      luma

    • chromaWarm

      -
      public static float chromaWarm(float encoded)
      +
      public static float chromaWarm(float encoded)
      The "chroma warm" of the given packed float in YCwCm format, which when combined with chroma mild describes the shade and saturation of a color; ranges from 0f to 1f . YCwCm is useful for modifications to colors:
        @@ -746,7 +820,7 @@

        chromaWarm

      • chromaMild

        -
        public static float chromaMild(float encoded)
        +
        public static float chromaMild(float encoded)
        The "chroma mild" of the given packed float in YCwCm format, which when combined with chroma warm describes the shade and saturation of a color; ranges from 0f to 1f . YCwCm is useful for modifications to colors: @@ -770,7 +844,7 @@

        chromaMild

      • toEditedFloat

        -
        public static float toEditedFloat(float basis, +
        public static float toEditedFloat(float basis, float hue, float saturation, float light, @@ -803,7 +877,7 @@

        toEditedFloat

      • lighten

        -
        public static float lighten(float start, +
        public static float lighten(float start, float change)
        Interpolates from the packed float color start towards white by change. While change should be between 0f (return start as-is) and 1f (return white), start should be a packed color, as from @@ -824,7 +898,7 @@

        lighten

      • darken

        -
        public static float darken(float start, +
        public static float darken(float start, float change)
        Interpolates from the packed float color start towards black by change. While change should be between 0f (return start as-is) and 1f (return black), start should be a packed color, as from @@ -845,7 +919,7 @@

        darken

      • warm

        -
        public static float warm(float start, +
        public static float warm(float start, float change)
        Interpolates from the packed float color start towards a warmer color (yellow to red) by change. While change should be between 0f (returnstart as-is) and 1f (return fully warmed), start should be a packed color, as from @@ -867,7 +941,7 @@

        warm

      • cool

        -
        public static float cool(float start, +
        public static float cool(float start, float change)
        Interpolates from the packed float color start towards a cooler color (green to blue) by change. While change should be between 0f (return start as-is) and 1f (return fully cooled), start should be a packed color, as from @@ -889,7 +963,7 @@

        cool

      • weaken

        -
        public static float weaken(float start, +
        public static float weaken(float start, float change)
        Interpolates from the packed float color start towards a milder color (between green and yellow) by change. While change should be between 0f (return start as-is) and 1f (return fully mild), start should be a packed color, as @@ -911,7 +985,7 @@

        weaken

      • strengthen

        -
        public static float strengthen(float start, +
        public static float strengthen(float start, float change)
        Interpolates from the packed float color start towards a bolder color (between blue and red) by change. While change should be between 0f (return start as-is) and 1f (return fully cooled), start should be a packed color, as @@ -933,7 +1007,7 @@

        strengthen

      • blot

        -
        public static float blot(float start, +
        public static float blot(float start, float change)
        Interpolates from the packed float color start towards that color made opaque by change. While change should be between 0f (return start as-is) and 1f (return start with full alpha), start should be a packed color, as from @@ -954,7 +1028,7 @@

        blot

      • fade

        -
        public static float fade(float start, +
        public static float fade(float start, float change)
        Interpolates from the packed float color start towards transparent by change. While change should be between 0 (return start as-is) and 1f (return the color with 0 alpha), start should be a packed color, as from @@ -975,7 +1049,7 @@

        fade

      • dullen

        -
        public static float dullen(float start, +
        public static float dullen(float start, float change)
        Brings the chromatic components of start closer to grayscale by change (desaturating them). While change should be between 0f (return start as-is) and 1f (return fully gray), start should be a packed color, as @@ -995,7 +1069,7 @@

        dullen

      • enrich

        -
        public static float enrich(float start, +
        public static float enrich(float start, float change)
        Pushes the chromatic components of start away from grayscale by change (saturating them). While change should be between 0f (return start as-is) and 1f (return maximally saturated), start should be a packed color, as @@ -1017,7 +1091,7 @@

        enrich

      • inverseLightness

        -
        public static float inverseLightness(float mainColor, +
        public static float inverseLightness(float mainColor, float contrastingColor)
        Given a packed float YCwCm color mainColor and another YCwCm color that it should be made to contrast with, gets a packed float YCwCm color with roughly inverted luma but the same chromatic channels and opacity (Cw @@ -1041,7 +1115,7 @@

        inverseLightness

      • differentiateLightness

        -
        public static float differentiateLightness(float mainColor, +
        public static float differentiateLightness(float mainColor, float contrastingColor)
        Given a packed float YCwCm color mainColor and another YCwCm color that it should be made to contrast with, gets a packed float YCwCm color with Y that should be quite different from contrastingColor's Y, @@ -1064,7 +1138,7 @@

        differentiateLightness

      • offsetLightness

        -
        public static float offsetLightness(float mainColor)
        +
        public static float offsetLightness(float mainColor)
        Pretty simple; adds 0.5 to the given color's Y and wraps it around if it would go above 1.0, then averages that with the original Y. This means light colors become darker, and dark colors become lighter, with almost all results in the middle-range of possible lightness.
        @@ -1079,7 +1153,7 @@

        offsetLightness

      • lessenChange

        -
        public static float lessenChange(float color, +
        public static float lessenChange(float color, float fraction)
        Makes the additive YCwCm color stored in color cause less of a change when used as a tint, as if it were mixed with neutral gray. When fraction is 1.0, this returns color unchanged; when fraction is 0.0, it @@ -1097,7 +1171,7 @@

        lessenChange

      • randomEdit

        -
        public static float randomEdit(float color, +
        public static float randomEdit(float color, long seed, float variance)
        Makes a quasi-randomly-edited variant on the given color, allowing typically a small amount of @@ -1121,7 +1195,7 @@

        randomEdit

      • inGamut

        -
        public static boolean inGamut(float packed)
        +
        public static boolean inGamut(float packed)
        Returns true if the given packed float color, as YCwCm, is valid to convert losslessly back to RGBA.
        Parameters:
        @@ -1134,7 +1208,7 @@

        inGamut

      • inGamut

        -
        public static boolean inGamut(float y, +
        public static boolean inGamut(float y, float cw, float cm)
        Returns true if the given YCwCm values are valid to convert losslessly back to RGBA.
        @@ -1151,7 +1225,7 @@

        inGamut

      • limitToGamut

        -
        public static float limitToGamut(float packed)
        +
        public static float limitToGamut(float packed)
        Iteratively checks whether the given YCwCm color is in-gamut, and either brings the color closer to 50% gray if it isn't in-gamut, or returns it as soon as it is in-gamut.
        @@ -1167,7 +1241,7 @@

        limitToGamut

      • limitToGamut

        -
        public static float limitToGamut(float y, +
        public static float limitToGamut(float y, float cw, float cm)
        Iteratively checks whether the given YCwCm color is in-gamut, and either brings the color closer to 50% gray if @@ -1187,7 +1261,7 @@

        limitToGamut

      • limitToGamut

        -
        public static float limitToGamut(float y, +
        public static float limitToGamut(float y, float cw, float cm, float a)
        @@ -1207,9 +1281,72 @@

        limitToGamut

      • +
        +

        editYCwCm

        +
        public static float editYCwCm(float encoded, + float addY, + float addCw, + float addCm, + float addAlpha)
        +
        Given a packed float YCwCm color, this edits its luma (Y), chromatic warmth (Cw), chromatic mildness (Cm), and + alpha channels by adding the corresponding "add" parameter and then clamping. This returns a different float + value (of course, the given float can't be edited in-place). You can give a value of 0 for any "add" parameter + you want to stay unchanged. This clamps the resulting color to remain in-gamut, so it should be safe to convert + it back to RGBA.
        +
        +
        Parameters:
        +
        encoded - a packed float YCwCm color
        +
        addY - how much to add to the luma channel; typically in the -1 to 1 range
        +
        addCw - how much to add to the chromatic warmth channel; typically in the -2 to 2 range
        +
        addCm - how much to add to the chromatic mildness channel; typically in the -2 to 2 range
        +
        addAlpha - how much to add to the alpha channel; typically in the -1 to 1 range
        +
        Returns:
        +
        a packed float YCwCm color with the requested edits applied to encoded
        +
        +
        +
      • +
      • +
        +

        editYCwCm

        +
        public static float editYCwCm(float encoded, + float addY, + float addCw, + float addCm, + float addAlpha, + float mulY, + float mulCw, + float mulCm, + float mulAlpha)
        +
        Given a packed float YCwCm color, this edits its luma (Y), chromatic warmth (Cw), chromatic mildness (Cm), and + alpha channels by first multiplying each channel by the corresponding "mul" parameter and then adding the + corresponding "add" parameter, before clamping. This means the luma value is multiplied by mulY, then has + addY added, and then is clamped to the normal range for luma (0 to 1). This returns a different float + value (of course, the given float can't be edited in-place). You can give a value of 0 for any "add" parameter + you want to stay unchanged, or a value of 1 for any "mul" parameter that shouldn't change. Note that this + manipulates chromatic warmth and mildness in the -1 to 1 range, so if you multiply by a small number like + 0.25f, then this will produce a less-saturated color, and if you multiply by a larger number like + 4f, then you will get a much more-saturated color. This clamps the resulting color to remain in-gamut, + so it should be safe to convert it back to RGBA.
        +
        +
        Parameters:
        +
        encoded - a packed float YCwCm color
        +
        addY - how much to add to the luma channel; typically in the -1 to 1 range
        +
        addCw - how much to add to the chromatic warmth channel; typically in the -2 to 2 range
        +
        addCm - how much to add to the chromatic mildness channel; typically in the -2 to 2 range
        +
        addAlpha - how much to add to the alpha channel; typically in the -1 to 1 range
        +
        mulY - how much to multiply the luma channel by; should be non-negative
        +
        mulCw - how much to multiply the chromatic warmth channel by; usually non-negative (not always)
        +
        mulCm - how much to multiply the chromatic mildness channel by; usually non-negative (not always)
        +
        mulAlpha - how much to multiply the alpha channel by; should be non-negative
        +
        Returns:
        +
        a packed float YCwCm color with the requested edits applied to encoded
        +
        +
        +
      • +
      • randomColor

        -
        public static float randomColor(Random random)
        +
        public static float randomColor(Random random)
        Produces a random packed float color that is always in-gamut and should be uniformly distributed.
        Parameters:
        diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/ColorfulBatch.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/ColorfulBatch.html index c20e20dd..9dc27818 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/ColorfulBatch.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/ColorfulBatch.html @@ -3,7 +3,7 @@ -ColorfulBatch (colorful 0.5.2-SNAPSHOT API) +ColorfulBatch (colorful 0.6.0 API) @@ -74,7 +74,7 @@

        Class ColorfulBatch

      • -
        java.lang.Object +
        java.lang.Object
        com.github.tommyettinger.colorful.ycwcm.ColorfulBatch
        @@ -84,7 +84,7 @@

        Class ColorfulBatch


      • public class ColorfulBatch -extends Object +extends Object implements com.badlogic.gdx.graphics.g2d.Batch
        A substitute for SpriteBatch that adds an additional attribute to store an extra color's worth of channels, used to modify the luma and chromatic channels of a color by multiplication (called @@ -152,7 +152,7 @@

        Field Summary

        protected float
         
        -
        static String
        +
        static String
         
        static float
        @@ -528,8 +528,8 @@

        Method Summary

      • -

        Methods inherited from class java.lang.Object

        -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      @@ -554,7 +554,7 @@

      SPRITE_SIZE

    • TWEAK_ATTRIBUTE

      -
      public static final String TWEAK_ATTRIBUTE
      +
      public static final String TWEAK_ATTRIBUTE
      See Also:
      Constant Field Values
      diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/ColorfulSprite.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/ColorfulSprite.html index 5af53e2d..2375e2c8 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/ColorfulSprite.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/ColorfulSprite.html @@ -3,7 +3,7 @@ -ColorfulSprite (colorful 0.5.2-SNAPSHOT API) +ColorfulSprite (colorful 0.6.0 API) @@ -74,7 +74,7 @@

      Class ColorfulSprite

    • -
      java.lang.Object +
      java.lang.Object
      com.badlogic.gdx.graphics.g2d.TextureRegion
      com.github.tommyettinger.colorful.ycwcm.ColorfulSprite
      @@ -448,8 +448,8 @@

      Method Summary

      Methods inherited from class com.badlogic.gdx.graphics.g2d.TextureRegion

      getRegionHeight, getRegionWidth, getRegionX, getRegionY, getTexture, getU, getU2, getV, getV2, isFlipX, isFlipY, setRegion, setRegion, setRegion, setRegion, setRegionHeight, setRegionWidth, setRegionX, setRegionY, setTexture, split, split
      -

      Methods inherited from class java.lang.Object

      -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      +

      Methods inherited from class java.lang.Object

      +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/Palette.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/Palette.html index 26bfb072..4713a0bc 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/Palette.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/Palette.html @@ -3,7 +3,7 @@ -Palette (colorful 0.5.2-SNAPSHOT API) +Palette (colorful 0.6.0 API) @@ -74,13 +74,13 @@

    Class Palette

    -
    java.lang.Object +
    java.lang.Object
    com.github.tommyettinger.colorful.ycwcm.Palette

    public class Palette -extends Object
    +extends Object
    A palette of predefined colors as packed YCwCm floats, the kind FloatColors works with. You can access colors by their constant name, such as OCEAN_BLUE, by the NAMED map using NAMED.get("Ocean Blue", 0f), or by index in the FloatArray called LIST. Note that to access a float @@ -841,21 +841,21 @@

    Field Summary

    This color constant "Mush" has RGBA8888 code B1B10AFF, luma 0.6117647, warmth 0.82745105, mildness 0.82745105, alpha 1.0, hue 0.16666666, and saturation 0.90322566.
    -
    static com.badlogic.gdx.utils.ObjectFloatMap<String>
    +
    static com.badlogic.gdx.utils.ObjectFloatMap<String>
     
    -
    static com.badlogic.gdx.utils.Array<String>
    +
    static com.badlogic.gdx.utils.Array<String>
    All names for colors in this palette, in alphabetical order.
    -
    static com.badlogic.gdx.utils.Array<String>
    +
    static com.badlogic.gdx.utils.Array<String>
    All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to blue.
    -
    static com.badlogic.gdx.utils.Array<String>
    +
    static com.badlogic.gdx.utils.Array<String>
    All names for colors in this palette, sorted by lightness from black to white.
    @@ -1448,8 +1448,8 @@

    Method Summary

    -

    Methods inherited from class java.lang.Object

    -clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • @@ -1464,7 +1464,7 @@

    Field Details

  • NAMED

    -
    public static final com.badlogic.gdx.utils.ObjectFloatMap<String> NAMED
    +
    public static final com.badlogic.gdx.utils.ObjectFloatMap<String> NAMED
  • @@ -5828,7 +5828,7 @@

    RASPBERRY

  • NAMES

    -
    public static final com.badlogic.gdx.utils.Array<String> NAMES
    +
    public static final com.badlogic.gdx.utils.Array<String> NAMES
    All names for colors in this palette, in alphabetical order. You can fetch the corresponding packed float color by looking up a name in NAMED.
    @@ -5836,7 +5836,7 @@

    NAMES

  • NAMES_BY_HUE

    -
    public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_HUE
    +
    public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_HUE
    All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to blue. You can fetch the corresponding packed float color by looking up a name in NAMED.
    @@ -5844,7 +5844,7 @@

    NAMES_BY_HUE

  • NAMES_BY_LIGHTNESS

    -
    public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_LIGHTNESS
    +
    public static final com.badlogic.gdx.utils.Array<String> NAMES_BY_LIGHTNESS
    All names for colors in this palette, sorted by lightness from black to white. You can fetch the corresponding packed float color by looking up a name in NAMED.
    diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/class-use/ColorTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/class-use/ColorTools.html index 3321ddcd..2ffab52b 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/class-use/ColorTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/class-use/ColorTools.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.ycwcm.ColorTools (colorful 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.ycwcm.ColorTools (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/class-use/ColorfulBatch.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/class-use/ColorfulBatch.html index 39afbaf9..56768258 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/class-use/ColorfulBatch.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/class-use/ColorfulBatch.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.ycwcm.ColorfulBatch (colorful 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.ycwcm.ColorfulBatch (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/class-use/ColorfulSprite.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/class-use/ColorfulSprite.html index ef08a0a9..02258ecf 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/class-use/ColorfulSprite.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/class-use/ColorfulSprite.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.ycwcm.ColorfulSprite (colorful 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.ycwcm.ColorfulSprite (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/class-use/Palette.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/class-use/Palette.html index ea38c394..53fb076f 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/class-use/Palette.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/class-use/Palette.html @@ -3,7 +3,7 @@ -Uses of Class com.github.tommyettinger.colorful.ycwcm.Palette (colorful 0.5.2-SNAPSHOT API) +Uses of Class com.github.tommyettinger.colorful.ycwcm.Palette (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/package-summary.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/package-summary.html index f98c4807..815ac5f3 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/package-summary.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/package-summary.html @@ -3,7 +3,7 @@ -com.github.tommyettinger.colorful.ycwcm (colorful 0.5.2-SNAPSHOT API) +com.github.tommyettinger.colorful.ycwcm (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/package-tree.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/package-tree.html index 1766d079..ce56d7e5 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/package-tree.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/package-tree.html @@ -3,7 +3,7 @@ -com.github.tommyettinger.colorful.ycwcm Class Hierarchy (colorful 0.5.2-SNAPSHOT API) +com.github.tommyettinger.colorful.ycwcm Class Hierarchy (colorful 0.6.0 API) @@ -60,7 +60,7 @@

    Hierarchy For Package com.github.tommyettinger.colorful.ycwcm<

    Class Hierarchy

      -
    • java.lang.Object +
    • java.lang.Object
      • com.github.tommyettinger.colorful.ycwcm.ColorfulBatch (implements com.badlogic.gdx.graphics.g2d.Batch)
      • com.github.tommyettinger.colorful.ycwcm.ColorTools
      • diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/package-use.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/package-use.html index 277dae20..bff4444d 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/package-use.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ycwcm/package-use.html @@ -3,7 +3,7 @@ -Uses of Package com.github.tommyettinger.colorful.ycwcm (colorful 0.5.2-SNAPSHOT API) +Uses of Package com.github.tommyettinger.colorful.ycwcm (colorful 0.6.0 API) diff --git a/docs/colorful/apidocs/constant-values.html b/docs/colorful/apidocs/constant-values.html index ed8745e7..407a5122 100644 --- a/docs/colorful/apidocs/constant-values.html +++ b/docs/colorful/apidocs/constant-values.html @@ -3,7 +3,7 @@ -Constant Field Values (colorful 0.5.2-SNAPSHOT API) +Constant Field Values (colorful 0.6.0 API) @@ -68,61 +68,61 @@

        com.github.*

        Modifier and Type
        Constant Field
        Value
        -
        public static final String
        +
        public static final String
        -
        "#ifdef GL_ES\n#define LOWP lowp\nprecision mediump float;\n#else\n#define LOWP \n#endif\nvarying vec2 v_texCoords;\nvarying LOWP vec4 v_color;\nuniform sampler2D u_texture;\nconst vec3 bright = vec3(0.375, 0.5, 0.125);\nvoid main()\n{\n vec4 tgt = texture2D( u_texture, v_texCoords );\n vec3 ycc = vec3(v_color.r - 0.5 + dot(tgt.rgb, bright), ((v_color.g - 0.5) * 2.0 + tgt.r - tgt.b), ((v_color.b - 0.5) * 2.0 + tgt.g - tgt.b));\n gl_FragColor = vec4( (clamp(mat3(1.0, 1.0, 1.0, 0.625, -0.375, -0.375, -0.5, 0.5, -0.5) * ycc, 0.0, 1.0)), v_color.a * tgt.a);\n}"
        -
        public static final String
        +
        "#ifdef GL_ES\n#define LOWP lowp\nprecision mediump float;\n#else\n#define LOWP \n#endif\nvarying vec2 v_texCoords;\nvarying LOWP vec4 v_color;\nuniform sampler2D u_texture;\nconst vec3 bright = vec3(0.375, 0.5, 0.125);\nvoid main()\n{\n vec4 tgt = texture2D( u_texture, v_texCoords );\n////use the following line to match the color exactly\n vec3 ycc = vec3(v_color.r - 0.5 + dot(tgt.rgb, bright), ((v_color.g - 0.5) * 2.0 + tgt.r - tgt.b), ((v_color.b - 0.5) * 2.0 + tgt.g - tgt.b));\n////use the following line to increase contrast\n// vec3 ycc = vec3(v_color.r * dot(sin(tgt.rgb * 1.5707963267948966) * sqrt(tgt.rgb), bright), ((v_color.g - 0.5) * 2.0 + tgt.r - tgt.b), ((v_color.b - 0.5) * 2.0 + tgt.g - tgt.b));\n////use the following line to increase contrast more\n// vec3 ycc = vec3(v_color.r * pow(dot(tgt.rgb, bright), 1.25), ((v_color.g - 0.5) * 2.0 + tgt.r - tgt.b), ((v_color.b - 0.5) * 2.0 + tgt.g - tgt.b));\n gl_FragColor = vec4( (clamp(mat3(1.0, 1.0, 1.0, 0.625, -0.375, -0.375, -0.5, 0.5, -0.5) * ycc, 0.0, 1.0)), v_color.a * tgt.a);\n}"
        +
        public static final String
        -
        "#ifdef GL_ES\n#define LOWP lowp\nprecision mediump float;\n#else\n#define LOWP \n#endif\nvarying vec2 v_texCoords;\nvarying LOWP vec4 v_color;\nuniform sampler2D u_texture;\nvoid main()\n{\n vec4 tgt = texture2D(u_texture, v_texCoords);\n gl_FragColor = clamp(vec4(sqrt(tgt.rgb * tgt.rgb * v_color.rgb * v_color.rgb * 4.0), v_color.a * tgt.a), 0.0, 1.0);\n}"
        -
        public static final String
        +
        "#ifdef GL_ES\n#define LOWP lowp\nprecision mediump float;\n#else\n#define LOWP \n#endif\nvarying vec2 v_texCoords;\nvarying LOWP vec4 v_color;\nuniform sampler2D u_texture;\nvoid main()\n{\n vec4 tgt = texture2D(u_texture, v_texCoords);\n gl_FragColor = clamp(vec4(tgt.rgb * v_color.rgb * 2.0, v_color.a * tgt.a), 0.0, 1.0);\n}"
        +
        public static final String
        -
        "#ifdef GL_ES\n#define LOWP lowp\nprecision mediump float;\n#else\n#define LOWP \n#endif\nvarying vec2 v_texCoords;\nvarying LOWP vec4 v_color;\nuniform sampler2D u_texture;\nconst float contrast = 1.375 ;\nconst vec3 bright = vec3(0.375, 0.5, 0.125) * (4.0 / 3.0);\nvoid main()\n{\n vec4 tgt = texture2D( u_texture, v_texCoords );\n vec3 ycc = vec3(v_color.r - 0.5 + pow(dot(tgt.rgb, bright), contrast) * 0.75, ((v_color.g - 0.5) * 2.0 + tgt.r - tgt.b), ((v_color.b - 0.5) * 2.0 + tgt.g - tgt.b));\n gl_FragColor = vec4( (clamp(mat3(1.0, 1.0, 1.0, 0.625, -0.375, -0.375, -0.5, 0.5, -0.5) * ycc, 0.0, 1.0)), v_color.a * tgt.a);\n}"
        -
        public static final String
        +
        "#ifdef GL_ES\n#define LOWP lowp\nprecision mediump float;\n#else\n#define LOWP \n#endif\nvarying vec2 v_texCoords;\nvarying LOWP vec4 v_color;\nuniform sampler2D u_texture;\nconst float contrast = 1.375 ; // You can make contrast a uniform if you want.\nconst vec3 bright = vec3(0.375, 0.5, 0.125) * (4.0 / 3.0);\nvoid main()\n{\n vec4 tgt = texture2D( u_texture, v_texCoords );\n vec3 ycc = vec3(v_color.r - 0.5 + pow(dot(tgt.rgb, bright), contrast) * 0.75, ((v_color.g - 0.5) * 2.0 + tgt.r - tgt.b), ((v_color.b - 0.5) * 2.0 + tgt.g - tgt.b));\n gl_FragColor = vec4( (clamp(mat3(1.0, 1.0, 1.0, 0.625, -0.375, -0.375, -0.5, 0.5, -0.5) * ycc, 0.0, 1.0)), v_color.a * tgt.a);\n}"
        +
        public static final String
        -
        "#ifdef GL_ES\n#define LOWP lowp\nprecision mediump float;\n#else\n#define LOWP \n#endif\nvarying vec2 v_texCoords;\nvarying LOWP vec4 v_color;\nuniform sampler2D u_texture;\nconst float eps = 1.0e-10;\nvec4 rgb2hsl(vec4 c)\n{\n const vec4 J = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, J.wz), vec4(c.gb, J.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n float d = q.x - min(q.w, q.y);\n float l = q.x * (1.0 - 0.5 * d / (q.x + eps));\n return vec4(abs(q.z + (q.w - q.y) / (6.0 * d + eps)), (q.x - l) / (min(l, 1.0 - l) + eps), l, c.a);\n}\n\nvec4 hsl2rgb(vec4 c)\n{\n const vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.x + K.xyz) * 6.0 - K.www);\n float v = (c.z + c.y * min(c.z, 1.0 - c.z));\n return vec4(v * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), 2.0 * (1.0 - c.z / (v + eps))), c.w);\n}void main()\n{\n vec4 tgt = texture2D( u_texture, v_texCoords );\n vec4 hsl = rgb2hsl(tgt);\n hsl.x = fract((fract(v_color.x + 0.5 - hsl.x) - 0.5) * v_color.w + hsl.x);\n hsl.yz = mix(hsl.yz, v_color.yz, v_color.w);\n gl_FragColor = hsl2rgb(hsl);\n}"
        -
        public static final String
        +
        "#ifdef GL_ES\n#define LOWP lowp\nprecision mediump float;\n#else\n#define LOWP \n#endif\nvarying vec2 v_texCoords;\nvarying LOWP vec4 v_color;\nuniform sampler2D u_texture;\nconst float eps = 1.0e-10;\n////Call this to go from the official HSL hue distribution (where blue is opposite yellow) to a\n////different distribution that matches primary colors in painting (where purple is opposite yellow).\n//float official2primaries(float hue) {\n// return hue * ( 2.137\n// + hue * ( 0.542\n// + hue * (-15.141\n// + hue * ( 30.120\n// + hue * (-22.541\n// + hue * 5.883)))));\n//}\n////Call this to go to the official HSL hue distribution (where blue is opposite yellow) from a\n////different distribution that matches primary colors in painting (where purple is opposite yellow).\n//float primaries2official(float hue) {\n// return hue * ( 0.677\n// + hue * ( -0.123\n// + hue * (-11.302\n// + hue * ( 46.767\n// + hue * (-58.493\n// + hue * 23.474)))));\n//}\nvec4 rgb2hsl(vec4 c)\n{\n const vec4 J = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, J.wz), vec4(c.gb, J.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n float d = q.x - min(q.w, q.y);\n float l = q.x * (1.0 - 0.5 * d / (q.x + eps));\n return vec4(abs(q.z + (q.w - q.y) / (6.0 * d + eps)), (q.x - l) / (min(l, 1.0 - l) + eps), l, c.a);\n}\n\nvec4 hsl2rgb(vec4 c)\n{\n const vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.x + K.xyz) * 6.0 - K.www);\n float v = (c.z + c.y * min(c.z, 1.0 - c.z));\n return vec4(v * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), 2.0 * (1.0 - c.z / (v + eps))), c.w);\n}void main()\n{\n vec4 tgt = texture2D( u_texture, v_texCoords );\n vec4 hsl = rgb2hsl(tgt);\n hsl.x = fract((fract(v_color.x + 0.5 - hsl.x) - 0.5) * v_color.w + hsl.x);\n hsl.yz = mix(hsl.yz, v_color.yz, v_color.w);\n gl_FragColor = hsl2rgb(hsl);\n}"
        +
        public static final String
        "#ifdef GL_ES\n#define LOWP lowp\nprecision mediump float;\n#else\n#define LOWP \n#endif\nvarying vec2 v_texCoords;\nvarying LOWP vec4 v_color;\nuniform sampler2D u_texture;\nvec3 applyHue(vec3 rgb, float hue)\n{\n vec3 k = vec3(0.57735);\n float c = cos(hue);\n //Rodrigues\' rotation formula\n return rgb * c + cross(k, rgb) * sin(hue) + k * dot(k, rgb) * (1.0 - c);\n}\nvoid main()\n{\n float hue = 6.2831853 * (v_color.x - 0.5);\n float saturation = v_color.y * 2.0;\n float brightness = v_color.z - 0.5;\n vec4 tgt = texture2D( u_texture, v_texCoords );\n tgt.rgb = applyHue(tgt.rgb, hue);\n tgt.rgb = vec3(\n (dot(tgt.rgb, vec3(0.375, 0.5, 0.125)) + brightness),\n ((tgt.r - tgt.b) * saturation),\n ((tgt.g - tgt.b) * saturation));\n gl_FragColor = clamp(vec4(\n dot(tgt.rgb, vec3(1.0, 0.625, -0.5)),\n dot(tgt.rgb, vec3(1.0, -0.375, 0.5)),\n dot(tgt.rgb, vec3(1.0, -0.375, -0.5)),\n tgt.a * v_color.w), 0.0, 1.0);\n}"
        -
        public static final String
        +
        public static final String
        "#ifdef GL_ES\n#define LOWP lowp\nprecision mediump float;\n#else\n#define LOWP \n#endif\nvarying vec2 v_texCoords;\nvarying float v_lightFix;\nvarying LOWP vec4 v_color;\nuniform sampler2D u_texture;\nvec3 applyHue(vec3 rgb, float hue)\n{\n vec3 k = vec3(0.57735);\n float c = cos(hue);\n //Rodrigues\' rotation formula\n return rgb * c + cross(k, rgb) * sin(hue) + k * dot(k, rgb) * (1.0 - c);\n}\nvoid main()\n{\n float hue = 6.2831853 * (v_color.x - 0.5);\n float saturation = v_color.y * 2.0;\n float brightness = v_color.z - 0.5;\n vec4 tgt = texture2D( u_texture, v_texCoords );\n tgt.rgb = applyHue(tgt.rgb, hue);\n tgt.rgb = vec3(\n (0.5 * pow(dot(tgt.rgb, vec3(0.375, 0.5, 0.125)), v_color.w) * v_lightFix + brightness),\n ((tgt.r - tgt.b) * saturation),\n ((tgt.g - tgt.b) * saturation));\n gl_FragColor = clamp(vec4(\n dot(tgt.rgb, vec3(1.0, 0.625, -0.5)),\n dot(tgt.rgb, vec3(1.0, -0.375, 0.5)),\n dot(tgt.rgb, vec3(1.0, -0.375, -0.5)),\n tgt.a), 0.0, 1.0);\n}"
        -
        public static final String
        +
        public static final String
        -
        "#ifdef GL_ES\n#define LOWP lowp\nprecision mediump float;\n#else\n#define LOWP \n#endif\nvarying vec2 v_texCoords;\nvarying float v_lightFix;\nvarying LOWP vec4 v_color;\nuniform sampler2D u_texture;\nconst float eps = 1.0e-10;\nvec4 rgb2hsl(vec4 c)\n{\n const vec4 J = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, J.wz), vec4(c.gb, J.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n float d = q.x - min(q.w, q.y);\n float l = q.x * (1.0 - 0.5 * d / (q.x + eps));\n return vec4(abs(q.z + (q.w - q.y) / (6.0 * d + eps)), (q.x - l) / (min(l, 1.0 - l) + eps), l, c.a);\n}\n\nvec4 hsl2rgb(vec4 c)\n{\n const vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.x + K.xyz) * 6.0 - K.www);\n float v = (c.z + c.y * min(c.z, 1.0 - c.z));\n return vec4(v * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), 2.0 * (1.0 - c.z / (v + eps))), c.w);\n}void main()\n{\n float hue = (v_color.x - 0.5);\n float saturation = v_color.y * 2.0;\n float brightness = v_color.z - 0.5;\n vec4 tgt = texture2D( u_texture, v_texCoords );\n tgt = rgb2hsl(tgt);\n tgt.r = fract(tgt.r + hue);\n tgt = hsl2rgb(tgt);\n tgt.rgb = vec3(\n (0.5 * pow(dot(tgt.rgb, vec3(0.375, 0.5, 0.125)), v_color.w) * v_lightFix + brightness),\n ((tgt.r - tgt.b) * saturation),\n ((tgt.g - tgt.b) * saturation));\n gl_FragColor = clamp(vec4(\n dot(tgt.rgb, vec3(1.0, 0.625, -0.5)),\n dot(tgt.rgb, vec3(1.0, -0.375, 0.5)),\n dot(tgt.rgb, vec3(1.0, -0.375, -0.5)),\n tgt.a), 0.0, 1.0);\n}"
        -
        public static final String
        +
        "#ifdef GL_ES\n#define LOWP lowp\nprecision mediump float;\n#else\n#define LOWP \n#endif\nvarying vec2 v_texCoords;\nvarying float v_lightFix;\nvarying LOWP vec4 v_color;\nuniform sampler2D u_texture;\nconst float eps = 1.0e-10;\n////Call this to go from the official HSL hue distribution (where blue is opposite yellow) to a\n////different distribution that matches primary colors in painting (where purple is opposite yellow).\n//float official2primaries(float hue) {\n// return hue * ( 2.137\n// + hue * ( 0.542\n// + hue * (-15.141\n// + hue * ( 30.120\n// + hue * (-22.541\n// + hue * 5.883)))));\n//}\n////Call this to go to the official HSL hue distribution (where blue is opposite yellow) from a\n////different distribution that matches primary colors in painting (where purple is opposite yellow).\n//float primaries2official(float hue) {\n// return hue * ( 0.677\n// + hue * ( -0.123\n// + hue * (-11.302\n// + hue * ( 46.767\n// + hue * (-58.493\n// + hue * 23.474)))));\n//}\nvec4 rgb2hsl(vec4 c)\n{\n const vec4 J = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, J.wz), vec4(c.gb, J.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n float d = q.x - min(q.w, q.y);\n float l = q.x * (1.0 - 0.5 * d / (q.x + eps));\n return vec4(abs(q.z + (q.w - q.y) / (6.0 * d + eps)), (q.x - l) / (min(l, 1.0 - l) + eps), l, c.a);\n}\n\nvec4 hsl2rgb(vec4 c)\n{\n const vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.x + K.xyz) * 6.0 - K.www);\n float v = (c.z + c.y * min(c.z, 1.0 - c.z));\n return vec4(v * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), 2.0 * (1.0 - c.z / (v + eps))), c.w);\n}void main()\n{\n float hue = (v_color.x - 0.5);\n float saturation = v_color.y * 2.0;\n float brightness = v_color.z - 0.5;\n vec4 tgt = texture2D( u_texture, v_texCoords );\n tgt = rgb2hsl(tgt);\n tgt.r = fract(tgt.r + hue);\n tgt = hsl2rgb(tgt);\n tgt.rgb = vec3(\n (0.5 * pow(dot(tgt.rgb, vec3(0.375, 0.5, 0.125)), v_color.w) * v_lightFix + brightness),\n ((tgt.r - tgt.b) * saturation),\n ((tgt.g - tgt.b) * saturation));\n gl_FragColor = clamp(vec4(\n dot(tgt.rgb, vec3(1.0, 0.625, -0.5)),\n dot(tgt.rgb, vec3(1.0, -0.375, 0.5)),\n dot(tgt.rgb, vec3(1.0, -0.375, -0.5)),\n tgt.a), 0.0, 1.0);\n}"
        +
        public static final String
        -
        "#ifdef GL_ES\n#define LOWP lowp\nprecision mediump float;\n#else\n#define LOWP \n#endif\nvarying vec2 v_texCoords;\nvarying float v_lightFix;\nvarying LOWP vec4 v_color;\nuniform sampler2D u_texture;\nvec3 applyHue(vec3 rgb, float hue)\n{\n vec3 k = vec3(0.57735);\n float c = cos(hue);\n //Rodrigues\' rotation formula\n return rgb * c + cross(k, rgb) * sin(hue) + k * dot(k, rgb) * (1.0 - c);\n}\nvoid main()\n{\n float hue = 6.2831853 * (v_color.x - 0.5);\n float saturation = v_color.y * 2.0;\n float brightness = v_color.z - 0.5;\n vec4 tgt = texture2D( u_texture, v_texCoords );\n tgt.rgb = applyHue(tgt.rgb, hue);\n tgt.rgb = vec3(\n (0.5 * pow(dot(tgt.rgb, vec3(0.375, 0.5, 0.125)), v_color.w) * v_lightFix),\n ((tgt.r - tgt.b) * saturation),\n ((tgt.g - tgt.b) * saturation));\n tgt.r = sin((tgt.r + brightness) * 6.2831853) * 0.5 + 0.5;\n gl_FragColor = clamp(vec4(\n dot(tgt.rgb, vec3(1.0, 0.625, -0.5)),\n dot(tgt.rgb, vec3(1.0, -0.375, 0.5)),\n dot(tgt.rgb, vec3(1.0, -0.375, -0.5)),\n tgt.a), 0.0, 1.0);\n}"
        -
        public static final String
        +
        "#ifdef GL_ES\n#define LOWP lowp\nprecision mediump float;\n#else\n#define LOWP \n#endif\nvarying vec2 v_texCoords;\nvarying float v_lightFix;\nvarying LOWP vec4 v_color;\nuniform sampler2D u_texture;\nvec3 applyHue(vec3 rgb, float hue)\nvec3 applyHue(vec3 rgb, float hue)\n{\n vec3 k = vec3(0.57735);\n float c = cos(hue);\n //Rodrigues\' rotation formula\n return rgb * c + cross(k, rgb) * sin(hue) + k * dot(k, rgb) * (1.0 - c);\n}\nvoid main()\n{\n float hue = 6.2831853 * (v_color.x - 0.5);\n float saturation = v_color.y * 2.0;\n float brightness = v_color.z - 0.5;\n vec4 tgt = texture2D( u_texture, v_texCoords );\n tgt.rgb = applyHue(tgt.rgb, hue);\n tgt.rgb = vec3(\n (0.5 * pow(dot(tgt.rgb, vec3(0.375, 0.5, 0.125)), v_color.w) * v_lightFix),\n ((tgt.r - tgt.b) * saturation),\n ((tgt.g - tgt.b) * saturation));\n tgt.r = sin((tgt.r + brightness) * 6.2831853) * 0.5 + 0.5;\n gl_FragColor = clamp(vec4(\n dot(tgt.rgb, vec3(1.0, 0.625, -0.5)),\n dot(tgt.rgb, vec3(1.0, -0.375, 0.5)),\n dot(tgt.rgb, vec3(1.0, -0.375, -0.5)),\n tgt.a), 0.0, 1.0);\n}"
        +
        public static final String
        -
        "#ifdef GL_ES\n#define LOWP lowp\nprecision mediump float;\n#else\n#define LOWP \n#endif\nvarying vec2 v_texCoords;\nvarying LOWP vec4 v_color;\nuniform sampler2D u_texture;\nconst float eps = 1.0e-10;\nvec4 rgb2hsl(vec4 c)\n{\n const vec4 J = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, J.wz), vec4(c.gb, J.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n float d = q.x - min(q.w, q.y);\n float l = q.x * (1.0 - 0.5 * d / (q.x + eps));\n return vec4(abs(q.z + (q.w - q.y) / (6.0 * d + eps)), (q.x - l) / (min(l, 1.0 - l) + eps), l, c.a);\n}\n\nvec4 hsl2rgb(vec4 c)\n{\n const vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.x + K.xyz) * 6.0 - K.www);\n float v = (c.z + c.y * min(c.z, 1.0 - c.z));\n return vec4(v * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), 2.0 * (1.0 - c.z / (v + eps))), c.w);\n}void main()\n{\n vec4 tgt = texture2D( u_texture, v_texCoords );\n vec4 hsl = rgb2hsl(tgt);\n hsl.xy = vec2(cos(hsl.x * 6.2831853), sin(hsl.x * 6.2831853)) * hsl.y;\n vec3 tint = vec3(cos(v_color.x * 6.2831853) * v_color.y, sin(v_color.x * 6.2831853) * v_color.y, v_color.z);\n hsl.xyz = mix(hsl.xyz, tint, v_color.w);\n hsl.xy = vec2(fract(atan(hsl.y, hsl.x) / 6.2831853), length(hsl.xy));\n gl_FragColor = hsl2rgb(hsl);\n}"
        -
        public static final String
        +
        "#ifdef GL_ES\n#define LOWP lowp\nprecision mediump float;\n#else\n#define LOWP \n#endif\nvarying vec2 v_texCoords;\nvarying LOWP vec4 v_color;\nuniform sampler2D u_texture;\nconst float eps = 1.0e-10;\n////Call this to go from the official HSL hue distribution (where blue is opposite yellow) to a\n////different distribution that matches primary colors in painting (where purple is opposite yellow).\n//float official2primaries(float hue) {\n// return hue * ( 2.137\n// + hue * ( 0.542\n// + hue * (-15.141\n// + hue * ( 30.120\n// + hue * (-22.541\n// + hue * 5.883)))));\n//}\n////Call this to go to the official HSL hue distribution (where blue is opposite yellow) from a\n////different distribution that matches primary colors in painting (where purple is opposite yellow).\n//float primaries2official(float hue) {\n// return hue * ( 0.677\n// + hue * ( -0.123\n// + hue * (-11.302\n// + hue * ( 46.767\n// + hue * (-58.493\n// + hue * 23.474)))));\n//}\nvec4 rgb2hsl(vec4 c)\n{\n const vec4 J = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, J.wz), vec4(c.gb, J.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n float d = q.x - min(q.w, q.y);\n float l = q.x * (1.0 - 0.5 * d / (q.x + eps));\n return vec4(abs(q.z + (q.w - q.y) / (6.0 * d + eps)), (q.x - l) / (min(l, 1.0 - l) + eps), l, c.a);\n}\n\nvec4 hsl2rgb(vec4 c)\n{\n const vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.x + K.xyz) * 6.0 - K.www);\n float v = (c.z + c.y * min(c.z, 1.0 - c.z));\n return vec4(v * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), 2.0 * (1.0 - c.z / (v + eps))), c.w);\n}void main()\n{\n vec4 tgt = texture2D( u_texture, v_texCoords );\n vec4 hsl = rgb2hsl(tgt);\n hsl.xy = vec2(cos(hsl.x * 6.2831853), sin(hsl.x * 6.2831853)) * hsl.y;\n vec3 tint = vec3(cos(v_color.x * 6.2831853) * v_color.y, sin(v_color.x * 6.2831853) * v_color.y, v_color.z);\n hsl.xyz = mix(hsl.xyz, tint, v_color.w);\n hsl.xy = vec2(fract(atan(hsl.y, hsl.x) / 6.2831853), length(hsl.xy));\n gl_FragColor = hsl2rgb(hsl);\n}"
        +
        public static final String
        -
        "#ifdef GL_ES\n#define LOWP lowp\nprecision mediump float;\n#else\n#define LOWP \n#endif\nvarying vec2 v_texCoords;\nvarying LOWP vec4 v_color;\nuniform sampler2D u_texture;\nconst float eps = 1.0e-10;\nvec4 rgb2hsl(vec4 c)\n{\n const vec4 J = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, J.wz), vec4(c.gb, J.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n float d = q.x - min(q.w, q.y);\n float l = q.x * (1.0 - 0.5 * d / (q.x + eps));\n return vec4(abs(q.z + (q.w - q.y) / (6.0 * d + eps)), (q.x - l) / (min(l, 1.0 - l) + eps), l, c.a);\n}\n\nvec4 hsl2rgb(vec4 c)\n{\n const vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.x + K.xyz) * 6.0 - K.www);\n float v = (c.z + c.y * min(c.z, 1.0 - c.z));\n return vec4(v * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), 2.0 * (1.0 - c.z / (v + eps))), c.w);\n}void main()\n{\n float hue = v_color.x - 0.5;\n float saturation = v_color.y * 2.0;\n float brightness = v_color.z - 0.5;\n vec4 tgt = texture2D( u_texture, v_texCoords );\n tgt = rgb2hsl(tgt);\n tgt.x = fract(tgt.x + hue);\n tgt.y = clamp(tgt.y * saturation, 0.0, 1.0);\n tgt.z = clamp(brightness + tgt.z, 0.0, 1.0);\n gl_FragColor = hsl2rgb(tgt);\n}"
        -
        public static final String
        +
        "#ifdef GL_ES\n#define LOWP lowp\nprecision mediump float;\n#else\n#define LOWP \n#endif\nvarying vec2 v_texCoords;\nvarying LOWP vec4 v_color;\nuniform sampler2D u_texture;\nconst float eps = 1.0e-10;\n////Call this to go from the official HSL hue distribution (where blue is opposite yellow) to a\n////different distribution that matches primary colors in painting (where purple is opposite yellow).\n//float official2primaries(float hue) {\n// return hue * ( 2.137\n// + hue * ( 0.542\n// + hue * (-15.141\n// + hue * ( 30.120\n// + hue * (-22.541\n// + hue * 5.883)))));\n//}\n////Call this to go to the official HSL hue distribution (where blue is opposite yellow) from a\n////different distribution that matches primary colors in painting (where purple is opposite yellow).\n//float primaries2official(float hue) {\n// return hue * ( 0.677\n// + hue * ( -0.123\n// + hue * (-11.302\n// + hue * ( 46.767\n// + hue * (-58.493\n// + hue * 23.474)))));\n//}\nvec4 rgb2hsl(vec4 c)\n{\n const vec4 J = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, J.wz), vec4(c.gb, J.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n float d = q.x - min(q.w, q.y);\n float l = q.x * (1.0 - 0.5 * d / (q.x + eps));\n return vec4(abs(q.z + (q.w - q.y) / (6.0 * d + eps)), (q.x - l) / (min(l, 1.0 - l) + eps), l, c.a);\n}\n\nvec4 hsl2rgb(vec4 c)\n{\n const vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.x + K.xyz) * 6.0 - K.www);\n float v = (c.z + c.y * min(c.z, 1.0 - c.z));\n return vec4(v * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), 2.0 * (1.0 - c.z / (v + eps))), c.w);\n}void main()\n{\n float hue = v_color.x - 0.5;\n float saturation = v_color.y * 2.0;\n float brightness = v_color.z - 0.5;\n vec4 tgt = texture2D( u_texture, v_texCoords );\n tgt = rgb2hsl(tgt);\n tgt.x = fract(tgt.x + hue);\n tgt.y = clamp(tgt.y * saturation, 0.0, 1.0);\n tgt.z = clamp(brightness + tgt.z, 0.0, 1.0);\n gl_FragColor = hsl2rgb(tgt);\n}"
        +
        public static final String
        "#ifdef GL_ES\n#define LOWP lowp\nprecision mediump float;\n#else\n#define LOWP \n#endif\nvarying vec2 v_texCoords;\nvarying LOWP vec4 v_color;\nuniform sampler2D u_texture;\nuniform vec4 u_search;\nuniform vec4 u_replace;\nvoid main()\n{\n vec4 tgt = texture2D(u_texture, v_texCoords);\n float curve = smoothstep(0.0, 1.0, 1.25 - distance(tgt.rgb, u_search.rgb) * 2.0);\n gl_FragColor = vec4(mix(tgt.rgb, u_replace.rgb, curve), tgt.a) * v_color;\n}"
        -
        public static final String
        +
        public static final String
        "#ifdef GL_ES\n#define LOWP lowp\nprecision mediump float;\n#else\n#define LOWP \n#endif\nvarying vec2 v_texCoords;\nvarying LOWP vec4 v_color;\nuniform sampler2D u_texture;\nvoid main()\n{\n vec4 tgt = texture2D( u_texture, v_texCoords );\n gl_FragColor = clamp(vec4(tgt.rgb * pow((v_color.rgb + 0.1) * 1.666, vec3(1.5)), v_color.a * tgt.a), 0.0, 1.0);\n}"
        -
        public static final String
        +
        public static final String
        -
        "#ifdef GL_ES\n#define LOWP lowp\nprecision mediump float;\n#else\n#define LOWP \n#endif\nvarying vec2 v_texCoords;\nvarying LOWP vec4 v_color;\nuniform sampler2D u_texture;\nconst float eps = 1.0e-10;\nvec4 rgb2hsl(vec4 c)\n{\n const vec4 J = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, J.wz), vec4(c.gb, J.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n float d = q.x - min(q.w, q.y);\n float l = q.x * (1.0 - 0.5 * d / (q.x + eps));\n return vec4(abs(q.z + (q.w - q.y) / (6.0 * d + eps)), (q.x - l) / (min(l, 1.0 - l) + eps), l, c.a);\n}\n\nvec4 hsl2rgb(vec4 c)\n{\n const vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.x + K.xyz) * 6.0 - K.www);\n float v = (c.z + c.y * min(c.z, 1.0 - c.z));\n return vec4(v * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), 2.0 * (1.0 - c.z / (v + eps))), c.w);\n}void main()\n{\n vec4 tgt = texture2D( u_texture, v_texCoords );\n vec4 hsl = rgb2hsl(tgt);\n hsl.x = fract(v_color.x + hsl.x + 0.5);\n hsl.yz = clamp(hsl.yz * v_color.yz * 2.0, 0.0, 1.0);\n gl_FragColor = hsl2rgb(hsl);\n}"
        -
        public static final String
        - +
        "#ifdef GL_ES\n#define LOWP lowp\nprecision mediump float;\n#else\n#define LOWP \n#endif\nvarying vec2 v_texCoords;\nvarying LOWP vec4 v_color;\nuniform sampler2D u_texture;\nconst float eps = 1.0e-10;\n////Call this to go from the official HSL hue distribution (where blue is opposite yellow) to a\n////different distribution that matches primary colors in painting (where purple is opposite yellow).\n//float official2primaries(float hue) {\n// return hue * ( 2.137\n// + hue * ( 0.542\n// + hue * (-15.141\n// + hue * ( 30.120\n// + hue * (-22.541\n// + hue * 5.883)))));\n//}\n////Call this to go to the official HSL hue distribution (where blue is opposite yellow) from a\n////different distribution that matches primary colors in painting (where purple is opposite yellow).\n//float primaries2official(float hue) {\n// return hue * ( 0.677\n// + hue * ( -0.123\n// + hue * (-11.302\n// + hue * ( 46.767\n// + hue * (-58.493\n// + hue * 23.474)))));\n//}\nvec4 rgb2hsl(vec4 c)\n{\n const vec4 J = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, J.wz), vec4(c.gb, J.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n float d = q.x - min(q.w, q.y);\n float l = q.x * (1.0 - 0.5 * d / (q.x + eps));\n return vec4(abs(q.z + (q.w - q.y) / (6.0 * d + eps)), (q.x - l) / (min(l, 1.0 - l) + eps), l, c.a);\n}\n\nvec4 hsl2rgb(vec4 c)\n{\n const vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.x + K.xyz) * 6.0 - K.www);\n float v = (c.z + c.y * min(c.z, 1.0 - c.z));\n return vec4(v * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), 2.0 * (1.0 - c.z / (v + eps))), c.w);\n}void main()\n{\n vec4 tgt = texture2D( u_texture, v_texCoords );\n vec4 hsl = rgb2hsl(tgt);\n hsl.x = fract(v_color.x + hsl.x + 0.5);\n hsl.yz = clamp(hsl.yz * v_color.yz * 2.0, 0.0, 1.0);\n gl_FragColor = hsl2rgb(hsl);\n}"
        +
        public static final String
        + +
        "const float eps = 1.0e-10;\n////Call this to go from the official HSL hue distribution (where blue is opposite yellow) to a\n////different distribution that matches primary colors in painting (where purple is opposite yellow).\n//float official2primaries(float hue) {\n// return hue * ( 2.137\n// + hue * ( 0.542\n// + hue * (-15.141\n// + hue * ( 30.120\n// + hue * (-22.541\n// + hue * 5.883)))));\n//}\n////Call this to go to the official HSL hue distribution (where blue is opposite yellow) from a\n////different distribution that matches primary colors in painting (where purple is opposite yellow).\n//float primaries2official(float hue) {\n// return hue * ( 0.677\n// + hue * ( -0.123\n// + hue * (-11.302\n// + hue * ( 46.767\n// + hue * (-58.493\n// + hue * 23.474)))));\n//}\nvec4 rgb2hsl(vec4 c)\n{\n const vec4 J = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, J.wz), vec4(c.gb, J.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n float d = q.x - min(q.w, q.y);\n float l = q.x * (1.0 - 0.5 * d / (q.x + eps));\n return vec4(abs(q.z + (q.w - q.y) / (6.0 * d + eps)), (q.x - l) / (min(l, 1.0 - l) + eps), l, c.a);\n}\n\nvec4 hsl2rgb(vec4 c)\n{\n const vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.x + K.xyz) * 6.0 - K.www);\n float v = (c.z + c.y * min(c.z, 1.0 - c.z));\n return vec4(v * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), 2.0 * (1.0 - c.z / (v + eps))), c.w);\n}"
        +
        public static final String
        + +
        "const float eps = 1.0e-10;\nfloat official2primaries(float hue) {\n return (sqrt(hue + 0.050625) - 0.225) * 1.25;\n}\nfloat primaries2official(float hue) {\n return pow(hue * 0.8 + 0.225, 2.0) - 0.050625;\n}\nvec4 rgb2hsl(vec4 c)\n{\n const vec4 J = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, J.wz), vec4(c.gb, J.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float l = q.x * (1.0 - 0.5 * d / (q.x + eps));\n return vec4(official2primaries(abs(q.z + (q.w - q.y) / (6.0 * d + eps))), (q.x - l) / (min(l, 1.0 - l) + eps), l, c.a);\n}\n\nvec4 hsl2rgb(vec4 c)\n{\n const vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(primaries2official(c.x) + K.xyz) * 6.0 - K.www);\n float v = (c.z + c.y * min(c.z, 1.0 - c.z));\n return vec4(v * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), 2.0 * (1.0 - c.z / (v + eps))), c.w);\n}"
        +
        public static final String
        +
        "vec3 applyHue(vec3 rgb, float hue)\n{\n vec3 k = vec3(0.57735);\n float c = cos(hue);\n //Rodrigues\' rotation formula\n return rgb * c + cross(k, rgb) * sin(hue) + k * dot(k, rgb) * (1.0 - c);\n}\n"
        -
        public static final String
        - -
        "const float eps = 1.0e-10;\nvec4 rgb2hsl(vec4 c)\n{\n const vec4 J = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, J.wz), vec4(c.gb, J.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n float d = q.x - min(q.w, q.y);\n float l = q.x * (1.0 - 0.5 * d / (q.x + eps));\n return vec4(abs(q.z + (q.w - q.y) / (6.0 * d + eps)), (q.x - l) / (min(l, 1.0 - l) + eps), l, c.a);\n}\n\nvec4 hsl2rgb(vec4 c)\n{\n const vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.x + K.xyz) * 6.0 - K.www);\n float v = (c.z + c.y * min(c.z, 1.0 - c.z));\n return vec4(v * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), 2.0 * (1.0 - c.z / (v + eps))), c.w);\n}"
        -
        public static final String
        - -
        "const float eps = 1.0e-10;\nfloat official2primaries(float hue) {\n return (sqrt(hue + 0.050625) - 0.225) * 1.25;\n}\nfloat primaries2official(float hue) {\n return pow(hue * 0.8 + 0.225, 2.0) - 0.050625;\n}\nvec4 rgb2hsl(vec4 c)\n{\n const vec4 J = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, J.wz), vec4(c.gb, J.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float l = q.x * (1.0 - 0.5 * d / (q.x + eps));\n return vec4(official2primaries(abs(q.z + (q.w - q.y) / (6.0 * d + eps))), (q.x - l) / (min(l, 1.0 - l) + eps), l, c.a);\n}\n\nvec4 hsl2rgb(vec4 c)\n{\n const vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(primaries2official(c.x) + K.xyz) * 6.0 - K.www);\n float v = (c.z + c.y * min(c.z, 1.0 - c.z));\n return vec4(v * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), 2.0 * (1.0 - c.z / (v + eps))), c.w);\n}"
        -
        public static final String
        +
        public static final String
        "attribute vec4 a_position;\nattribute vec4 a_color;\nattribute vec2 a_texCoord0;\nuniform mat4 u_projTrans;\nvarying vec4 v_color;\nvarying vec2 v_texCoords;\n\nvoid main()\n{\n v_color = a_color;\n v_color.a = v_color.a * (255.0/254.0);\n v_texCoords = a_texCoord0;\n gl_Position = u_projTrans * a_position;\n}\n"
        -
        public static final String
        +
        public static final String
        "attribute vec4 a_position;\nattribute vec4 a_color;\nattribute vec2 a_texCoord0;\nuniform mat4 u_projTrans;\nvarying vec4 v_color;\nvarying vec2 v_texCoords;\nconst vec3 yellow = vec3( 0.16155326,0.020876605,-0.26078433 );\nconst vec3 magenta = vec3(-0.16136102,0.122068435,-0.070396 );\nconst vec3 cyan = vec3( 0.16420607,0.3481738, 0.104959644);\nvoid main()\n{\n v_color = a_color;\n v_color.a = a_color.a * (255.0/254.0);\n vec3 hsi = v_color.rgb;\n v_color.x = (hsi.z - 0.5) * 0.9999;\n hsi.x *= 6.28318;\n hsi.y *= 0.5;\n v_color.y = cos(hsi.x) * hsi.y;\n v_color.z = sin(hsi.x) * hsi.y;\n float crMid = dot(cyan.yz, v_color.yz);\n float mgMid = dot(magenta.yz, v_color.yz);\n float ybMid = dot(yellow.yz, v_color.yz);\n float crScale = (v_color.x - 0.5 + step(crMid, 0.0)) * cyan.x / (0.00001 - crMid);\n float mgScale = (v_color.x + 0.5 - step(mgMid, 0.0)) * magenta.x / (0.00001 - mgMid);\n float ybScale = (v_color.x - 0.5 + step(ybMid, 0.0)) * yellow.x / (0.00001 - ybMid);\n float scale = 4.0 * min(crScale, min(mgScale, ybScale));\n v_color.yz *= scale * length(v_color.yz) / cos(3.14159 * v_color.x);\n v_color.xyz += 0.5;\n v_texCoords = a_texCoord0;\n gl_Position = u_projTrans * a_position;\n}\n"
        -
        public static final String
        +
        public static final String
        "attribute vec4 a_position;\nattribute vec4 a_color;\nattribute vec2 a_texCoord0;\nuniform mat4 u_projTrans;\nvarying vec4 v_color;\nvarying vec2 v_texCoords;\nvarying float v_lightFix;\n\nvoid main()\n{\n v_color = a_color;\n v_texCoords = a_texCoord0;\n v_color.a = pow(v_color.a * (255.0/254.0) + 0.5, 1.709);\n v_lightFix = 1.0 + pow(v_color.a, 1.41421356);\n gl_Position = u_projTrans * a_position;\n}\n"

  • @@ -162,7 +162,7 @@

    com.github.*

    public static final int
    23
    -
    public static final String
    +
    public static final String
    "a_tweak"
    public static final int
    @@ -1040,7 +1040,7 @@

    com.github.*

    public static final int
    23
    -
    public static final String
    +
    public static final String
    "a_tweak"
    public static final int
    @@ -2076,7 +2076,7 @@

    com.github.*

    public static final int
    23
    -
    public static final String
    +
    public static final String
    "a_tweak"
    public static final int
    @@ -3112,7 +3112,7 @@

    com.github.*

    public static final int
    23
    -
    public static final String
    +
    public static final String
    "a_tweak"
    public static final int
    @@ -4148,7 +4148,7 @@

    com.github.*

    public static final int
    23
    -
    public static final String
    +
    public static final String
    "a_tweak"
    public static final int
    diff --git a/docs/colorful/apidocs/help-doc.html b/docs/colorful/apidocs/help-doc.html index a16cef8f..45f33530 100644 --- a/docs/colorful/apidocs/help-doc.html +++ b/docs/colorful/apidocs/help-doc.html @@ -3,7 +3,7 @@ -API Help (colorful 0.5.2-SNAPSHOT API) +API Help (colorful 0.6.0 API) @@ -64,10 +64,10 @@

    Package

    • Interfaces
    • Classes
    • -
    • Enums
    • +
    • Enum Classes
    • Exceptions
    • Errors
    • -
    • Annotation Types
    • +
    • Annotation Interfaces
    @@ -99,19 +99,19 @@

    Class or Interface

    The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.

    -

    Annotation Type

    -

    Each annotation type has its own separate page with the following sections:

    +

    Annotation Interface

    +

    Each annotation interface has its own separate page with the following sections:

      -
    • Annotation Type Declaration
    • -
    • Annotation Type Description
    • +
    • Annotation Interface Declaration
    • +
    • Annotation Interface Description
    • Required Element Summary
    • Optional Element Summary
    • Element Details
    -

    Enum

    -

    Each enum has its own separate page with the following sections:

    +

    Enum Class

    +

    Each enum class has its own separate page with the following sections:

    • Enum Declaration
    • Enum Description
    • diff --git a/docs/colorful/apidocs/index-all.html b/docs/colorful/apidocs/index-all.html index 101dfd40..0575cc4e 100644 --- a/docs/colorful/apidocs/index-all.html +++ b/docs/colorful/apidocs/index-all.html @@ -3,7 +3,7 @@ -Index (colorful 0.5.2-SNAPSHOT API) +Index (colorful 0.6.0 API) @@ -1381,6 +1381,11 @@

      C

      Gets the "chroma" or "colorfulness" of a given Oklab color.
      +
      chromaLimit(float, float) - Static method in class com.github.tommyettinger.colorful.oklab.ColorTools
      +
      +
      Given a hue and lightness, this gets the (approximate) maximum chroma possible for that hue-lightness + combination.
      +
      chromaMild(float) - Static method in class com.github.tommyettinger.colorful.ycwcm.ColorTools
      The "chroma mild" of the given packed float in YCwCm format, which when combined with chroma warm describes the @@ -1857,29 +1862,29 @@

      C

      cos(double) - Static method in class com.github.tommyettinger.colorful.TrigTools
      -
      A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x +
      A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x faster cos() calls in benchmarking; if you have access to libGDX you should consider its sometimes-more-precise and sometimes-faster MathUtils.cos() method.
      cos(float) - Static method in class com.github.tommyettinger.colorful.TrigTools
      -
      A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x +
      A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x faster cos() calls in benchmarking, and both takes and returns floats; if you have access to libGDX you should consider its more-precise and sometimes-faster MathUtils.cos() method.
      cos_(double) - Static method in class com.github.tommyettinger.colorful.TrigTools
      -
      A variation on Math.cos(double) that takes its input as a fraction of a turn instead of in radians; one +
      A variation on Math.cos(double) that takes its input as a fraction of a turn instead of in radians; one turn is equal to 360 degrees or two*PI radians.
      cos_(float) - Static method in class com.github.tommyettinger.colorful.TrigTools
      -
      A variation on Math.cos(double) that takes its input as a fraction of a turn instead of in radians (it +
      A variation on Math.cos(double) that takes its input as a fraction of a turn instead of in radians (it also takes and returns a float); one turn is equal to 360 degrees or two*PI radians.
      cosDegrees(float) - Static method in class com.github.tommyettinger.colorful.TrigTools
      -
      A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x +
      A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x faster cos() calls in benchmarking, and both takes and returns floats; if you have access to libGDX, you should consider its more-precise and sometimes-faster MathUtils.cosDeg() method.
      @@ -2808,6 +2813,28 @@

      E

      This color constant "Earwax" has RGBA8888 code BFBF3FFF, luma 0.6862745, warmth 0.7490196, mildness 0.7490196, alpha 1.0, hue 0.16666667, and saturation 0.5039369.
      +
      editIPT(float, float, float, float, float) - Static method in class com.github.tommyettinger.colorful.ipt_hq.ColorTools
      +
      +
      Given a packed float IPT_HQ color, this edits its intensity, protan, tritan, and alpha channels by adding the + corresponding "add" parameter and then clamping.
      +
      +
      editIPT(float, float, float, float, float) - Static method in class com.github.tommyettinger.colorful.ipt.ColorTools
      +
      +
      Given a packed float IPT color, this edits its intensity, protan, tritan, and alpha channels by adding the + corresponding "add" parameter and then clamping.
      +
      +
      editIPT(float, float, float, float, float, float, float, float, float) - Static method in class com.github.tommyettinger.colorful.ipt_hq.ColorTools
      +
      +
      Given a packed float IPT_HQ color, this edits its intensity, protan, tritan, and alpha channels by first + multiplying each channel by the corresponding "mul" parameter and then adding the corresponding "add" parameter, + before clamping.
      +
      +
      editIPT(float, float, float, float, float, float, float, float, float) - Static method in class com.github.tommyettinger.colorful.ipt.ColorTools
      +
      +
      Given a packed float IPT color, this edits its intensity, protan, tritan, and alpha channels by first + multiplying each channel by the corresponding "mul" parameter and then adding the corresponding "add" parameter, + before clamping.
      +
      editKnownColors() - Static method in class com.github.tommyettinger.colorful.ipt_hq.Palette
      Changes the existing RGBA Color instances in Colors to use IPT_HQ and so be able to be shown normally by @@ -2838,6 +2865,37 @@

      E

      Changes the existing RGBA Color instances in Colors to use YCwCm and so be able to be shown normally by ColorfulBatch or a Batch using Shaders.fragmentShader.
      +
      editOklab(float, float, float, float, float) - Static method in class com.github.tommyettinger.colorful.oklab.ColorTools
      +
      +
      Given a packed float Oklab color, this edits its L, A, B, and alpha channels by adding the corresponding "add" + parameter and then clamping.
      +
      +
      editOklab(float, float, float, float, float, float, float, float, float) - Static method in class com.github.tommyettinger.colorful.oklab.ColorTools
      +
      +
      Given a packed float Oklab color, this edits its L, A, B, and alpha channels by first multiplying each channel by + the corresponding "mul" parameter and then adding the corresponding "add" parameter, before clamping.
      +
      +
      editRGB(float, float, float, float, float) - Static method in class com.github.tommyettinger.colorful.rgb.ColorTools
      +
      +
      Given a packed float RGB color, this edits its red, green, blue, and alpha channels by adding the corresponding + "add" parameter and then clamping.
      +
      +
      editRGB(float, float, float, float, float, float, float, float, float) - Static method in class com.github.tommyettinger.colorful.rgb.ColorTools
      +
      +
      Given a packed float RGB color, this edits its red, green, blue, and alpha channels by first multiplying each + channel by the corresponding "mul" parameter and then adding the corresponding "add" parameter, before clamping.
      +
      +
      editYCwCm(float, float, float, float, float) - Static method in class com.github.tommyettinger.colorful.ycwcm.ColorTools
      +
      +
      Given a packed float YCwCm color, this edits its luma (Y), chromatic warmth (Cw), chromatic mildness (Cm), and + alpha channels by adding the corresponding "add" parameter and then clamping.
      +
      +
      editYCwCm(float, float, float, float, float, float, float, float, float) - Static method in class com.github.tommyettinger.colorful.ycwcm.ColorTools
      +
      +
      Given a packed float YCwCm color, this edits its luma (Y), chromatic warmth (Cw), chromatic mildness (Cm), and + alpha channels by first multiplying each channel by the corresponding "mul" parameter and then adding the + corresponding "add" parameter, before clamping.
      +
      EGGPLANT - Static variable in class com.github.tommyettinger.colorful.ipt_hq.Palette
      This color constant "Eggplant" has RGBA8888 code 320A46FF, intensity 0.19607843, protan 0.54901963, tritan 0.41568628, alpha 1.0, hue 0.77523744, and saturation 0.23475279.
      @@ -3257,8 +3315,8 @@

      F

      fragmentShaderGammaRGBA - Static variable in class com.github.tommyettinger.colorful.Shaders
      -
      A simple shader that uses multiplicative blending with "normal" RGBA colors, but internally uses gamma correction - to make changes in color smoother.
      +
      A simple shader that uses multiplicative blending with "normal" RGBA colors, and is simpler than + Shaders.fragmentShaderRGBA but can make changes in color smoother.
      fragmentShaderHigherContrast - Static variable in class com.github.tommyettinger.colorful.Shaders
      @@ -3266,9 +3324,13 @@

      F

      colors light.
  • fragmentShaderHSI - Static variable in class com.github.tommyettinger.colorful.Shaders
    -
     
    +
    +
    This is an alias for Shaders.fragmentShaderIPT.
    +
    fragmentShaderHSL - Static variable in class com.github.tommyettinger.colorful.Shaders
    -
     
    +
    +
    Treats the color as hue, saturation, lightness, and...
    +
    fragmentShaderHSLA - Static variable in class com.github.tommyettinger.colorful.Shaders
    Allows changing Hue/Saturation/Lightness/Alpha, with hue as a rotation.
    @@ -3316,13 +3378,18 @@

    F

    Just like Shaders.fragmentShaderIPT_HQ, but uses the Oklab color space instead of the very similar IPT_HQ one.
    fragmentShaderReplacement - Static variable in class com.github.tommyettinger.colorful.Shaders
    -
     
    +
    +
    This is supposed to look for RGBA colors that are similar to search, and if it finds + one, to replace it with replace (also an RGBA color).
    +
    fragmentShaderRGBA - Static variable in class com.github.tommyettinger.colorful.Shaders
    A simple shader that uses additive blending with "normal" RGBA colors (alpha is still multiplicative).
    fragmentShaderRotateHSL - Static variable in class com.github.tommyettinger.colorful.Shaders
    -
     
    +
    +
    I can't even remember what this does, to be honest.
    +
    FROG_GREEN - Static variable in class com.github.tommyettinger.colorful.ipt_hq.Palette
    This color constant "Frog Green" has RGBA8888 code 73C805FF, intensity 0.64705884, protan 0.36862746, tritan 0.73333335, alpha 1.0, hue 0.2387869, and saturation 0.76305395.
    @@ -3410,7 +3477,7 @@

    F

    fromRGBA8888(int) - Static method in class com.github.tommyettinger.colorful.ipt_hq.ColorTools
    -
    Takes a color encoded as an RGBA8888 int and converts to a packed float in the IPT format this uses.
    +
    Takes a color encoded as an RGBA8888 int and converts to a packed float in the IPT_HQ format this uses.
    fromRGBA8888(int) - Static method in class com.github.tommyettinger.colorful.ipt.ColorTools
    @@ -4157,10 +4224,6 @@

    H

    Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased) to 1f (exclusive, red and approaching purple if decreased).
    -
    hueRodrigues - Static variable in class com.github.tommyettinger.colorful.Shaders
    -
    -
    GLSL: Takes an RGB vec3 and a float that represents a hue rotation in radians, and returns the rotated RGB vec3.
    -
    HUNTER_GREEN - Static variable in class com.github.tommyettinger.colorful.ipt_hq.Palette
    This color constant "Hunter Green" has RGBA8888 code 1E2D23FF, intensity 0.20392157, protan 0.47843137, tritan 0.5137255, alpha 1.0, hue 0.3799188, and saturation 0.058159105.
    @@ -4893,7 +4956,7 @@

    L

    limitToGamut(float) - Static method in class com.github.tommyettinger.colorful.ipt_hq.ColorTools
    -
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it +
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to grayscale if it isn't in-gamut, or returns it as soon as it is in-gamut.
    limitToGamut(float) - Static method in class com.github.tommyettinger.colorful.ipt.ColorTools
    @@ -4913,7 +4976,7 @@

    L

    limitToGamut(float, float, float) - Static method in class com.github.tommyettinger.colorful.ipt_hq.ColorTools
    -
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it +
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to grayscale if it isn't in-gamut, or returns it as soon as it is in-gamut.
    limitToGamut(float, float, float) - Static method in class com.github.tommyettinger.colorful.ipt.ColorTools
    @@ -4933,7 +4996,7 @@

    L

    limitToGamut(float, float, float, float) - Static method in class com.github.tommyettinger.colorful.ipt_hq.ColorTools
    -
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it +
    Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to grayscale if it isn't in-gamut, or returns it as soon as it is in-gamut.
    limitToGamut(float, float, float, float) - Static method in class com.github.tommyettinger.colorful.ipt.ColorTools
    @@ -5001,6 +5064,18 @@

    L

    Interpolates from the packed float color start towards an "artificial" color (between blue and purple) by change.
    +
    lowerB(float, float) - Static method in class com.github.tommyettinger.colorful.rgb.ColorTools
    +
    +
    Interpolates from the packed float color start to decrease its blue channel by change.
    +
    +
    lowerG(float, float) - Static method in class com.github.tommyettinger.colorful.rgb.ColorTools
    +
    +
    Interpolates from the packed float color start to decrease its green channel by change.
    +
    +
    lowerR(float, float) - Static method in class com.github.tommyettinger.colorful.rgb.ColorTools
    +
    +
    Interpolates from the packed float color start to decrease its red channel by change.
    +
    luma(float) - Static method in class com.github.tommyettinger.colorful.ycwcm.ColorTools
    The "luma" of the given packed float in YCwCm format, which is like its lightness; ranges from 0.0f to @@ -5714,6 +5789,28 @@

    O

    (a chromatic component ranging from greenish to reddish, called protan in IPT), B (a chromatic component ranging from bluish to yellowish, called tritan in IPT), and alpha (or opacity).
    +
    oklabByHCL(float, float, float, float) - Static method in class com.github.tommyettinger.colorful.oklab.ColorTools
    +
    +
    A different way to specify an Oklab color, using hue, chroma, lightness, and alpha something like a normal HSL(A) + color but calculating them directly in the Oklab color space.
    +
    +
    oklabByHSL(float, float, float, float) - Static method in class com.github.tommyettinger.colorful.oklab.ColorTools
    +
    +
    A different way to specify an Oklab color, using hue, saturation, lightness, and alpha like a normal HSL(A) color + but calculating them directly in the Oklab color space.
    +
    +
    oklabHue(float) - Static method in class com.github.tommyettinger.colorful.oklab.ColorTools
    +
    +
    Gets the hue of the given Oklab float color, but as Oklab understands hue rather than how HSL does.
    +
    +
    oklabLightness(float) - Static method in class com.github.tommyettinger.colorful.oklab.ColorTools
    +
    +
    Gets the lightness of the given Oklab float color, but as Oklab understands lightness rather than how HSL does.
    +
    +
    oklabSaturation(float) - Static method in class com.github.tommyettinger.colorful.oklab.ColorTools
    +
    +
    Gets the saturation of the given Oklab float color, but as Oklab understands saturation rather than how HSL does.
    +
    OLD_ROSE - Static variable in class com.github.tommyettinger.colorful.ipt_hq.Palette
    This color constant "Old Rose" has RGBA8888 code D7A0BEFF, intensity 0.7372549, protan 0.57254905, tritan 0.48235294, alpha 1.0, hue 0.91212684, and saturation 0.21507424.
    @@ -5885,13 +5982,19 @@

    P

    partialCodeHSL - Static variable in class com.github.tommyettinger.colorful.Shaders
    -
    Credit to Sam Hocevar, https://gamedev.stackexchange.com/a/59808 .
    +
    Not a full shader, this is a snippet used by most of the other HSL-based shaders to implement the complex + rgb2hsl() and hsl2rgb() methods.
    partialCodeHSLStretched - Static variable in class com.github.tommyettinger.colorful.Shaders
    Adjusted-hue version of Shaders.partialCodeHSL, supplying HSL to-and-from RGB conversions with a smaller range of hue used for cyan and a larger range for orange.
    +
    partialHueRodrigues - Static variable in class com.github.tommyettinger.colorful.Shaders
    +
    +
    This GLSL snippet takes an RGB vec3 and a float that represents a hue rotation in radians, and returns the + rotated RGB vec3.
    +
    PASTEL_SKY - Static variable in class com.github.tommyettinger.colorful.ipt_hq.Palette
    This color constant "Pastel Sky" has RGBA8888 code ABE3E3FF, intensity 0.8745098, protan 0.4392157, tritan 0.4745098, alpha 1.0, hue 0.5000837, and saturation 0.22290218.
    @@ -6549,6 +6652,18 @@

    R

    Interpolates from the packed float color start towards a "natural" color (between green and orange) by change.
    +
    raiseB(float, float) - Static method in class com.github.tommyettinger.colorful.rgb.ColorTools
    +
    +
    Interpolates from the packed float color start to increase its blue channel by change.
    +
    +
    raiseG(float, float) - Static method in class com.github.tommyettinger.colorful.rgb.ColorTools
    +
    +
    Interpolates from the packed float color start to increase its green channel by change.
    +
    +
    raiseR(float, float) - Static method in class com.github.tommyettinger.colorful.rgb.ColorTools
    +
    +
    Interpolates from the packed float color start to increase its red channel by change.
    +
    randomColor(Random) - Static method in class com.github.tommyettinger.colorful.ipt_hq.ColorTools
    Produces a random packed float color that is always in-gamut and should be uniformly distributed.
    @@ -8046,7 +8161,7 @@

    S

    Shaders - Class in com.github.tommyettinger.colorful
    -
    Constants that contain the critical shader code to construct a ShaderProgram that can render the rest of this +
    Shader code to construct a ShaderProgram that can render the specialized colors produced by the rest of this library.
    Shaders() - Constructor for class com.github.tommyettinger.colorful.Shaders
    @@ -8246,29 +8361,29 @@

    S

     
    sin(double) - Static method in class com.github.tommyettinger.colorful.TrigTools
    -
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x +
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x faster sin() calls in benchmarking; if you have access to libGDX you should consider its sometimes-more-precise and sometimes-faster MathUtils.sin() method.
    sin(float) - Static method in class com.github.tommyettinger.colorful.TrigTools
    -
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x +
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x faster sin() calls in benchmarking, and both takes and returns floats; if you have access to libGDX you should consider its more-precise and sometimes-faster MathUtils.sin() method.
    sin_(double) - Static method in class com.github.tommyettinger.colorful.TrigTools
    -
    A variation on Math.sin(double) that takes its input as a fraction of a turn instead of in radians; one +
    A variation on Math.sin(double) that takes its input as a fraction of a turn instead of in radians; one turn is equal to 360 degrees or two*PI radians.
    sin_(float) - Static method in class com.github.tommyettinger.colorful.TrigTools
    -
    A variation on Math.sin(double) that takes its input as a fraction of a turn instead of in radians (it +
    A variation on Math.sin(double) that takes its input as a fraction of a turn instead of in radians (it also takes and returns a float); one turn is equal to 360 degrees or two*PI radians.
    sinDegrees(float) - Static method in class com.github.tommyettinger.colorful.TrigTools
    -
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x +
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x faster sin() calls in benchmarking, and both takes and returns floats; if you have access to libGDX, you should consider its more-precise and sometimes-faster MathUtils.sinDeg() method.
    @@ -8875,6 +8990,11 @@

    T

    Writes an RGB-format packed float color (the format produced by ColorTools.rgb(float, float, float, float)) into an RGBA8888 Color as used by libGDX (called editing).
    +
    toColor(Color, float) - Static method in class com.github.tommyettinger.colorful.ycwcm.ColorTools
    +
    +
    Writes a YCwCm-format packed float color (the format produced by ColorTools.ycwcm(float, float, float, float)) + into an RGBA8888 Color as used by libGDX (called editing).
    +
    toEditedFloat(float, float, float, float, float) - Static method in class com.github.tommyettinger.colorful.ipt_hq.ColorTools
    Gets a variation on the packed float color basis as another packed float that has its hue, saturation, lightness, @@ -8900,6 +9020,21 @@

    T

    Gets a variation on the packed float color basis as another packed float that has its hue, saturation, lightness, and opacity adjusted by the specified amounts.
    +
    toIPTColor(Color, float) - Static method in class com.github.tommyettinger.colorful.ipt_hq.ColorTools
    +
    +
    Writes an IPT_HQ-format packed float color (the format produced by ColorTools.ipt(float, float, float, float)) + into an IPT_HQ-format Color called editing.
    +
    +
    toIPTColor(Color, float) - Static method in class com.github.tommyettinger.colorful.ipt.ColorTools
    +
    +
    Writes an IPT-format packed float color (the format produced by ColorTools.ipt(float, float, float, float)) + into an IPT-format Color called editing.
    +
    +
    toOklabColor(Color, float) - Static method in class com.github.tommyettinger.colorful.oklab.ColorTools
    +
    +
    Writes an Oklab-format packed float color (the format produced by ColorTools.oklab(float, float, float, float)) + into an Oklab-format Color called editing.
    +
    toRGBA(float) - Static method in class com.github.tommyettinger.colorful.ipt_hq.ColorTools
    Converts a packed float color in the format produced by ColorTools.ipt(float, float, float, float) @@ -8961,6 +9096,11 @@

    T

    Number of rendering calls, ever.
    +
    toYCwCmColor(Color, float) - Static method in class com.github.tommyettinger.colorful.ycwcm.ColorTools
    +
    +
    Writes a YCwCm-format packed float color (the format produced by ColorTools.ycwcm(float, float, float, float)) + into a YCwCm-format Color called editing.
    +
    translate(float, float) - Method in class com.github.tommyettinger.colorful.ipt_hq.ColorfulSprite
    Sets the position relative to the current position where the sprite will be drawn.
    @@ -9414,7 +9554,7 @@

    V

    vertexShaderHSLC - Static variable in class com.github.tommyettinger.colorful.Shaders
    -
    This is the default vertex shader from libGDX, but also sets a varying value for contrast.
    +
    This is similar to the default vertex shader from libGDX, but also sets a varying value for contrast.
    VIOLET - Static variable in class com.github.tommyettinger.colorful.ipt_hq.Palette
    diff --git a/docs/colorful/apidocs/index.html b/docs/colorful/apidocs/index.html index 482fd6ce..5201e5da 100644 --- a/docs/colorful/apidocs/index.html +++ b/docs/colorful/apidocs/index.html @@ -3,7 +3,7 @@ -Overview (colorful 0.5.2-SNAPSHOT API) +Overview (colorful 0.6.0 API) @@ -51,7 +51,7 @@
    -

    colorful 0.5.2-SNAPSHOT API

    +

    colorful 0.6.0 API

    Packages
    diff --git a/docs/colorful/apidocs/member-search-index.js b/docs/colorful/apidocs/member-search-index.js index cb513a72..08d23545 100644 --- a/docs/colorful/apidocs/member-search-index.js +++ b/docs/colorful/apidocs/member-search-index.js @@ -1 +1 @@ -memberSearchIndex = [{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"acos_(double)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"acos_(float)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"acos(double)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"acos(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"ALIASES"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"ALIASES"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"ALIASES"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"appendToKnownColors()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"appendToKnownColors()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"appendToKnownColors()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"appendToKnownColors()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"appendToKnownColors()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"appendToKnownColors()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"appendToKnownColors()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"appendToKnownColors()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"asin_(double)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"asin_(float)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"asin(double)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"asin(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"atan(double)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"atan(float)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"atan2_(double, double)","u":"atan2_(double,double)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"atan2_(float, float)","u":"atan2_(float,float)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"atan2(double, double)","u":"atan2(double,double)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"atan2(float, float)","u":"atan2(float,float)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"atan2Degrees(double, double)","u":"atan2Degrees(double,double)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"atan2Degrees(float, float)","u":"atan2Degrees(float,float)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"atan2Degrees360(double, double)","u":"atan2Degrees360(double,double)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"atan2Degrees360(float, float)","u":"atan2Degrees360(float,float)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"atanDegrees(double)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"atanDegrees(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"begin()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"begin()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"begin()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"begin()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"begin()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"bestMatch(float, int)","u":"bestMatch(float,int)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"bestMatch(float, int)","u":"bestMatch(float,int)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"bestMatch(float, int)","u":"bestMatch(float,int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"BRONZE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"BRONZE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"BRONZE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"BROWN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"BROWN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"BROWN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"BUTTER"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"BUTTER"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"BUTTER"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"C1"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"C1"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"C1"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"C1"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"C1"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"C2"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"C2"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"C2"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"C2"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"C2"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"C3"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"C3"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"C3"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"C3"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"C3"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"C4"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"C4"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"C4"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"C4"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"C4"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"CACTUS"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"CACTUS"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"CACTUS"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"channelA(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"channelB(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"channelL(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"CHOCOLATE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"CHOCOLATE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"CHOCOLATE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"chroma(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"chromaMild(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"chromaWarm(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"CINNAMON"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"CINNAMON"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"CINNAMON"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"COBALT"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"COBALT"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"COBALT"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"color"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"color"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"color"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"color"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"color"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"ColorfulBatch()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"ColorfulBatch()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"ColorfulBatch()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"ColorfulBatch()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"ColorfulBatch()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"ColorfulBatch(int)","u":"%3Cinit%3E(int)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"ColorfulBatch(int)","u":"%3Cinit%3E(int)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"ColorfulBatch(int)","u":"%3Cinit%3E(int)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"ColorfulBatch(int)","u":"%3Cinit%3E(int)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"ColorfulBatch(int)","u":"%3Cinit%3E(int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"ColorfulBatch(int, ShaderProgram)","u":"%3Cinit%3E(int,com.badlogic.gdx.graphics.glutils.ShaderProgram)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"ColorfulBatch(int, ShaderProgram)","u":"%3Cinit%3E(int,com.badlogic.gdx.graphics.glutils.ShaderProgram)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"ColorfulBatch(int, ShaderProgram)","u":"%3Cinit%3E(int,com.badlogic.gdx.graphics.glutils.ShaderProgram)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"ColorfulBatch(int, ShaderProgram)","u":"%3Cinit%3E(int,com.badlogic.gdx.graphics.glutils.ShaderProgram)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"ColorfulBatch(int, ShaderProgram)","u":"%3Cinit%3E(int,com.badlogic.gdx.graphics.glutils.ShaderProgram)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"ColorfulSprite()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"ColorfulSprite()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"ColorfulSprite()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"ColorfulSprite()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"ColorfulSprite()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"ColorfulSprite(ColorfulSprite)","u":"%3Cinit%3E(com.github.tommyettinger.colorful.ipt_hq.ColorfulSprite)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"ColorfulSprite(ColorfulSprite)","u":"%3Cinit%3E(com.github.tommyettinger.colorful.ipt.ColorfulSprite)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"ColorfulSprite(ColorfulSprite)","u":"%3Cinit%3E(com.github.tommyettinger.colorful.oklab.ColorfulSprite)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"ColorfulSprite(ColorfulSprite)","u":"%3Cinit%3E(com.github.tommyettinger.colorful.rgb.ColorfulSprite)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"ColorfulSprite(ColorfulSprite)","u":"%3Cinit%3E(com.github.tommyettinger.colorful.ycwcm.ColorfulSprite)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"ColorfulSprite(Texture)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.Texture)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"ColorfulSprite(Texture)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.Texture)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"ColorfulSprite(Texture)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.Texture)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"ColorfulSprite(Texture)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.Texture)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"ColorfulSprite(Texture)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.Texture)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"ColorfulSprite(Texture, int, int)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.Texture,int,int)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"ColorfulSprite(Texture, int, int)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.Texture,int,int)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"ColorfulSprite(Texture, int, int)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.Texture,int,int)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"ColorfulSprite(Texture, int, int)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.Texture,int,int)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"ColorfulSprite(Texture, int, int)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.Texture,int,int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"ColorfulSprite(Texture, int, int, int, int)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.Texture,int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"ColorfulSprite(Texture, int, int, int, int)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.Texture,int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"ColorfulSprite(Texture, int, int, int, int)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.Texture,int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"ColorfulSprite(Texture, int, int, int, int)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.Texture,int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"ColorfulSprite(Texture, int, int, int, int)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.Texture,int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"ColorfulSprite(TextureRegion)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.g2d.TextureRegion)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"ColorfulSprite(TextureRegion)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.g2d.TextureRegion)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"ColorfulSprite(TextureRegion)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.g2d.TextureRegion)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"ColorfulSprite(TextureRegion)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.g2d.TextureRegion)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"ColorfulSprite(TextureRegion)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.g2d.TextureRegion)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"ColorfulSprite(TextureRegion, int, int, int, int)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.g2d.TextureRegion,int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"ColorfulSprite(TextureRegion, int, int, int, int)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.g2d.TextureRegion,int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"ColorfulSprite(TextureRegion, int, int, int, int)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.g2d.TextureRegion,int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"ColorfulSprite(TextureRegion, int, int, int, int)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.g2d.TextureRegion,int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"ColorfulSprite(TextureRegion, int, int, int, int)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.g2d.TextureRegion,int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"COLORS_BY_HUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"COLORS_BY_HUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"COLORS_BY_HUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"cool(float, float)","u":"cool(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"cos_(double)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"cos_(float)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"cos(double)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"cos(float)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"cosDegrees(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"createDefaultShader()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"createDefaultShader()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"createDefaultShader()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"createDefaultShader()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"createDefaultShader()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"DENIM"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"DENIM"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"DENIM"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"disableBlending()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"disableBlending()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"disableBlending()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"disableBlending()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"disableBlending()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"dispose()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"dispose()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"dispose()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"dispose()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"dispose()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"draw(ColorfulBatch)","u":"draw(com.github.tommyettinger.colorful.ipt_hq.ColorfulBatch)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"draw(ColorfulBatch)","u":"draw(com.github.tommyettinger.colorful.ipt.ColorfulBatch)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"draw(ColorfulBatch)","u":"draw(com.github.tommyettinger.colorful.oklab.ColorfulBatch)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"draw(ColorfulBatch)","u":"draw(com.github.tommyettinger.colorful.rgb.ColorfulBatch)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"draw(ColorfulBatch)","u":"draw(com.github.tommyettinger.colorful.ycwcm.ColorfulBatch)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"draw(ColorfulBatch, float)","u":"draw(com.github.tommyettinger.colorful.ipt_hq.ColorfulBatch,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"draw(ColorfulBatch, float)","u":"draw(com.github.tommyettinger.colorful.ipt.ColorfulBatch,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"draw(ColorfulBatch, float)","u":"draw(com.github.tommyettinger.colorful.oklab.ColorfulBatch,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"draw(ColorfulBatch, float)","u":"draw(com.github.tommyettinger.colorful.rgb.ColorfulBatch,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"draw(ColorfulBatch, float)","u":"draw(com.github.tommyettinger.colorful.ycwcm.ColorfulBatch,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"draw(Texture, float, float)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"draw(Texture, float, float)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"draw(Texture, float, float)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"draw(Texture, float, float)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"draw(Texture, float, float)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float, float, float, float, float, float, int, int, int, int, boolean, boolean)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float,float,float,float,float,float,int,int,int,int,boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float, float, float, float, float, float, int, int, int, int, boolean, boolean)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float,float,float,float,float,float,int,int,int,int,boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float, float, float, float, float, float, int, int, int, int, boolean, boolean)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float,float,float,float,float,float,int,int,int,int,boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float, float, float, float, float, float, int, int, int, int, boolean, boolean)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float,float,float,float,float,float,int,int,int,int,boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float, float, float, float, float, float, int, int, int, int, boolean, boolean)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float,float,float,float,float,float,int,int,int,int,boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float, int, int, int, int, boolean, boolean)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float,int,int,int,int,boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float, int, int, int, int, boolean, boolean)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float,int,int,int,int,boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float, int, int, int, int, boolean, boolean)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float,int,int,int,int,boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float, int, int, int, int, boolean, boolean)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float,int,int,int,int,boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float, int, int, int, int, boolean, boolean)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float,int,int,int,int,boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"draw(Texture, float, float, int, int, int, int)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"draw(Texture, float, float, int, int, int, int)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"draw(Texture, float, float, int, int, int, int)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"draw(Texture, float, float, int, int, int, int)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"draw(Texture, float, float, int, int, int, int)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"draw(Texture, float[], int, int)","u":"draw(com.badlogic.gdx.graphics.Texture,float[],int,int)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"draw(Texture, float[], int, int)","u":"draw(com.badlogic.gdx.graphics.Texture,float[],int,int)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"draw(Texture, float[], int, int)","u":"draw(com.badlogic.gdx.graphics.Texture,float[],int,int)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"draw(Texture, float[], int, int)","u":"draw(com.badlogic.gdx.graphics.Texture,float[],int,int)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"draw(Texture, float[], int, int)","u":"draw(com.badlogic.gdx.graphics.Texture,float[],int,int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"draw(TextureRegion, float, float)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"draw(TextureRegion, float, float)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"draw(TextureRegion, float, float)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"draw(TextureRegion, float, float)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"draw(TextureRegion, float, float)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, Affine2)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,com.badlogic.gdx.math.Affine2)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, Affine2)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,com.badlogic.gdx.math.Affine2)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, Affine2)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,com.badlogic.gdx.math.Affine2)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, Affine2)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,com.badlogic.gdx.math.Affine2)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, Affine2)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,com.badlogic.gdx.math.Affine2)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, float, float, float, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, float, float, float, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, float, float, float, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, float, float, float, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, float, float, float, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, float, float, float, float, float, float, float, boolean)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,float,float,float,float,float,float,float,boolean)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, float, float, float, float, float, float, float, boolean)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,float,float,float,float,float,float,float,boolean)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, float, float, float, float, float, float, float, boolean)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,float,float,float,float,float,float,float,boolean)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, float, float, float, float, float, float, float, boolean)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,float,float,float,float,float,float,float,boolean)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, float, float, float, float, float, float, float, boolean)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,float,float,float,float,float,float,float,boolean)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"drawExactly(Texture, float[], int, int)","u":"drawExactly(com.badlogic.gdx.graphics.Texture,float[],int,int)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"drawExactly(Texture, float[], int, int)","u":"drawExactly(com.badlogic.gdx.graphics.Texture,float[],int,int)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"drawExactly(Texture, float[], int, int)","u":"drawExactly(com.badlogic.gdx.graphics.Texture,float[],int,int)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"drawExactly(Texture, float[], int, int)","u":"drawExactly(com.badlogic.gdx.graphics.Texture,float[],int,int)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"drawExactly(Texture, float[], int, int)","u":"drawExactly(com.badlogic.gdx.graphics.Texture,float[],int,int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"dullen(float, float)","u":"dullen(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"dullen(float, float)","u":"dullen(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"dullen(float, float)","u":"dullen(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"dullen(float, float)","u":"dullen(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"editKnownColors()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"editKnownColors()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"editKnownColors()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"editKnownColors()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"editKnownColors()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"editKnownColors()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"EMBER"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"EMBER"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"EMBER"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"enableBlending()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"enableBlending()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"enableBlending()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"enableBlending()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"enableBlending()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"end()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"end()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"end()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"end()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"end()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"enrich(float, float)","u":"enrich(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"enrich(float, float)","u":"enrich(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"enrich(float, float)","u":"enrich(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"enrich(float, float)","u":"enrich(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"FERN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"FERN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"FERN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"flip(boolean, boolean)","u":"flip(boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"flip(boolean, boolean)","u":"flip(boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"flip(boolean, boolean)","u":"flip(boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"flip(boolean, boolean)","u":"flip(boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"flip(boolean, boolean)","u":"flip(boolean,boolean)"},{"p":"com.github.tommyettinger.colorful","c":"FloatColors","l":"FloatColors()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"flush()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"flush()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"flush()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"flush()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"flush()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShader"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderConfigurableContrast"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderDayNight"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderFlatLightness"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderGammaRGBA"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderHigherContrast"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderHSI"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderHSL"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderHSLA"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderHSLC"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderHSLC2"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderHSLC3"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderHSLP"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderHSLPsychedelic"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderIPT"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderIPT_HQ"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderLowerContrast"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderOklab"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderReplacement"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderRGBA"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderRotateHSL"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"fromColor(Color)","u":"fromColor(com.badlogic.gdx.graphics.Color)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"fromColor(Color)","u":"fromColor(com.badlogic.gdx.graphics.Color)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"fromColor(Color)","u":"fromColor(com.badlogic.gdx.graphics.Color)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"fromColor(Color)","u":"fromColor(com.badlogic.gdx.graphics.Color)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"fromColor(Color)","u":"fromColor(com.badlogic.gdx.graphics.Color)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"fromHSI(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"fromHSI(float, float, float, float)","u":"fromHSI(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"fromRGBA(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"fromRGBA(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"fromRGBA(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"fromRGBA(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"getBlendDstFunc()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"getBlendDstFunc()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"getBlendDstFunc()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"getBlendDstFunc()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"getBlendDstFunc()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"getBlendDstFuncAlpha()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"getBlendDstFuncAlpha()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"getBlendDstFuncAlpha()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"getBlendDstFuncAlpha()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"getBlendDstFuncAlpha()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"getBlendSrcFunc()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"getBlendSrcFunc()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"getBlendSrcFunc()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"getBlendSrcFunc()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"getBlendSrcFunc()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"getBlendSrcFuncAlpha()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"getBlendSrcFuncAlpha()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"getBlendSrcFuncAlpha()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"getBlendSrcFuncAlpha()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"getBlendSrcFuncAlpha()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"getBoundingRectangle()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"getBoundingRectangle()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"getBoundingRectangle()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"getBoundingRectangle()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"getBoundingRectangle()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"getColor()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"getColor()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"getColor()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"getColor()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"getColor()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"getColor()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"getColor()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"getColor()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"getColor()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"getColor()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"getColorTweak()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"getColorTweak()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"getColorTweak()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"getColorTweak()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"getColorTweak()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"getHeight()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"getHeight()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"getHeight()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"getHeight()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"getHeight()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"getOriginX()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"getOriginX()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"getOriginX()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"getOriginX()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"getOriginX()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"getOriginY()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"getOriginY()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"getOriginY()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"getOriginY()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"getOriginY()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"getPackedColor()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"getPackedColor()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"getPackedColor()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"getPackedColor()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"getPackedColor()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"getProjectionMatrix()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"getProjectionMatrix()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"getProjectionMatrix()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"getProjectionMatrix()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"getProjectionMatrix()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"getRawGamutValue(int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"getRotation()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"getRotation()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"getRotation()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"getRotation()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"getRotation()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"getScaleX()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"getScaleX()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"getScaleX()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"getScaleX()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"getScaleX()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"getScaleY()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"getScaleY()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"getScaleY()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"getScaleY()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"getScaleY()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"getShader()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"getShader()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"getShader()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"getShader()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"getShader()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"getTransformMatrix()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"getTransformMatrix()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"getTransformMatrix()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"getTransformMatrix()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"getTransformMatrix()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"getTweak()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"getTweak()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"getTweak()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"getTweak()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"getTweak()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"getVertices()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"getVertices()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"getVertices()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"getVertices()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"getVertices()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"getWidth()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"getWidth()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"getWidth()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"getWidth()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"getWidth()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"getX()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"getX()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"getX()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"getX()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"getX()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"getY()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"getY()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"getY()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"getY()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"getY()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful","c":"FloatColors","l":"hsl2rgb(float)"},{"p":"com.github.tommyettinger.colorful","c":"FloatColors","l":"hsl2rgb(float, float, float, float)","u":"hsl2rgb(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"hueRodrigues"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"inGamut(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"inGamut(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"inGamut(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"inGamut(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"inGamut(float, float, float)","u":"inGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"inGamut(float, float, float)","u":"inGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"inGamut(float, float, float)","u":"inGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"inGamut(float, float, float)","u":"inGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"intensity(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"intensity(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"ipt(float, float, float, float)","u":"ipt(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"ipt(float, float, float, float)","u":"ipt(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"isBlendingEnabled()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"isBlendingEnabled()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"isBlendingEnabled()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"isBlendingEnabled()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"isBlendingEnabled()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"isDrawing()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"isDrawing()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"isDrawing()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"isDrawing()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"isDrawing()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful","c":"FloatColors","l":"lerpFloatColors(float, float, float)","u":"lerpFloatColors(float,float,float)"},{"p":"com.github.tommyettinger.colorful","c":"FloatColors","l":"lerpFloatColorsBlended(float, float, float)","u":"lerpFloatColorsBlended(float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"LIME"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"LIME"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"LIME"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"limitToGamut(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"limitToGamut(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"limitToGamut(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"limitToGamut(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"limitToGamut(float, float, float)","u":"limitToGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"limitToGamut(float, float, float)","u":"limitToGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"limitToGamut(float, float, float)","u":"limitToGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"limitToGamut(float, float, float)","u":"limitToGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"limitToGamut(float, float, float, float)","u":"limitToGamut(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"limitToGamut(float, float, float, float)","u":"limitToGamut(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"limitToGamut(float, float, float, float)","u":"limitToGamut(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"limitToGamut(float, float, float, float)","u":"limitToGamut(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"lowerA(float, float)","u":"lowerA(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"lowerB(float, float)","u":"lowerB(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"luma(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"makeBatch()"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"makeBatch(float)"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"makeBatchHSLC()"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"makeGammaRGBAShader()"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"makeRGBAShader()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"maximizeSaturation(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"maximizeSaturation(float, float, float, float)","u":"maximizeSaturation(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"maxSpritesInBatch"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"maxSpritesInBatch"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"maxSpritesInBatch"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"maxSpritesInBatch"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"maxSpritesInBatch"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"MINT"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"MINT"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"MINT"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful","c":"FloatColors","l":"mix(float, float)","u":"mix(float,float)"},{"p":"com.github.tommyettinger.colorful","c":"FloatColors","l":"mix(float, float, float)","u":"mix(float,float,float)"},{"p":"com.github.tommyettinger.colorful","c":"FloatColors","l":"mix(float, float, float, float)","u":"mix(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful","c":"FloatColors","l":"mix(float...)"},{"p":"com.github.tommyettinger.colorful","c":"FloatColors","l":"mix(float[], int, int)","u":"mix(float[],int,int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"MOSS"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"MOSS"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"MOSS"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful","c":"FloatColors","l":"multiplyAlpha(float, float)","u":"multiplyAlpha(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"NAVY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"NAVY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"NAVY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"oklab(float, float, float, float)","u":"oklab(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"OLIVE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"OLIVE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"OLIVE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"parseDescription(String)","u":"parseDescription(java.lang.String)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"parseDescription(String)","u":"parseDescription(java.lang.String)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"parseDescription(String)","u":"parseDescription(java.lang.String)"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"partialCodeHSL"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"partialCodeHSLStretched"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"PEAR"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"PEAR"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"PEAR"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"PINK"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"PINK"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"PINK"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"PLUM"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"PLUM"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"PLUM"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"protan(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"protan(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"protanDown(float, float)","u":"protanDown(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"protanDown(float, float)","u":"protanDown(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"protanUp(float, float)","u":"protanUp(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"protanUp(float, float)","u":"protanUp(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"raiseA(float, float)","u":"raiseA(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"raiseB(float, float)","u":"raiseB(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"RED"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"RED"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"RED"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"renderCalls"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"renderCalls"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"renderCalls"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"renderCalls"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"renderCalls"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"rgb(float, float, float, float)","u":"rgb(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful","c":"FloatColors","l":"rgb2hsl(float)"},{"p":"com.github.tommyettinger.colorful","c":"FloatColors","l":"rgb2hsl(float, float, float, float)","u":"rgb2hsl(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"rotate(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"rotate(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"rotate(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"rotate(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"rotate(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"rotate90(boolean)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"rotate90(boolean)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"rotate90(boolean)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"rotate90(boolean)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"rotate90(boolean)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"SAGE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"SAGE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"SAGE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"scale(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"scale(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"scale(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"scale(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"scale(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"scroll(float, float)","u":"scroll(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"scroll(float, float)","u":"scroll(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"scroll(float, float)","u":"scroll(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"scroll(float, float)","u":"scroll(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"scroll(float, float)","u":"scroll(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"set(ColorfulSprite)","u":"set(com.github.tommyettinger.colorful.ipt_hq.ColorfulSprite)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"set(ColorfulSprite)","u":"set(com.github.tommyettinger.colorful.ipt.ColorfulSprite)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"set(ColorfulSprite)","u":"set(com.github.tommyettinger.colorful.oklab.ColorfulSprite)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"set(ColorfulSprite)","u":"set(com.github.tommyettinger.colorful.rgb.ColorfulSprite)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"set(ColorfulSprite)","u":"set(com.github.tommyettinger.colorful.ycwcm.ColorfulSprite)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setAlpha(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setAlpha(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setAlpha(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setAlpha(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setAlpha(float)"},{"p":"com.github.tommyettinger.colorful","c":"FloatColors","l":"setAlpha(float, float)","u":"setAlpha(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setBlendFunction(int, int)","u":"setBlendFunction(int,int)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setBlendFunction(int, int)","u":"setBlendFunction(int,int)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setBlendFunction(int, int)","u":"setBlendFunction(int,int)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setBlendFunction(int, int)","u":"setBlendFunction(int,int)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setBlendFunction(int, int)","u":"setBlendFunction(int,int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setBlendFunctionSeparate(int, int, int, int)","u":"setBlendFunctionSeparate(int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setBlendFunctionSeparate(int, int, int, int)","u":"setBlendFunctionSeparate(int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setBlendFunctionSeparate(int, int, int, int)","u":"setBlendFunctionSeparate(int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setBlendFunctionSeparate(int, int, int, int)","u":"setBlendFunctionSeparate(int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setBlendFunctionSeparate(int, int, int, int)","u":"setBlendFunctionSeparate(int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setBounds(float, float, float, float)","u":"setBounds(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setBounds(float, float, float, float)","u":"setBounds(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setBounds(float, float, float, float)","u":"setBounds(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setBounds(float, float, float, float)","u":"setBounds(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setBounds(float, float, float, float)","u":"setBounds(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setCenter(float, float)","u":"setCenter(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setCenter(float, float)","u":"setCenter(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setCenter(float, float)","u":"setCenter(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setCenter(float, float)","u":"setCenter(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setCenter(float, float)","u":"setCenter(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setCenterX(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setCenterX(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setCenterX(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setCenterX(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setCenterX(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setCenterY(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setCenterY(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setCenterY(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setCenterY(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setCenterY(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setColor(Color)","u":"setColor(com.badlogic.gdx.graphics.Color)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setColor(Color)","u":"setColor(com.badlogic.gdx.graphics.Color)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setColor(Color)","u":"setColor(com.badlogic.gdx.graphics.Color)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setColor(Color)","u":"setColor(com.badlogic.gdx.graphics.Color)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setColor(Color)","u":"setColor(com.badlogic.gdx.graphics.Color)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setColor(Color)","u":"setColor(com.badlogic.gdx.graphics.Color)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setColor(Color)","u":"setColor(com.badlogic.gdx.graphics.Color)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setColor(Color)","u":"setColor(com.badlogic.gdx.graphics.Color)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setColor(Color)","u":"setColor(com.badlogic.gdx.graphics.Color)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setColor(Color)","u":"setColor(com.badlogic.gdx.graphics.Color)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setColor(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setColor(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setColor(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setColor(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setColor(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setColor(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setColor(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setColor(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setColor(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setColor(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setColor(float, float, float, float)","u":"setColor(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setColor(float, float, float, float)","u":"setColor(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setColor(float, float, float, float)","u":"setColor(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setColor(float, float, float, float)","u":"setColor(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setColor(float, float, float, float)","u":"setColor(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setColor(float, float, float, float)","u":"setColor(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setColor(float, float, float, float)","u":"setColor(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setColor(float, float, float, float)","u":"setColor(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setColor(float, float, float, float)","u":"setColor(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setColor(float, float, float, float)","u":"setColor(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setFlip(boolean, boolean)","u":"setFlip(boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setFlip(boolean, boolean)","u":"setFlip(boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setFlip(boolean, boolean)","u":"setFlip(boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setFlip(boolean, boolean)","u":"setFlip(boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setFlip(boolean, boolean)","u":"setFlip(boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setIntColor(int)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setIntColor(int)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setIntColor(int)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setIntColor(int)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setIntColor(int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setIntColor(int, int, int, int)","u":"setIntColor(int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setIntColor(int, int, int, int)","u":"setIntColor(int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setIntColor(int, int, int, int)","u":"setIntColor(int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setIntColor(int, int, int, int)","u":"setIntColor(int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setIntColor(int, int, int, int)","u":"setIntColor(int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setIntTweak(int)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setIntTweak(int)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setIntTweak(int)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setIntTweak(int)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setIntTweak(int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setIntTweak(int, int, int, int)","u":"setIntTweak(int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setIntTweak(int, int, int, int)","u":"setIntTweak(int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setIntTweak(int, int, int, int)","u":"setIntTweak(int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setIntTweak(int, int, int, int)","u":"setIntTweak(int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setIntTweak(int, int, int, int)","u":"setIntTweak(int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setOrigin(float, float)","u":"setOrigin(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setOrigin(float, float)","u":"setOrigin(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setOrigin(float, float)","u":"setOrigin(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setOrigin(float, float)","u":"setOrigin(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setOrigin(float, float)","u":"setOrigin(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setOriginBasedPosition(float, float)","u":"setOriginBasedPosition(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setOriginBasedPosition(float, float)","u":"setOriginBasedPosition(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setOriginBasedPosition(float, float)","u":"setOriginBasedPosition(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setOriginBasedPosition(float, float)","u":"setOriginBasedPosition(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setOriginBasedPosition(float, float)","u":"setOriginBasedPosition(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setOriginCenter()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setOriginCenter()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setOriginCenter()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setOriginCenter()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setOriginCenter()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setPackedColor(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setPackedColor(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setPackedColor(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setPackedColor(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setPackedColor(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setPackedColor(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setPackedColor(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setPackedColor(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setPackedColor(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setPackedColor(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setPosition(float, float)","u":"setPosition(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setPosition(float, float)","u":"setPosition(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setPosition(float, float)","u":"setPosition(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setPosition(float, float)","u":"setPosition(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setPosition(float, float)","u":"setPosition(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setProjectionMatrix(Matrix4)","u":"setProjectionMatrix(com.badlogic.gdx.math.Matrix4)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setProjectionMatrix(Matrix4)","u":"setProjectionMatrix(com.badlogic.gdx.math.Matrix4)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setProjectionMatrix(Matrix4)","u":"setProjectionMatrix(com.badlogic.gdx.math.Matrix4)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setProjectionMatrix(Matrix4)","u":"setProjectionMatrix(com.badlogic.gdx.math.Matrix4)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setProjectionMatrix(Matrix4)","u":"setProjectionMatrix(com.badlogic.gdx.math.Matrix4)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setRegion(float, float, float, float)","u":"setRegion(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setRegion(float, float, float, float)","u":"setRegion(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setRegion(float, float, float, float)","u":"setRegion(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setRegion(float, float, float, float)","u":"setRegion(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setRegion(float, float, float, float)","u":"setRegion(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setRotation(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setRotation(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setRotation(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setRotation(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setRotation(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setScale(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setScale(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setScale(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setScale(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setScale(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setScale(float, float)","u":"setScale(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setScale(float, float)","u":"setScale(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setScale(float, float)","u":"setScale(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setScale(float, float)","u":"setScale(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setScale(float, float)","u":"setScale(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setShader(ShaderProgram)","u":"setShader(com.badlogic.gdx.graphics.glutils.ShaderProgram)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setShader(ShaderProgram)","u":"setShader(com.badlogic.gdx.graphics.glutils.ShaderProgram)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setShader(ShaderProgram)","u":"setShader(com.badlogic.gdx.graphics.glutils.ShaderProgram)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setShader(ShaderProgram)","u":"setShader(com.badlogic.gdx.graphics.glutils.ShaderProgram)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setShader(ShaderProgram)","u":"setShader(com.badlogic.gdx.graphics.glutils.ShaderProgram)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setSize(float, float)","u":"setSize(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setSize(float, float)","u":"setSize(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setSize(float, float)","u":"setSize(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setSize(float, float)","u":"setSize(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setSize(float, float)","u":"setSize(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setTransformMatrix(Matrix4)","u":"setTransformMatrix(com.badlogic.gdx.math.Matrix4)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setTransformMatrix(Matrix4)","u":"setTransformMatrix(com.badlogic.gdx.math.Matrix4)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setTransformMatrix(Matrix4)","u":"setTransformMatrix(com.badlogic.gdx.math.Matrix4)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setTransformMatrix(Matrix4)","u":"setTransformMatrix(com.badlogic.gdx.math.Matrix4)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setTransformMatrix(Matrix4)","u":"setTransformMatrix(com.badlogic.gdx.math.Matrix4)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setTweak(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setTweak(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setTweak(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setTweak(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setTweak(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setTweak(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setTweak(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setTweak(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setTweak(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setTweak(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setTweak(float, float, float, float)","u":"setTweak(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setTweak(float, float, float, float)","u":"setTweak(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setTweak(float, float, float, float)","u":"setTweak(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setTweak(float, float, float, float)","u":"setTweak(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setTweak(float, float, float, float)","u":"setTweak(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setTweak(float, float, float, float)","u":"setTweak(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setTweak(float, float, float, float)","u":"setTweak(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setTweak(float, float, float, float)","u":"setTweak(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setTweak(float, float, float, float)","u":"setTweak(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setTweak(float, float, float, float)","u":"setTweak(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setTweakedColor(float, float)","u":"setTweakedColor(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setTweakedColor(float, float)","u":"setTweakedColor(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setTweakedColor(float, float)","u":"setTweakedColor(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setTweakedColor(float, float)","u":"setTweakedColor(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setTweakedColor(float, float)","u":"setTweakedColor(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setTweakedColor(float, float)","u":"setTweakedColor(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setTweakedColor(float, float)","u":"setTweakedColor(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setTweakedColor(float, float)","u":"setTweakedColor(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setTweakedColor(float, float)","u":"setTweakedColor(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setTweakedColor(float, float)","u":"setTweakedColor(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setTweakedColor(float, float, float, float, float, float, float, float)","u":"setTweakedColor(float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setTweakedColor(float, float, float, float, float, float, float, float)","u":"setTweakedColor(float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setTweakedColor(float, float, float, float, float, float, float, float)","u":"setTweakedColor(float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setTweakedColor(float, float, float, float, float, float, float, float)","u":"setTweakedColor(float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setTweakedColor(float, float, float, float, float, float, float, float)","u":"setTweakedColor(float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setTweakedColor(float, float, float, float, float, float, float, float)","u":"setTweakedColor(float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setTweakedColor(float, float, float, float, float, float, float, float)","u":"setTweakedColor(float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setTweakedColor(float, float, float, float, float, float, float, float)","u":"setTweakedColor(float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setTweakedColor(float, float, float, float, float, float, float, float)","u":"setTweakedColor(float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setTweakedColor(float, float, float, float, float, float, float, float)","u":"setTweakedColor(float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setU(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setU(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setU(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setU(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setU(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setU2(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setU2(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setU2(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setU2(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setU2(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setupMatrices()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setupMatrices()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setupMatrices()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setupMatrices()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setupMatrices()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setV(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setV(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setV(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setV(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setV(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setV2(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setV2(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setV2(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setV2(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setV2(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setX(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setX(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setX(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setX(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setX(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setY(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setY(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setY(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setY(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setY(float)"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"Shaders()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"SimplePalette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"SimplePalette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"SimplePalette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"sin_(double)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"sin_(float)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"sin(double)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"sin(float)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"sinDegrees(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"SKY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"SKY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"SKY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"SPRITE_SIZE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"SPRITE_SIZE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"SPRITE_SIZE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"SPRITE_SIZE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"SPRITE_SIZE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"SPRITE_SIZE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"SPRITE_SIZE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"SPRITE_SIZE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"SPRITE_SIZE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"SPRITE_SIZE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"strengthen(float, float)","u":"strengthen(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"subrandomColor(float, float, float)","u":"subrandomColor(float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"subrandomColor(float, float, float)","u":"subrandomColor(float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"switchTexture(Texture)","u":"switchTexture(com.badlogic.gdx.graphics.Texture)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"switchTexture(Texture)","u":"switchTexture(com.badlogic.gdx.graphics.Texture)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"switchTexture(Texture)","u":"switchTexture(com.badlogic.gdx.graphics.Texture)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"switchTexture(Texture)","u":"switchTexture(com.badlogic.gdx.graphics.Texture)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"switchTexture(Texture)","u":"switchTexture(com.badlogic.gdx.graphics.Texture)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"T1"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"T1"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"T1"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"T1"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"T1"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"T2"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"T2"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"T2"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"T2"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"T2"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"T3"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"T3"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"T3"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"T3"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"T3"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"T4"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"T4"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"T4"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"T4"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"T4"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"TEAL"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"TEAL"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"TEAL"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"toColor(Color, float)","u":"toColor(com.badlogic.gdx.graphics.Color,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"toColor(Color, float)","u":"toColor(com.badlogic.gdx.graphics.Color,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"toColor(Color, float)","u":"toColor(com.badlogic.gdx.graphics.Color,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"toColor(Color, float)","u":"toColor(com.badlogic.gdx.graphics.Color,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"toRGBA(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"toRGBA(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"toRGBA(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"toRGBA(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"totalRenderCalls"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"totalRenderCalls"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"totalRenderCalls"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"totalRenderCalls"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"totalRenderCalls"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"translate(float, float)","u":"translate(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"translate(float, float)","u":"translate(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"translate(float, float)","u":"translate(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"translate(float, float)","u":"translate(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"translate(float, float)","u":"translate(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"translateX(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"translateX(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"translateX(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"translateX(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"translateX(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"translateY(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"translateY(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"translateY(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"translateY(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"translateY(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"TrigTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"tritan(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"tritan(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"tritanDown(float, float)","u":"tritanDown(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"tritanDown(float, float)","u":"tritanDown(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"tritanUp(float, float)","u":"tritanUp(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"tritanUp(float, float)","u":"tritanUp(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"tweak"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"tweak"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"tweak"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"tweak"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"tweak"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"TWEAK_ATTRIBUTE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"TWEAK_ATTRIBUTE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"TWEAK_ATTRIBUTE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"TWEAK_ATTRIBUTE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"TWEAK_ATTRIBUTE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"TWEAK_RESET"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"TWEAK_RESET"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"TWEAK_RESET"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"TWEAK_RESET"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"TWEAK_RESET"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"U1"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"U1"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"U1"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"U1"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"U1"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"U2"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"U2"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"U2"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"U2"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"U2"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"U3"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"U3"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"U3"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"U3"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"U3"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"U4"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"U4"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"U4"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"U4"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"U4"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"V1"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"V1"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"V1"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"V1"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"V1"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"V2"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"V2"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"V2"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"V2"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"V2"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"V3"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"V3"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"V3"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"V3"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"V3"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"V4"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"V4"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"V4"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"V4"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"V4"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"VERTEX_SIZE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"VERTEX_SIZE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"VERTEX_SIZE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"VERTEX_SIZE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"VERTEX_SIZE"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"vertexShader"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"vertexShaderDayNight"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"vertexShaderHSI"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"vertexShaderHSLC"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"warm(float, float)","u":"warm(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"weaken(float, float)","u":"weaken(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"X1"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"X1"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"X1"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"X1"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"X1"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"X2"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"X2"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"X2"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"X2"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"X2"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"X3"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"X3"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"X3"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"X3"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"X3"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"X4"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"X4"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"X4"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"X4"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"X4"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"Y1"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"Y1"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"Y1"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"Y1"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"Y1"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"Y2"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"Y2"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"Y2"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"Y2"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"Y2"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"Y3"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"Y3"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"Y3"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"Y3"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"Y3"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"Y4"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"Y4"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"Y4"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"Y4"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"Y4"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"ycwcm(float, float, float, float)","u":"ycwcm(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"ZUCCHINI"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"ZUCCHINI"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"ZUCCHINI"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"ZUCCHINI"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"ZUCCHINI"}];updateSearchResults(); \ No newline at end of file +memberSearchIndex = [{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"acos_(double)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"acos_(float)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"acos(double)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"acos(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"ALIASES"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"ALIASES"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"ALIASES"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"appendToKnownColors()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"appendToKnownColors()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"appendToKnownColors()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"appendToKnownColors()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"appendToKnownColors()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"appendToKnownColors()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"appendToKnownColors()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"appendToKnownColors()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"asin_(double)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"asin_(float)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"asin(double)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"asin(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"atan(double)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"atan(float)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"atan2_(double, double)","u":"atan2_(double,double)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"atan2_(float, float)","u":"atan2_(float,float)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"atan2(double, double)","u":"atan2(double,double)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"atan2(float, float)","u":"atan2(float,float)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"atan2Degrees(double, double)","u":"atan2Degrees(double,double)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"atan2Degrees(float, float)","u":"atan2Degrees(float,float)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"atan2Degrees360(double, double)","u":"atan2Degrees360(double,double)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"atan2Degrees360(float, float)","u":"atan2Degrees360(float,float)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"atanDegrees(double)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"atanDegrees(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"begin()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"begin()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"begin()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"begin()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"begin()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"bestMatch(float, int)","u":"bestMatch(float,int)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"bestMatch(float, int)","u":"bestMatch(float,int)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"bestMatch(float, int)","u":"bestMatch(float,int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"BRONZE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"BRONZE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"BRONZE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"BROWN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"BROWN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"BROWN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"BUTTER"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"BUTTER"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"BUTTER"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"C1"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"C1"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"C1"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"C1"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"C1"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"C2"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"C2"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"C2"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"C2"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"C2"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"C3"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"C3"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"C3"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"C3"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"C3"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"C4"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"C4"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"C4"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"C4"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"C4"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"CACTUS"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"CACTUS"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"CACTUS"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"channelA(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"channelB(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"channelL(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"CHOCOLATE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"CHOCOLATE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"CHOCOLATE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"chroma(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"chromaLimit(float, float)","u":"chromaLimit(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"chromaMild(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"chromaWarm(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"CINNAMON"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"CINNAMON"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"CINNAMON"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"COBALT"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"COBALT"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"COBALT"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"color"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"color"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"color"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"color"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"color"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"ColorfulBatch()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"ColorfulBatch()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"ColorfulBatch()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"ColorfulBatch()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"ColorfulBatch()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"ColorfulBatch(int)","u":"%3Cinit%3E(int)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"ColorfulBatch(int)","u":"%3Cinit%3E(int)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"ColorfulBatch(int)","u":"%3Cinit%3E(int)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"ColorfulBatch(int)","u":"%3Cinit%3E(int)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"ColorfulBatch(int)","u":"%3Cinit%3E(int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"ColorfulBatch(int, ShaderProgram)","u":"%3Cinit%3E(int,com.badlogic.gdx.graphics.glutils.ShaderProgram)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"ColorfulBatch(int, ShaderProgram)","u":"%3Cinit%3E(int,com.badlogic.gdx.graphics.glutils.ShaderProgram)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"ColorfulBatch(int, ShaderProgram)","u":"%3Cinit%3E(int,com.badlogic.gdx.graphics.glutils.ShaderProgram)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"ColorfulBatch(int, ShaderProgram)","u":"%3Cinit%3E(int,com.badlogic.gdx.graphics.glutils.ShaderProgram)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"ColorfulBatch(int, ShaderProgram)","u":"%3Cinit%3E(int,com.badlogic.gdx.graphics.glutils.ShaderProgram)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"ColorfulSprite()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"ColorfulSprite()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"ColorfulSprite()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"ColorfulSprite()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"ColorfulSprite()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"ColorfulSprite(ColorfulSprite)","u":"%3Cinit%3E(com.github.tommyettinger.colorful.ipt_hq.ColorfulSprite)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"ColorfulSprite(ColorfulSprite)","u":"%3Cinit%3E(com.github.tommyettinger.colorful.ipt.ColorfulSprite)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"ColorfulSprite(ColorfulSprite)","u":"%3Cinit%3E(com.github.tommyettinger.colorful.oklab.ColorfulSprite)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"ColorfulSprite(ColorfulSprite)","u":"%3Cinit%3E(com.github.tommyettinger.colorful.rgb.ColorfulSprite)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"ColorfulSprite(ColorfulSprite)","u":"%3Cinit%3E(com.github.tommyettinger.colorful.ycwcm.ColorfulSprite)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"ColorfulSprite(Texture)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.Texture)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"ColorfulSprite(Texture)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.Texture)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"ColorfulSprite(Texture)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.Texture)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"ColorfulSprite(Texture)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.Texture)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"ColorfulSprite(Texture)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.Texture)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"ColorfulSprite(Texture, int, int)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.Texture,int,int)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"ColorfulSprite(Texture, int, int)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.Texture,int,int)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"ColorfulSprite(Texture, int, int)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.Texture,int,int)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"ColorfulSprite(Texture, int, int)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.Texture,int,int)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"ColorfulSprite(Texture, int, int)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.Texture,int,int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"ColorfulSprite(Texture, int, int, int, int)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.Texture,int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"ColorfulSprite(Texture, int, int, int, int)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.Texture,int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"ColorfulSprite(Texture, int, int, int, int)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.Texture,int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"ColorfulSprite(Texture, int, int, int, int)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.Texture,int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"ColorfulSprite(Texture, int, int, int, int)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.Texture,int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"ColorfulSprite(TextureRegion)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.g2d.TextureRegion)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"ColorfulSprite(TextureRegion)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.g2d.TextureRegion)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"ColorfulSprite(TextureRegion)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.g2d.TextureRegion)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"ColorfulSprite(TextureRegion)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.g2d.TextureRegion)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"ColorfulSprite(TextureRegion)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.g2d.TextureRegion)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"ColorfulSprite(TextureRegion, int, int, int, int)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.g2d.TextureRegion,int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"ColorfulSprite(TextureRegion, int, int, int, int)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.g2d.TextureRegion,int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"ColorfulSprite(TextureRegion, int, int, int, int)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.g2d.TextureRegion,int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"ColorfulSprite(TextureRegion, int, int, int, int)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.g2d.TextureRegion,int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"ColorfulSprite(TextureRegion, int, int, int, int)","u":"%3Cinit%3E(com.badlogic.gdx.graphics.g2d.TextureRegion,int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"COLORS_BY_HUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"COLORS_BY_HUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"COLORS_BY_HUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"cool(float, float)","u":"cool(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"cos_(double)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"cos_(float)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"cos(double)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"cos(float)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"cosDegrees(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"createDefaultShader()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"createDefaultShader()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"createDefaultShader()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"createDefaultShader()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"createDefaultShader()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"DENIM"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"DENIM"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"DENIM"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"disableBlending()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"disableBlending()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"disableBlending()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"disableBlending()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"disableBlending()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"dispose()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"dispose()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"dispose()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"dispose()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"dispose()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"draw(ColorfulBatch)","u":"draw(com.github.tommyettinger.colorful.ipt_hq.ColorfulBatch)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"draw(ColorfulBatch)","u":"draw(com.github.tommyettinger.colorful.ipt.ColorfulBatch)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"draw(ColorfulBatch)","u":"draw(com.github.tommyettinger.colorful.oklab.ColorfulBatch)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"draw(ColorfulBatch)","u":"draw(com.github.tommyettinger.colorful.rgb.ColorfulBatch)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"draw(ColorfulBatch)","u":"draw(com.github.tommyettinger.colorful.ycwcm.ColorfulBatch)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"draw(ColorfulBatch, float)","u":"draw(com.github.tommyettinger.colorful.ipt_hq.ColorfulBatch,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"draw(ColorfulBatch, float)","u":"draw(com.github.tommyettinger.colorful.ipt.ColorfulBatch,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"draw(ColorfulBatch, float)","u":"draw(com.github.tommyettinger.colorful.oklab.ColorfulBatch,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"draw(ColorfulBatch, float)","u":"draw(com.github.tommyettinger.colorful.rgb.ColorfulBatch,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"draw(ColorfulBatch, float)","u":"draw(com.github.tommyettinger.colorful.ycwcm.ColorfulBatch,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"draw(Texture, float, float)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"draw(Texture, float, float)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"draw(Texture, float, float)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"draw(Texture, float, float)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"draw(Texture, float, float)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float, float, float, float, float, float, int, int, int, int, boolean, boolean)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float,float,float,float,float,float,int,int,int,int,boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float, float, float, float, float, float, int, int, int, int, boolean, boolean)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float,float,float,float,float,float,int,int,int,int,boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float, float, float, float, float, float, int, int, int, int, boolean, boolean)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float,float,float,float,float,float,int,int,int,int,boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float, float, float, float, float, float, int, int, int, int, boolean, boolean)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float,float,float,float,float,float,int,int,int,int,boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float, float, float, float, float, float, int, int, int, int, boolean, boolean)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float,float,float,float,float,float,int,int,int,int,boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float, int, int, int, int, boolean, boolean)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float,int,int,int,int,boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float, int, int, int, int, boolean, boolean)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float,int,int,int,int,boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float, int, int, int, int, boolean, boolean)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float,int,int,int,int,boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float, int, int, int, int, boolean, boolean)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float,int,int,int,int,boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"draw(Texture, float, float, float, float, int, int, int, int, boolean, boolean)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,float,float,int,int,int,int,boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"draw(Texture, float, float, int, int, int, int)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"draw(Texture, float, float, int, int, int, int)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"draw(Texture, float, float, int, int, int, int)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"draw(Texture, float, float, int, int, int, int)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"draw(Texture, float, float, int, int, int, int)","u":"draw(com.badlogic.gdx.graphics.Texture,float,float,int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"draw(Texture, float[], int, int)","u":"draw(com.badlogic.gdx.graphics.Texture,float[],int,int)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"draw(Texture, float[], int, int)","u":"draw(com.badlogic.gdx.graphics.Texture,float[],int,int)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"draw(Texture, float[], int, int)","u":"draw(com.badlogic.gdx.graphics.Texture,float[],int,int)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"draw(Texture, float[], int, int)","u":"draw(com.badlogic.gdx.graphics.Texture,float[],int,int)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"draw(Texture, float[], int, int)","u":"draw(com.badlogic.gdx.graphics.Texture,float[],int,int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"draw(TextureRegion, float, float)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"draw(TextureRegion, float, float)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"draw(TextureRegion, float, float)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"draw(TextureRegion, float, float)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"draw(TextureRegion, float, float)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, Affine2)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,com.badlogic.gdx.math.Affine2)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, Affine2)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,com.badlogic.gdx.math.Affine2)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, Affine2)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,com.badlogic.gdx.math.Affine2)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, Affine2)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,com.badlogic.gdx.math.Affine2)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, Affine2)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,com.badlogic.gdx.math.Affine2)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, float, float, float, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, float, float, float, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, float, float, float, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, float, float, float, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, float, float, float, float, float, float, float)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, float, float, float, float, float, float, float, boolean)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,float,float,float,float,float,float,float,boolean)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, float, float, float, float, float, float, float, boolean)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,float,float,float,float,float,float,float,boolean)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, float, float, float, float, float, float, float, boolean)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,float,float,float,float,float,float,float,boolean)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, float, float, float, float, float, float, float, boolean)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,float,float,float,float,float,float,float,boolean)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"draw(TextureRegion, float, float, float, float, float, float, float, float, float, boolean)","u":"draw(com.badlogic.gdx.graphics.g2d.TextureRegion,float,float,float,float,float,float,float,float,float,boolean)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"drawExactly(Texture, float[], int, int)","u":"drawExactly(com.badlogic.gdx.graphics.Texture,float[],int,int)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"drawExactly(Texture, float[], int, int)","u":"drawExactly(com.badlogic.gdx.graphics.Texture,float[],int,int)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"drawExactly(Texture, float[], int, int)","u":"drawExactly(com.badlogic.gdx.graphics.Texture,float[],int,int)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"drawExactly(Texture, float[], int, int)","u":"drawExactly(com.badlogic.gdx.graphics.Texture,float[],int,int)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"drawExactly(Texture, float[], int, int)","u":"drawExactly(com.badlogic.gdx.graphics.Texture,float[],int,int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"dullen(float, float)","u":"dullen(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"dullen(float, float)","u":"dullen(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"dullen(float, float)","u":"dullen(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"dullen(float, float)","u":"dullen(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"editIPT(float, float, float, float, float)","u":"editIPT(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"editIPT(float, float, float, float, float)","u":"editIPT(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"editIPT(float, float, float, float, float, float, float, float, float)","u":"editIPT(float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"editIPT(float, float, float, float, float, float, float, float, float)","u":"editIPT(float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"editKnownColors()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"editKnownColors()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"editKnownColors()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"editKnownColors()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"editKnownColors()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"editKnownColors()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"editOklab(float, float, float, float, float)","u":"editOklab(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"editOklab(float, float, float, float, float, float, float, float, float)","u":"editOklab(float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"editRGB(float, float, float, float, float)","u":"editRGB(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"editRGB(float, float, float, float, float, float, float, float, float)","u":"editRGB(float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"editYCwCm(float, float, float, float, float)","u":"editYCwCm(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"editYCwCm(float, float, float, float, float, float, float, float, float)","u":"editYCwCm(float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"EMBER"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"EMBER"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"EMBER"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"enableBlending()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"enableBlending()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"enableBlending()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"enableBlending()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"enableBlending()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"end()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"end()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"end()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"end()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"end()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"enrich(float, float)","u":"enrich(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"enrich(float, float)","u":"enrich(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"enrich(float, float)","u":"enrich(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"enrich(float, float)","u":"enrich(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"FERN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"FERN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"FERN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"flip(boolean, boolean)","u":"flip(boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"flip(boolean, boolean)","u":"flip(boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"flip(boolean, boolean)","u":"flip(boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"flip(boolean, boolean)","u":"flip(boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"flip(boolean, boolean)","u":"flip(boolean,boolean)"},{"p":"com.github.tommyettinger.colorful","c":"FloatColors","l":"FloatColors()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"flush()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"flush()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"flush()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"flush()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"flush()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShader"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderConfigurableContrast"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderDayNight"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderFlatLightness"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderGammaRGBA"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderHigherContrast"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderHSI"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderHSL"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderHSLA"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderHSLC"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderHSLC2"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderHSLC3"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderHSLP"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderHSLPsychedelic"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderIPT"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderIPT_HQ"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderLowerContrast"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderOklab"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderReplacement"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderRGBA"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"fragmentShaderRotateHSL"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"fromColor(Color)","u":"fromColor(com.badlogic.gdx.graphics.Color)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"fromColor(Color)","u":"fromColor(com.badlogic.gdx.graphics.Color)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"fromColor(Color)","u":"fromColor(com.badlogic.gdx.graphics.Color)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"fromColor(Color)","u":"fromColor(com.badlogic.gdx.graphics.Color)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"fromColor(Color)","u":"fromColor(com.badlogic.gdx.graphics.Color)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"fromHSI(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"fromHSI(float, float, float, float)","u":"fromHSI(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"fromRGBA(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"fromRGBA(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"fromRGBA(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"fromRGBA(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"getBlendDstFunc()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"getBlendDstFunc()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"getBlendDstFunc()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"getBlendDstFunc()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"getBlendDstFunc()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"getBlendDstFuncAlpha()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"getBlendDstFuncAlpha()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"getBlendDstFuncAlpha()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"getBlendDstFuncAlpha()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"getBlendDstFuncAlpha()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"getBlendSrcFunc()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"getBlendSrcFunc()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"getBlendSrcFunc()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"getBlendSrcFunc()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"getBlendSrcFunc()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"getBlendSrcFuncAlpha()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"getBlendSrcFuncAlpha()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"getBlendSrcFuncAlpha()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"getBlendSrcFuncAlpha()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"getBlendSrcFuncAlpha()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"getBoundingRectangle()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"getBoundingRectangle()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"getBoundingRectangle()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"getBoundingRectangle()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"getBoundingRectangle()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"getColor()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"getColor()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"getColor()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"getColor()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"getColor()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"getColor()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"getColor()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"getColor()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"getColor()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"getColor()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"getColorTweak()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"getColorTweak()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"getColorTweak()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"getColorTweak()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"getColorTweak()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"getHeight()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"getHeight()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"getHeight()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"getHeight()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"getHeight()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"getOriginX()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"getOriginX()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"getOriginX()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"getOriginX()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"getOriginX()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"getOriginY()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"getOriginY()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"getOriginY()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"getOriginY()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"getOriginY()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"getPackedColor()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"getPackedColor()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"getPackedColor()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"getPackedColor()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"getPackedColor()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"getProjectionMatrix()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"getProjectionMatrix()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"getProjectionMatrix()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"getProjectionMatrix()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"getProjectionMatrix()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"getRawGamutValue(int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"getRotation()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"getRotation()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"getRotation()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"getRotation()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"getRotation()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"getScaleX()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"getScaleX()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"getScaleX()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"getScaleX()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"getScaleX()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"getScaleY()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"getScaleY()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"getScaleY()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"getScaleY()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"getScaleY()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"getShader()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"getShader()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"getShader()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"getShader()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"getShader()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"getTransformMatrix()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"getTransformMatrix()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"getTransformMatrix()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"getTransformMatrix()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"getTransformMatrix()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"getTweak()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"getTweak()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"getTweak()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"getTweak()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"getTweak()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"getVertices()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"getVertices()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"getVertices()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"getVertices()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"getVertices()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"getWidth()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"getWidth()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"getWidth()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"getWidth()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"getWidth()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"getX()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"getX()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"getX()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"getX()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"getX()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"getY()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"getY()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"getY()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"getY()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"getY()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful","c":"FloatColors","l":"hsl2rgb(float)"},{"p":"com.github.tommyettinger.colorful","c":"FloatColors","l":"hsl2rgb(float, float, float, float)","u":"hsl2rgb(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"inGamut(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"inGamut(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"inGamut(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"inGamut(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"inGamut(float, float, float)","u":"inGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"inGamut(float, float, float)","u":"inGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"inGamut(float, float, float)","u":"inGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"inGamut(float, float, float)","u":"inGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"intensity(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"intensity(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"ipt(float, float, float, float)","u":"ipt(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"ipt(float, float, float, float)","u":"ipt(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"isBlendingEnabled()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"isBlendingEnabled()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"isBlendingEnabled()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"isBlendingEnabled()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"isBlendingEnabled()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"isDrawing()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"isDrawing()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"isDrawing()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"isDrawing()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"isDrawing()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful","c":"FloatColors","l":"lerpFloatColors(float, float, float)","u":"lerpFloatColors(float,float,float)"},{"p":"com.github.tommyettinger.colorful","c":"FloatColors","l":"lerpFloatColorsBlended(float, float, float)","u":"lerpFloatColorsBlended(float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"LIME"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"LIME"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"LIME"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"limitToGamut(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"limitToGamut(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"limitToGamut(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"limitToGamut(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"limitToGamut(float, float, float)","u":"limitToGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"limitToGamut(float, float, float)","u":"limitToGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"limitToGamut(float, float, float)","u":"limitToGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"limitToGamut(float, float, float)","u":"limitToGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"limitToGamut(float, float, float, float)","u":"limitToGamut(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"limitToGamut(float, float, float, float)","u":"limitToGamut(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"limitToGamut(float, float, float, float)","u":"limitToGamut(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"limitToGamut(float, float, float, float)","u":"limitToGamut(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"lowerA(float, float)","u":"lowerA(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"lowerB(float, float)","u":"lowerB(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"lowerB(float, float)","u":"lowerB(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"lowerG(float, float)","u":"lowerG(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"lowerR(float, float)","u":"lowerR(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"luma(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"makeBatch()"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"makeBatch(float)"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"makeBatchHSLC()"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"makeGammaRGBAShader()"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"makeRGBAShader()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"maximizeSaturation(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"maximizeSaturation(float, float, float, float)","u":"maximizeSaturation(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"maxSpritesInBatch"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"maxSpritesInBatch"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"maxSpritesInBatch"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"maxSpritesInBatch"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"maxSpritesInBatch"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"MINT"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"MINT"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"MINT"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful","c":"FloatColors","l":"mix(float, float)","u":"mix(float,float)"},{"p":"com.github.tommyettinger.colorful","c":"FloatColors","l":"mix(float, float, float)","u":"mix(float,float,float)"},{"p":"com.github.tommyettinger.colorful","c":"FloatColors","l":"mix(float, float, float, float)","u":"mix(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful","c":"FloatColors","l":"mix(float...)"},{"p":"com.github.tommyettinger.colorful","c":"FloatColors","l":"mix(float[], int, int)","u":"mix(float[],int,int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"MOSS"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"MOSS"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"MOSS"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful","c":"FloatColors","l":"multiplyAlpha(float, float)","u":"multiplyAlpha(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"NAVY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"NAVY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"NAVY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"oklab(float, float, float, float)","u":"oklab(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"oklabByHCL(float, float, float, float)","u":"oklabByHCL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"oklabByHSL(float, float, float, float)","u":"oklabByHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"oklabHue(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"oklabLightness(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"oklabSaturation(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"OLIVE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"OLIVE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"OLIVE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"parseDescription(String)","u":"parseDescription(java.lang.String)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"parseDescription(String)","u":"parseDescription(java.lang.String)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"parseDescription(String)","u":"parseDescription(java.lang.String)"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"partialCodeHSL"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"partialCodeHSLStretched"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"partialHueRodrigues"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"PEAR"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"PEAR"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"PEAR"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"PINK"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"PINK"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"PINK"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"PLUM"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"PLUM"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"PLUM"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"protan(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"protan(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"protanDown(float, float)","u":"protanDown(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"protanDown(float, float)","u":"protanDown(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"protanUp(float, float)","u":"protanUp(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"protanUp(float, float)","u":"protanUp(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"raiseA(float, float)","u":"raiseA(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"raiseB(float, float)","u":"raiseB(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"raiseB(float, float)","u":"raiseB(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"raiseG(float, float)","u":"raiseG(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"raiseR(float, float)","u":"raiseR(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"RED"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"RED"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"RED"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"renderCalls"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"renderCalls"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"renderCalls"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"renderCalls"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"renderCalls"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"rgb(float, float, float, float)","u":"rgb(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful","c":"FloatColors","l":"rgb2hsl(float)"},{"p":"com.github.tommyettinger.colorful","c":"FloatColors","l":"rgb2hsl(float, float, float, float)","u":"rgb2hsl(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"rotate(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"rotate(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"rotate(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"rotate(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"rotate(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"rotate90(boolean)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"rotate90(boolean)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"rotate90(boolean)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"rotate90(boolean)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"rotate90(boolean)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"SAGE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"SAGE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"SAGE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"scale(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"scale(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"scale(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"scale(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"scale(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"scroll(float, float)","u":"scroll(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"scroll(float, float)","u":"scroll(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"scroll(float, float)","u":"scroll(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"scroll(float, float)","u":"scroll(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"scroll(float, float)","u":"scroll(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"set(ColorfulSprite)","u":"set(com.github.tommyettinger.colorful.ipt_hq.ColorfulSprite)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"set(ColorfulSprite)","u":"set(com.github.tommyettinger.colorful.ipt.ColorfulSprite)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"set(ColorfulSprite)","u":"set(com.github.tommyettinger.colorful.oklab.ColorfulSprite)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"set(ColorfulSprite)","u":"set(com.github.tommyettinger.colorful.rgb.ColorfulSprite)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"set(ColorfulSprite)","u":"set(com.github.tommyettinger.colorful.ycwcm.ColorfulSprite)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setAlpha(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setAlpha(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setAlpha(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setAlpha(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setAlpha(float)"},{"p":"com.github.tommyettinger.colorful","c":"FloatColors","l":"setAlpha(float, float)","u":"setAlpha(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setBlendFunction(int, int)","u":"setBlendFunction(int,int)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setBlendFunction(int, int)","u":"setBlendFunction(int,int)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setBlendFunction(int, int)","u":"setBlendFunction(int,int)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setBlendFunction(int, int)","u":"setBlendFunction(int,int)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setBlendFunction(int, int)","u":"setBlendFunction(int,int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setBlendFunctionSeparate(int, int, int, int)","u":"setBlendFunctionSeparate(int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setBlendFunctionSeparate(int, int, int, int)","u":"setBlendFunctionSeparate(int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setBlendFunctionSeparate(int, int, int, int)","u":"setBlendFunctionSeparate(int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setBlendFunctionSeparate(int, int, int, int)","u":"setBlendFunctionSeparate(int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setBlendFunctionSeparate(int, int, int, int)","u":"setBlendFunctionSeparate(int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setBounds(float, float, float, float)","u":"setBounds(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setBounds(float, float, float, float)","u":"setBounds(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setBounds(float, float, float, float)","u":"setBounds(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setBounds(float, float, float, float)","u":"setBounds(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setBounds(float, float, float, float)","u":"setBounds(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setCenter(float, float)","u":"setCenter(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setCenter(float, float)","u":"setCenter(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setCenter(float, float)","u":"setCenter(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setCenter(float, float)","u":"setCenter(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setCenter(float, float)","u":"setCenter(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setCenterX(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setCenterX(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setCenterX(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setCenterX(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setCenterX(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setCenterY(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setCenterY(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setCenterY(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setCenterY(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setCenterY(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setColor(Color)","u":"setColor(com.badlogic.gdx.graphics.Color)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setColor(Color)","u":"setColor(com.badlogic.gdx.graphics.Color)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setColor(Color)","u":"setColor(com.badlogic.gdx.graphics.Color)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setColor(Color)","u":"setColor(com.badlogic.gdx.graphics.Color)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setColor(Color)","u":"setColor(com.badlogic.gdx.graphics.Color)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setColor(Color)","u":"setColor(com.badlogic.gdx.graphics.Color)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setColor(Color)","u":"setColor(com.badlogic.gdx.graphics.Color)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setColor(Color)","u":"setColor(com.badlogic.gdx.graphics.Color)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setColor(Color)","u":"setColor(com.badlogic.gdx.graphics.Color)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setColor(Color)","u":"setColor(com.badlogic.gdx.graphics.Color)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setColor(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setColor(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setColor(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setColor(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setColor(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setColor(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setColor(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setColor(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setColor(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setColor(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setColor(float, float, float, float)","u":"setColor(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setColor(float, float, float, float)","u":"setColor(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setColor(float, float, float, float)","u":"setColor(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setColor(float, float, float, float)","u":"setColor(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setColor(float, float, float, float)","u":"setColor(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setColor(float, float, float, float)","u":"setColor(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setColor(float, float, float, float)","u":"setColor(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setColor(float, float, float, float)","u":"setColor(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setColor(float, float, float, float)","u":"setColor(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setColor(float, float, float, float)","u":"setColor(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setFlip(boolean, boolean)","u":"setFlip(boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setFlip(boolean, boolean)","u":"setFlip(boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setFlip(boolean, boolean)","u":"setFlip(boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setFlip(boolean, boolean)","u":"setFlip(boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setFlip(boolean, boolean)","u":"setFlip(boolean,boolean)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setIntColor(int)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setIntColor(int)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setIntColor(int)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setIntColor(int)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setIntColor(int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setIntColor(int, int, int, int)","u":"setIntColor(int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setIntColor(int, int, int, int)","u":"setIntColor(int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setIntColor(int, int, int, int)","u":"setIntColor(int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setIntColor(int, int, int, int)","u":"setIntColor(int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setIntColor(int, int, int, int)","u":"setIntColor(int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setIntTweak(int)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setIntTweak(int)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setIntTweak(int)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setIntTweak(int)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setIntTweak(int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setIntTweak(int, int, int, int)","u":"setIntTweak(int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setIntTweak(int, int, int, int)","u":"setIntTweak(int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setIntTweak(int, int, int, int)","u":"setIntTweak(int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setIntTweak(int, int, int, int)","u":"setIntTweak(int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setIntTweak(int, int, int, int)","u":"setIntTweak(int,int,int,int)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setOrigin(float, float)","u":"setOrigin(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setOrigin(float, float)","u":"setOrigin(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setOrigin(float, float)","u":"setOrigin(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setOrigin(float, float)","u":"setOrigin(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setOrigin(float, float)","u":"setOrigin(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setOriginBasedPosition(float, float)","u":"setOriginBasedPosition(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setOriginBasedPosition(float, float)","u":"setOriginBasedPosition(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setOriginBasedPosition(float, float)","u":"setOriginBasedPosition(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setOriginBasedPosition(float, float)","u":"setOriginBasedPosition(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setOriginBasedPosition(float, float)","u":"setOriginBasedPosition(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setOriginCenter()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setOriginCenter()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setOriginCenter()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setOriginCenter()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setOriginCenter()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setPackedColor(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setPackedColor(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setPackedColor(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setPackedColor(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setPackedColor(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setPackedColor(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setPackedColor(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setPackedColor(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setPackedColor(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setPackedColor(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setPosition(float, float)","u":"setPosition(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setPosition(float, float)","u":"setPosition(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setPosition(float, float)","u":"setPosition(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setPosition(float, float)","u":"setPosition(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setPosition(float, float)","u":"setPosition(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setProjectionMatrix(Matrix4)","u":"setProjectionMatrix(com.badlogic.gdx.math.Matrix4)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setProjectionMatrix(Matrix4)","u":"setProjectionMatrix(com.badlogic.gdx.math.Matrix4)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setProjectionMatrix(Matrix4)","u":"setProjectionMatrix(com.badlogic.gdx.math.Matrix4)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setProjectionMatrix(Matrix4)","u":"setProjectionMatrix(com.badlogic.gdx.math.Matrix4)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setProjectionMatrix(Matrix4)","u":"setProjectionMatrix(com.badlogic.gdx.math.Matrix4)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setRegion(float, float, float, float)","u":"setRegion(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setRegion(float, float, float, float)","u":"setRegion(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setRegion(float, float, float, float)","u":"setRegion(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setRegion(float, float, float, float)","u":"setRegion(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setRegion(float, float, float, float)","u":"setRegion(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setRotation(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setRotation(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setRotation(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setRotation(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setRotation(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setScale(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setScale(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setScale(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setScale(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setScale(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setScale(float, float)","u":"setScale(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setScale(float, float)","u":"setScale(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setScale(float, float)","u":"setScale(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setScale(float, float)","u":"setScale(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setScale(float, float)","u":"setScale(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setShader(ShaderProgram)","u":"setShader(com.badlogic.gdx.graphics.glutils.ShaderProgram)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setShader(ShaderProgram)","u":"setShader(com.badlogic.gdx.graphics.glutils.ShaderProgram)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setShader(ShaderProgram)","u":"setShader(com.badlogic.gdx.graphics.glutils.ShaderProgram)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setShader(ShaderProgram)","u":"setShader(com.badlogic.gdx.graphics.glutils.ShaderProgram)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setShader(ShaderProgram)","u":"setShader(com.badlogic.gdx.graphics.glutils.ShaderProgram)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setSize(float, float)","u":"setSize(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setSize(float, float)","u":"setSize(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setSize(float, float)","u":"setSize(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setSize(float, float)","u":"setSize(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setSize(float, float)","u":"setSize(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setTransformMatrix(Matrix4)","u":"setTransformMatrix(com.badlogic.gdx.math.Matrix4)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setTransformMatrix(Matrix4)","u":"setTransformMatrix(com.badlogic.gdx.math.Matrix4)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setTransformMatrix(Matrix4)","u":"setTransformMatrix(com.badlogic.gdx.math.Matrix4)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setTransformMatrix(Matrix4)","u":"setTransformMatrix(com.badlogic.gdx.math.Matrix4)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setTransformMatrix(Matrix4)","u":"setTransformMatrix(com.badlogic.gdx.math.Matrix4)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setTweak(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setTweak(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setTweak(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setTweak(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setTweak(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setTweak(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setTweak(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setTweak(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setTweak(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setTweak(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setTweak(float, float, float, float)","u":"setTweak(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setTweak(float, float, float, float)","u":"setTweak(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setTweak(float, float, float, float)","u":"setTweak(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setTweak(float, float, float, float)","u":"setTweak(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setTweak(float, float, float, float)","u":"setTweak(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setTweak(float, float, float, float)","u":"setTweak(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setTweak(float, float, float, float)","u":"setTweak(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setTweak(float, float, float, float)","u":"setTweak(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setTweak(float, float, float, float)","u":"setTweak(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setTweak(float, float, float, float)","u":"setTweak(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setTweakedColor(float, float)","u":"setTweakedColor(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setTweakedColor(float, float)","u":"setTweakedColor(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setTweakedColor(float, float)","u":"setTweakedColor(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setTweakedColor(float, float)","u":"setTweakedColor(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setTweakedColor(float, float)","u":"setTweakedColor(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setTweakedColor(float, float)","u":"setTweakedColor(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setTweakedColor(float, float)","u":"setTweakedColor(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setTweakedColor(float, float)","u":"setTweakedColor(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setTweakedColor(float, float)","u":"setTweakedColor(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setTweakedColor(float, float)","u":"setTweakedColor(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setTweakedColor(float, float, float, float, float, float, float, float)","u":"setTweakedColor(float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setTweakedColor(float, float, float, float, float, float, float, float)","u":"setTweakedColor(float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setTweakedColor(float, float, float, float, float, float, float, float)","u":"setTweakedColor(float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setTweakedColor(float, float, float, float, float, float, float, float)","u":"setTweakedColor(float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setTweakedColor(float, float, float, float, float, float, float, float)","u":"setTweakedColor(float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setTweakedColor(float, float, float, float, float, float, float, float)","u":"setTweakedColor(float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setTweakedColor(float, float, float, float, float, float, float, float)","u":"setTweakedColor(float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setTweakedColor(float, float, float, float, float, float, float, float)","u":"setTweakedColor(float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setTweakedColor(float, float, float, float, float, float, float, float)","u":"setTweakedColor(float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setTweakedColor(float, float, float, float, float, float, float, float)","u":"setTweakedColor(float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setU(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setU(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setU(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setU(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setU(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setU2(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setU2(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setU2(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setU2(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setU2(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"setupMatrices()"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"setupMatrices()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"setupMatrices()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"setupMatrices()"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"setupMatrices()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setV(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setV(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setV(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setV(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setV(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setV2(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setV2(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setV2(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setV2(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setV2(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setX(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setX(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setX(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setX(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setX(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"setY(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"setY(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"setY(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"setY(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"setY(float)"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"Shaders()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"SimplePalette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"SimplePalette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"SimplePalette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"sin_(double)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"sin_(float)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"sin(double)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"sin(float)"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"sinDegrees(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"SKY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"SKY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"SKY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"SPRITE_SIZE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"SPRITE_SIZE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"SPRITE_SIZE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"SPRITE_SIZE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"SPRITE_SIZE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"SPRITE_SIZE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"SPRITE_SIZE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"SPRITE_SIZE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"SPRITE_SIZE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"SPRITE_SIZE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"strengthen(float, float)","u":"strengthen(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"subrandomColor(float, float, float)","u":"subrandomColor(float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"subrandomColor(float, float, float)","u":"subrandomColor(float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"switchTexture(Texture)","u":"switchTexture(com.badlogic.gdx.graphics.Texture)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"switchTexture(Texture)","u":"switchTexture(com.badlogic.gdx.graphics.Texture)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"switchTexture(Texture)","u":"switchTexture(com.badlogic.gdx.graphics.Texture)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"switchTexture(Texture)","u":"switchTexture(com.badlogic.gdx.graphics.Texture)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"switchTexture(Texture)","u":"switchTexture(com.badlogic.gdx.graphics.Texture)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"T1"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"T1"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"T1"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"T1"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"T1"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"T2"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"T2"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"T2"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"T2"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"T2"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"T3"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"T3"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"T3"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"T3"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"T3"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"T4"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"T4"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"T4"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"T4"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"T4"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"TEAL"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"TEAL"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"TEAL"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"toColor(Color, float)","u":"toColor(com.badlogic.gdx.graphics.Color,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"toColor(Color, float)","u":"toColor(com.badlogic.gdx.graphics.Color,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"toColor(Color, float)","u":"toColor(com.badlogic.gdx.graphics.Color,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"toColor(Color, float)","u":"toColor(com.badlogic.gdx.graphics.Color,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"toColor(Color, float)","u":"toColor(com.badlogic.gdx.graphics.Color,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"toIPTColor(Color, float)","u":"toIPTColor(com.badlogic.gdx.graphics.Color,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"toIPTColor(Color, float)","u":"toIPTColor(com.badlogic.gdx.graphics.Color,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"toOklabColor(Color, float)","u":"toOklabColor(com.badlogic.gdx.graphics.Color,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"toRGBA(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"toRGBA(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"toRGBA(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"toRGBA(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"totalRenderCalls"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"totalRenderCalls"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"totalRenderCalls"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"totalRenderCalls"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"totalRenderCalls"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"toYCwCmColor(Color, float)","u":"toYCwCmColor(com.badlogic.gdx.graphics.Color,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"translate(float, float)","u":"translate(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"translate(float, float)","u":"translate(float,float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"translate(float, float)","u":"translate(float,float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"translate(float, float)","u":"translate(float,float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"translate(float, float)","u":"translate(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"translateX(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"translateX(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"translateX(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"translateX(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"translateX(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"translateY(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"translateY(float)"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"translateY(float)"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"translateY(float)"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"translateY(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful","c":"TrigTools","l":"TrigTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"tritan(float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"tritan(float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"tritanDown(float, float)","u":"tritanDown(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"tritanDown(float, float)","u":"tritanDown(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorTools","l":"tritanUp(float, float)","u":"tritanUp(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorTools","l":"tritanUp(float, float)","u":"tritanUp(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"tweak"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"tweak"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"tweak"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"tweak"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"tweak"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"TWEAK_ATTRIBUTE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"TWEAK_ATTRIBUTE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"TWEAK_ATTRIBUTE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"TWEAK_ATTRIBUTE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"TWEAK_ATTRIBUTE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"TWEAK_RESET"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"TWEAK_RESET"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"TWEAK_RESET"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"TWEAK_RESET"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"TWEAK_RESET"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"U1"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"U1"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"U1"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"U1"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"U1"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"U2"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"U2"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"U2"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"U2"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"U2"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"U3"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"U3"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"U3"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"U3"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"U3"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"U4"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"U4"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"U4"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"U4"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"U4"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"V1"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"V1"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"V1"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"V1"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"V1"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"V2"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"V2"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"V2"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"V2"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"V2"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"V3"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"V3"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"V3"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"V3"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"V3"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"V4"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"V4"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"V4"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"V4"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"V4"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulSprite","l":"VERTEX_SIZE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulSprite","l":"VERTEX_SIZE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulSprite","l":"VERTEX_SIZE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulSprite","l":"VERTEX_SIZE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulSprite","l":"VERTEX_SIZE"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"vertexShader"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"vertexShaderDayNight"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"vertexShaderHSI"},{"p":"com.github.tommyettinger.colorful","c":"Shaders","l":"vertexShaderHSLC"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"warm(float, float)","u":"warm(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"weaken(float, float)","u":"weaken(float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"X1"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"X1"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"X1"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"X1"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"X1"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"X2"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"X2"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"X2"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"X2"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"X2"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"X3"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"X3"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"X3"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"X3"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"X3"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"X4"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"X4"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"X4"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"X4"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"X4"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"Y1"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"Y1"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"Y1"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"Y1"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"Y1"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"Y2"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"Y2"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"Y2"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"Y2"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"Y2"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"Y3"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"Y3"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"Y3"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"Y3"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"Y3"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"ColorfulBatch","l":"Y4"},{"p":"com.github.tommyettinger.colorful.ipt","c":"ColorfulBatch","l":"Y4"},{"p":"com.github.tommyettinger.colorful.oklab","c":"ColorfulBatch","l":"Y4"},{"p":"com.github.tommyettinger.colorful.rgb","c":"ColorfulBatch","l":"Y4"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorfulBatch","l":"Y4"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"ColorTools","l":"ycwcm(float, float, float, float)","u":"ycwcm(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"SimplePalette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.oklab","c":"SimplePalette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.rgb","c":"SimplePalette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.ipt_hq","c":"Palette","l":"ZUCCHINI"},{"p":"com.github.tommyettinger.colorful.ipt","c":"Palette","l":"ZUCCHINI"},{"p":"com.github.tommyettinger.colorful.oklab","c":"Palette","l":"ZUCCHINI"},{"p":"com.github.tommyettinger.colorful.rgb","c":"Palette","l":"ZUCCHINI"},{"p":"com.github.tommyettinger.colorful.ycwcm","c":"Palette","l":"ZUCCHINI"}];updateSearchResults(); \ No newline at end of file diff --git a/docs/colorful/apidocs/overview-summary.html b/docs/colorful/apidocs/overview-summary.html index bddb238e..1a2a4bfa 100644 --- a/docs/colorful/apidocs/overview-summary.html +++ b/docs/colorful/apidocs/overview-summary.html @@ -3,7 +3,7 @@ -colorful 0.5.2-SNAPSHOT API +colorful 0.6.0 API diff --git a/docs/colorful/apidocs/overview-tree.html b/docs/colorful/apidocs/overview-tree.html index 3527690b..7f2191da 100644 --- a/docs/colorful/apidocs/overview-tree.html +++ b/docs/colorful/apidocs/overview-tree.html @@ -3,7 +3,7 @@ -Class Hierarchy (colorful 0.5.2-SNAPSHOT API) +Class Hierarchy (colorful 0.6.0 API) @@ -65,7 +65,7 @@

    Hierarchy For All Packages

    Class Hierarchy

      -
    • java.lang.Object +
    • java.lang.Object
      • com.github.tommyettinger.colorful.ipt_hq.ColorfulBatch (implements com.badlogic.gdx.graphics.g2d.Batch)
      • com.github.tommyettinger.colorful.ipt.ColorfulBatch (implements com.badlogic.gdx.graphics.g2d.Batch)
      • diff --git a/docs/colorful/apidocs/search.js b/docs/colorful/apidocs/search.js index c5865187..2c2ced05 100644 --- a/docs/colorful/apidocs/search.js +++ b/docs/colorful/apidocs/search.js @@ -27,7 +27,7 @@ var noResult = {l: "No results found"}; var loading = {l: "Loading search index..."}; var catModules = "Modules"; var catPackages = "Packages"; -var catTypes = "Types"; +var catTypes = "Classes and Interfaces"; var catMembers = "Members"; var catSearchTags = "Search Tags"; var highlight = "$&"; diff --git a/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/FloatColors.html b/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/FloatColors.html index fa3353d8..6bfe8c6d 100644 --- a/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/FloatColors.html +++ b/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/FloatColors.html @@ -138,10 +138,10 @@ 125 126 /** 127 * Interpolates from the packed float color start towards end by change. Both start and end should be packed colors, -128 * as from {@link ColorTools#ycwcm(float, float, float, float)} or +128 * as from {@link com.github.tommyettinger.colorful.oklab.ColorTools#oklab(float, float, float, float)} or 129 * {@link com.github.tommyettinger.colorful.ipt.ColorTools#ipt(float, float, float, float)}, and change can be 130 * between 0f (keep start) and 1f (only use end). Both start and end should use the same color space; that is, both -131 * could be produced using YCwCm, both could be produced using IPT, or both could be libGDX-native RGB, but they +131 * could be produced using Oklab, both could be produced using IPT, or both could be libGDX-native RGB, but they 132 * can't mix. This is a good way to reduce allocations of temporary Colors. 133 * @param start the starting color as a packed float 134 * @param end the target color as a packed float @@ -161,11 +161,11 @@ 148 /** 149 * Interpolates from the packed float color start towards end by change, but keeps the alpha of start and uses the 150 * alpha of end as an extra factor that can affect how much to change. Both start and end should be packed colors, -151 * as from {@link ColorTools#ycwcm(float, float, float, float)} or -152 * {@link com.github.tommyettinger.colorful.ipt.ColorTools#ipt(float, float, float, float)}, and change can be between 0f -153 * (keep start) and 1f (only use end). Both start and end should use the same color space; that is, both could be -154 * produced using YCwCm, or both could be produced using IPT, but not a mix of the two. This is a good way to -155 * reduce allocations of temporary Colors. +151 * as from {@link com.github.tommyettinger.colorful.ipt_hq.ColorTools#ipt(float, float, float, float)} or +152 * {@link ColorTools#ycwcm(float, float, float, float)}, and change can be between 0f (keep start) and 1f (only use +153 * end). Both start and end should use the same color space; that is, both could be produced using IPT_HQ, or both +154 * could be produced using YCwCm, but not a mix of the two. This is a good way to reduce allocations of temporary +155 * Colors. 156 * @param start the starting color as a packed float; alpha will be preserved 157 * @param end the target color as a packed float; alpha will not be used directly, and will instead be multiplied with change 158 * @param change how much to go from start toward end, as a float between 0 and 1; higher means closer to end @@ -235,22 +235,24 @@ 222 /** 223 * Given several colors, this gets an even mix of all colors in equal measure. 224 * If {@code colors} is null or has no items, this returns 0f (usually transparent in most color spaces). -225 * @param colors an array or varargs of packed float colors; all should use the same color space -226 * @param offset the index of the first item in {@code colors} to use -227 * @param size how many items from {@code colors} to use -228 * @return an even mix of all colors given, as a packed float color -229 */ -230 public static float mix(float[] colors, int offset, int size) { -231 if(colors == null || colors.length < offset + size || offset < 0 || size <= 0) -232 return 0f; // transparent, usually -233 float result = colors[offset]; -234 for (int i = offset + 1, o = offset + size, denom = 2; i < o; i++, denom++) { -235 result = lerpFloatColors(result, colors[i], 1f / denom); -236 } -237 return result; -238 } -239 -240} +225 * This is mostly useful in conjunction with {@link com.badlogic.gdx.utils.FloatArray}, using its {@code items} +226 * for colors, typically 0 for offset, and its {@code size} for size. +227 * @param colors an array of packed float colors; all should use the same color space +228 * @param offset the index of the first item in {@code colors} to use +229 * @param size how many items from {@code colors} to use +230 * @return an even mix of all colors given, as a packed float color +231 */ +232 public static float mix(float[] colors, int offset, int size) { +233 if(colors == null || colors.length < offset + size || offset < 0 || size <= 0) +234 return 0f; // transparent, usually +235 float result = colors[offset]; +236 for (int i = offset + 1, o = offset + size, denom = 2; i < o; i++, denom++) { +237 result = lerpFloatColors(result, colors[i], 1f / denom); +238 } +239 return result; +240 } +241 +242} diff --git a/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/Shaders.html b/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/Shaders.html index b104090c..29953f20 100644 --- a/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/Shaders.html +++ b/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/Shaders.html @@ -20,993 +20,1157 @@ 007import com.github.tommyettinger.colorful.ycwcm.ColorfulSprite; 008 009/** -010 * Constants that contain the critical shader code to construct a {@link ShaderProgram} that can render the rest of this +010 * Shader code to construct a {@link ShaderProgram} that can render the specialized colors produced by the rest of this 011 * library. The shader code is meant for use in a {@link com.badlogic.gdx.graphics.g2d.SpriteBatch}; a convenience -012 * method, {@link #makeBatch()}, is provided to generate and return a SpriteBatch that uses the correct ShaderProgram. -013 * <br> -014 * Created by Tommy Ettinger on 12/2/2019. -015 */ -016public class Shaders { -017 /** -018 * This is the default vertex shader from libGDX. -019 */ -020 public static final String vertexShader = "attribute vec4 " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" -021 + "attribute vec4 " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" -022 + "attribute vec2 " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n" -023 + "uniform mat4 u_projTrans;\n" -024 + "varying vec4 v_color;\n" -025 + "varying vec2 v_texCoords;\n" -026 + "\n" -027 + "void main()\n" -028 + "{\n" -029 + " v_color = " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" -030 + " v_color.a = v_color.a * (255.0/254.0);\n" -031 + " v_texCoords = " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n" -032 + " gl_Position = u_projTrans * " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" -033 + "}\n"; -034 /** -035 * A simple shader that uses additive blending with "normal" RGBA colors (alpha is still multiplicative). -036 * With the default SpriteBatch ShaderProgram, white is the neutral color, 50% gray darkens a color by about 50%, -037 * and black darkens a color to black, but nothing can brighten a color. With this, 50% gray is the neutral color, -038 * white adds 0.5 to the RGB channels (brightening it and also desaturating it), and black subtracts 0.5 from the -039 * RGB channels (darkening and desaturating, but not to black unless the color is already somewhat dark). When -040 * tinting with white, this looks like <a href="https://i.imgur.com/iAb1rig.png">The Mona Lisa on the left</a>, when -041 * tinting with 50% gray, it makes no change, and when tinting with black, it almost reaches all black, but some -042 * faint part of the image is still barely visible. -043 */ -044 public static final String fragmentShaderRGBA = -045 "#ifdef GL_ES\n" + -046 "#define LOWP lowp\n" + -047 "precision mediump float;\n" + -048 "#else\n" + -049 "#define LOWP \n" + -050 "#endif\n" + -051 "varying vec2 v_texCoords;\n" + -052 "varying LOWP vec4 v_color;\n" + -053 "uniform sampler2D u_texture;\n" + -054 "void main()\n" + -055 "{\n" + -056 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + -057 " gl_FragColor = clamp(vec4(tgt.rgb * pow((v_color.rgb + 0.1) * 1.666, vec3(1.5)), v_color.a * tgt.a), 0.0, 1.0);\n" + -058 "}"; -059 /** -060 * A simple shader that uses multiplicative blending with "normal" RGBA colors, but internally uses gamma correction -061 * to make changes in color smoother. With the default SpriteBatch ShaderProgram, white is the neutral color, 50% -062 * gray darkens a color by about 50%, and black darkens a color to black, but nothing can brighten a color. With -063 * this, 50% gray is the neutral color, white multiplies the RGB channels by about 2 (brightening it and slightly -064 * desaturating it), and black multiplies the RGB channels by 0 (reducing the color always to black). When tinting -065 * with white, this looks like <a href="https://i.imgur.com/gKRSzKv.png">The Mona Lisa on the left</a>; when tinting -066 * with 50% gray, it makes no change, and when tinting with black, it produces an all-black image. -067 * <br> -068 * Credit for finding this goes to CypherCove, who uses a similar version in -069 * <a href="https://github.com/CypherCove/gdx-tween/blob/5047eeae9250d1f1c52e87aaf572956045a523f9/gdx-tween/src/main/java/com/cyphercove/gdxtween/graphics/GtColor.java">gdx=tween</a>. -070 */ -071 public static final String fragmentShaderGammaRGBA = -072 "#ifdef GL_ES\n" + -073 "#define LOWP lowp\n" + -074 "precision mediump float;\n" + -075 "#else\n" + -076 "#define LOWP \n" + -077 "#endif\n" + -078 "varying vec2 v_texCoords;\n" + -079 "varying LOWP vec4 v_color;\n" + -080 "uniform sampler2D u_texture;\n" + -081 "void main()\n" + -082 "{\n" + -083 " vec4 tgt = texture2D(u_texture, v_texCoords);\n" + -084 " gl_FragColor = clamp(vec4(sqrt(tgt.rgb * tgt.rgb * v_color.rgb * v_color.rgb * 4.0), v_color.a * tgt.a), 0.0, 1.0);\n" + -085 "}"; -086 //// save the result as shader, and set it on your batch with -087 // ShaderProgram shader = makeRGBAShader(); -088 // batch.setShader(shader) -089 /** -090 * A simple helper method that builds the simplest shader here; this shader allows tinting with light colors to -091 * lighten an image. You can assign the result to a SpriteBatch with its -092 * {@link SpriteBatch#setShader(ShaderProgram)} method. -093 * @return a ShaderProgram that uses the RGBA shader {@link #fragmentShaderRGBA} -094 */ -095 public static ShaderProgram makeRGBAShader() -096 { -097 ShaderProgram shader = new ShaderProgram(vertexShader, fragmentShaderRGBA); -098 if(!shader.isCompiled()) -099 throw new GdxRuntimeException("Couldn't compile shader: " + shader.getLog()); -100 return shader; -101 } -102 /** -103 * A simple helper method that builds the simplest shader here; this shader allows tinting with light colors to -104 * lighten an image, and also smooths changes well. You can assign the result to a SpriteBatch with its -105 * {@link SpriteBatch#setShader(ShaderProgram)} method. -106 * @return a ShaderProgram that uses the RGBA shader {@link #fragmentShaderGammaRGBA} -107 */ -108 public static ShaderProgram makeGammaRGBAShader() -109 { -110 ShaderProgram shader = new ShaderProgram(vertexShader, fragmentShaderGammaRGBA); -111 if(!shader.isCompiled()) -112 throw new GdxRuntimeException("Couldn't compile shader: " + shader.getLog()); -113 return shader; -114 } -115 +012 * method, {@link #makeBatch()}, is provided to generate and return a SpriteBatch that uses a correct ShaderProgram. +013 * Many of the shaders here are experimental and meant as a basis for user code, rather than a complete solution. +014 * If you aren't familiar with shaders in libGDX, <a href="https://github.com/libgdx/libgdx/wiki/Shaders">see this +015 * libGDX wiki article</a> for more information. +016 * <br> +017 * Many of these shaders would need at least some changing to work with kinds of +018 * {@link com.badlogic.gdx.graphics.g2d.Batch} that aren't SpriteBatch (or at least very similar). You should compare +019 * the names of {@code uniform} variables in the vertex and fragment shader if you use a different kind of Batch; if all +020 * of them are the same and there are the same amount, then you should be able to use these shaders without issue. +021 * <br> +022 * Note that you don't need to specify a shader from here at all if you use a ColorfulBatch from this library! +023 * There is a ColorfulBatch in each of the color space subpackages, such as {@code rgb}, {@code oklab}, and {@code ipt}. +024 * All of those allow a multiplicative "tweak" to each color channel before an additive change is applied to that +025 * channel; to contrast, all of the shaders here can only permit one or the other for a given channel. ColorfulBatch may +026 * act oddly if it has to interact with SpriteBatch-specific classes like {@link com.badlogic.gdx.graphics.g2d.Sprite}, +027 * so there are ColorfulSprite classes that also allow setting the "tweak" and additive change per-sprite. Still, it can +028 * be a good idea to use the shaders here if you have an existing SpriteBatch, or want to use the various experimental +029 * shaders as a test-bed. +030 */ +031public class Shaders { +032 /** +033 * This is the default vertex shader from libGDX. It is used without change by most of the fragment shaders here. +034 */ +035 public static final String vertexShader = "attribute vec4 " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" +036 + "attribute vec4 " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" +037 + "attribute vec2 " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n" +038 + "uniform mat4 u_projTrans;\n" +039 + "varying vec4 v_color;\n" +040 + "varying vec2 v_texCoords;\n" +041 + "\n" +042 + "void main()\n" +043 + "{\n" +044 + " v_color = " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" +045 + " v_color.a = v_color.a * (255.0/254.0);\n" +046 + " v_texCoords = " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n" +047 + " gl_Position = u_projTrans * " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" +048 + "}\n"; +049 /** +050 * A simple shader that uses additive blending with "normal" RGBA colors (alpha is still multiplicative). +051 * With the default SpriteBatch ShaderProgram, white is the neutral color, 50% gray darkens a color by about 50%, +052 * and black darkens a color to black, but nothing can brighten a color. With this, 50% gray is the neutral color, +053 * white adds 0.5 to the RGB channels (brightening it and also desaturating it), and black subtracts 0.5 from the +054 * RGB channels (darkening and desaturating, but not to black unless the color is already somewhat dark). When +055 * tinting with white, this looks like <a href="https://i.imgur.com/iAb1rig.png">The Mona Lisa on the left</a>, when +056 * tinting with 50% gray, it makes no change, and when tinting with black, it almost reaches all black, but some +057 * faint part of the image is still barely visible. +058 * <br> +059 * You can generate RGB colors using any of various methods in the {@code rgb} package, such as +060 * {@link com.github.tommyettinger.colorful.rgb.ColorTools#rgb(float, float, float, float)}. +061 * <br> +062 * Meant for use with {@link #vertexShader}. +063 */ +064 public static final String fragmentShaderRGBA = +065 "#ifdef GL_ES\n" + +066 "#define LOWP lowp\n" + +067 "precision mediump float;\n" + +068 "#else\n" + +069 "#define LOWP \n" + +070 "#endif\n" + +071 "varying vec2 v_texCoords;\n" + +072 "varying LOWP vec4 v_color;\n" + +073 "uniform sampler2D u_texture;\n" + +074 "void main()\n" + +075 "{\n" + +076 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + +077 " gl_FragColor = clamp(vec4(tgt.rgb * pow((v_color.rgb + 0.1) * 1.666, vec3(1.5)), v_color.a * tgt.a), 0.0, 1.0);\n" + +078 "}"; +079 /** +080 * A simple shader that uses multiplicative blending with "normal" RGBA colors, and is simpler than +081 * {@link #fragmentShaderRGBA} but can make changes in color smoother. With the default SpriteBatch ShaderProgram, +082 * white is the neutral color, 50% gray darkens a color by about 50%, and black darkens a color to black, but +083 * nothing can brighten a color. With this, 50% gray is the neutral color, white multiplies the RGB channels by +084 * 2.0 (brightening it and slightly desaturating it), and black multiplies the RGB channels by 0 (reducing the color +085 * always to black). When tinting with white, this looks like <a href="https://i.imgur.com/I30jeXv.png">The Mona +086 * Lisa on the left</a>; when tinting with 50% gray, it makes no change, and when tinting with black, it produces an +087 * all-black image. +088 * <br> +089 * You can generate RGB colors using any of various methods in the {@code rgb} package, such as +090 * {@link com.github.tommyettinger.colorful.rgb.ColorTools#rgb(float, float, float, float)}. +091 * <br> +092 * Meant for use with {@link #vertexShader}. +093 * <br> +094 * An earlier version of this attempted to use some useful code by CypherCove in gdx-tween, but the current version +095 * doesn't share any code, and doesn't really do any gamma correction either. It does less... gamma... un-correction +096 * than {@link #fragmentShaderRGBA}, though, so if the source images are gamma-corrected this should be fine. +097 */ +098 public static final String fragmentShaderGammaRGBA = +099 "#ifdef GL_ES\n" + +100 "#define LOWP lowp\n" + +101 "precision mediump float;\n" + +102 "#else\n" + +103 "#define LOWP \n" + +104 "#endif\n" + +105 "varying vec2 v_texCoords;\n" + +106 "varying LOWP vec4 v_color;\n" + +107 "uniform sampler2D u_texture;\n" + +108 "void main()\n" + +109 "{\n" + +110 " vec4 tgt = texture2D(u_texture, v_texCoords);\n" + +111 " gl_FragColor = clamp(vec4(tgt.rgb * v_color.rgb * 2.0, v_color.a * tgt.a), 0.0, 1.0);\n" + +112 "}"; +113 //// save the result as shader, and set it on your batch with +114 // ShaderProgram shader = makeRGBAShader(); +115 // batch.setShader(shader) 116 /** -117 * Where the magic happens; this converts a batch color from the YCwCm format (used by colorful's ycwcm package) to -118 * RGBA. The vertex color will be split up into 4 channels just as a normal shader does, but the channels here are -119 * luma, chromatic warmth, chromatic mildness, and alpha; alpha acts just like a typical RGBA shader, but the others -120 * are additive instead of multiplicative, with 0.5 as a neutral value. This does not support the "tweak" features -121 * that {@link ColorfulBatch} does, which include multiplicative counterparts to the additive operations this -122 * supports on luma, chromatic warmth, and chromatic mildness, plus a contrast adjustment. If you want to adjust -123 * contrast globally, you can use {@link #makeBatch(float)} to set the contrast for a new Batch with a new shader. +117 * A simple helper method that builds the simplest shader here; this shader allows tinting with light colors to +118 * lighten an image. You can assign the result to a SpriteBatch with its +119 * {@link SpriteBatch#setShader(ShaderProgram)} method. +120 * <br> +121 * You can generate RGB colors using any of various methods in the {@code rgb} package, such as +122 * {@link com.github.tommyettinger.colorful.rgb.ColorTools#rgb(float, float, float, float)}. +123 * @return a ShaderProgram that uses the RGBA shader {@link #fragmentShaderRGBA} 124 */ -125 public static final String fragmentShader = -126 "#ifdef GL_ES\n" + -127 "#define LOWP lowp\n" + -128 "precision mediump float;\n" + -129 "#else\n" + -130 "#define LOWP \n" + -131 "#endif\n" + -132 "varying vec2 v_texCoords;\n" + -133 "varying LOWP vec4 v_color;\n" + -134 "uniform sampler2D u_texture;\n" + -135 "const vec3 bright = vec3(0.375, 0.5, 0.125);\n" + -136 "void main()\n" + -137 "{\n" + -138 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + -139 //use the following line to match the color exactly -140 " vec3 ycc = vec3(v_color.r - 0.5 + dot(tgt.rgb, bright), ((v_color.g - 0.5) * 2.0 + tgt.r - tgt.b), ((v_color.b - 0.5) * 2.0 + tgt.g - tgt.b));\n" + -141 //use the following line to increase contrast -142// " vec3 ycc = vec3(v_color.r * dot(sin(tgt.rgb * 1.5707963267948966) * sqrt(tgt.rgb), bright), ((v_color.g - 0.5) * 2.0 + tgt.r - tgt.b), ((v_color.b - 0.5) * 2.0 + tgt.g - tgt.b));\n" + -143 //use the following line to increase contrast more -144// " vec3 ycc = vec3(v_color.r * pow(dot(tgt.rgb, bright), 1.25), ((v_color.g - 0.5) * 2.0 + tgt.r - tgt.b), ((v_color.b - 0.5) * 2.0 + tgt.g - tgt.b));\n" + -145 //uses a specific matrix (related to bright, above) multiplied with ycc to get back to rgb. -146 " gl_FragColor = vec4( (clamp(mat3(1.0, 1.0, 1.0, 0.625, -0.375, -0.375, -0.5, 0.5, -0.5) * ycc, 0.0, 1.0)), v_color.a * tgt.a);\n" + -147 "}"; -148 /** -149 * A variant on {@link #fragmentShader} that adjusts luma to make mid-range colors darker, while keeping light -150 * colors light. This is not the same as {@link ColorfulBatch} even when the contrast for ColorfulBatch's tweak is -151 * the same as what this uses (1.375 here, which is roughly 0.875f in a tweak value). ColorfulBatch does some work -152 * in the vertex shader so it may be a little faster than this approach, and it seems to have less severe effects on -153 * the overall brightness of an image that has adjusted contrast. -154 */ -155 public static final String fragmentShaderHigherContrast = -156 "#ifdef GL_ES\n" + -157 "#define LOWP lowp\n" + -158 "precision mediump float;\n" + -159 "#else\n" + -160 "#define LOWP \n" + -161 "#endif\n" + -162 "varying vec2 v_texCoords;\n" + -163 "varying LOWP vec4 v_color;\n" + -164 "uniform sampler2D u_texture;\n" + -165 "const float contrast = 1.375 ;\n" + // you can make contrast a uniform if you want -166 "const vec3 bright = vec3(0.375, 0.5, 0.125) * (4.0 / 3.0);\n" + -167 "void main()\n" + -168 "{\n" + -169 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + -170 " vec3 ycc = vec3(v_color.r - 0.5 + pow(dot(tgt.rgb, bright), contrast) * 0.75, ((v_color.g - 0.5) * 2.0 + tgt.r - tgt.b), ((v_color.b - 0.5) * 2.0 + tgt.g - tgt.b));\n" + -171 " gl_FragColor = vec4( (clamp(mat3(1.0, 1.0, 1.0, 0.625, -0.375, -0.375, -0.5, 0.5, -0.5) * ycc, 0.0, 1.0)), v_color.a * tgt.a);\n" + -172 "}"; -173 -174 /** -175 * An alternative shader that effectively reduces luma contrast, bringing all but the darkest colors to the -176 * upper-mid luma range. This is not the same as {@link ColorfulBatch} even when the contrast for ColorfulBatch's -177 * tweak is the same as what this uses (0.625 here, which is roughly 0.125f in a tweak value). ColorfulBatch does -178 * some work in the vertex shader so it may be a little faster than this approach, and it seems to have less severe -179 * effects on the overall brightness of an image that has adjusted contrast. -180 */ -181 public static final String fragmentShaderLowerContrast = fragmentShaderHigherContrast.replace(" 1.375 ", "0.625"); -182 -183 /** -184 * Prepares and returns a new SpriteBatch that uses the default {@link #vertexShader} and {@link #fragmentShader} -185 * from this class, making it able to render YCwCm colors from the ycwcm package. It won't be a -186 * {@link ColorfulBatch} (those can adjust colors in more ways); you can simply use {@code new ColorfulBatch()} to -187 * make one of those. Note that a SpriteBatch like this produces won't be able to render a {@link ColorfulSprite}, -188 * but ColorfulBatch can. -189 * @return a freshly allocated SpriteBatch that will also have a new ShaderProgram for rendering YCwCm -190 */ -191 public static SpriteBatch makeBatch() -192 { -193 ShaderProgram shader = new ShaderProgram(vertexShader, fragmentShader); -194 if(!shader.isCompiled()) -195 throw new GdxRuntimeException("Couldn't compile shader: " + shader.getLog()); -196 return new SpriteBatch(1000, shader); -197 } -198 -199 /** -200 * Prepares and returns a new SpriteBatch that uses the default {@link #vertexShader} and {@link #fragmentShader} -201 * from this class, making it able to render YCwCm colors from the ycwcm package. This also takes a -202 * {@code contrast} parameter; if greater than 1.0 it will make light colors lighter and dark colors darker, while -203 * if it is less than 1.0 it will make all but the darkest colors closer to the upper-middle-range of lightness. -204 * If you want to adjust contrast per-sprite, use a {@link ColorfulBatch} (those can adjust colors in more ways); -205 * you can simply use {@code new ColorfulBatch()} to make one of those. Note that a SpriteBatch like this produces -206 * won't be able to render a {@link ColorfulSprite}, but ColorfulBatch can. ColorfulBatch also will calculate -207 * contrast differently from the shader this uses, including doing some work in the vertex shader (which may be -208 * faster). It also takes a contrast in its tweak value that is limited to a 0.0 to 1.0 range, rather than 0.1 to -209 * 2.0 here (this can technically tolerate 0.01 to 10.0, but those extremes aren't recommended). -210 * @param contrast how much contrast should be emphasized; higher than 1.0 is more contrasting, and this should usually be between 0.1 and 2.0 -211 * @return a freshly allocated SpriteBatch that will also have a new ShaderProgram for rendering YCwCm -212 */ -213 public static SpriteBatch makeBatch(final float contrast) -214 { -215 ShaderProgram shader = new ShaderProgram(vertexShader, fragmentShaderHigherContrast.replace(" 1.375 ", Float.toString(Math.min(Math.max(contrast, 0.01f), 10f)))); -216 if(!shader.isCompiled()) -217 throw new GdxRuntimeException("Couldn't compile shader: " + shader.getLog()); -218 return new SpriteBatch(1000, shader); -219 } -220 -221 /** -222 * Prepares and returns a new SpriteBatch that uses {@link #vertexShaderHSLC} and {@link #fragmentShaderHSLC} -223 * from this class, making it interpret the SpriteBatch's color, as set by -224 * {@link SpriteBatch#setColor(float, float, float, float)}, to be hue rotation, saturation change, lightness -225 * change, and contrast change. All of these are neutral when their value is 0.5f. Hue rotates clockwise or -226 * counterclockwise when it goes toward 0.0, and the other way when it goes toward 1.0; 0.0 and 1.0 both refer to -227 * the 180 degree rotation, but I don't know which goes which way (it also depends on how you visualize hue). -228 * Saturation becomes more grayscale as it goes towards 0.0, and more vivid as it goes towards 1.0. Lightness gets -229 * darker towards 0.0, lighter towards 1.0 (any lightness above 0.5 will brighten the image, unlike the default -230 * shader and batch color). Contrast affects changes in lightness; low contrast makes all lightness closer to the -231 * mid-range, while high contrast makes even small changes in the mid-range of an image's color have stark lightness -232 * changes in the result. Note, this does not support changing an image's alpha with the batch color. -233 * @return a freshly allocated SpriteBatch that will also have a new ShaderProgram for rendering HSLC -234 */ -235 public static SpriteBatch makeBatchHSLC() -236 { -237 ShaderProgram shader = new ShaderProgram(vertexShaderHSLC, fragmentShaderHSLC); -238 if(!shader.isCompiled()) -239 throw new GdxRuntimeException("Couldn't compile shader: " + shader.getLog()); -240 return new SpriteBatch(1000, shader); -241 } -242 -243 /** -244 * Similar to {@link #fragmentShader}, but this uses the very perceptually-accurate IPT color space as described by -245 * Ebner and Fairchild, instead of the custom YCwCm color space. IPT doesn't really need that much more computation -246 * to be done by the shader, but tends to make gradual changes in color much smoother. If comparing to YCwCm, then -247 * Y (luma) is like I (intensity) here, so when a Batch color has 0 for I (stored in the r channel), it makes the -248 * image very dark, while if the Batch color has 1 for I, it makes the image very light. Cw and Cm can be graphed -249 * like a color wheel, and in their case, the 4 corners of a square graph are red, yellow, green, and blue. IPT is -250 * less geometrical, and the corners are roughly purple, orange, green, and cyan, while the centers of the edges of -251 * the square are close to red, yellow, green, and blue. <a href="https://i.imgur.com/A3n4qmM.png">See this capture -252 * of the IPT space</a> if you want a better picture. The P (short for protan, a term from ophthalmology) channel -253 * (stored in g) is the left-to-right axis there, with P==0 making colors green or blue (cooler), and P==1 making -254 * colors orange, red, or purple (somewhat warmer). The T (short for tritan, also from ophthalmology) channel -255 * (stored in b) is the down-to-up axis there, with T==0 making colors more blue or purple, and T==1 making colors -256 * more green, yellow, brown, or orange. Where protan can be viewed as going from cool to warm as its value -257 * increases, tritan can be viewed as going from artificial to natural, or perhaps fluid to solid. Alpha is treated -258 * exactly as it is in the standard libGDX fragment shader, with the alpha in the batch color multiplied by the -259 * alpha in the image pixel to get the result alpha. -260 */ -261 public static String fragmentShaderIPT = -262 "#ifdef GL_ES\n" + -263 "#define LOWP lowp\n" + -264 "precision mediump float;\n" + -265 "#else\n" + -266 "#define LOWP \n" + -267 "#endif\n" + -268 "varying vec2 v_texCoords;\n" + -269 "varying LOWP vec4 v_color;\n" + -270 "uniform sampler2D u_texture;\n" + -271 "void main()\n" + -272 "{\n" + -273 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + -274 " vec4 adj = v_color;\n" + -275 " adj.yz = adj.yz * 2.0 - 0.5;\n" + -276 " vec3 ipt = (mat3(0.189786, 0.669665 , 0.286498, 0.576951, -0.73741 , 0.655205, 0.233221, 0.0681367, -0.941748)\n" + -277 " * (tgt.rgb)) + adj.xyz - 0.5;\n" + -278 " ipt.x = clamp(ipt.x, 0.0, 1.0);\n" + -279 " ipt.yz = clamp(ipt.yz, -1.0, 1.0);\n" + -280 " vec3 back = mat3(0.999779, 1.00015, 0.999769, 1.07094, -0.377744, 0.0629496, 0.324891, 0.220439, -0.809638) * ipt;\n" + -281 " gl_FragColor = vec4(clamp(back, 0.0, 1.0), adj.a * tgt.a);\n" + -282 "}"; -283 /** -284 * Just like {@link #fragmentShaderIPT}, but gamma-corrects the input and output RGB values (which improves -285 * lightness uniformity) and uses an exponential step internally to change how colors are distributed within the -286 * gamut. These steps are more computationally expensive than the bare-bones ones in {@link #fragmentShaderIPT}, but -287 * they seem to improve some aspects of color transitions quite a bit. -288 */ -289 public static String fragmentShaderIPT_HQ = -290 "#ifdef GL_ES\n" + -291 "#define LOWP lowp\n" + -292 "precision mediump float;\n" + -293 "#else\n" + -294 "#define LOWP \n" + -295 "#endif\n" + -296 "varying vec2 v_texCoords;\n" + -297 "varying LOWP vec4 v_color;\n" + -298 "uniform sampler2D u_texture;\n" + -299 "const vec3 forward = vec3(0.43);\n" + -300 "const vec3 reverse = vec3(1.0 / 0.43);\n" + -301 "void main()\n" + -302 "{\n" + -303 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + -304 " vec3 ipt = mat3(0.40000, 4.45500, 0.80560, 0.40000, -4.8510, 0.35720, 0.20000, 0.39600, -1.1628) *" + -305 " pow(mat3(0.313921, 0.151693, 0.017753, 0.639468, 0.748209, 0.109468, 0.0465970, 0.1000044, 0.8729690) \n" + -306 " * (tgt.rgb * tgt.rgb), forward);\n" + -307 " ipt.x = clamp(ipt.x + v_color.x - 0.55, 0.0, 1.0);\n" + -308 " ipt.yz = clamp(ipt.yz + v_color.yz * 2.0 - 1.0, -1.0, 1.0);\n" + -309 " ipt = mat3(1.0, 1.0, 1.0, 0.097569, -0.11388, 0.032615, 0.205226, 0.133217, -0.67689) * ipt;\n" + -310 " gl_FragColor = vec4(sqrt(clamp(" + -311 " mat3(5.432622, -1.10517, 0.028104, -4.67910, 2.311198, -0.19466, 0.246257, -0.20588, 1.166325) *\n" + -312 " (sign(ipt) * pow(abs(ipt), reverse))," + -313 " 0.0, 1.0)), v_color.a * tgt.a);\n" + -314 "}"; -315 -316 /** -317 * Just like {@link #fragmentShaderIPT_HQ}, but uses the Oklab color space instead of the very similar IPT_HQ one. -318 */ -319 public static String fragmentShaderOklab = -320 "#ifdef GL_ES\n" + -321 "#define LOWP lowp\n" + -322 "precision mediump float;\n" + -323 "#else\n" + -324 "#define LOWP \n" + -325 "#endif\n" + -326 "varying vec2 v_texCoords;\n" + -327 "varying LOWP vec4 v_color;\n" + -328 "uniform sampler2D u_texture;\n" + -329 "const vec3 forward = vec3(1.0 / 3.0);\n" + -330 "void main()\n" + -331 "{\n" + -332 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + -333 " vec3 lab = mat3(+0.2104542553, +1.9779984951, +0.0259040371, +0.7936177850, -2.4285922050, +0.7827717662, -0.0040720468, +0.4505937099, -0.8086757660) *" + -334 " pow(mat3(0.4121656120, 0.2118591070, 0.0883097947, 0.5362752080, 0.6807189584, 0.2818474174, 0.0514575653, 0.1074065790, 0.6302613616) \n" + -335 " * (tgt.rgb * tgt.rgb), forward);\n" + -336 " lab.x = clamp(lab.x + v_color.r - 0.63, 0.0, 1.0);\n" + -337 " lab.yz = clamp(lab.yz + v_color.gb * 2.0 - 1.0, -1.0, 1.0);\n" + -338 " lab = mat3(1.0, 1.0, 1.0, +0.3963377774, -0.1055613458, -0.0894841775, +0.2158037573, -0.0638541728, -1.2914855480) * lab;\n" + -339 " gl_FragColor = vec4(sqrt(clamp(" + -340 " mat3(+4.0767245293, -1.2681437731, -0.0041119885, -3.3072168827, +2.6093323231, -0.7034763098, +0.2307590544, -0.3411344290, +1.7068625689) *\n" + -341 " (lab * lab * lab)," + -342 " 0.0, 1.0)), v_color.a * tgt.a);\n" + -343 "}"; -344 -345 /** -346 * A vertex shader that does the bulk of processing HSI-format batch colors and converting them to a format -347 * {@link #fragmentShaderHSI} can use. Since HSI is only a cylindrical/spherical adaptation of IPT, with identical -348 * I components and the combination of H and S in polar coordinates mapping to P and T in Cartesian coordinates, -349 * the fragment shader this is used with can be any that expects an IPT color (currently only -350 * {@link #fragmentShaderIPT} does this, and it's the same as {@link #fragmentShaderHSI}). This vertex shader does -351 * a lot more than most vertex shaders here, but since it is executed relatively rarely (unless you're drawing many -352 * 1-pixel textures), there shouldn't be a heavy performance penalty. -353 */ -354 public static final String vertexShaderHSI = "attribute vec4 " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" -355 + "attribute vec4 " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" -356 + "attribute vec2 " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n" -357 + "uniform mat4 u_projTrans;\n" -358 + "varying vec4 v_color;\n" -359 + "varying vec2 v_texCoords;\n" -360 + "const vec3 yellow = vec3( 0.16155326,0.020876605,-0.26078433 );\n" -361 + "const vec3 magenta = vec3(-0.16136102,0.122068435,-0.070396 );\n" -362 + "const vec3 cyan = vec3( 0.16420607,0.3481738, 0.104959644);\n" -363 + "void main()\n" -364 + "{\n" -365 + " v_color = " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" -366 + " v_color.a = " + ShaderProgram.COLOR_ATTRIBUTE + ".a * (255.0/254.0);\n" -367 + " vec3 hsi = v_color.rgb;\n" -368 + " v_color.x = (hsi.z - 0.5) * 0.9999;\n" -369 + " hsi.x *= 6.28318;\n" -370 + " hsi.y *= 0.5;\n" -371 + " v_color.y = cos(hsi.x) * hsi.y;\n" -372 + " v_color.z = sin(hsi.x) * hsi.y;\n" -373 + " float crMid = dot(cyan.yz, v_color.yz);\n" -374 + " float mgMid = dot(magenta.yz, v_color.yz);\n" -375 + " float ybMid = dot(yellow.yz, v_color.yz);\n" -376 + " float crScale = (v_color.x - 0.5 + step(crMid, 0.0)) * cyan.x / (0.00001 - crMid);\n" -377 + " float mgScale = (v_color.x + 0.5 - step(mgMid, 0.0)) * magenta.x / (0.00001 - mgMid);\n" -378 + " float ybScale = (v_color.x - 0.5 + step(ybMid, 0.0)) * yellow.x / (0.00001 - ybMid);\n" -379 + " float scale = 4.0 * min(crScale, min(mgScale, ybScale));\n" -380 + " v_color.yz *= scale * length(v_color.yz) / cos(3.14159 * v_color.x);\n" -381 + " v_color.xyz += 0.5;\n" -382 + " v_texCoords = " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n" -383 + " gl_Position = u_projTrans * " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" -384 + "}\n"; -385 public static String fragmentShaderHSI = fragmentShaderIPT; -386 -387 /** -388 * Credit to Sam Hocevar, https://gamedev.stackexchange.com/a/59808 . -389 */ -390 public static final String partialCodeHSL = -391 "const float eps = 1.0e-10;\n" + -392// //Call this to go from the official HSL hue distribution (where blue is opposite yellow) to a -393// //different distribution that matches primary colors in painting (where purple is opposite yellow). -394// "float official2primaries(float hue) {\n" + -395// " return hue * ( 2.137\n" + -396// " + hue * ( 0.542\n" + -397// " + hue * (-15.141\n" + -398// " + hue * ( 30.120\n" + -399// " + hue * (-22.541\n" + -400// " + hue * 5.883)))));\n" + -401// "}\n" + -402// //Call this to go to the official HSL hue distribution (where blue is opposite yellow) from a -403// //different distribution that matches primary colors in painting (where purple is opposite yellow). -404// "float primaries2official(float hue) {\n" + -405// " return hue * ( 0.677\n" + -406// " + hue * ( -0.123\n" + -407// " + hue * (-11.302\n" + -408// " + hue * ( 46.767\n" + -409// " + hue * (-58.493\n" + -410// " + hue * 23.474)))));\n" + -411// "}\n" + -412 "vec4 rgb2hsl(vec4 c)\n" + -413 "{\n" + -414 " const vec4 J = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n" + -415 " vec4 p = mix(vec4(c.bg, J.wz), vec4(c.gb, J.xy), step(c.b, c.g));\n" + -416 " vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n" + -417 " float d = q.x - min(q.w, q.y);\n" + -418 " float l = q.x * (1.0 - 0.5 * d / (q.x + eps));\n" + -419 " return vec4(abs(q.z + (q.w - q.y) / (6.0 * d + eps)), (q.x - l) / (min(l, 1.0 - l) + eps), l, c.a);\n" + -420 "}\n" + -421 "\n" + -422 "vec4 hsl2rgb(vec4 c)\n" + -423 "{\n" + -424 " const vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n" + -425 " vec3 p = abs(fract(c.x + K.xyz) * 6.0 - K.www);\n" + -426 " float v = (c.z + c.y * min(c.z, 1.0 - c.z));\n" + -427 " return vec4(v * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), 2.0 * (1.0 - c.z / (v + eps))), c.w);\n" + -428 "}"; -429 -430 /** -431 * Adjusted-hue version of {@link #partialCodeHSL}, supplying HSL to-and-from RGB conversions with a smaller range -432 * of hue used for cyan and a larger range for orange. Not currently used. Credit to Sam Hocevar, -433 * https://gamedev.stackexchange.com/a/59808 . -434 */ -435 public static final String partialCodeHSLStretched = -436 "const float eps = 1.0e-10;\n" + -437 //// maybe not blue enough? -438// //Call this to go from the official HSL hue distribution (where blue is opposite yellow) to a -439// //different distribution that matches primary colors in painting (where purple is opposite yellow). -440// "float official2primaries(float hue) {\n" + -441// " return hue * ( 1.630\n" + -442// " + hue * ( 5.937\n" + -443// " + hue * (-38.485\n" + -444// " + hue * ( 76.101\n" + -445// " + hue * (-63.977\n" + -446// " + hue * 19.794)))));\n" + -447// "}\n" + -448// //Call this to go to the official HSL hue distribution (where blue is opposite yellow) from a -449// //different distribution that matches primary colors in painting (where purple is opposite yellow). -450// "float primaries2official(float hue) {\n" + -451// " return hue * ( 1.463\n" + -452// " + hue * ( -9.834\n" + -453// " + hue * ( 31.153\n" + -454// " + hue * (-35.066\n" + -455// " + hue * 13.284))));\n" + -456// "}\n" + -457 //// still weirdly high orange -458// "float official2primaries(float hue) {\n" + -459// " return hue * ( 2.634\n" + -460// " + hue * ( -4.703\n" + -461// " + hue * ( 3.659\n" + -462// " + hue * ( 0.829\n" + -463// " + hue * -1.419))));\n" + -464// "}\n" + -465// "float primaries2official(float hue) {\n" + -466// " return hue * ( 1.163\n" + -467// " + hue * ( -7.102\n" + -468// " + hue * ( 22.709\n" + -469// " + hue * (-25.502\n" + -470// " + hue * 9.732))));\n" + -471// "}\n" + -472// "const float ROOT = 16.0;\n" + -473// "const float SQUARE = ROOT * ROOT;\n" + -474 "float official2primaries(float hue) {\n" + -475// " return (sqrt(hue * 0.9375 + 0.0625) - 0.25) * 1.333;\n" + -476// " return asin(sqrt(hue * SQUARE) * (1.0 / ROOT)) * (2.0 * 3.14159274);\n" + -477 -478// " return asin((sqrt(hue * 0.9375 + 0.0625) - 0.25) * 2.666 - 1.0) * 0.318309886 + 0.5;\n" + -479 -480// " return sqrt(sin((hue - 0.5) * 3.14159274) * 0.5 + 0.5);\n" + -481// " return pow(hue, 0.5625);\n" + -482// " return sqrt(hue);\n" + -483 " return (sqrt(hue + 0.050625) - 0.225) * 1.25;\n" + -484 "}\n" + -485 "float primaries2official(float hue) {\n" + -486// " hue = sin((hue) * (0.5 * 3.14159274));\n" + -487// " hue = (hue) * 0.75 + 0.25;\n" + -488 -489// " hue = sin((hue - 0.5) * 3.14159274);\n" + -490// " hue = (hue + 1.0) * 0.375 + 0.25;\n" + -491// " return (hue * hue - 0.0625) * (1.0 / 0.9375);\n" + -492 -493// " return asin(hue * hue * 2.0 - 1.0) * 0.318309886 + 0.5;\n" + -494// " return pow(hue, 1.77777);\n" + -495 " return pow(hue * 0.8 + 0.225, 2.0) - 0.050625;\n" + -496// " return hue * hue;\n" + -497 -498// " hue = sin((hue) * (0.5 * 3.14159274));\n" + -499// " hue = hue * ROOT;\n" + -500// " return (hue * hue) * (1.0 / SQUARE);\n" + -501 -502 "}\n" + -503 //// way too much orange? -504// //Call this to go from the official HSL hue distribution (where blue is opposite yellow) to a -505// //different distribution that matches primary colors in painting (where purple is opposite yellow). -506// "float official2primaries(float hue) {\n" + -507// " return hue * ( 2.137\n" + -508// " + hue * ( 0.542\n" + -509// " + hue * (-15.141\n" + -510// " + hue * ( 30.120\n" + -511// " + hue * (-22.541\n" + -512// " + hue * 5.883)))));\n" + -513// "}\n" + -514// //Call this to go to the official HSL hue distribution (where blue is opposite yellow) from a -515// //different distribution that matches primary colors in painting (where purple is opposite yellow). -516// "float primaries2official(float hue) {\n" + -517// " return hue * ( 0.677\n" + -518// " + hue * ( -0.123\n" + -519// " + hue * (-11.302\n" + -520// " + hue * ( 46.767\n" + -521// " + hue * (-58.493\n" + -522// " + hue * 23.474)))));\n" + -523// "}\n" + -524 "vec4 rgb2hsl(vec4 c)\n" + -525 "{\n" + -526 " const vec4 J = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n" + -527 " vec4 p = mix(vec4(c.bg, J.wz), vec4(c.gb, J.xy), step(c.b, c.g));\n" + -528 " vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n" + -529 "\n" + -530 " float d = q.x - min(q.w, q.y);\n" + -531 " float l = q.x * (1.0 - 0.5 * d / (q.x + eps));\n" + -532 " return vec4(official2primaries(abs(q.z + (q.w - q.y) / (6.0 * d + eps))), (q.x - l) / (min(l, 1.0 - l) + eps), l, c.a);\n" + -533 "}\n" + -534 "\n" + -535 "vec4 hsl2rgb(vec4 c)\n" + -536 "{\n" + -537 " const vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n" + -538 " vec3 p = abs(fract(primaries2official(c.x) + K.xyz) * 6.0 - K.www);\n" + -539 " float v = (c.z + c.y * min(c.z, 1.0 - c.z));\n" + -540 " return vec4(v * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), 2.0 * (1.0 - c.z / (v + eps))), c.w);\n" + -541 "}"; -542 -543 public static final String fragmentShaderHSL = -544 "#ifdef GL_ES\n" + -545 "#define LOWP lowp\n" + -546 "precision mediump float;\n" + -547 "#else\n" + -548 "#define LOWP \n" + -549 "#endif\n" + -550 "varying vec2 v_texCoords;\n" + -551 "varying LOWP vec4 v_color;\n" + -552 "uniform sampler2D u_texture;\n" + -553 partialCodeHSL + -554 "void main()\n" + -555 "{\n" + -556 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + -557 " vec4 hsl = rgb2hsl(tgt);\n" + -558 " hsl.x = fract((fract(v_color.x + 0.5 - hsl.x) - 0.5) * v_color.w + hsl.x);\n" + -559 " hsl.yz = mix(hsl.yz, v_color.yz, v_color.w);\n" + -560 " gl_FragColor = hsl2rgb(hsl);\n" + -561 "}"; -562 -563 public static final String fragmentShaderRotateHSL = -564 "#ifdef GL_ES\n" + -565 "#define LOWP lowp\n" + -566 "precision mediump float;\n" + -567 "#else\n" + -568 "#define LOWP \n" + -569 "#endif\n" + -570 "varying vec2 v_texCoords;\n" + -571 "varying LOWP vec4 v_color;\n" + -572 "uniform sampler2D u_texture;\n" + -573 partialCodeHSL + -574 "void main()\n" + -575 "{\n" + -576 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + -577 " vec4 hsl = rgb2hsl(tgt);\n" + -578 " hsl.x = fract(v_color.x + hsl.x + 0.5);\n" + -579 " hsl.yz = clamp(hsl.yz * v_color.yz * 2.0, 0.0, 1.0);\n" + -580 " gl_FragColor = hsl2rgb(hsl);\n" + -581 "}"; -582 -583 /** -584 * This is the default vertex shader from libGDX, but also sets a varying value for contrast. It is needed if you -585 * use {@link #fragmentShaderHSLC}. -586 */ -587 public static final String vertexShaderHSLC = "attribute vec4 a_position;\n" -588 + "attribute vec4 a_color;\n" -589 + "attribute vec2 a_texCoord0;\n" -590 + "uniform mat4 u_projTrans;\n" -591 + "varying vec4 v_color;\n" -592 + "varying vec2 v_texCoords;\n" -593 + "varying float v_lightFix;\n" -594 + "\n" -595 + "void main()\n" -596 + "{\n" -597 + " v_color = a_color;\n" -598 + " v_texCoords = a_texCoord0;\n" -599 + " v_color.a = pow(v_color.a * (255.0/254.0) + 0.5, 1.709);\n" -600 + " v_lightFix = 1.0 + pow(v_color.a, 1.41421356);\n" -601 + " gl_Position = u_projTrans * a_position;\n" -602 + "}\n"; -603 -604 /** -605 * Allows changing Hue/Saturation/Lightness/Contrast, with hue as a rotation. Expects the vertex shader to be -606 * {@link #vertexShaderHSLC}, which sets {@code varying float v_lightFix} so contrast can use it. -607 * <br> -608 * Credit for HLSL version goes to Andrey-Postelzhuk, -609 * <a href="https://forum.unity.com/threads/hue-saturation-brightness-contrast-shader.260649/">Unity Forums</a>. -610 * The YCC adaptation, and different approach to contrast (this has close to neutral contrast when a is 0.5, -611 * while the original had a fair bit higher contrast than expected), is from this codebase. -612 */ -613 public static final String fragmentShaderHSLC = -614 "#ifdef GL_ES\n" + -615 "#define LOWP lowp\n" + -616 "precision mediump float;\n" + -617 "#else\n" + -618 "#define LOWP \n" + -619 "#endif\n" + -620 "varying vec2 v_texCoords;\n" + -621 "varying float v_lightFix;\n" + -622 "varying LOWP vec4 v_color;\n" + -623 "uniform sampler2D u_texture;\n" + -624 "vec3 applyHue(vec3 rgb, float hue)\n" + -625 "{\n" + -626 " vec3 k = vec3(0.57735);\n" + -627 " float c = cos(hue);\n" + -628 " //Rodrigues' rotation formula\n" + -629 " return rgb * c + cross(k, rgb) * sin(hue) + k * dot(k, rgb) * (1.0 - c);\n" + -630 "}\n" + -631 "void main()\n" + -632 "{\n" + -633 " float hue = 6.2831853 * (v_color.x - 0.5);\n" + -634 " float saturation = v_color.y * 2.0;\n" + -635 " float brightness = v_color.z - 0.5;\n" + -636 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + -637 " tgt.rgb = applyHue(tgt.rgb, hue);\n" + -638 " tgt.rgb = vec3(\n" + -639 " (0.5 * pow(dot(tgt.rgb, vec3(0.375, 0.5, 0.125)), v_color.w) * v_lightFix + brightness),\n" + // lightness -640 " ((tgt.r - tgt.b) * saturation),\n" + // warmth -641 " ((tgt.g - tgt.b) * saturation));\n" + // mildness -642 " gl_FragColor = clamp(vec4(\n" + -643 " dot(tgt.rgb, vec3(1.0, 0.625, -0.5)),\n" + // back to red -644 " dot(tgt.rgb, vec3(1.0, -0.375, 0.5)),\n" + // back to green -645 " dot(tgt.rgb, vec3(1.0, -0.375, -0.5)),\n" + // back to blue -646 " tgt.a), 0.0, 1.0);\n" + // keep alpha, then clamp -647 "}"; -648 /** -649 * Allows changing Hue/Saturation/Lightness/Alpha, with hue as a rotation. Expects the vertex shader to be -650 * {@link #vertexShader}, unlike what {@link #fragmentShaderHSLC} expects. -651 * <br> -652 * Credit for HLSL version goes to Andrey-Postelzhuk, -653 * <a href="https://forum.unity.com/threads/hue-saturation-brightness-contrast-shader.260649/">Unity Forums</a>. -654 * The YCC adaptation, and change to use alpha, is from this codebase. -655 */ -656 public static final String fragmentShaderHSLA = -657 "#ifdef GL_ES\n" + -658 "#define LOWP lowp\n" + -659 "precision mediump float;\n" + -660 "#else\n" + -661 "#define LOWP \n" + -662 "#endif\n" + -663 "varying vec2 v_texCoords;\n" + -664 "varying LOWP vec4 v_color;\n" + -665 "uniform sampler2D u_texture;\n" + -666 "vec3 applyHue(vec3 rgb, float hue)\n" + -667 "{\n" + -668 " vec3 k = vec3(0.57735);\n" + -669 " float c = cos(hue);\n" + -670 " //Rodrigues' rotation formula\n" + -671 " return rgb * c + cross(k, rgb) * sin(hue) + k * dot(k, rgb) * (1.0 - c);\n" + -672 "}\n" + -673 "void main()\n" + -674 "{\n" + -675 " float hue = 6.2831853 * (v_color.x - 0.5);\n" + -676 " float saturation = v_color.y * 2.0;\n" + -677 " float brightness = v_color.z - 0.5;\n" + -678 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + -679 " tgt.rgb = applyHue(tgt.rgb, hue);\n" + -680 " tgt.rgb = vec3(\n" + -681 " (dot(tgt.rgb, vec3(0.375, 0.5, 0.125)) + brightness),\n" + // lightness -682 " ((tgt.r - tgt.b) * saturation),\n" + // warmth -683 " ((tgt.g - tgt.b) * saturation));\n" + // mildness -684 " gl_FragColor = clamp(vec4(\n" + -685 " dot(tgt.rgb, vec3(1.0, 0.625, -0.5)),\n" + // back to red -686 " dot(tgt.rgb, vec3(1.0, -0.375, 0.5)),\n" + // back to green -687 " dot(tgt.rgb, vec3(1.0, -0.375, -0.5)),\n" + // back to blue -688 " tgt.a * v_color.w), 0.0, 1.0);\n" + // keep alpha, then clamp -689 "}"; -690 /** -691 * GLSL: Takes an RGB vec3 and a float that represents a hue rotation in radians, and returns the rotated RGB vec3. -692 * Credit for this challenging method goes to Andrey-Postelzhuk, -693 * <a href="https://forum.unity.com/threads/hue-saturation-brightness-contrast-shader.260649/">Unity Forums</a>. -694 */ -695 public static final String hueRodrigues = -696 "vec3 applyHue(vec3 rgb, float hue)\n" + -697 "{\n" + -698 " vec3 k = vec3(0.57735);\n" + -699 " float c = cos(hue);\n" + -700 " //Rodrigues' rotation formula\n" + -701 " return rgb * c + cross(k, rgb) * sin(hue) + k * dot(k, rgb) * (1.0 - c);\n" + -702 "}\n"; -703 -704 /** -705 * Generally a lower-quality hue rotation than {@link #fragmentShaderHSLC}; this is here as a work in progress. -706 * Expects the vertex shader to be {@link #vertexShaderHSLC}, which sets {@code varying float v_lightFix} so -707 * contrast can use it. -708 */ -709 public static final String fragmentShaderHSLC2 = -710 "#ifdef GL_ES\n" + -711 "#define LOWP lowp\n" + -712 "precision mediump float;\n" + -713 "#else\n" + -714 "#define LOWP \n" + -715 "#endif\n" + -716 "varying vec2 v_texCoords;\n" + -717 "varying float v_lightFix;\n" + -718 "varying LOWP vec4 v_color;\n" + -719 "uniform sampler2D u_texture;\n" + -720 partialCodeHSL + -721 "void main()\n" + -722 "{\n" + -723 " float hue = (v_color.x - 0.5);\n" + -724 " float saturation = v_color.y * 2.0;\n" + -725 " float brightness = v_color.z - 0.5;\n" + -726 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + -727 " tgt = rgb2hsl(tgt);\n" + -728 " tgt.r = fract(tgt.r + hue);\n" + -729 " tgt = hsl2rgb(tgt);\n" + -730 " tgt.rgb = vec3(\n" + -731 " (0.5 * pow(dot(tgt.rgb, vec3(0.375, 0.5, 0.125)), v_color.w) * v_lightFix + brightness),\n" + // lightness -732 " ((tgt.r - tgt.b) * saturation),\n" + // warmth -733 " ((tgt.g - tgt.b) * saturation));\n" + // mildness -734 " gl_FragColor = clamp(vec4(\n" + -735 " dot(tgt.rgb, vec3(1.0, 0.625, -0.5)),\n" + // back to red -736 " dot(tgt.rgb, vec3(1.0, -0.375, 0.5)),\n" + // back to green -737 " dot(tgt.rgb, vec3(1.0, -0.375, -0.5)),\n" + // back to blue -738 " tgt.a), 0.0, 1.0);\n" + // keep alpha, then clamp -739 "}"; -740 /** -741 * Cycles lightness in a psychedelic way as hue and lightness change; not a general-purpose usage. -742 * Expects the vertex shader to be {@link #vertexShaderHSLC}, which sets {@code varying float v_lightFix} so -743 * contrast can use it. -744 */ -745 public static final String fragmentShaderHSLC3 = -746 "#ifdef GL_ES\n" + -747 "#define LOWP lowp\n" + -748 "precision mediump float;\n" + -749 "#else\n" + -750 "#define LOWP \n" + -751 "#endif\n" + -752 "varying vec2 v_texCoords;\n" + -753 "varying float v_lightFix;\n" + -754 "varying LOWP vec4 v_color;\n" + -755 "uniform sampler2D u_texture;\n" + -756 "vec3 applyHue(vec3 rgb, float hue)\n" + -757 "{\n" + -758 " vec3 k = vec3(0.57735);\n" + -759 " float c = cos(hue);\n" + -760 " //Rodrigues' rotation formula\n" + -761 " return rgb * c + cross(k, rgb) * sin(hue) + k * dot(k, rgb) * (1.0 - c);\n" + -762 "}\n" + -763 "void main()\n" + -764 "{\n" + -765 " float hue = 6.2831853 * (v_color.x - 0.5);\n" + -766 " float saturation = v_color.y * 2.0;\n" + -767 " float brightness = v_color.z - 0.5;\n" + -768 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + -769 " tgt.rgb = applyHue(tgt.rgb, hue);\n" + -770 " tgt.rgb = vec3(\n" + -771 " (0.5 * pow(dot(tgt.rgb, vec3(0.375, 0.5, 0.125)), v_color.w) * v_lightFix),\n" + // lightness -772 " ((tgt.r - tgt.b) * saturation),\n" + // warmth -773 " ((tgt.g - tgt.b) * saturation));\n" + // mildness -774 " tgt.r = sin((tgt.r + brightness) * 6.2831853) * 0.5 + 0.5;\n" + -775 " gl_FragColor = clamp(vec4(\n" + -776 " dot(tgt.rgb, vec3(1.0, 0.625, -0.5)),\n" + // back to red -777 " dot(tgt.rgb, vec3(1.0, -0.375, 0.5)),\n" + // back to green -778 " dot(tgt.rgb, vec3(1.0, -0.375, -0.5)),\n" + // back to blue -779 " tgt.a), 0.0, 1.0);\n" + // keep alpha, then clamp -780 "}"; -781 /** -782 * Cycles hue, but not lightness; otherwise this is like {@link #fragmentShaderHSLC3} without contrast, and keeping -783 * alpha intact. -784 * Internally, this uses Sam Hocevar's RGB/HSL conversion instead of Andrey-Postelzhuk's HSLC code. -785 * Expects the vertex shader to be {@link #vertexShader}, not the HSLC variant. -786 */ -787 public static final String fragmentShaderHSLPsychedelic = -788 "#ifdef GL_ES\n" + -789 "#define LOWP lowp\n" + -790 "precision mediump float;\n" + -791 "#else\n" + -792 "#define LOWP \n" + -793 "#endif\n" + -794 "varying vec2 v_texCoords;\n" + -795 "varying LOWP vec4 v_color;\n" + -796 "uniform sampler2D u_texture;\n" + -797 partialCodeHSL + -798 "void main()\n" + -799 "{\n" + -800 " float hue = v_color.x - 0.5;\n" + -801 " float saturation = v_color.y * 2.0;\n" + -802 " float brightness = v_color.z - 0.5;\n" + -803 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + -804 " tgt = rgb2hsl(tgt);\n" + -805 " tgt.x = fract(tgt.x + hue);\n" + -806 " tgt.y = clamp(tgt.y * saturation, 0.0, 1.0);\n" + -807 " tgt.z = clamp(brightness + tgt.z, 0.0, 1.0);\n" + -808 " gl_FragColor = hsl2rgb(tgt);\n" + -809 "}"; -810 -811 /** -812 * One of the more useful HSL shaders here, this takes a batch color as hue, saturation, lightness, and power, -813 * with hue as a target hue and power used to determine how much of the target color should be used. There is no -814 * neutral value for hue, saturation, or lightness, but if power is 0, then the source color will be used -815 * exactly. On the other hand, if power is 1.0, then all pixels will be the target color. Hue is specified from -816 * 0.0 to 1.0, with 0.0 as red, about 0.3 as green, about 0.6 as blue, etc. Saturation is specified from 0.0 to 1.0, -817 * with 0.0 as grayscale and 1.0 as a fully-saturated target color. Lightness is specified from 0.0 to 1.0, with 0.0 -818 * as black, the 0.3 to 0.7 range as most colors, and 1.0 white; saturation is clamped to a smaller value as -819 * lightness moves away from 0.5 (toward black or white). -820 */ -821 public static final String fragmentShaderHSLP = -822 "#ifdef GL_ES\n" + -823 "#define LOWP lowp\n" + -824 "precision mediump float;\n" + -825 "#else\n" + -826 "#define LOWP \n" + -827 "#endif\n" + -828 "varying vec2 v_texCoords;\n" + -829 "varying LOWP vec4 v_color;\n" + -830 "uniform sampler2D u_texture;\n" + -831 partialCodeHSL + -832 "void main()\n" + -833 "{\n" + -834 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + -835 " vec4 hsl = rgb2hsl(tgt);\n" + -836 " hsl.xy = vec2(cos(hsl.x * 6.2831853), sin(hsl.x * 6.2831853)) * hsl.y;\n" + -837 " vec3 tint = vec3(cos(v_color.x * 6.2831853) * v_color.y, sin(v_color.x * 6.2831853) * v_color.y, v_color.z);\n" + -838 " hsl.xyz = mix(hsl.xyz, tint, v_color.w);\n" + -839 " hsl.xy = vec2(fract(atan(hsl.y, hsl.x) / 6.2831853), length(hsl.xy));\n" + -840 " gl_FragColor = hsl2rgb(hsl);\n" + -841 "}"; -842 -843 public static final String fragmentShaderReplacement = -844 "#ifdef GL_ES\n" + -845 "#define LOWP lowp\n" + -846 "precision mediump float;\n" + -847 "#else\n" + -848 "#define LOWP \n" + -849 "#endif\n" + -850 "varying vec2 v_texCoords;\n" + -851 "varying LOWP vec4 v_color;\n" + -852 "uniform sampler2D u_texture;\n" + -853 "uniform vec4 u_search;\n" + -854 "uniform vec4 u_replace;\n" + -855 "void main()\n" + -856 "{\n" + -857 " vec4 tgt = texture2D(u_texture, v_texCoords);\n" + -858 " float curve = smoothstep(0.0, 1.0, 1.25 - distance(tgt.rgb, u_search.rgb) * 2.0);\n" + -859 " gl_FragColor = vec4(mix(tgt.rgb, u_replace.rgb, curve), tgt.a) * v_color;\n" + -860 "}"; -861 /** -862 * A drop-in replacement for the default fragment shader that eliminates lightness differences in the output colors. -863 * Specifically, it does the normal SpriteBatch shader's step with the multiplicative batch color, converts to IPT, -864 * sets intensity to 0.5, shrinks the P and T components so the color is less saturated, and then converts back to -865 * an RGBA color. Editing this shader is strongly encouraged to fit your needs! -866 * <br> -867 * This uses {@link #vertexShader}, as usual. -868 * @see #fragmentShaderConfigurableContrast a per-sprite-configurable version of this -869 */ -870 public static String fragmentShaderFlatLightness = -871 "#ifdef GL_ES\n" + -872 "#define LOWP lowp\n" + -873 "precision mediump float;\n" + -874 "#else\n" + -875 "#define LOWP \n" + -876 "#endif\n" + -877 "#define TARGET_LIGHTNESS 0.5 \n" + -878 "#define SATURATION_CHANGE 1.0 \n" + -879 "varying vec2 v_texCoords;\n" + -880 "varying LOWP vec4 v_color;\n" + -881 "uniform sampler2D u_texture;\n" + -882 "void main()\n" + -883 "{\n" + -884 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + -885 " vec3 ipt = (mat3(0.189786, 0.669665 , 0.286498, 0.576951, -0.73741 , 0.655205, 0.233221, 0.0681367, -0.941748)\n" + -886 " * (tgt.rgb * v_color.rgb));\n" + -887 " ipt.x = TARGET_LIGHTNESS;\n" + // change to desired lightness or pass in a lightness as a uniform -888 "// ipt.x = (ipt.x - 0.5) * 0.25 + TARGET_LIGHTNESS;\n" + // an alternative way that preserves a tiny bit of original lightness -889 " ipt.yz *= SATURATION_CHANGE;\n" + // multiplies saturation by SATURATION_CHANGE, which may be more or less than 1.0 -890 " vec3 back = clamp(mat3(0.999779, 1.00015, 0.999769, 1.07094, -0.377744, 0.0629496, 0.324891, 0.220439, -0.809638) * ipt, 0.0, 1.0);\n" + -891 " gl_FragColor = vec4(back, v_color.a * tgt.a);\n" + -892 "}"; -893 /** -894 * A specialized shader that can reduce lightness differences in the output colors, saturate/desaturate them, and -895 * can be configured to use some of the existing lightness in the image to add to a main flat lightness. -896 * Specifically, it takes the fragment color (typically a pixel in a texture), converts to IPT, does a calculation -897 * involving the intensity of the fragment color where the batch color's blue channel affects how much that -898 * intensity is used, adds the red channel of the batch color, multiplies the P and T components by the green -899 * channel times 2.0 to saturate or desaturate, and then converts back to an RGBA color. The neutral value for this -900 * is the RGBA color 0.5, 0.5, 1.0, 1.0 . A typical usage to achieve a fog effect would be to raise lightness (r), -901 * slightly reduce saturation (g), sharply flatten the original texture's lightness (b), and leave alpha alone (a): -902 * 0.7, 0.4, 0.2, 1.0 . -903 * <br> -904 * This uses {@link #vertexShader}, as usual. -905 * @see #fragmentShaderFlatLightness if you only need one contrast setting and still want to set color tints -906 */ -907 public static String fragmentShaderConfigurableContrast = -908 "#ifdef GL_ES\n" + -909 "#define LOWP lowp\n" + -910 "precision mediump float;\n" + -911 "#else\n" + -912 "#define LOWP \n" + -913 "#endif\n" + -914 "varying vec2 v_texCoords;\n" + -915 "varying LOWP vec4 v_color;\n" + -916 "uniform sampler2D u_texture;\n" + -917 "void main()\n" + -918 "{\n" + -919 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + -920 " vec3 ipt = (mat3(0.189786, 0.669665 , 0.286498, 0.576951, -0.73741 , 0.655205, 0.233221, 0.0681367, -0.941748)\n" + -921 " * tgt.rgb);\n" + -922 " ipt.x = (ipt.x - 0.5) * v_color.b + v_color.r;\n" + // preserves some lightness based on b, sets main lightness with r -923 " ipt.yz *= v_color.g * 2.0;\n" + // the green channel affects saturation; if it's 0.5 it won't change saturation. -924 " vec3 back = clamp(mat3(0.999779, 1.00015, 0.999769, 1.07094, -0.377744, 0.0629496, 0.324891, 0.220439, -0.809638) * ipt, 0.0, 1.0);\n" + -925 " gl_FragColor = vec4(back, v_color.a * tgt.a);\n" + -926 "}"; -927 -928 /** -929 * A day/night cycle shader that can be used without any other parts of this library. This only needs setting the -930 * uniform {@code u_timeOfDay} to any float; the rate at which you change this float affects how fast the day/night -931 * cycle occurs. This is meant to be used with {@link #fragmentShaderDayNight}. Together, they make the color -932 * adjustment go from bluish and dark at night, to purplish at dawn, to orange/yellow and bright at mid-day, toward -933 * red at dusk, and then back to bluish at night. -934 */ -935 public static String vertexShaderDayNight = "attribute vec4 " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" -936 + "attribute vec4 " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" -937 + "attribute vec2 " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n" -938 + "uniform mat4 u_projTrans;\n" -939 + "uniform float u_timeOfDay;\n" -940 + "varying vec4 v_color;\n" -941 + "varying vec4 v_tweak;\n" -942 + "varying vec2 v_texCoords;\n" -943 + "varying float v_lightFix;\n" -944 + "const vec3 forward = vec3(1.0 / 3.0);\n" -945 + "\n" -946 + "void main()\n" -947 + "{\n" -948 + " float st = sin(1.5707963 * sin(0.2617994 * u_timeOfDay));\n" -949 + " float ct = sin(1.5707963 * cos(0.2617994 * u_timeOfDay));\n" -950 + " float dd = ct * ct;\n" -951 + " v_color = " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" -952 + " v_color.w = v_color.w * (255.0/254.0);\n" -953 + " vec3 oklab = mat3(+0.2104542553, +1.9779984951, +0.0259040371, +0.7936177850, -2.4285922050, +0.7827717662, -0.0040720468, +0.4505937099, -0.8086757660) *" -954 + " pow(mat3(0.4121656120, 0.2118591070, 0.0883097947, 0.5362752080, 0.6807189584, 0.2818474174, 0.0514575653, 0.1074065790, 0.6302613616) \n" -955 + " * (v_color.rgb * v_color.rgb), forward);\n" -956 + " v_color.x = clamp(oklab.x + (0.0625 * st), 0.0, 1.0);\n" -957 + " v_color.yz = clamp(oklab.yz + vec2(0.0625 * dd + 0.03125 * st, 0.1 * st), -1.0, 1.0) * ((dd + 0.25) * 0.5);\n" -958 + " v_tweak = vec4(0.2 * st + 0.5);\n" -959 + " v_tweak.w = pow((1.0 - 0.125 * st), 1.709);\n" -960 + " v_lightFix = 1.0 + pow(v_tweak.w, 1.41421356);\n" -961 + " v_texCoords = " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n" -962 + " gl_Position = u_projTrans * " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" -963 + "}\n"; -964 /** -965 * The fragment shader counterpart to {@link #vertexShaderDayNight}; must be used with that vertex shader. See its -966 * docs for more info, particularly about the one uniform this needs set. -967 */ -968 public static String fragmentShaderDayNight = -969 "#ifdef GL_ES\n" + -970 "#define LOWP lowp\n" + -971 "precision mediump float;\n" + -972 "#else\n" + -973 "#define LOWP \n" + -974 "#endif\n" + -975 "varying vec2 v_texCoords;\n" + -976 "varying LOWP vec4 v_color;\n" + -977 "varying LOWP vec4 v_tweak;\n" + -978 "varying float v_lightFix;\n" + -979 "uniform sampler2D u_texture;\n" + -980 "const vec3 forward = vec3(1.0 / 3.0);\n" + -981 "void main()\n" + -982 "{\n" + -983 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + -984 " vec3 lab = mat3(+0.2104542553, +1.9779984951, +0.0259040371, +0.7936177850, -2.4285922050, +0.7827717662, -0.0040720468, +0.4505937099, -0.8086757660) *" + -985 " pow(mat3(0.4121656120, 0.2118591070, 0.0883097947, 0.5362752080, 0.6807189584, 0.2818474174, 0.0514575653, 0.1074065790, 0.6302613616) \n" + -986 " * (tgt.rgb * tgt.rgb), forward);\n" + -987 " lab.x = clamp(pow(lab.x, v_tweak.w) * v_lightFix * v_tweak.x + v_color.x - 1.0, 0.0, 1.0);\n" + -988 " lab.yz = clamp((lab.yz * v_tweak.yz + v_color.yz) * 1.5, -1.0, 1.0);\n" + -989 " lab = mat3(1.0, 1.0, 1.0, +0.3963377774, -0.1055613458, -0.0894841775, +0.2158037573, -0.0638541728, -1.2914855480) * lab;\n" + -990 " gl_FragColor = vec4(sqrt(clamp(" + -991 " mat3(+4.0767245293, -1.2681437731, -0.0041119885, -3.3072168827, +2.6093323231, -0.7034763098, +0.2307590544, -0.3411344290, +1.7068625689) *\n" + -992 " (lab * lab * lab)," + -993 " 0.0, 1.0)), v_color.a * tgt.a);\n" + -994 "}"; -995 -996} +125 public static ShaderProgram makeRGBAShader() +126 { +127 ShaderProgram shader = new ShaderProgram(vertexShader, fragmentShaderRGBA); +128 if(!shader.isCompiled()) +129 throw new GdxRuntimeException("Couldn't compile shader: " + shader.getLog()); +130 return shader; +131 } +132 /** +133 * A simple helper method that builds the simplest shader here; this shader allows tinting with light colors to +134 * lighten an image, and also smooths changes well. You can assign the result to a SpriteBatch with its +135 * {@link SpriteBatch#setShader(ShaderProgram)} method. +136 * <br> +137 * You can generate RGB colors using any of various methods in the {@code rgb} package, such as +138 * {@link com.github.tommyettinger.colorful.rgb.ColorTools#rgb(float, float, float, float)}. +139 * @return a ShaderProgram that uses the RGBA shader {@link #fragmentShaderGammaRGBA} +140 */ +141 public static ShaderProgram makeGammaRGBAShader() +142 { +143 ShaderProgram shader = new ShaderProgram(vertexShader, fragmentShaderGammaRGBA); +144 if(!shader.isCompiled()) +145 throw new GdxRuntimeException("Couldn't compile shader: " + shader.getLog()); +146 return shader; +147 } +148 +149 /** +150 * Where the magic happens; this converts a batch color from the YCwCm format (used by colorful's ycwcm package) to +151 * RGBA. The vertex color will be split up into 4 channels just as a normal shader does, but the channels here are +152 * luma, chromatic warmth, chromatic mildness, and alpha; alpha acts just like a typical RGBA shader, but the others +153 * are additive instead of multiplicative, with 0.5 as a neutral value. This does not support the "tweak" features +154 * that {@link ColorfulBatch} does, which include multiplicative counterparts to the additive operations this +155 * supports on luma, chromatic warmth, and chromatic mildness, plus a contrast adjustment. If you want to adjust +156 * contrast globally, you can use {@link #makeBatch(float)} to set the contrast for a new Batch with a new shader. +157 * <br> +158 * You can generate RGB colors using any of various methods in the {@code rgb} package, such as +159 * {@link com.github.tommyettinger.colorful.rgb.ColorTools#rgb(float, float, float, float)}. +160 * <br> +161 * Meant for use with {@link #vertexShader}. +162 */ +163 public static final String fragmentShader = +164 "#ifdef GL_ES\n" + +165 "#define LOWP lowp\n" + +166 "precision mediump float;\n" + +167 "#else\n" + +168 "#define LOWP \n" + +169 "#endif\n" + +170 "varying vec2 v_texCoords;\n" + +171 "varying LOWP vec4 v_color;\n" + +172 "uniform sampler2D u_texture;\n" + +173 "const vec3 bright = vec3(0.375, 0.5, 0.125);\n" + +174 "void main()\n" + +175 "{\n" + +176 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + +177 "////use the following line to match the color exactly\n" + +178 " vec3 ycc = vec3(v_color.r - 0.5 + dot(tgt.rgb, bright), ((v_color.g - 0.5) * 2.0 + tgt.r - tgt.b), ((v_color.b - 0.5) * 2.0 + tgt.g - tgt.b));\n" + +179 "////use the following line to increase contrast\n" + +180 "// vec3 ycc = vec3(v_color.r * dot(sin(tgt.rgb * 1.5707963267948966) * sqrt(tgt.rgb), bright), ((v_color.g - 0.5) * 2.0 + tgt.r - tgt.b), ((v_color.b - 0.5) * 2.0 + tgt.g - tgt.b));\n" + +181 "////use the following line to increase contrast more\n" + +182 "// vec3 ycc = vec3(v_color.r * pow(dot(tgt.rgb, bright), 1.25), ((v_color.g - 0.5) * 2.0 + tgt.r - tgt.b), ((v_color.b - 0.5) * 2.0 + tgt.g - tgt.b));\n" + +183 //uses a specific matrix (related to bright, above) multiplied with ycc to get back to rgb. +184 " gl_FragColor = vec4( (clamp(mat3(1.0, 1.0, 1.0, 0.625, -0.375, -0.375, -0.5, 0.5, -0.5) * ycc, 0.0, 1.0)), v_color.a * tgt.a);\n" + +185 "}"; +186 /** +187 * A variant on {@link #fragmentShader} that adjusts luma to make mid-range colors darker, while keeping light +188 * colors light. This is not the same as {@link ColorfulBatch} even when the contrast for ColorfulBatch's tweak is +189 * the same as what this uses (1.375 here, which is roughly 0.875f in a tweak value). ColorfulBatch does some work +190 * in the vertex shader so it may be a little faster than this approach, and it seems to have less severe effects on +191 * the overall brightness of an image that has adjusted contrast. +192 * <br> +193 * You can generate YCwCm colors using any of various methods in the {@code ycwcm} package, such as +194 * {@link com.github.tommyettinger.colorful.ycwcm.ColorTools#ycwcm(float, float, float, float)}. +195 * <br> +196 * Meant for use with {@link #vertexShader}. +197 */ +198 public static final String fragmentShaderHigherContrast = +199 "#ifdef GL_ES\n" + +200 "#define LOWP lowp\n" + +201 "precision mediump float;\n" + +202 "#else\n" + +203 "#define LOWP \n" + +204 "#endif\n" + +205 "varying vec2 v_texCoords;\n" + +206 "varying LOWP vec4 v_color;\n" + +207 "uniform sampler2D u_texture;\n" + +208 "const float contrast = 1.375 ; // You can make contrast a uniform if you want.\n" + +209 "const vec3 bright = vec3(0.375, 0.5, 0.125) * (4.0 / 3.0);\n" + +210 "void main()\n" + +211 "{\n" + +212 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + +213 " vec3 ycc = vec3(v_color.r - 0.5 + pow(dot(tgt.rgb, bright), contrast) * 0.75, ((v_color.g - 0.5) * 2.0 + tgt.r - tgt.b), ((v_color.b - 0.5) * 2.0 + tgt.g - tgt.b));\n" + +214 " gl_FragColor = vec4( (clamp(mat3(1.0, 1.0, 1.0, 0.625, -0.375, -0.375, -0.5, 0.5, -0.5) * ycc, 0.0, 1.0)), v_color.a * tgt.a);\n" + +215 "}"; +216 +217 /** +218 * An alternative shader that effectively reduces luma contrast, bringing all but the darkest colors to the +219 * upper-mid luma range. This is not the same as {@link ColorfulBatch} even when the contrast for ColorfulBatch's +220 * tweak is the same as what this uses (0.625 here, which is roughly 0.125f in a tweak value). ColorfulBatch does +221 * some work in the vertex shader so it may be a little faster than this approach, and it seems to have less severe +222 * effects on the overall brightness of an image that has adjusted contrast. +223 * <br> +224 * You can generate YCwCm colors using any of various methods in the {@code ycwcm} package, such as +225 * {@link com.github.tommyettinger.colorful.ycwcm.ColorTools#ycwcm(float, float, float, float)}. +226 * <br> +227 * Meant for use with {@link #vertexShader}. +228 */ +229 public static final String fragmentShaderLowerContrast = fragmentShaderHigherContrast.replace(" 1.375 ", "0.625"); +230 +231 /** +232 * Prepares and returns a new SpriteBatch that uses the default {@link #vertexShader} and {@link #fragmentShader} +233 * from this class, making it able to render YCwCm colors from the ycwcm package. It won't be a +234 * {@link ColorfulBatch} (those can adjust colors in more ways); you can simply use {@code new ColorfulBatch()} to +235 * make one of those. Note that a SpriteBatch like this produces won't be able to render a {@link ColorfulSprite}, +236 * but ColorfulBatch can. +237 * <br> +238 * You can generate YCwCm colors using any of various methods in the {@code ycwcm} package, such as +239 * {@link com.github.tommyettinger.colorful.ycwcm.ColorTools#ycwcm(float, float, float, float)}. +240 * @return a freshly allocated SpriteBatch that will also have a new ShaderProgram for rendering YCwCm +241 */ +242 public static SpriteBatch makeBatch() +243 { +244 ShaderProgram shader = new ShaderProgram(vertexShader, fragmentShader); +245 if(!shader.isCompiled()) +246 throw new GdxRuntimeException("Couldn't compile shader: " + shader.getLog()); +247 return new SpriteBatch(1000, shader); +248 } +249 +250 /** +251 * Prepares and returns a new SpriteBatch that uses the default {@link #vertexShader} and {@link #fragmentShader} +252 * from this class, making it able to render YCwCm colors from the ycwcm package. This also takes a +253 * {@code contrast} parameter; if greater than 1.0 it will make light colors lighter and dark colors darker, while +254 * if it is less than 1.0 it will make all but the darkest colors closer to the upper-middle-range of lightness. +255 * If you want to adjust contrast per-sprite, use a {@link ColorfulBatch} (those can adjust colors in more ways); +256 * you can simply use {@code new ColorfulBatch()} to make one of those. Note that a SpriteBatch like this produces +257 * won't be able to render a {@link ColorfulSprite}, but ColorfulBatch can. ColorfulBatch also will calculate +258 * contrast differently from the shader this uses, including doing some work in the vertex shader (which may be +259 * faster). It also takes a contrast in its tweak value that is limited to a 0.0 to 1.0 range, rather than 0.1 to +260 * 2.0 here (this can technically tolerate 0.01 to 10.0, but those extremes aren't recommended). +261 * <br> +262 * You can generate YCwCm colors using any of various methods in the {@code ycwcm} package, such as +263 * {@link com.github.tommyettinger.colorful.ycwcm.ColorTools#ycwcm(float, float, float, float)}. +264 * @param contrast how much contrast should be emphasized; higher than 1.0 is more contrasting, and this should usually be between 0.1 and 2.0 +265 * @return a freshly allocated SpriteBatch that will also have a new ShaderProgram for rendering YCwCm +266 */ +267 public static SpriteBatch makeBatch(final float contrast) +268 { +269 ShaderProgram shader = new ShaderProgram(vertexShader, fragmentShaderHigherContrast.replace(" 1.375 ", Float.toString(Math.min(Math.max(contrast, 0.01f), 10f)))); +270 if(!shader.isCompiled()) +271 throw new GdxRuntimeException("Couldn't compile shader: " + shader.getLog()); +272 return new SpriteBatch(1000, shader); +273 } +274 +275 /** +276 * Prepares and returns a new SpriteBatch that uses {@link #vertexShaderHSLC} and {@link #fragmentShaderHSLC} +277 * from this class, making it interpret the SpriteBatch's color, as set by +278 * {@link SpriteBatch#setColor(float, float, float, float)}, to be hue rotation, saturation change, lightness +279 * change, and contrast change. All of these are neutral when their value is 0.5f. Hue rotates clockwise or +280 * counterclockwise when it goes toward 0.0, and the other way when it goes toward 1.0; 0.0 and 1.0 both refer to +281 * the 180 degree rotation, but I don't know which goes which way (it also depends on how you visualize hue). +282 * Saturation becomes more grayscale as it goes towards 0.0, and more vivid as it goes towards 1.0. Lightness gets +283 * darker towards 0.0, lighter towards 1.0 (any lightness above 0.5 will brighten the image, unlike the default +284 * shader and batch color). Contrast affects changes in lightness; low contrast makes all lightness closer to the +285 * mid-range, while high contrast makes even small changes in the mid-range of an image's color have stark lightness +286 * changes in the result. Note, this does not support changing an image's alpha with the batch color. +287 * <br> +288 * You can generate HSLC colors using {@link FloatColors#rgb2hsl(float, float, float, float)}, using the last +289 * parameter to store contrast. +290 * @return a freshly allocated SpriteBatch that will also have a new ShaderProgram for rendering HSLC +291 */ +292 public static SpriteBatch makeBatchHSLC() +293 { +294 ShaderProgram shader = new ShaderProgram(vertexShaderHSLC, fragmentShaderHSLC); +295 if(!shader.isCompiled()) +296 throw new GdxRuntimeException("Couldn't compile shader: " + shader.getLog()); +297 return new SpriteBatch(1000, shader); +298 } +299 +300 /** +301 * Similar to {@link #fragmentShader}, but this uses the very perceptually-accurate IPT color space as described by +302 * Ebner and Fairchild, instead of the custom YCwCm color space. IPT doesn't really need that much more computation +303 * to be done by the shader, but tends to make gradual changes in color much smoother. If comparing to YCwCm, then +304 * Y (luma) is like I (intensity) here, so when a Batch color has 0 for I (stored in the r channel), it makes the +305 * image very dark, while if the Batch color has 1 for I, it makes the image very light. Cw and Cm can be graphed +306 * like a color wheel, and in their case, the 4 corners of a square graph are red, yellow, green, and blue. IPT is +307 * less geometrical, and the corners are roughly purple, orange, green, and cyan, while the centers of the edges of +308 * the square are close to red, yellow, green, and blue. <a href="https://i.imgur.com/A3n4qmM.png">See this capture +309 * of the IPT space</a> if you want a better picture. The P (short for protan, a term from ophthalmology) channel +310 * (stored in g) is the left-to-right axis there, with P==0 making colors green or blue (cooler), and P==1 making +311 * colors orange, red, or purple (somewhat warmer). The T (short for tritan, also from ophthalmology) channel +312 * (stored in b) is the down-to-up axis there, with T==0 making colors more blue or purple, and T==1 making colors +313 * more green, yellow, brown, or orange. Where protan can be viewed as going from cool to warm as its value +314 * increases, tritan can be viewed as going from artificial to natural, or perhaps fluid to solid. Alpha is treated +315 * exactly as it is in the standard libGDX fragment shader, with the alpha in the batch color multiplied by the +316 * alpha in the image pixel to get the result alpha. +317 * <br> +318 * You can generate IPT colors using any of various methods in the {@code ipt} package, such as +319 * {@link com.github.tommyettinger.colorful.ipt.ColorTools#ipt(float, float, float, float)}. Note that IPT is +320 * intended to share an API with the {@code ipt_hq} package, but IPT_HQ is usually preferred. +321 * <br> +322 * Meant for use with {@link #vertexShader}. +323 */ +324 public static String fragmentShaderIPT = +325 "#ifdef GL_ES\n" + +326 "#define LOWP lowp\n" + +327 "precision mediump float;\n" + +328 "#else\n" + +329 "#define LOWP \n" + +330 "#endif\n" + +331 "varying vec2 v_texCoords;\n" + +332 "varying LOWP vec4 v_color;\n" + +333 "uniform sampler2D u_texture;\n" + +334 "void main()\n" + +335 "{\n" + +336 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + +337 " vec4 adj = v_color;\n" + +338 " adj.yz = adj.yz * 2.0 - 0.5;\n" + +339 " vec3 ipt = (mat3(0.189786, 0.669665 , 0.286498, 0.576951, -0.73741 , 0.655205, 0.233221, 0.0681367, -0.941748)\n" + +340 " * (tgt.rgb)) + adj.xyz - 0.5;\n" + +341 " ipt.x = clamp(ipt.x, 0.0, 1.0);\n" + +342 " ipt.yz = clamp(ipt.yz, -1.0, 1.0);\n" + +343 " vec3 back = mat3(0.999779, 1.00015, 0.999769, 1.07094, -0.377744, 0.0629496, 0.324891, 0.220439, -0.809638) * ipt;\n" + +344 " gl_FragColor = vec4(clamp(back, 0.0, 1.0), adj.a * tgt.a);\n" + +345 "}"; +346 /** +347 * Just like {@link #fragmentShaderIPT}, but gamma-corrects the input and output RGB values (which improves +348 * lightness uniformity) and uses an exponential step internally to change how colors are distributed within the +349 * gamut. These steps are more computationally expensive than the bare-bones ones in {@link #fragmentShaderIPT}, but +350 * they seem to improve some aspects of color transitions quite a bit. +351 * <br> +352 * You can generate IPT_HQ colors using any of various methods in the {@code ipt_hq} package, such as +353 * {@link com.github.tommyettinger.colorful.ipt_hq.ColorTools#ipt(float, float, float, float)}. Note that IPT_HQ is +354 * intended to share an API with the {@code ipt} package, but IPT_HQ is usually preferred. +355 * <br> +356 * Meant for use with {@link #vertexShader}. +357 */ +358 public static String fragmentShaderIPT_HQ = +359 "#ifdef GL_ES\n" + +360 "#define LOWP lowp\n" + +361 "precision mediump float;\n" + +362 "#else\n" + +363 "#define LOWP \n" + +364 "#endif\n" + +365 "varying vec2 v_texCoords;\n" + +366 "varying LOWP vec4 v_color;\n" + +367 "uniform sampler2D u_texture;\n" + +368 "const vec3 forward = vec3(0.43);\n" + +369 "const vec3 reverse = vec3(1.0 / 0.43);\n" + +370 "void main()\n" + +371 "{\n" + +372 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + +373 " vec3 ipt = mat3(0.40000, 4.45500, 0.80560, 0.40000, -4.8510, 0.35720, 0.20000, 0.39600, -1.1628) *" + +374 " pow(mat3(0.313921, 0.151693, 0.017753, 0.639468, 0.748209, 0.109468, 0.0465970, 0.1000044, 0.8729690) \n" + +375 " * (tgt.rgb * tgt.rgb), forward);\n" + +376 " ipt.x = clamp(ipt.x + v_color.x - 0.55, 0.0, 1.0);\n" + +377 " ipt.yz = clamp(ipt.yz + v_color.yz * 2.0 - 1.0, -1.0, 1.0);\n" + +378 " ipt = mat3(1.0, 1.0, 1.0, 0.097569, -0.11388, 0.032615, 0.205226, 0.133217, -0.67689) * ipt;\n" + +379 " gl_FragColor = vec4(sqrt(clamp(" + +380 " mat3(5.432622, -1.10517, 0.028104, -4.67910, 2.311198, -0.19466, 0.246257, -0.20588, 1.166325) *\n" + +381 " (sign(ipt) * pow(abs(ipt), reverse))," + +382 " 0.0, 1.0)), v_color.a * tgt.a);\n" + +383 "}"; +384 +385 /** +386 * Just like {@link #fragmentShaderIPT_HQ}, but uses the Oklab color space instead of the very similar IPT_HQ one. +387 * This also gamma-corrects the inputs and outputs, though it uses subtly different math internally. Oklab colors +388 * tend to have more variation on their L channel, which represents lightness, than their A or B channels, which +389 * represent green-to-red and blue-to-yellow chromatic axes; indeed, A and B tend to be no more than about 1/6 away +390 * from their middle point at 1/2, which is used for grayscale. This is normal for Oklab, and allows colors to be +391 * compared for approximate difference using Euclidean distance. Importantly, Oklab preserves the meaning of its L +392 * channel (lightness) very well when comparing two arbitrary colors, while also doing well when comparing chroma +393 * (see {@link com.github.tommyettinger.colorful.oklab.ColorTools#chroma(float)}. +394 * <br> +395 * You can generate Oklab colors using any of various methods in the {@code oklab} package, such as +396 * {@link com.github.tommyettinger.colorful.oklab.ColorTools#oklab(float, float, float, float)}. +397 * <br> +398 * Meant for use with {@link #vertexShader}. +399 */ +400 public static String fragmentShaderOklab = +401 "#ifdef GL_ES\n" + +402 "#define LOWP lowp\n" + +403 "precision mediump float;\n" + +404 "#else\n" + +405 "#define LOWP \n" + +406 "#endif\n" + +407 "varying vec2 v_texCoords;\n" + +408 "varying LOWP vec4 v_color;\n" + +409 "uniform sampler2D u_texture;\n" + +410 "const vec3 forward = vec3(1.0 / 3.0);\n" + +411 "void main()\n" + +412 "{\n" + +413 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + +414 " vec3 lab = mat3(+0.2104542553, +1.9779984951, +0.0259040371, +0.7936177850, -2.4285922050, +0.7827717662, -0.0040720468, +0.4505937099, -0.8086757660) *" + +415 " pow(mat3(0.4121656120, 0.2118591070, 0.0883097947, 0.5362752080, 0.6807189584, 0.2818474174, 0.0514575653, 0.1074065790, 0.6302613616) \n" + +416 " * (tgt.rgb * tgt.rgb), forward);\n" + +417 " lab.x = clamp(lab.x + v_color.r - 0.63, 0.0, 1.0);\n" + +418 " lab.yz = clamp(lab.yz + v_color.gb * 2.0 - 1.0, -1.0, 1.0);\n" + +419 " lab = mat3(1.0, 1.0, 1.0, +0.3963377774, -0.1055613458, -0.0894841775, +0.2158037573, -0.0638541728, -1.2914855480) * lab;\n" + +420 " gl_FragColor = vec4(sqrt(clamp(" + +421 " mat3(+4.0767245293, -1.2681437731, -0.0041119885, -3.3072168827, +2.6093323231, -0.7034763098, +0.2307590544, -0.3411344290, +1.7068625689) *\n" + +422 " (lab * lab * lab)," + +423 " 0.0, 1.0)), v_color.a * tgt.a);\n" + +424 "}"; +425 +426 /** +427 * A vertex shader that does the bulk of processing HSI-format batch colors and converting them to a format +428 * {@link #fragmentShaderHSI} can use. Since HSI is only a cylindrical/spherical adaptation of IPT, with identical +429 * I components and the combination of H and S in polar coordinates mapping to P and T in Cartesian coordinates, +430 * the fragment shader this is used with can be any that expects an IPT color (currently only +431 * {@link #fragmentShaderIPT} does this, and it's the same as {@link #fragmentShaderHSI}). This vertex shader does +432 * a lot more than most vertex shaders here, but since it is executed relatively rarely (unless you're drawing many +433 * 1-pixel textures), there shouldn't be a heavy performance penalty. +434 * <br> +435 * There is no special code to generate HSI colors; you can use +436 * {@link com.github.tommyettinger.colorful.ipt.ColorTools#ipt(float, float, float, float)}, or any ColorTools +437 * method that generates a packed float color directly from the channel values, to specify hue, saturation, +438 * intensity, and alpha in that order. You can also just specify the batch color directly with +439 * {@link SpriteBatch#setColor(float, float, float, float)}, taking the channels in the same order as above. +440 * <br> +441 * EXPERIMENTAL. Meant more for reading and editing than serious usage. +442 */ +443 public static final String vertexShaderHSI = "attribute vec4 " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" +444 + "attribute vec4 " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" +445 + "attribute vec2 " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n" +446 + "uniform mat4 u_projTrans;\n" +447 + "varying vec4 v_color;\n" +448 + "varying vec2 v_texCoords;\n" +449 + "const vec3 yellow = vec3( 0.16155326,0.020876605,-0.26078433 );\n" +450 + "const vec3 magenta = vec3(-0.16136102,0.122068435,-0.070396 );\n" +451 + "const vec3 cyan = vec3( 0.16420607,0.3481738, 0.104959644);\n" +452 + "void main()\n" +453 + "{\n" +454 + " v_color = " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" +455 + " v_color.a = " + ShaderProgram.COLOR_ATTRIBUTE + ".a * (255.0/254.0);\n" +456 + " vec3 hsi = v_color.rgb;\n" +457 + " v_color.x = (hsi.z - 0.5) * 0.9999;\n" +458 + " hsi.x *= 6.28318;\n" +459 + " hsi.y *= 0.5;\n" +460 + " v_color.y = cos(hsi.x) * hsi.y;\n" +461 + " v_color.z = sin(hsi.x) * hsi.y;\n" +462 + " float crMid = dot(cyan.yz, v_color.yz);\n" +463 + " float mgMid = dot(magenta.yz, v_color.yz);\n" +464 + " float ybMid = dot(yellow.yz, v_color.yz);\n" +465 + " float crScale = (v_color.x - 0.5 + step(crMid, 0.0)) * cyan.x / (0.00001 - crMid);\n" +466 + " float mgScale = (v_color.x + 0.5 - step(mgMid, 0.0)) * magenta.x / (0.00001 - mgMid);\n" +467 + " float ybScale = (v_color.x - 0.5 + step(ybMid, 0.0)) * yellow.x / (0.00001 - ybMid);\n" +468 + " float scale = 4.0 * min(crScale, min(mgScale, ybScale));\n" +469 + " v_color.yz *= scale * length(v_color.yz) / cos(3.14159 * v_color.x);\n" +470 + " v_color.xyz += 0.5;\n" +471 + " v_texCoords = " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n" +472 + " gl_Position = u_projTrans * " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" +473 + "}\n"; +474 /** +475 * This is an alias for {@link #fragmentShaderIPT}. If used with {@link #vertexShaderHSI}, you can specify a batch +476 * color using an HSL-like system. +477 * <br> +478 * There is no special code to generate HSI colors; you can use +479 * {@link com.github.tommyettinger.colorful.ipt.ColorTools#ipt(float, float, float, float)}, or any ColorTools +480 * method that generates a packed float color directly from the channel values, to specify hue, saturation, +481 * intensity, and alpha in that order. You can also just specify the batch color directly with +482 * {@link SpriteBatch#setColor(float, float, float, float)}, taking the channels in the same order as above. +483 * <br> +484 * Meant for use with {@link #vertexShaderHSI}. +485 */ +486 public static String fragmentShaderHSI = fragmentShaderIPT; +487 +488 /** +489 * Not a full shader, this is a snippet used by most of the other HSL-based shaders to implement the complex +490 * rgb2hsl() and hsl2rgb() methods. There are also comments in the code snippet that you can use if you want to +491 * change the distribution of colors across the color wheel. +492 * <br> +493 * Credit to Sam Hocevar, https://gamedev.stackexchange.com/a/59808 . +494 * <br> +495 * EXPERIMENTAL. Meant more for reading and editing than serious usage. +496 */ +497 public static final String partialCodeHSL = +498 "const float eps = 1.0e-10;\n" + +499 "////Call this to go from the official HSL hue distribution (where blue is opposite yellow) to a\n" + +500 "////different distribution that matches primary colors in painting (where purple is opposite yellow).\n" + +501 "//float official2primaries(float hue) {\n" + +502 "// return hue * ( 2.137\n" + +503 "// + hue * ( 0.542\n" + +504 "// + hue * (-15.141\n" + +505 "// + hue * ( 30.120\n" + +506 "// + hue * (-22.541\n" + +507 "// + hue * 5.883)))));\n" + +508 "//}\n" + +509 "////Call this to go to the official HSL hue distribution (where blue is opposite yellow) from a\n" + +510 "////different distribution that matches primary colors in painting (where purple is opposite yellow).\n" + +511 "//float primaries2official(float hue) {\n" + +512 "// return hue * ( 0.677\n" + +513 "// + hue * ( -0.123\n" + +514 "// + hue * (-11.302\n" + +515 "// + hue * ( 46.767\n" + +516 "// + hue * (-58.493\n" + +517 "// + hue * 23.474)))));\n" + +518 "//}\n" + +519 "vec4 rgb2hsl(vec4 c)\n" + +520 "{\n" + +521 " const vec4 J = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n" + +522 " vec4 p = mix(vec4(c.bg, J.wz), vec4(c.gb, J.xy), step(c.b, c.g));\n" + +523 " vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n" + +524 " float d = q.x - min(q.w, q.y);\n" + +525 " float l = q.x * (1.0 - 0.5 * d / (q.x + eps));\n" + +526 " return vec4(abs(q.z + (q.w - q.y) / (6.0 * d + eps)), (q.x - l) / (min(l, 1.0 - l) + eps), l, c.a);\n" + +527 "}\n" + +528 "\n" + +529 "vec4 hsl2rgb(vec4 c)\n" + +530 "{\n" + +531 " const vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n" + +532 " vec3 p = abs(fract(c.x + K.xyz) * 6.0 - K.www);\n" + +533 " float v = (c.z + c.y * min(c.z, 1.0 - c.z));\n" + +534 " return vec4(v * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), 2.0 * (1.0 - c.z / (v + eps))), c.w);\n" + +535 "}"; +536 +537 /** +538 * Adjusted-hue version of {@link #partialCodeHSL}, supplying HSL to-and-from RGB conversions with a smaller range +539 * of hue used for cyan and a larger range for orange. Not currently used. This is pretty much only meant so people +540 * reading the source code and trying different variations on HSL can see some of the attempts I made. +541 * <br> +542 * Credit to Sam Hocevar, https://gamedev.stackexchange.com/a/59808 . +543 * <br> +544 * EXPERIMENTAL. Meant more for reading and editing than serious usage. +545 */ +546 public static final String partialCodeHSLStretched = +547 "const float eps = 1.0e-10;\n" + +548 //// maybe not blue enough? +549// //Call this to go from the official HSL hue distribution (where blue is opposite yellow) to a +550// //different distribution that matches primary colors in painting (where purple is opposite yellow). +551// "float official2primaries(float hue) {\n" + +552// " return hue * ( 1.630\n" + +553// " + hue * ( 5.937\n" + +554// " + hue * (-38.485\n" + +555// " + hue * ( 76.101\n" + +556// " + hue * (-63.977\n" + +557// " + hue * 19.794)))));\n" + +558// "}\n" + +559// //Call this to go to the official HSL hue distribution (where blue is opposite yellow) from a +560// //different distribution that matches primary colors in painting (where purple is opposite yellow). +561// "float primaries2official(float hue) {\n" + +562// " return hue * ( 1.463\n" + +563// " + hue * ( -9.834\n" + +564// " + hue * ( 31.153\n" + +565// " + hue * (-35.066\n" + +566// " + hue * 13.284))));\n" + +567// "}\n" + +568 //// still weirdly high orange +569// "float official2primaries(float hue) {\n" + +570// " return hue * ( 2.634\n" + +571// " + hue * ( -4.703\n" + +572// " + hue * ( 3.659\n" + +573// " + hue * ( 0.829\n" + +574// " + hue * -1.419))));\n" + +575// "}\n" + +576// "float primaries2official(float hue) {\n" + +577// " return hue * ( 1.163\n" + +578// " + hue * ( -7.102\n" + +579// " + hue * ( 22.709\n" + +580// " + hue * (-25.502\n" + +581// " + hue * 9.732))));\n" + +582// "}\n" + +583// "const float ROOT = 16.0;\n" + +584// "const float SQUARE = ROOT * ROOT;\n" + +585 "float official2primaries(float hue) {\n" + +586// " return (sqrt(hue * 0.9375 + 0.0625) - 0.25) * 1.333;\n" + +587// " return asin(sqrt(hue * SQUARE) * (1.0 / ROOT)) * (2.0 * 3.14159274);\n" + +588 +589// " return asin((sqrt(hue * 0.9375 + 0.0625) - 0.25) * 2.666 - 1.0) * 0.318309886 + 0.5;\n" + +590 +591// " return sqrt(sin((hue - 0.5) * 3.14159274) * 0.5 + 0.5);\n" + +592// " return pow(hue, 0.5625);\n" + +593// " return sqrt(hue);\n" + +594 " return (sqrt(hue + 0.050625) - 0.225) * 1.25;\n" + +595 "}\n" + +596 "float primaries2official(float hue) {\n" + +597// " hue = sin((hue) * (0.5 * 3.14159274));\n" + +598// " hue = (hue) * 0.75 + 0.25;\n" + +599 +600// " hue = sin((hue - 0.5) * 3.14159274);\n" + +601// " hue = (hue + 1.0) * 0.375 + 0.25;\n" + +602// " return (hue * hue - 0.0625) * (1.0 / 0.9375);\n" + +603 +604// " return asin(hue * hue * 2.0 - 1.0) * 0.318309886 + 0.5;\n" + +605// " return pow(hue, 1.77777);\n" + +606 " return pow(hue * 0.8 + 0.225, 2.0) - 0.050625;\n" + +607// " return hue * hue;\n" + +608 +609// " hue = sin((hue) * (0.5 * 3.14159274));\n" + +610// " hue = hue * ROOT;\n" + +611// " return (hue * hue) * (1.0 / SQUARE);\n" + +612 +613 "}\n" + +614 //// way too much orange? +615// //Call this to go from the official HSL hue distribution (where blue is opposite yellow) to a +616// //different distribution that matches primary colors in painting (where purple is opposite yellow). +617// "float official2primaries(float hue) {\n" + +618// " return hue * ( 2.137\n" + +619// " + hue * ( 0.542\n" + +620// " + hue * (-15.141\n" + +621// " + hue * ( 30.120\n" + +622// " + hue * (-22.541\n" + +623// " + hue * 5.883)))));\n" + +624// "}\n" + +625// //Call this to go to the official HSL hue distribution (where blue is opposite yellow) from a +626// //different distribution that matches primary colors in painting (where purple is opposite yellow). +627// "float primaries2official(float hue) {\n" + +628// " return hue * ( 0.677\n" + +629// " + hue * ( -0.123\n" + +630// " + hue * (-11.302\n" + +631// " + hue * ( 46.767\n" + +632// " + hue * (-58.493\n" + +633// " + hue * 23.474)))));\n" + +634// "}\n" + +635 "vec4 rgb2hsl(vec4 c)\n" + +636 "{\n" + +637 " const vec4 J = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n" + +638 " vec4 p = mix(vec4(c.bg, J.wz), vec4(c.gb, J.xy), step(c.b, c.g));\n" + +639 " vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n" + +640 "\n" + +641 " float d = q.x - min(q.w, q.y);\n" + +642 " float l = q.x * (1.0 - 0.5 * d / (q.x + eps));\n" + +643 " return vec4(official2primaries(abs(q.z + (q.w - q.y) / (6.0 * d + eps))), (q.x - l) / (min(l, 1.0 - l) + eps), l, c.a);\n" + +644 "}\n" + +645 "\n" + +646 "vec4 hsl2rgb(vec4 c)\n" + +647 "{\n" + +648 " const vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n" + +649 " vec3 p = abs(fract(primaries2official(c.x) + K.xyz) * 6.0 - K.www);\n" + +650 " float v = (c.z + c.y * min(c.z, 1.0 - c.z));\n" + +651 " return vec4(v * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), 2.0 * (1.0 - c.z / (v + eps))), c.w);\n" + +652 "}"; +653 /** +654 * This GLSL snippet takes an RGB vec3 and a float that represents a hue rotation in radians, and returns the +655 * rotated RGB vec3. It is not a full shader, and is used by inserting it into shader code to provide the applyHue() +656 * method to that code. +657 * <br> +658 * Credit for this challenging method goes to Andrey-Postelzhuk, +659 * <a href="https://forum.unity.com/threads/hue-saturation-brightness-contrast-shader.260649/">Unity Forums</a>. +660 */ +661 public static final String partialHueRodrigues = +662 "vec3 applyHue(vec3 rgb, float hue)\n" + +663 "{\n" + +664 " vec3 k = vec3(0.57735);\n" + +665 " float c = cos(hue);\n" + +666 " //Rodrigues' rotation formula\n" + +667 " return rgb * c + cross(k, rgb) * sin(hue) + k * dot(k, rgb) * (1.0 - c);\n" + +668 "}\n"; +669 +670 +671 /** +672 * Treats the color as hue, saturation, lightness, and... uh... well, this is pretty much only useful when the batch +673 * color's {@code a} is 1 . You probably want {@link #fragmentShaderHSLC} or {@link #fragmentShaderHSLA}. +674 * <br> +675 * EXPERIMENTAL. Meant more for reading and editing than serious usage. +676 */ +677 public static final String fragmentShaderHSL = +678 "#ifdef GL_ES\n" + +679 "#define LOWP lowp\n" + +680 "precision mediump float;\n" + +681 "#else\n" + +682 "#define LOWP \n" + +683 "#endif\n" + +684 "varying vec2 v_texCoords;\n" + +685 "varying LOWP vec4 v_color;\n" + +686 "uniform sampler2D u_texture;\n" + +687 partialCodeHSL + +688 "void main()\n" + +689 "{\n" + +690 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + +691 " vec4 hsl = rgb2hsl(tgt);\n" + +692 " hsl.x = fract((fract(v_color.x + 0.5 - hsl.x) - 0.5) * v_color.w + hsl.x);\n" + +693 " hsl.yz = mix(hsl.yz, v_color.yz, v_color.w);\n" + +694 " gl_FragColor = hsl2rgb(hsl);\n" + +695 "}"; +696 +697 /** +698 * I can't even remember what this does, to be honest. It's probably not what you want. Instead, you probably want +699 * {@link #fragmentShaderHSLC} or {@link #fragmentShaderHSLA}. +700 * <br> +701 * EXPERIMENTAL. Meant more for reading and editing than serious usage. +702 */ +703 public static final String fragmentShaderRotateHSL = +704 "#ifdef GL_ES\n" + +705 "#define LOWP lowp\n" + +706 "precision mediump float;\n" + +707 "#else\n" + +708 "#define LOWP \n" + +709 "#endif\n" + +710 "varying vec2 v_texCoords;\n" + +711 "varying LOWP vec4 v_color;\n" + +712 "uniform sampler2D u_texture;\n" + +713 partialCodeHSL + +714 "void main()\n" + +715 "{\n" + +716 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + +717 " vec4 hsl = rgb2hsl(tgt);\n" + +718 " hsl.x = fract(v_color.x + hsl.x + 0.5);\n" + +719 " hsl.yz = clamp(hsl.yz * v_color.yz * 2.0, 0.0, 1.0);\n" + +720 " gl_FragColor = hsl2rgb(hsl);\n" + +721 "}"; +722 +723 /** +724 * This is similar to the default vertex shader from libGDX, but also sets a varying value for contrast. It is +725 * needed if you use {@link #fragmentShaderHSLC}. +726 */ +727 public static final String vertexShaderHSLC = "attribute vec4 a_position;\n" +728 + "attribute vec4 a_color;\n" +729 + "attribute vec2 a_texCoord0;\n" +730 + "uniform mat4 u_projTrans;\n" +731 + "varying vec4 v_color;\n" +732 + "varying vec2 v_texCoords;\n" +733 + "varying float v_lightFix;\n" +734 + "\n" +735 + "void main()\n" +736 + "{\n" +737 + " v_color = a_color;\n" +738 + " v_texCoords = a_texCoord0;\n" +739 + " v_color.a = pow(v_color.a * (255.0/254.0) + 0.5, 1.709);\n" +740 + " v_lightFix = 1.0 + pow(v_color.a, 1.41421356);\n" +741 + " gl_Position = u_projTrans * a_position;\n" +742 + "}\n"; +743 +744 /** +745 * Allows changing Hue/Saturation/Lightness/Contrast, with hue as a rotation. If hue continuously goes from 0 to 1, +746 * then 0 to 1, 0 to 1, and so on, then this will smoothly rotate the hue of the image. +747 * <br> +748 * You can generate HSLC colors using methods like {@link FloatColors#rgb2hsl(float, float, float, float)}. +749 * <br> +750 * Credit for HLSL version goes to Andrey-Postelzhuk, +751 * <a href="https://forum.unity.com/threads/hue-saturation-brightness-contrast-shader.260649/">Unity Forums</a>. +752 * The YCC adaptation, and different approach to contrast (this has close to neutral contrast when a is 0.5, +753 * while the original had a fair bit higher contrast than expected), is from this codebase. +754 * <br> +755 * Meant only for use with {@link #vertexShaderHSLC}, which sets {@code varying float v_lightFix} so contrast can +756 * use it. +757 */ +758 public static final String fragmentShaderHSLC = +759 "#ifdef GL_ES\n" + +760 "#define LOWP lowp\n" + +761 "precision mediump float;\n" + +762 "#else\n" + +763 "#define LOWP \n" + +764 "#endif\n" + +765 "varying vec2 v_texCoords;\n" + +766 "varying float v_lightFix;\n" + +767 "varying LOWP vec4 v_color;\n" + +768 "uniform sampler2D u_texture;\n" + +769 partialHueRodrigues + +770 "void main()\n" + +771 "{\n" + +772 " float hue = 6.2831853 * (v_color.x - 0.5);\n" + +773 " float saturation = v_color.y * 2.0;\n" + +774 " float brightness = v_color.z - 0.5;\n" + +775 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + +776 " tgt.rgb = applyHue(tgt.rgb, hue);\n" + +777 " tgt.rgb = vec3(\n" + +778 " (0.5 * pow(dot(tgt.rgb, vec3(0.375, 0.5, 0.125)), v_color.w) * v_lightFix + brightness),\n" + // lightness +779 " ((tgt.r - tgt.b) * saturation),\n" + // warmth +780 " ((tgt.g - tgt.b) * saturation));\n" + // mildness +781 " gl_FragColor = clamp(vec4(\n" + +782 " dot(tgt.rgb, vec3(1.0, 0.625, -0.5)),\n" + // back to red +783 " dot(tgt.rgb, vec3(1.0, -0.375, 0.5)),\n" + // back to green +784 " dot(tgt.rgb, vec3(1.0, -0.375, -0.5)),\n" + // back to blue +785 " tgt.a), 0.0, 1.0);\n" + // keep alpha, then clamp +786 "}"; +787 /** +788 * Allows changing Hue/Saturation/Lightness/Alpha, with hue as a rotation. +789 * <br> +790 * You can generate HSLA colors using methods like {@link FloatColors#rgb2hsl(float, float, float, float)}. +791 * <br> +792 * Credit for HLSL version goes to Andrey-Postelzhuk, +793 * <a href="https://forum.unity.com/threads/hue-saturation-brightness-contrast-shader.260649/">Unity Forums</a>. +794 * The YCC adaptation, and change to use alpha, is from this codebase. +795 * <br> +796 * Meant to be used with {@link #vertexShader}, unlike what {@link #fragmentShaderHSLC} expects. +797 */ +798 public static final String fragmentShaderHSLA = +799 "#ifdef GL_ES\n" + +800 "#define LOWP lowp\n" + +801 "precision mediump float;\n" + +802 "#else\n" + +803 "#define LOWP \n" + +804 "#endif\n" + +805 "varying vec2 v_texCoords;\n" + +806 "varying LOWP vec4 v_color;\n" + +807 "uniform sampler2D u_texture;\n" + +808 partialHueRodrigues + +809 "void main()\n" + +810 "{\n" + +811 " float hue = 6.2831853 * (v_color.x - 0.5);\n" + +812 " float saturation = v_color.y * 2.0;\n" + +813 " float brightness = v_color.z - 0.5;\n" + +814 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + +815 " tgt.rgb = applyHue(tgt.rgb, hue);\n" + +816 " tgt.rgb = vec3(\n" + +817 " (dot(tgt.rgb, vec3(0.375, 0.5, 0.125)) + brightness),\n" + // lightness +818 " ((tgt.r - tgt.b) * saturation),\n" + // warmth +819 " ((tgt.g - tgt.b) * saturation));\n" + // mildness +820 " gl_FragColor = clamp(vec4(\n" + +821 " dot(tgt.rgb, vec3(1.0, 0.625, -0.5)),\n" + // back to red +822 " dot(tgt.rgb, vec3(1.0, -0.375, 0.5)),\n" + // back to green +823 " dot(tgt.rgb, vec3(1.0, -0.375, -0.5)),\n" + // back to blue +824 " tgt.a * v_color.w), 0.0, 1.0);\n" + // keep alpha, then clamp +825 "}"; +826 /** +827 * Generally a lower-quality hue rotation than {@link #fragmentShaderHSLC}; this is here as a work in progress. +828 * <br> +829 * You can generate HSLC colors using methods like {@link FloatColors#rgb2hsl(float, float, float, float)}. +830 * <br> +831 * Meant to be used with {@link #vertexShaderHSLC}, which sets {@code varying float v_lightFix} so +832 * contrast can use it. +833 * <br> +834 * EXPERIMENTAL. Meant more for reading and editing than serious usage. +835 */ +836 public static final String fragmentShaderHSLC2 = +837 "#ifdef GL_ES\n" + +838 "#define LOWP lowp\n" + +839 "precision mediump float;\n" + +840 "#else\n" + +841 "#define LOWP \n" + +842 "#endif\n" + +843 "varying vec2 v_texCoords;\n" + +844 "varying float v_lightFix;\n" + +845 "varying LOWP vec4 v_color;\n" + +846 "uniform sampler2D u_texture;\n" + +847 partialCodeHSL + +848 "void main()\n" + +849 "{\n" + +850 " float hue = (v_color.x - 0.5);\n" + +851 " float saturation = v_color.y * 2.0;\n" + +852 " float brightness = v_color.z - 0.5;\n" + +853 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + +854 " tgt = rgb2hsl(tgt);\n" + +855 " tgt.r = fract(tgt.r + hue);\n" + +856 " tgt = hsl2rgb(tgt);\n" + +857 " tgt.rgb = vec3(\n" + +858 " (0.5 * pow(dot(tgt.rgb, vec3(0.375, 0.5, 0.125)), v_color.w) * v_lightFix + brightness),\n" + // lightness +859 " ((tgt.r - tgt.b) * saturation),\n" + // warmth +860 " ((tgt.g - tgt.b) * saturation));\n" + // mildness +861 " gl_FragColor = clamp(vec4(\n" + +862 " dot(tgt.rgb, vec3(1.0, 0.625, -0.5)),\n" + // back to red +863 " dot(tgt.rgb, vec3(1.0, -0.375, 0.5)),\n" + // back to green +864 " dot(tgt.rgb, vec3(1.0, -0.375, -0.5)),\n" + // back to blue +865 " tgt.a), 0.0, 1.0);\n" + // keep alpha, then clamp +866 "}"; +867 /** +868 * Cycles lightness in a psychedelic way as hue and lightness change; not a general-purpose usage. +869 * <br> +870 * You can generate HSLC colors using methods like {@link FloatColors#rgb2hsl(float, float, float, float)}. +871 * <br> +872 * Meant to be used with {@link #vertexShaderHSLC}, which sets {@code varying float v_lightFix} so +873 * contrast can use it. +874 * <br> +875 * EXPERIMENTAL. Meant more for reading and editing than serious usage. +876 */ +877 public static final String fragmentShaderHSLC3 = +878 "#ifdef GL_ES\n" + +879 "#define LOWP lowp\n" + +880 "precision mediump float;\n" + +881 "#else\n" + +882 "#define LOWP \n" + +883 "#endif\n" + +884 "varying vec2 v_texCoords;\n" + +885 "varying float v_lightFix;\n" + +886 "varying LOWP vec4 v_color;\n" + +887 "uniform sampler2D u_texture;\n" + +888 "vec3 applyHue(vec3 rgb, float hue)\n" + +889 partialHueRodrigues + +890 "void main()\n" + +891 "{\n" + +892 " float hue = 6.2831853 * (v_color.x - 0.5);\n" + +893 " float saturation = v_color.y * 2.0;\n" + +894 " float brightness = v_color.z - 0.5;\n" + +895 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + +896 " tgt.rgb = applyHue(tgt.rgb, hue);\n" + +897 " tgt.rgb = vec3(\n" + +898 " (0.5 * pow(dot(tgt.rgb, vec3(0.375, 0.5, 0.125)), v_color.w) * v_lightFix),\n" + // lightness +899 " ((tgt.r - tgt.b) * saturation),\n" + // warmth +900 " ((tgt.g - tgt.b) * saturation));\n" + // mildness +901 " tgt.r = sin((tgt.r + brightness) * 6.2831853) * 0.5 + 0.5;\n" + +902 " gl_FragColor = clamp(vec4(\n" + +903 " dot(tgt.rgb, vec3(1.0, 0.625, -0.5)),\n" + // back to red +904 " dot(tgt.rgb, vec3(1.0, -0.375, 0.5)),\n" + // back to green +905 " dot(tgt.rgb, vec3(1.0, -0.375, -0.5)),\n" + // back to blue +906 " tgt.a), 0.0, 1.0);\n" + // keep alpha, then clamp +907 "}"; +908 /** +909 * Cycles hue, but not lightness; otherwise this is like {@link #fragmentShaderHSLC3} without contrast, and keeping +910 * alpha intact. Internally, this uses Sam Hocevar's RGB/HSL conversion instead of Andrey-Postelzhuk's HSLC code. +911 * <br> +912 * You can generate HSLA colors using methods like {@link FloatColors#rgb2hsl(float, float, float, float)}. +913 * <br> +914 * Expects the vertex shader to be {@link #vertexShader}, not the HSLC variant. +915 * <br> +916 * EXPERIMENTAL. Meant more for reading and editing than serious usage. +917 */ +918 public static final String fragmentShaderHSLPsychedelic = +919 "#ifdef GL_ES\n" + +920 "#define LOWP lowp\n" + +921 "precision mediump float;\n" + +922 "#else\n" + +923 "#define LOWP \n" + +924 "#endif\n" + +925 "varying vec2 v_texCoords;\n" + +926 "varying LOWP vec4 v_color;\n" + +927 "uniform sampler2D u_texture;\n" + +928 partialCodeHSL + +929 "void main()\n" + +930 "{\n" + +931 " float hue = v_color.x - 0.5;\n" + +932 " float saturation = v_color.y * 2.0;\n" + +933 " float brightness = v_color.z - 0.5;\n" + +934 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + +935 " tgt = rgb2hsl(tgt);\n" + +936 " tgt.x = fract(tgt.x + hue);\n" + +937 " tgt.y = clamp(tgt.y * saturation, 0.0, 1.0);\n" + +938 " tgt.z = clamp(brightness + tgt.z, 0.0, 1.0);\n" + +939 " gl_FragColor = hsl2rgb(tgt);\n" + +940 "}"; +941 +942 /** +943 * One of the more useful HSL shaders here, this takes a batch color as hue, saturation, lightness, and power, +944 * with hue as a target hue and power used to determine how much of the target color should be used. There is no +945 * neutral value for hue, saturation, or lightness, but if power is 0, then the source color will be used +946 * exactly. On the other hand, if power is 1.0, then all pixels will be the target color. Hue is specified from +947 * 0.0 to 1.0, with 0.0 as red, about 0.3 as green, about 0.6 as blue, etc. Saturation is specified from 0.0 to 1.0, +948 * with 0.0 as grayscale and 1.0 as a fully-saturated target color. Lightness is specified from 0.0 to 1.0, with 0.0 +949 * as black, the 0.3 to 0.7 range as most colors, and 1.0 white; saturation is clamped to a smaller value as +950 * lightness moves away from 0.5 (toward black or white). +951 * <br> +952 * You can generate HSL(P) colors using methods like {@link FloatColors#rgb2hsl(float, float, float, float)}. +953 */ +954 public static final String fragmentShaderHSLP = +955 "#ifdef GL_ES\n" + +956 "#define LOWP lowp\n" + +957 "precision mediump float;\n" + +958 "#else\n" + +959 "#define LOWP \n" + +960 "#endif\n" + +961 "varying vec2 v_texCoords;\n" + +962 "varying LOWP vec4 v_color;\n" + +963 "uniform sampler2D u_texture;\n" + +964 partialCodeHSL + +965 "void main()\n" + +966 "{\n" + +967 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + +968 " vec4 hsl = rgb2hsl(tgt);\n" + +969 " hsl.xy = vec2(cos(hsl.x * 6.2831853), sin(hsl.x * 6.2831853)) * hsl.y;\n" + +970 " vec3 tint = vec3(cos(v_color.x * 6.2831853) * v_color.y, sin(v_color.x * 6.2831853) * v_color.y, v_color.z);\n" + +971 " hsl.xyz = mix(hsl.xyz, tint, v_color.w);\n" + +972 " hsl.xy = vec2(fract(atan(hsl.y, hsl.x) / 6.2831853), length(hsl.xy));\n" + +973 " gl_FragColor = hsl2rgb(hsl);\n" + +974 "}"; +975 +976 /** +977 * This is supposed to look for RGBA colors that are similar to {@code search}, and if it finds +978 * one, to replace it with {@code replace} (also an RGBA color). It isn't great at the searching part. +979 * <br> +980 * You can generate RGB colors using any of various methods in the {@code rgb} package, such as +981 * {@link com.github.tommyettinger.colorful.rgb.ColorTools#rgb(float, float, float, float)}. +982 * <br> +983 * EXPERIMENTAL. Meant more for reading and editing than serious usage. +984 */ +985 public static final String fragmentShaderReplacement = +986 "#ifdef GL_ES\n" + +987 "#define LOWP lowp\n" + +988 "precision mediump float;\n" + +989 "#else\n" + +990 "#define LOWP \n" + +991 "#endif\n" + +992 "varying vec2 v_texCoords;\n" + +993 "varying LOWP vec4 v_color;\n" + +994 "uniform sampler2D u_texture;\n" + +995 "uniform vec4 u_search;\n" + +996 "uniform vec4 u_replace;\n" + +997 "void main()\n" + +998 "{\n" + +999 " vec4 tgt = texture2D(u_texture, v_texCoords);\n" + +1000 " float curve = smoothstep(0.0, 1.0, 1.25 - distance(tgt.rgb, u_search.rgb) * 2.0);\n" + +1001 " gl_FragColor = vec4(mix(tgt.rgb, u_replace.rgb, curve), tgt.a) * v_color;\n" + +1002 "}"; +1003 /** +1004 * A drop-in replacement for the default fragment shader that eliminates lightness differences in the output colors. +1005 * Specifically, it does the normal SpriteBatch shader's step with the multiplicative batch color, converts to IPT, +1006 * sets intensity to 0.5, shrinks the P and T components so the color is less saturated, and then converts back to +1007 * an RGBA color. Even though this uses IPT internally, it expects the batch color to be normal RGBA. +1008 * <br> +1009 * Editing this shader is strongly encouraged to fit your needs! +1010 * <br> +1011 * You can generate RGB colors using any of various methods in the {@code rgb} package, such as +1012 * {@link com.github.tommyettinger.colorful.rgb.ColorTools#rgb(float, float, float, float)}. +1013 * <br> +1014 * Meant for use with {@link #vertexShader}. +1015 * @see #fragmentShaderConfigurableContrast a per-sprite-configurable version of this +1016 */ +1017 public static String fragmentShaderFlatLightness = +1018 "#ifdef GL_ES\n" + +1019 "#define LOWP lowp\n" + +1020 "precision mediump float;\n" + +1021 "#else\n" + +1022 "#define LOWP \n" + +1023 "#endif\n" + +1024 "#define TARGET_LIGHTNESS 0.5 \n" + +1025 "#define SATURATION_CHANGE 1.0 \n" + +1026 "varying vec2 v_texCoords;\n" + +1027 "varying LOWP vec4 v_color;\n" + +1028 "uniform sampler2D u_texture;\n" + +1029 "void main()\n" + +1030 "{\n" + +1031 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + +1032 " vec3 ipt = (mat3(0.189786, 0.669665 , 0.286498, 0.576951, -0.73741 , 0.655205, 0.233221, 0.0681367, -0.941748)\n" + +1033 " * (tgt.rgb * v_color.rgb));\n" + +1034 " ipt.x = TARGET_LIGHTNESS;\n" + // change to desired lightness or pass in a lightness as a uniform +1035 "// ipt.x = (ipt.x - 0.5) * 0.25 + TARGET_LIGHTNESS;\n" + // an alternative way that preserves a tiny bit of original lightness +1036 " ipt.yz *= SATURATION_CHANGE;\n" + // multiplies saturation by SATURATION_CHANGE, which may be more or less than 1.0 +1037 " vec3 back = clamp(mat3(0.999779, 1.00015, 0.999769, 1.07094, -0.377744, 0.0629496, 0.324891, 0.220439, -0.809638) * ipt, 0.0, 1.0);\n" + +1038 " gl_FragColor = vec4(back, v_color.a * tgt.a);\n" + +1039 "}"; +1040 /** +1041 * A specialized shader that can reduce lightness differences in the output colors, saturate/desaturate them, and +1042 * can be configured to use some of the existing lightness in the image to add to a main flat lightness. +1043 * Specifically, it takes the fragment color (typically a pixel in a texture), converts to IPT, does a calculation +1044 * involving the intensity of the fragment color where the batch color's blue channel affects how much that +1045 * intensity is used, adds the red channel of the batch color, multiplies the P and T components by the green +1046 * channel times 2.0 to saturate or desaturate, and then converts back to an RGBA color. The neutral value for this +1047 * is the RGBA color 0.5, 0.5, 1.0, 1.0 . A typical usage to achieve a fog effect would be to raise lightness (r), +1048 * slightly reduce saturation (g), sharply flatten the original texture's lightness (b), and leave alpha alone (a): +1049 * 0.7, 0.4, 0.2, 1.0 . +1050 * <br> +1051 * This doesn't use a standard type of color; you should use something like +1052 * {@link com.github.tommyettinger.colorful.rgb.ColorTools#rgb(float, float, float, float)} to set the channels in +1053 * the specific way this uses them. +1054 * <br> +1055 * Meant for use with {@link #vertexShader}. +1056 * @see #fragmentShaderFlatLightness if you only need one contrast setting and still want to set color tints +1057 */ +1058 public static String fragmentShaderConfigurableContrast = +1059 "#ifdef GL_ES\n" + +1060 "#define LOWP lowp\n" + +1061 "precision mediump float;\n" + +1062 "#else\n" + +1063 "#define LOWP \n" + +1064 "#endif\n" + +1065 "varying vec2 v_texCoords;\n" + +1066 "varying LOWP vec4 v_color;\n" + +1067 "uniform sampler2D u_texture;\n" + +1068 "void main()\n" + +1069 "{\n" + +1070 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + +1071 " vec3 ipt = (mat3(0.189786, 0.669665 , 0.286498, 0.576951, -0.73741 , 0.655205, 0.233221, 0.0681367, -0.941748)\n" + +1072 " * tgt.rgb);\n" + +1073 " ipt.x = (ipt.x - 0.5) * v_color.b + v_color.r;\n" + // preserves some lightness based on b, sets main lightness with r +1074 " ipt.yz *= v_color.g * 2.0;\n" + // the green channel affects saturation; if it's 0.5 it won't change saturation. +1075 " vec3 back = clamp(mat3(0.999779, 1.00015, 0.999769, 1.07094, -0.377744, 0.0629496, 0.324891, 0.220439, -0.809638) * ipt, 0.0, 1.0);\n" + +1076 " gl_FragColor = vec4(back, v_color.a * tgt.a);\n" + +1077 "}"; +1078 +1079 /** +1080 * A day/night cycle shader that can be used without any other parts of this library. This only needs setting the +1081 * uniform {@code u_timeOfDay} to any float; the rate at which you change this float affects how fast the day/night +1082 * cycle occurs. This is meant to be used with {@link #fragmentShaderDayNight}. Together, they make the color +1083 * adjustment go from bluish and dark at night, to purplish at dawn, to orange/yellow and bright at mid-day, toward +1084 * red at dusk, and then back to bluish at night. This uses an RGBA batch color. +1085 * <br> +1086 * Editing this shader is strongly encouraged to fit your needs! The time-based variables st, ct, and dd can all be +1087 * adjusted to increase or decrease the strength of the effect, and their effects can also be adjusted upon v_color +1088 * and v_tweak. +1089 * <br> +1090 * You can generate RGB colors using any of various methods in the {@code rgb} package, such as +1091 * {@link com.github.tommyettinger.colorful.rgb.ColorTools#rgb(float, float, float, float)}. +1092 */ +1093 public static String vertexShaderDayNight = "attribute vec4 " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" +1094 + "attribute vec4 " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" +1095 + "attribute vec2 " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n" +1096 + "uniform mat4 u_projTrans;\n" +1097 + "uniform float u_timeOfDay;\n" +1098 + "varying vec4 v_color;\n" +1099 + "varying vec4 v_tweak;\n" +1100 + "varying vec2 v_texCoords;\n" +1101 + "varying float v_lightFix;\n" +1102 + "const vec3 forward = vec3(1.0 / 3.0);\n" +1103 + "\n" +1104 + "void main()\n" +1105 + "{\n" +1106 + " float st = sin(1.5707963 * sin(0.2617994 * u_timeOfDay)); // Whenever st is very high or low... \n" +1107 + " float ct = sin(1.5707963 * cos(0.2617994 * u_timeOfDay)); // ...ct is close to 0, and vice versa. \n" +1108 + " float dd = ct * ct; // Positive, small; used for dawn and dusk. \n" +1109 + " v_color = " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" +1110 + " v_color.w = v_color.w * (255.0/254.0);\n" +1111 + " vec3 oklab = mat3(+0.2104542553, +1.9779984951, +0.0259040371, +0.7936177850, -2.4285922050, +0.7827717662, -0.0040720468, +0.4505937099, -0.8086757660) *" +1112 + " pow(mat3(0.4121656120, 0.2118591070, 0.0883097947, 0.5362752080, 0.6807189584, 0.2818474174, 0.0514575653, 0.1074065790, 0.6302613616) \n" +1113 + " * (v_color.rgb * v_color.rgb), forward);\n" +1114 + " // The next four lines make use of the time-based variables st, ct, and dd. Edit to fit. \n" +1115 + " v_color.x = clamp(oklab.x + (0.0625 * st), 0.0, 1.0);\n" +1116 + " v_color.yz = clamp(oklab.yz + vec2(0.0625 * dd + 0.03125 * st, 0.1 * st), -1.0, 1.0) * ((dd + 0.25) * 0.5);\n" +1117 + " v_tweak = vec4(0.2 * st + 0.5);\n" +1118 + " v_tweak.w = pow((1.0 - 0.125 * st), 1.709);\n" +1119 + " v_lightFix = 1.0 + pow(v_tweak.w, 1.41421356);\n" +1120 + " v_texCoords = " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n" +1121 + " gl_Position = u_projTrans * " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" +1122 + "}\n"; +1123 /** +1124 * The fragment shader counterpart to {@link #vertexShaderDayNight}; must be used with that vertex shader. See its +1125 * docs for more info, particularly about the one uniform this needs set. This uses an RGBA batch color. +1126 * <br> +1127 * You can generate RGB colors using any of various methods in the {@code rgb} package, such as +1128 * {@link com.github.tommyettinger.colorful.rgb.ColorTools#rgb(float, float, float, float)}. +1129 * <br> +1130 * Meant only for use with {@link #vertexShaderDayNight}. +1131 */ +1132 public static String fragmentShaderDayNight = +1133 "#ifdef GL_ES\n" + +1134 "#define LOWP lowp\n" + +1135 "precision mediump float;\n" + +1136 "#else\n" + +1137 "#define LOWP \n" + +1138 "#endif\n" + +1139 "varying vec2 v_texCoords;\n" + +1140 "varying LOWP vec4 v_color;\n" + +1141 "varying LOWP vec4 v_tweak;\n" + +1142 "varying float v_lightFix;\n" + +1143 "uniform sampler2D u_texture;\n" + +1144 "const vec3 forward = vec3(1.0 / 3.0);\n" + +1145 "void main()\n" + +1146 "{\n" + +1147 " vec4 tgt = texture2D( u_texture, v_texCoords );\n" + +1148 " vec3 lab = mat3(+0.2104542553, +1.9779984951, +0.0259040371, +0.7936177850, -2.4285922050, +0.7827717662, -0.0040720468, +0.4505937099, -0.8086757660) *" + +1149 " pow(mat3(0.4121656120, 0.2118591070, 0.0883097947, 0.5362752080, 0.6807189584, 0.2818474174, 0.0514575653, 0.1074065790, 0.6302613616) \n" + +1150 " * (tgt.rgb * tgt.rgb), forward);\n" + +1151 " lab.x = clamp(pow(lab.x, v_tweak.w) * v_lightFix * v_tweak.x + v_color.x - 1.0, 0.0, 1.0);\n" + +1152 " lab.yz = clamp((lab.yz * v_tweak.yz + v_color.yz) * 1.5, -1.0, 1.0);\n" + +1153 " lab = mat3(1.0, 1.0, 1.0, +0.3963377774, -0.1055613458, -0.0894841775, +0.2158037573, -0.0638541728, -1.2914855480) * lab;\n" + +1154 " gl_FragColor = vec4(sqrt(clamp(" + +1155 " mat3(+4.0767245293, -1.2681437731, -0.0041119885, -3.3072168827, +2.6093323231, -0.7034763098, +0.2307590544, -0.3411344290, +1.7068625689) *\n" + +1156 " (lab * lab * lab)," + +1157 " 0.0, 1.0)), v_color.a * tgt.a);\n" + +1158 "}"; +1159 +1160} diff --git a/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/ipt/ColorTools.html b/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/ipt/ColorTools.html index 878e6b47..8d97a35a 100644 --- a/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/ipt/ColorTools.html +++ b/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/ipt/ColorTools.html @@ -19,985 +19,1061 @@ 006import com.github.tommyettinger.colorful.FloatColors; 007import com.github.tommyettinger.colorful.Shaders; 008import com.github.tommyettinger.colorful.TrigTools; -009import com.github.tommyettinger.colorful.ycwcm.Palette; -010 -011import java.util.Random; -012 -013/** -014 * Contains code for manipulating colors as {@code int}, packed {@code float}, and {@link Color} values in the IPT -015 * color space. IPT has more perceptually-uniform handling of hue than some other color spaces, like YCwCm, and even -016 * though the version here gives up the complex exponential adjustments to various components that the original IPT -017 * paper used, it still is pretty good at preserving perceptual lightness. In most regards, this is a more -018 * thoroughly-constructed color space than YCwCm, but YCwCm may still be useful because of how it maps to aesthetic -019 * components of color. See {@link #ipt(float, float, float, float)} for docs on the I, P, and T channels. -020 */ -021public class ColorTools { -022 /** -023 * Gets a packed float representation of a color given as 4 float components, here, I (intensity or lightness), P -024 * (protan, a chromatic component ranging from greenish to reddish), T (tritan, a chromatic component ranging from -025 * bluish to yellowish), and A (alpha or opacity). As long as you use a batch with {@link Shaders#fragmentShaderIPT} -026 * as its shader, colors passed with {@link com.badlogic.gdx.graphics.g2d.Batch#setPackedColor(float)} will be -027 * interpreted as IPT. Intensity should be between 0 and 1, inclusive, with 0 used for very dark colors (almost only -028 * black), and 1 used for very light colors (almost only white). Protan and tritan range from 0.0 to 1.0, with -029 * grayscale results when both are about 0.5. There's some aesthetic value in changing just one chroma value. When -030 * protan is high and tritan is low, the color is more purple/magenta, when both are low it is more bluish, when -031 * tritan is high and protan is low, the color tends to be greenish, and when both are high it tends to be orange. -032 * When protan and tritan are both near 0.5f, the color is closer to gray. Alpha is the multiplicative opacity of -033 * the color, and acts like RGBA's alpha. -034 * <br> -035 * This method bit-masks the resulting color's byte values, so any values can technically be given to this as -036 * intensity, protan, and tritan, but they will only be reversible from the returned float color to the original I, -037 * P, and T values if the original values were in the range that {@link #intensity(float)}, {@link #protan(float)}, -038 * and {@link #tritan(float)} return. -039 * -040 * @param intens 0f to 1f, intensity or I component of IPT, with 0.5f meaning "no change" and 1f brightening -041 * @param protan 0f to 1f, protan or P component of IPT, with 1f more orange, red, or magenta -042 * @param tritan 0f to 1f, tritan or T component of IPT, with 1f more green, yellow, or red -043 * @param alpha 0f to 1f, 0f makes the color transparent and 1f makes it opaque -044 * @return a float encoding a color with the given properties -045 */ -046 public static float ipt(float intens, float protan, float tritan, float alpha) { -047 return NumberUtils.intBitsToFloat(((int) (alpha * 255) << 24 & 0xFE000000) | ((int) (tritan * 255) << 16 & 0xFF0000) -048 | ((int) (protan * 255) << 8 & 0xFF00) | ((int) (intens * 255) & 0xFF)); -049 } -050 -051 /** -052 * Converts a packed float color in the format produced by {@link ColorTools#ipt(float, float, float, float)} to an RGBA8888 int. -053 * This format of int can be used with Pixmap and in some other places in libGDX. -054 * @param packed a packed float color, as produced by {@link ColorTools#ipt(float, float, float, float)} -055 * @return an RGBA8888 int color -056 */ -057 public static int toRGBA8888(final float packed) -058 { -059 final int decoded = NumberUtils.floatToRawIntBits(packed); -060 final float i = (decoded & 0xff) / 255f; -061 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -062 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -063 final int r = Math.min(Math.max((int) ((0.999779f * i + 1.0709400f * p + 0.324891f * t) * 256.0), 0), 255); -064 final int g = Math.min(Math.max((int) ((1.000150f * i - 0.3777440f * p + 0.220439f * t) * 256.0), 0), 255); -065 final int b = Math.min(Math.max((int) ((0.999769f * i + 0.0629496f * p - 0.809638f * t) * 256.0), 0), 255); -066 return r << 24 | g << 16 | b << 8 | (decoded & 0xfe000000) >>> 24 | decoded >>> 31; -067 } -068 -069 /** -070 * Converts a packed float color in the format produced by {@link ColorTools#ipt(float, float, float, float)} -071 * to a packed float in RGBA format. -072 * This format of float can be used with the standard SpriteBatch and in some other places in libGDX. -073 * @param packed a packed float color, as produced by {@link ColorTools#ipt(float, float, float, float)} -074 * @return a packed float color as RGBA -075 */ -076 public static float toRGBA(final float packed) -077 { -078 final int decoded = NumberUtils.floatToRawIntBits(packed); -079 final float i = (decoded & 0xff) / 255f; -080 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -081 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -082 final int r = Math.min(Math.max((int) ((0.999779f * i + 1.0709400f * p + 0.324891f * t) * 256.0), 0), 255); -083 final int g = Math.min(Math.max((int) ((1.000150f * i - 0.3777440f * p + 0.220439f * t) * 256.0), 0), 255); -084 final int b = Math.min(Math.max((int) ((0.999769f * i + 0.0629496f * p - 0.809638f * t) * 256.0), 0), 255); -085 return NumberUtils.intBitsToFloat(r | g << 8 | b << 16 | (decoded & 0xfe000000)); -086 } -087 /** -088 * Writes an IPT-format packed float color (the format produced by {@link ColorTools#ipt(float, float, float, float)}) -089 * into an RGBA8888 Color as used by libGDX (called {@code editing}). -090 * @param editing a libGDX color that will be filled in-place with an RGBA conversion of {@code packed} -091 * @param packed a packed float color, as produced by {@link ColorTools#ipt(float, float, float, float)} -092 * @return an RGBA8888 int color -093 */ -094 public static Color toColor(Color editing, final float packed) -095 { -096 final int decoded = NumberUtils.floatToRawIntBits(packed); -097 final float i = (decoded & 0xff) / 255f; -098 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -099 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -100 editing.r = (0.999779f * i + 1.0709400f * p + 0.324891f * t); -101 editing.g = (1.000150f * i - 0.3777440f * p + 0.220439f * t); -102 editing.b = (0.999769f * i + 0.0629496f * p - 0.809638f * t); -103 editing.a = (decoded >>> 25) * 0x1.020408p-7f; // this is 1/127 as a float -104 return editing.clamp(); -105 } -106 -107 /** -108 * Takes a color encoded as an RGBA8888 int and converts to a packed float in the IPT format this uses. -109 * @param rgba an int with the channels (in order) red, green, blue, alpha; should have 8 bits per channel -110 * @return a packed float as IPT, which this class can use -111 */ -112 public static float fromRGBA8888(final int rgba) { -113 final float r = (rgba >>> 24) * 0x1.010101010101p-8f; -114 final float g = (rgba >>> 16 & 0xFF) * 0x1.010101010101p-8f; -115 final float b = (rgba >>> 8 & 0xFF) * 0x1.010101010101p-8f; -116 return NumberUtils.intBitsToFloat( -117 Math.min(Math.max((int)((0.189786f * r + 0.576951f * g + 0.233221f * b) * 255.0f + 0.500f), 0), 255) -118 | Math.min(Math.max((int)((0.669665f * r - 0.73741f * g + 0.0681367f * b) * 127.5f + 127.5f), 0), 255) << 8 -119 | Math.min(Math.max((int)((0.286498f * r + 0.655205f * g - 0.941748f * b) * 127.5f + 127.5f), 0), 255) << 16 -120 | (rgba & 0xFE) << 24); +009import com.github.tommyettinger.colorful.ipt_hq.ColorfulBatch; +010import com.github.tommyettinger.colorful.ycwcm.Palette; +011 +012import java.util.Random; +013 +014/** +015 * Contains code for manipulating colors as {@code int}, packed {@code float}, and {@link Color} values in the IPT +016 * color space. IPT has more perceptually-uniform handling of hue than some other color spaces, like YCwCm, and even +017 * though the version here gives up the complex exponential adjustments to various components that the original IPT +018 * paper used, it still is pretty good at preserving perceptual lightness. In most regards, this is a more +019 * thoroughly-constructed color space than YCwCm, but YCwCm may still be useful because of how it maps to aesthetic +020 * components of color. See {@link #ipt(float, float, float, float)} for docs on the I, P, and T channels. +021 */ +022public class ColorTools { +023 /** +024 * Gets a packed float representation of a color given as 4 float components, here, I (intensity or lightness), P +025 * (protan, a chromatic component ranging from greenish to reddish), T (tritan, a chromatic component ranging from +026 * bluish to yellowish), and A (alpha or opacity). As long as you use a batch with {@link Shaders#fragmentShaderIPT} +027 * as its shader, colors passed with {@link com.badlogic.gdx.graphics.g2d.Batch#setPackedColor(float)} will be +028 * interpreted as IPT. Intensity should be between 0 and 1, inclusive, with 0 used for very dark colors (almost only +029 * black), and 1 used for very light colors (almost only white). Protan and tritan range from 0.0 to 1.0, with +030 * grayscale results when both are about 0.5. There's some aesthetic value in changing just one chroma value. When +031 * protan is high and tritan is low, the color is more purple/magenta, when both are low it is more bluish, when +032 * tritan is high and protan is low, the color tends to be greenish, and when both are high it tends to be orange. +033 * When protan and tritan are both near 0.5f, the color is closer to gray. Alpha is the multiplicative opacity of +034 * the color, and acts like RGBA's alpha. +035 * <br> +036 * This method bit-masks the resulting color's byte values, so any values can technically be given to this as +037 * intensity, protan, and tritan, but they will only be reversible from the returned float color to the original I, +038 * P, and T values if the original values were in the range that {@link #intensity(float)}, {@link #protan(float)}, +039 * and {@link #tritan(float)} return. +040 * +041 * @param intens 0f to 1f, intensity or I component of IPT, with 0.5f meaning "no change" and 1f brightening +042 * @param protan 0f to 1f, protan or P component of IPT, with 1f more orange, red, or magenta +043 * @param tritan 0f to 1f, tritan or T component of IPT, with 1f more green, yellow, or red +044 * @param alpha 0f to 1f, 0f makes the color transparent and 1f makes it opaque +045 * @return a float encoding a color with the given properties +046 */ +047 public static float ipt(float intens, float protan, float tritan, float alpha) { +048 return NumberUtils.intBitsToFloat(((int) (alpha * 255) << 24 & 0xFE000000) | ((int) (tritan * 255) << 16 & 0xFF0000) +049 | ((int) (protan * 255) << 8 & 0xFF00) | ((int) (intens * 255) & 0xFF)); +050 } +051 +052 /** +053 * Converts a packed float color in the format produced by {@link ColorTools#ipt(float, float, float, float)} to an RGBA8888 int. +054 * This format of int can be used with Pixmap and in some other places in libGDX. +055 * @param packed a packed float color, as produced by {@link ColorTools#ipt(float, float, float, float)} +056 * @return an RGBA8888 int color +057 */ +058 public static int toRGBA8888(final float packed) +059 { +060 final int decoded = NumberUtils.floatToRawIntBits(packed); +061 final float i = (decoded & 0xff) / 255f; +062 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +063 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +064 final int r = Math.min(Math.max((int) ((0.999779f * i + 1.0709400f * p + 0.324891f * t) * 256.0), 0), 255); +065 final int g = Math.min(Math.max((int) ((1.000150f * i - 0.3777440f * p + 0.220439f * t) * 256.0), 0), 255); +066 final int b = Math.min(Math.max((int) ((0.999769f * i + 0.0629496f * p - 0.809638f * t) * 256.0), 0), 255); +067 return r << 24 | g << 16 | b << 8 | (decoded & 0xfe000000) >>> 24 | decoded >>> 31; +068 } +069 +070 /** +071 * Converts a packed float color in the format produced by {@link ColorTools#ipt(float, float, float, float)} +072 * to a packed float in RGBA format. +073 * This format of float can be used with the standard SpriteBatch and in some other places in libGDX. +074 * @param packed a packed float color, as produced by {@link ColorTools#ipt(float, float, float, float)} +075 * @return a packed float color as RGBA +076 */ +077 public static float toRGBA(final float packed) +078 { +079 final int decoded = NumberUtils.floatToRawIntBits(packed); +080 final float i = (decoded & 0xff) / 255f; +081 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +082 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +083 final int r = Math.min(Math.max((int) ((0.999779f * i + 1.0709400f * p + 0.324891f * t) * 256.0), 0), 255); +084 final int g = Math.min(Math.max((int) ((1.000150f * i - 0.3777440f * p + 0.220439f * t) * 256.0), 0), 255); +085 final int b = Math.min(Math.max((int) ((0.999769f * i + 0.0629496f * p - 0.809638f * t) * 256.0), 0), 255); +086 return NumberUtils.intBitsToFloat(r | g << 8 | b << 16 | (decoded & 0xfe000000)); +087 } +088 /** +089 * Writes an IPT-format packed float color (the format produced by {@link ColorTools#ipt(float, float, float, float)}) +090 * into an RGBA8888 Color as used by libGDX (called {@code editing}). +091 * @param editing a libGDX color that will be filled in-place with an RGBA conversion of {@code packed} +092 * @param packed a packed float color, as produced by {@link ColorTools#ipt(float, float, float, float)} +093 * @return an RGBA8888 int color +094 */ +095 public static Color toColor(Color editing, final float packed) +096 { +097 final int decoded = NumberUtils.floatToRawIntBits(packed); +098 final float i = (decoded & 0xff) / 255f; +099 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +100 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +101 editing.r = (0.999779f * i + 1.0709400f * p + 0.324891f * t); +102 editing.g = (1.000150f * i - 0.3777440f * p + 0.220439f * t); +103 editing.b = (0.999769f * i + 0.0629496f * p - 0.809638f * t); +104 editing.a = (decoded >>> 25) * 0x1.020408p-7f; // this is 1/127 as a float +105 return editing.clamp(); +106 } +107 +108 /** +109 * Writes an IPT-format packed float color (the format produced by {@link ColorTools#ipt(float, float, float, float)}) +110 * into an IPT-format Color called {@code editing}. This is mostly useful if the rest of your application expects +111 * colors in IPT format, such as because you use {@link Shaders#fragmentShaderIPT} or {@link ColorfulBatch}. +112 * <br> +113 * Internally, this simply calls {@link Color#abgr8888ToColor(Color, float)} and returns the edited Color. +114 * @param editing a libGDX Color that will be filled in-place with the color {@code ipt}, unchanged from its color space +115 * @param ipt a packed float color, as produced by {@link ColorTools#ipt(float, float, float, float)} +116 * @return an RGBA8888 int color +117 */ +118 public static Color toIPTColor(Color editing, final float ipt){ +119 Color.abgr8888ToColor(editing, ipt); +120 return editing; 121 } 122 123 /** -124 * Takes a color encoded as an RGBA8888 packed float and converts to a packed float in the IPT format this uses. -125 * @param packed a packed float in RGBA8888 format, with A in the MSB and R in the LSB +124 * Takes a color encoded as an RGBA8888 int and converts to a packed float in the IPT format this uses. +125 * @param rgba an int with the channels (in order) red, green, blue, alpha; should have 8 bits per channel 126 * @return a packed float as IPT, which this class can use 127 */ -128 public static float fromRGBA(final float packed) { -129 final int abgr = NumberUtils.floatToRawIntBits(packed); -130 final float r = (abgr & 0xFF) * 0x1.010101010101p-8f; -131 final float g = (abgr >>> 8 & 0xFF) * 0x1.010101010101p-8f; -132 final float b = (abgr >>> 16 & 0xFF) * 0x1.010101010101p-8f; -133 -134 return NumberUtils.intBitsToFloat( -135 Math.min(Math.max((int)((0.189786f * r + 0.576951f * g + 0.233221f * b) * 255.999f), 0), 255) -136 | Math.min(Math.max((int)((0.669665f * r - 0.73741f * g + 0.0681367f * b) * 127.5f + 127.5f), 0), 255) << 8 -137 | Math.min(Math.max((int)((0.286498f * r + 0.655205f * g - 0.941748f * b) * 127.5f + 127.5f), 0), 255) << 16 -138 | (abgr & 0xFE000000)); -139 } -140 -141 /** -142 * Takes a libGDX Color that uses RGBA8888 channels and converts to a packed float in the IPT format this uses. -143 * @param color a libGDX RGBA8888 Color -144 * @return a packed float as IPT, which this class can use -145 */ -146 public static float fromColor(final Color color) { -147 return NumberUtils.intBitsToFloat( -148 Math.min(Math.max((int)((0.189786f * color.r + 0.576951f * color.g + 0.233221f * color.b) * 255.0f + 0.500f), 0), 255) -149 | Math.min(Math.max((int)((0.669665f * color.r - 0.73741f * color.g + 0.0681367f * color.b) * 127.5f + 127.5f), 0), 255) << 8 -150 | Math.min(Math.max((int)((0.286498f * color.r + 0.655205f * color.g - 0.941748f * color.b) * 127.5f + 127.5f), 0), 255) << 16 -151 | ((int)(color.a * 255f) << 24 & 0xFE000000)); -152 } -153 -154 /** -155 * Takes RGBA components from 0.0 to 1.0 each and converts to a packed float in the IPT format this uses. -156 * @param r red, from 0.0 to 1.0 (both inclusive) -157 * @param g green, from 0.0 to 1.0 (both inclusive) -158 * @param b blue, from 0.0 to 1.0 (both inclusive) -159 * @param a alpha, from 0.0 to 1.0 (both inclusive) +128 public static float fromRGBA8888(final int rgba) { +129 final float r = (rgba >>> 24) * 0x1.010101010101p-8f; +130 final float g = (rgba >>> 16 & 0xFF) * 0x1.010101010101p-8f; +131 final float b = (rgba >>> 8 & 0xFF) * 0x1.010101010101p-8f; +132 return NumberUtils.intBitsToFloat( +133 Math.min(Math.max((int)((0.189786f * r + 0.576951f * g + 0.233221f * b) * 255.0f + 0.500f), 0), 255) +134 | Math.min(Math.max((int)((0.669665f * r - 0.73741f * g + 0.0681367f * b) * 127.5f + 127.5f), 0), 255) << 8 +135 | Math.min(Math.max((int)((0.286498f * r + 0.655205f * g - 0.941748f * b) * 127.5f + 127.5f), 0), 255) << 16 +136 | (rgba & 0xFE) << 24); +137 } +138 +139 /** +140 * Takes a color encoded as an RGBA8888 packed float and converts to a packed float in the IPT format this uses. +141 * @param packed a packed float in RGBA8888 format, with A in the MSB and R in the LSB +142 * @return a packed float as IPT, which this class can use +143 */ +144 public static float fromRGBA(final float packed) { +145 final int abgr = NumberUtils.floatToRawIntBits(packed); +146 final float r = (abgr & 0xFF) * 0x1.010101010101p-8f; +147 final float g = (abgr >>> 8 & 0xFF) * 0x1.010101010101p-8f; +148 final float b = (abgr >>> 16 & 0xFF) * 0x1.010101010101p-8f; +149 +150 return NumberUtils.intBitsToFloat( +151 Math.min(Math.max((int)((0.189786f * r + 0.576951f * g + 0.233221f * b) * 255.999f), 0), 255) +152 | Math.min(Math.max((int)((0.669665f * r - 0.73741f * g + 0.0681367f * b) * 127.5f + 127.5f), 0), 255) << 8 +153 | Math.min(Math.max((int)((0.286498f * r + 0.655205f * g - 0.941748f * b) * 127.5f + 127.5f), 0), 255) << 16 +154 | (abgr & 0xFE000000)); +155 } +156 +157 /** +158 * Takes a libGDX Color that uses RGBA8888 channels and converts to a packed float in the IPT format this uses. +159 * @param color a libGDX RGBA8888 Color 160 * @return a packed float as IPT, which this class can use 161 */ -162 public static float fromRGBA(final float r, final float g, final float b, final float a) { +162 public static float fromColor(final Color color) { 163 return NumberUtils.intBitsToFloat( -164 Math.min(Math.max((int)((0.189786f * r + 0.576951f * g + 0.233221f * b) * 255.0f + 0.500f), 0), 255) -165 | Math.min(Math.max((int)((0.669665f * r - 0.73741f * g + 0.0681367f * b) * 127.5f + 127.5f), 0), 255) << 8 -166 | Math.min(Math.max((int)((0.286498f * r + 0.655205f * g - 0.941748f * b) * 127.5f + 127.5f), 0), 255) << 16 -167 | ((int)(a * 255f) << 24 & 0xFE000000)); +164 Math.min(Math.max((int)((0.189786f * color.r + 0.576951f * color.g + 0.233221f * color.b) * 255.0f + 0.500f), 0), 255) +165 | Math.min(Math.max((int)((0.669665f * color.r - 0.73741f * color.g + 0.0681367f * color.b) * 127.5f + 127.5f), 0), 255) << 8 +166 | Math.min(Math.max((int)((0.286498f * color.r + 0.655205f * color.g - 0.941748f * color.b) * 127.5f + 127.5f), 0), 255) << 16 +167 | ((int)(color.a * 255f) << 24 & 0xFE000000)); 168 } 169 170 /** -171 * Gets the red channel value of the given encoded color, as an int ranging from 0 to 255, inclusive. -172 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} -173 * @return an int from 0 to 255, inclusive, representing the red channel value of the given encoded color -174 */ -175 public static int redInt(final float encoded) -176 { -177 final int decoded = NumberUtils.floatToRawIntBits(encoded); -178 final float i = (decoded & 0xff) / 255f; -179 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -180 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -181 return Math.min(Math.max((int) ((0.999779f * i + 1.0709400f * p + 0.324891f * t) * 256.0), 0), 255); -182 } -183 -184 /** -185 * Gets the green channel value of the given encoded color, as an int ranging from 0 to 255, inclusive. -186 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} -187 * @return an int from 0 to 255, inclusive, representing the green channel value of the given encoded color -188 */ -189 public static int greenInt(final float encoded) -190 { -191 final int decoded = NumberUtils.floatToRawIntBits(encoded); -192 final float i = (decoded & 0xff) / 255f; -193 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -194 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -195 return Math.min(Math.max((int) ((1.000150f * i - 0.3777440f * p + 0.220439f * t) * 256.0), 0), 255); -196 } -197 -198 /** -199 * Gets the blue channel value of the given encoded color, as an int ranging from 0 to 255, inclusive. -200 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} -201 * @return an int from 0 to 255, inclusive, representing the blue channel value of the given encoded color -202 */ -203 public static int blueInt(final float encoded) -204 { -205 final int decoded = NumberUtils.floatToRawIntBits(encoded); -206 final float i = (decoded & 0xff) / 255f; -207 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -208 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -209 return Math.min(Math.max((int) ((0.999769f * i + 0.0629496f * p - 0.809638f * t) * 256.0), 0), 255); -210 } -211 -212 /** -213 * Gets the alpha channel value of the given encoded color, as an even int ranging from 0 to 254, inclusive. Because -214 * of how alpha is stored in libGDX, no odd-number values are possible for alpha. -215 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} -216 * @return an even int from 0 to 254, inclusive, representing the alpha channel value of the given encoded color -217 */ -218 public static int alphaInt(final float encoded) -219 { -220 return (NumberUtils.floatToRawIntBits(encoded) & 0xfe000000) >>> 24; -221 } -222 -223 /** -224 * Gets the red channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive. -225 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} -226 * @return a float from 0.0f to 1.0f, inclusive, representing the red channel value of the given encoded color -227 */ -228 public static float red(final float encoded) -229 { -230 final int decoded = NumberUtils.floatToRawIntBits(encoded); -231 final float i = (decoded & 0xff) / 255f; -232 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -233 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -234 return Math.min(Math.max((0.999779f * i + 1.0709400f * p + 0.324891f * t), 0f), 1f); -235 } -236 -237 /** -238 * Gets the green channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive. -239 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} -240 * @return a float from 0.0f to 1.0f, inclusive, representing the green channel value of the given encoded color -241 */ -242 public static float green(final float encoded) -243 { -244 final int decoded = NumberUtils.floatToRawIntBits(encoded); -245 final float i = (decoded & 0xff) / 255f; -246 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -247 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -248 return Math.min(Math.max((1.000150f * i - 0.3777440f * p + 0.220439f * t), 0f), 1f); -249 } -250 -251 /** -252 * Gets the blue channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive. -253 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} -254 * @return a float from 0.0f to 1.0f, inclusive, representing the blue channel value of the given encoded color -255 */ -256 public static float blue(final float encoded) -257 { -258 final int decoded = NumberUtils.floatToRawIntBits(encoded); -259 final float i = (decoded & 0xff) / 255f; -260 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -261 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -262 return Math.min(Math.max((0.999769f * i + 0.0629496f * p - 0.809638f * t), 0f), 1f); -263 } -264 -265 /** -266 * Gets the alpha channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive. -267 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} -268 * @return a float from 0.0f to 1.0f, inclusive, representing the alpha channel value of the given encoded color -269 */ -270 public static float alpha(final float encoded) -271 { -272 return ((NumberUtils.floatToRawIntBits(encoded) & 0xfe000000) >>> 24) * 0x1.020408p-8f; -273 } -274 -275 /** -276 * Gets a color as an IPT packed float given floats representing hue, saturation, lightness, and opacity. -277 * All parameters should normally be between 0 and 1 inclusive, though any hue is tolerated (precision loss may -278 * affect the color if the hue is too large). A hue of 0 is red, progressively higher hue values go to orange, -279 * yellow, green, blue, and purple before wrapping around to red as it approaches 1. A saturation of 0 is grayscale, -280 * a saturation of 1 is brightly colored, and values close to 1 will usually appear more distinct than values close -281 * to 0, especially if the hue is different. A lightness of 0.001f or less is always black (also using a shortcut if -282 * this is the case, respecting opacity), while a lightness of 1f is white. Very bright colors are mostly in a band -283 * of high-saturation where lightness is 0.5f. -284 * -285 * @param hue 0f to 1f, color wheel position -286 * @param saturation 0f to 1f, 0f is grayscale and 1f is brightly colored -287 * @param lightness 0f to 1f, 0f is black and 1f is white -288 * @param opacity 0f to 1f, 0f is fully transparent and 1f is opaque -289 * @return a float encoding a color with the given properties -290 */ -291 public static float floatGetHSL(float hue, float saturation, float lightness, float opacity) { -292 if (lightness <= 0.001f) { -293 return NumberUtils.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x7F7F00); -294 } else { -295 return fromRGBA(FloatColors.hsl2rgb(hue, saturation, lightness, opacity)); -296 } -297 } -298 -299 /** -300 * Gets the saturation of the given encoded color, as a float ranging from 0.0f to 1.0f, inclusive. -301 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} -302 * @return the saturation of the color from 0.0 (a grayscale color; inclusive) to 1.0 (a bright color, inclusive) -303 */ -304 public static float saturation(final float encoded) { -305 final int decoded = NumberUtils.floatToRawIntBits(encoded); -306 final float i = (decoded & 0xff) / 255f; -307 if(Math.abs(i - 0.5) > 0.495f) return 0f; -308 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -309 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -310 final float r = Math.min(Math.max((0.999779f * i + 1.0709400f * p + 0.324891f * t), 0f), 1f); -311 final float g = Math.min(Math.max((1.000150f * i - 0.3777440f * p + 0.220439f * t), 0f), 1f); -312 final float b = Math.min(Math.max((0.999769f * i + 0.0629496f * p - 0.809638f * t), 0f), 1f); -313 float x, y, w; -314 if(g < b) { -315 x = b; -316 y = g; -317 } -318 else { -319 x = g; -320 y = b; -321 } -322 if(r < x) { -323 w = r; -324 } -325 else { -326 w = x; -327 x = r; -328 } -329 return x - Math.min(w, y); -330// float d = x - Math.min(w, y); -331// float li = x * (1f - 0.5f * d / (x + 1e-10f)); -332// return (x - li); // (Math.min(li, 1f - li) + 1e-10f); -333 } -334 -335 public static float lightness(final float encoded) { -336 final int decoded = NumberUtils.floatToRawIntBits(encoded); -337 final float i = (decoded & 0xff) / 255f; -338 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -339 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -340 final float r = Math.min(Math.max((0.999779f * i + 1.0709400f * p + 0.324891f * t), 0f), 1f); -341 final float g = Math.min(Math.max((1.000150f * i - 0.3777440f * p + 0.220439f * t), 0f), 1f); -342 final float b = Math.min(Math.max((0.999769f * i + 0.0629496f * p - 0.809638f * t), 0f), 1f); -343 -344 float x, y, w; -345 if(g < b) { -346 x = b; -347 y = g; -348 } -349 else { -350 x = g; -351 y = b; -352 } -353 if(r < x) { -354 w = r; -355 } -356 else { -357 w = x; -358 x = r; -359 } -360 float d = x - Math.min(w, y); -361 return x * (1f - 0.5f * d / (x + 1e-10f)); -362 } -363 -364 /** -365 * Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased) -366 * to 1f (exclusive, red and approaching purple if decreased). -367 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} -368 * @return The hue of the color from 0.0 (red, inclusive) towards orange, then yellow, and -369 * eventually to purple before looping back to almost the same red (1.0, exclusive) -370 */ -371 public static float hue(final float encoded) { -372 final int decoded = NumberUtils.floatToRawIntBits(encoded); -373 final float i = (decoded & 0xff) / 255f; -374 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -375 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -376 final float r = Math.min(Math.max((0.999779f * i + 1.0709400f * p + 0.324891f * t), 0f), 1f); -377 final float g = Math.min(Math.max((1.000150f * i - 0.3777440f * p + 0.220439f * t), 0f), 1f); -378 final float b = Math.min(Math.max((0.999769f * i + 0.0629496f * p - 0.809638f * t), 0f), 1f); -379 float x, y, z, w; -380 if(g < b) { -381 x = b; -382 y = g; -383 z = -1f; -384 w = 2f / 3f; -385 } -386 else { -387 x = g; -388 y = b; -389 z = 0f; -390 w = -1f / 3f; -391 } -392 if(r < x) { -393 z = w; -394 w = r; -395 } -396 else { -397 w = x; -398 x = r; -399 } -400 float d = x - Math.min(w, y); -401 return Math.abs(z + (w - y) / (6f * d + 1e-10f)); -402 } -403 -404 /** -405 * The "intensity" of the given packed float in IPT format, which is like its lightness; ranges from 0.0f to -406 * 1.0f . You can edit the intensity of a color with {@link #lighten(float, float)} and -407 * {@link #darken(float, float)}. -408 * -409 * @param encoded a color encoded as a packed float, as by {@link #ipt(float, float, float, float)} -410 * @return the intensity value as a float from 0.0f to 1.0f -411 */ -412 public static float intensity(final float encoded) -413 { -414 return (NumberUtils.floatToRawIntBits(encoded) & 0xff) / 255f; -415 } -416 -417 /** -418 * The "protan" of the given packed float in IPT format, which when combined with tritan describes the -419 * hue and saturation of a color; ranges from 0f to 1f . If protan is 0f, the color will be cooler, more green or -420 * blue; if protan is 1f, the color will be warmer, from magenta to orange. You can edit the protan of a color with -421 * {@link #protanUp(float, float)} and {@link #protanDown(float, float)}. -422 * @param encoded a color encoded as a packed float, as by {@link #ipt(float, float, float, float)} -423 * @return the protan value as a float from 0.0f to 1.0f -424 */ -425 public static float protan(final float encoded) -426 { -427 return ((NumberUtils.floatToRawIntBits(encoded) >>> 8 & 0xff)) / 255f; -428 } -429 -430 /** -431 * The "tritan" of the given packed float in IPT format, which when combined with protan describes the -432 * hue and saturation of a color; ranges from 0f to 1f . If tritan is 0f, the color will be more "artificial", more -433 * blue or purple; if tritan is 1f, the color will be more "natural", from green to yellow to orange. You can edit -434 * the tritan of a color with {@link #tritanUp(float, float)} and {@link #tritanDown(float, float)}. -435 * @param encoded a color encoded as a packed float, as by {@link #ipt(float, float, float, float)} -436 * @return the tritan value as a float from 0.0f to 1.0f -437 */ -438 public static float tritan(final float encoded) -439 { -440 return ((NumberUtils.floatToRawIntBits(encoded) >>> 16 & 0xff)) / 255f; -441 } -442 -443 /** -444 * Gets a variation on the packed float color basis as another packed float that has its hue, saturation, lightness, -445 * and opacity adjusted by the specified amounts. Note that this edits the color in HSL space, not IPT! Takes -446 * floats representing the amounts of change to apply to hue, saturation, lightness, and opacity; these can be -447 * between -1f and 1f. Returns a float that can be used as a packed or encoded color with methods like -448 * {@link com.badlogic.gdx.graphics.g2d.Batch#setPackedColor(float)}. The float is likely to be different than the -449 * result of {@link #ipt(float, float, float, float)} unless hue, saturation, lightness, and opacity are all 0. -450 * This won't allocate any objects. -451 * <br> -452 * The parameters this takes all specify additive changes for a color component, clamping the final values so they -453 * can't go above 1 or below 0, with an exception for hue, which can rotate around if lower or higher hues would be -454 * used. As an example, if you give this 0.4f for saturation, and the current color has saturation 0.7f, then the -455 * resulting color will have 1f for saturation. If you gave this -0.1f for saturation and the current color again -456 * has saturation 0.7f, then resulting color will have 0.6f for saturation. -457 * -458 * @param basis a packed float color that will be used as the starting point to make the next color -459 * @param hue -1f to 1f, the hue change that can be applied to the new float color (not clamped, wraps) -460 * @param saturation -1f to 1f, the saturation change that can be applied to the new float color -461 * @param light -1f to 1f, the light/brightness change that can be applied to the new float color -462 * @param opacity -1f to 1f, the opacity/alpha change that can be applied to the new float color -463 * @return a float encoding a variation of basis with the given changes -464 */ -465 public static float toEditedFloat(float basis, float hue, float saturation, float light, float opacity) { -466 final int e = NumberUtils.floatToRawIntBits(basis); -467 final float i = Math.min(Math.max(light + (e & 0xff) / 255f, 0f), 1f); -468 opacity = Math.min(Math.max(opacity + (e >>> 24 & 0xfe) * 0x1.020408p-8f, 0f), 1f); -469 if (i <= 0.001f) -470 return NumberUtils.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x808000); -471 final float p = ((e >>> 7 & 0x1fe) - 0xff) / 255f; -472 final float t = ((e >>> 15 & 0x1fe) - 0xff) / 255f; -473 final float r = Math.min(Math.max((0.999779f * i + 1.0709400f * p + 0.324891f * t), 0f), 1f); -474 final float g = Math.min(Math.max((1.000150f * i - 0.3777440f * p + 0.220439f * t), 0f), 1f); -475 final float b = Math.min(Math.max((0.999769f * i + 0.0629496f * p - 0.809638f * t), 0f), 1f); -476 float x, y, z, w; -477 if(g < b) { -478 x = b; -479 y = g; -480 z = -1f; -481 w = 2f / 3f; -482 } -483 else { -484 x = g; -485 y = b; -486 z = 0f; -487 w = -1f / 3f; -488 } -489 if(r < x) { -490 z = w; -491 w = r; -492 } -493 else { -494 w = x; -495 x = r; -496 } -497 final float d = x - Math.min(w, y); -498 final float lum = x * (1f - 0.5f * d / (x + 1e-10f)); -499 hue += Math.abs(z + (w - y) / (6f * d + 1e-10f)) + 1f; -500 saturation += (x - lum) / (Math.min(lum, 1f - lum) + 1e-10f); -501 return fromRGBA(FloatColors.hsl2rgb(hue - (int)hue, Math.min(Math.max(saturation, 0f), 1f), lum, opacity)); -502 } -503 -504 /** -505 * Interpolates from the packed float color start towards white by change. While change should be between 0f (return -506 * start as-is) and 1f (return white), start should be a packed color, as from -507 * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and -508 * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards -509 * white. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is. -510 * @see #darken(float, float) the counterpart method that darkens a float color -511 * @param start the starting color as a packed float -512 * @param change how much to go from start toward white, as a float between 0 and 1; higher means closer to white -513 * @return a packed float that represents a color between start and white -514 */ -515 public static float lighten(final float start, final float change) { -516 final int s = NumberUtils.floatToRawIntBits(start), i = s & 0xFF, other = s & 0xFEFFFF00; -517 return NumberUtils.intBitsToFloat(((int) (i + (0xFF - i) * change) & 0xFF) | other); +171 * Takes RGBA components from 0.0 to 1.0 each and converts to a packed float in the IPT format this uses. +172 * @param r red, from 0.0 to 1.0 (both inclusive) +173 * @param g green, from 0.0 to 1.0 (both inclusive) +174 * @param b blue, from 0.0 to 1.0 (both inclusive) +175 * @param a alpha, from 0.0 to 1.0 (both inclusive) +176 * @return a packed float as IPT, which this class can use +177 */ +178 public static float fromRGBA(final float r, final float g, final float b, final float a) { +179 return NumberUtils.intBitsToFloat( +180 Math.min(Math.max((int)((0.189786f * r + 0.576951f * g + 0.233221f * b) * 255.0f + 0.500f), 0), 255) +181 | Math.min(Math.max((int)((0.669665f * r - 0.73741f * g + 0.0681367f * b) * 127.5f + 127.5f), 0), 255) << 8 +182 | Math.min(Math.max((int)((0.286498f * r + 0.655205f * g - 0.941748f * b) * 127.5f + 127.5f), 0), 255) << 16 +183 | ((int)(a * 255f) << 24 & 0xFE000000)); +184 } +185 +186 /** +187 * Gets the red channel value of the given encoded color, as an int ranging from 0 to 255, inclusive. +188 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} +189 * @return an int from 0 to 255, inclusive, representing the red channel value of the given encoded color +190 */ +191 public static int redInt(final float encoded) +192 { +193 final int decoded = NumberUtils.floatToRawIntBits(encoded); +194 final float i = (decoded & 0xff) / 255f; +195 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +196 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +197 return Math.min(Math.max((int) ((0.999779f * i + 1.0709400f * p + 0.324891f * t) * 256.0), 0), 255); +198 } +199 +200 /** +201 * Gets the green channel value of the given encoded color, as an int ranging from 0 to 255, inclusive. +202 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} +203 * @return an int from 0 to 255, inclusive, representing the green channel value of the given encoded color +204 */ +205 public static int greenInt(final float encoded) +206 { +207 final int decoded = NumberUtils.floatToRawIntBits(encoded); +208 final float i = (decoded & 0xff) / 255f; +209 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +210 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +211 return Math.min(Math.max((int) ((1.000150f * i - 0.3777440f * p + 0.220439f * t) * 256.0), 0), 255); +212 } +213 +214 /** +215 * Gets the blue channel value of the given encoded color, as an int ranging from 0 to 255, inclusive. +216 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} +217 * @return an int from 0 to 255, inclusive, representing the blue channel value of the given encoded color +218 */ +219 public static int blueInt(final float encoded) +220 { +221 final int decoded = NumberUtils.floatToRawIntBits(encoded); +222 final float i = (decoded & 0xff) / 255f; +223 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +224 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +225 return Math.min(Math.max((int) ((0.999769f * i + 0.0629496f * p - 0.809638f * t) * 256.0), 0), 255); +226 } +227 +228 /** +229 * Gets the alpha channel value of the given encoded color, as an even int ranging from 0 to 254, inclusive. Because +230 * of how alpha is stored in libGDX, no odd-number values are possible for alpha. +231 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} +232 * @return an even int from 0 to 254, inclusive, representing the alpha channel value of the given encoded color +233 */ +234 public static int alphaInt(final float encoded) +235 { +236 return (NumberUtils.floatToRawIntBits(encoded) & 0xfe000000) >>> 24; +237 } +238 +239 /** +240 * Gets the red channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive. +241 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} +242 * @return a float from 0.0f to 1.0f, inclusive, representing the red channel value of the given encoded color +243 */ +244 public static float red(final float encoded) +245 { +246 final int decoded = NumberUtils.floatToRawIntBits(encoded); +247 final float i = (decoded & 0xff) / 255f; +248 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +249 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +250 return Math.min(Math.max((0.999779f * i + 1.0709400f * p + 0.324891f * t), 0f), 1f); +251 } +252 +253 /** +254 * Gets the green channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive. +255 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} +256 * @return a float from 0.0f to 1.0f, inclusive, representing the green channel value of the given encoded color +257 */ +258 public static float green(final float encoded) +259 { +260 final int decoded = NumberUtils.floatToRawIntBits(encoded); +261 final float i = (decoded & 0xff) / 255f; +262 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +263 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +264 return Math.min(Math.max((1.000150f * i - 0.3777440f * p + 0.220439f * t), 0f), 1f); +265 } +266 +267 /** +268 * Gets the blue channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive. +269 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} +270 * @return a float from 0.0f to 1.0f, inclusive, representing the blue channel value of the given encoded color +271 */ +272 public static float blue(final float encoded) +273 { +274 final int decoded = NumberUtils.floatToRawIntBits(encoded); +275 final float i = (decoded & 0xff) / 255f; +276 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +277 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +278 return Math.min(Math.max((0.999769f * i + 0.0629496f * p - 0.809638f * t), 0f), 1f); +279 } +280 +281 /** +282 * Gets the alpha channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive. +283 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} +284 * @return a float from 0.0f to 1.0f, inclusive, representing the alpha channel value of the given encoded color +285 */ +286 public static float alpha(final float encoded) +287 { +288 return ((NumberUtils.floatToRawIntBits(encoded) & 0xfe000000) >>> 24) * 0x1.020408p-8f; +289 } +290 +291 /** +292 * Gets a color as an IPT packed float given floats representing hue, saturation, lightness, and opacity. +293 * All parameters should normally be between 0 and 1 inclusive, though any hue is tolerated (precision loss may +294 * affect the color if the hue is too large). A hue of 0 is red, progressively higher hue values go to orange, +295 * yellow, green, blue, and purple before wrapping around to red as it approaches 1. A saturation of 0 is grayscale, +296 * a saturation of 1 is brightly colored, and values close to 1 will usually appear more distinct than values close +297 * to 0, especially if the hue is different. A lightness of 0.001f or less is always black (also using a shortcut if +298 * this is the case, respecting opacity), while a lightness of 1f is white. Very bright colors are mostly in a band +299 * of high-saturation where lightness is 0.5f. +300 * +301 * @param hue 0f to 1f, color wheel position +302 * @param saturation 0f to 1f, 0f is grayscale and 1f is brightly colored +303 * @param lightness 0f to 1f, 0f is black and 1f is white +304 * @param opacity 0f to 1f, 0f is fully transparent and 1f is opaque +305 * @return a float encoding a color with the given properties +306 */ +307 public static float floatGetHSL(float hue, float saturation, float lightness, float opacity) { +308 if (lightness <= 0.001f) { +309 return NumberUtils.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x7F7F00); +310 } else { +311 return fromRGBA(FloatColors.hsl2rgb(hue, saturation, lightness, opacity)); +312 } +313 } +314 +315 /** +316 * Gets the saturation of the given encoded color, as a float ranging from 0.0f to 1.0f, inclusive. +317 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} +318 * @return the saturation of the color from 0.0 (a grayscale color; inclusive) to 1.0 (a bright color, inclusive) +319 */ +320 public static float saturation(final float encoded) { +321 final int decoded = NumberUtils.floatToRawIntBits(encoded); +322 final float i = (decoded & 0xff) / 255f; +323 if(Math.abs(i - 0.5) > 0.495f) return 0f; +324 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +325 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +326 final float r = Math.min(Math.max((0.999779f * i + 1.0709400f * p + 0.324891f * t), 0f), 1f); +327 final float g = Math.min(Math.max((1.000150f * i - 0.3777440f * p + 0.220439f * t), 0f), 1f); +328 final float b = Math.min(Math.max((0.999769f * i + 0.0629496f * p - 0.809638f * t), 0f), 1f); +329 float x, y, w; +330 if(g < b) { +331 x = b; +332 y = g; +333 } +334 else { +335 x = g; +336 y = b; +337 } +338 if(r < x) { +339 w = r; +340 } +341 else { +342 w = x; +343 x = r; +344 } +345 return x - Math.min(w, y); +346// float d = x - Math.min(w, y); +347// float li = x * (1f - 0.5f * d / (x + 1e-10f)); +348// return (x - li); // (Math.min(li, 1f - li) + 1e-10f); +349 } +350 +351 public static float lightness(final float encoded) { +352 final int decoded = NumberUtils.floatToRawIntBits(encoded); +353 final float i = (decoded & 0xff) / 255f; +354 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +355 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +356 final float r = Math.min(Math.max((0.999779f * i + 1.0709400f * p + 0.324891f * t), 0f), 1f); +357 final float g = Math.min(Math.max((1.000150f * i - 0.3777440f * p + 0.220439f * t), 0f), 1f); +358 final float b = Math.min(Math.max((0.999769f * i + 0.0629496f * p - 0.809638f * t), 0f), 1f); +359 +360 float x, y, w; +361 if(g < b) { +362 x = b; +363 y = g; +364 } +365 else { +366 x = g; +367 y = b; +368 } +369 if(r < x) { +370 w = r; +371 } +372 else { +373 w = x; +374 x = r; +375 } +376 float d = x - Math.min(w, y); +377 return x * (1f - 0.5f * d / (x + 1e-10f)); +378 } +379 +380 /** +381 * Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased) +382 * to 1f (exclusive, red and approaching purple if decreased). +383 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} +384 * @return The hue of the color from 0.0 (red, inclusive) towards orange, then yellow, and +385 * eventually to purple before looping back to almost the same red (1.0, exclusive) +386 */ +387 public static float hue(final float encoded) { +388 final int decoded = NumberUtils.floatToRawIntBits(encoded); +389 final float i = (decoded & 0xff) / 255f; +390 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +391 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +392 final float r = Math.min(Math.max((0.999779f * i + 1.0709400f * p + 0.324891f * t), 0f), 1f); +393 final float g = Math.min(Math.max((1.000150f * i - 0.3777440f * p + 0.220439f * t), 0f), 1f); +394 final float b = Math.min(Math.max((0.999769f * i + 0.0629496f * p - 0.809638f * t), 0f), 1f); +395 float x, y, z, w; +396 if(g < b) { +397 x = b; +398 y = g; +399 z = -1f; +400 w = 2f / 3f; +401 } +402 else { +403 x = g; +404 y = b; +405 z = 0f; +406 w = -1f / 3f; +407 } +408 if(r < x) { +409 z = w; +410 w = r; +411 } +412 else { +413 w = x; +414 x = r; +415 } +416 float d = x - Math.min(w, y); +417 return Math.abs(z + (w - y) / (6f * d + 1e-10f)); +418 } +419 +420 /** +421 * The "intensity" of the given packed float in IPT format, which is like its lightness; ranges from 0.0f to +422 * 1.0f . You can edit the intensity of a color with {@link #lighten(float, float)} and +423 * {@link #darken(float, float)}. +424 * +425 * @param encoded a color encoded as a packed float, as by {@link #ipt(float, float, float, float)} +426 * @return the intensity value as a float from 0.0f to 1.0f +427 */ +428 public static float intensity(final float encoded) +429 { +430 return (NumberUtils.floatToRawIntBits(encoded) & 0xff) / 255f; +431 } +432 +433 /** +434 * The "protan" of the given packed float in IPT format, which when combined with tritan describes the +435 * hue and saturation of a color; ranges from 0f to 1f . If protan is 0f, the color will be cooler, more green or +436 * blue; if protan is 1f, the color will be warmer, from magenta to orange. You can edit the protan of a color with +437 * {@link #protanUp(float, float)} and {@link #protanDown(float, float)}. +438 * @param encoded a color encoded as a packed float, as by {@link #ipt(float, float, float, float)} +439 * @return the protan value as a float from 0.0f to 1.0f +440 */ +441 public static float protan(final float encoded) +442 { +443 return ((NumberUtils.floatToRawIntBits(encoded) >>> 8 & 0xff)) / 255f; +444 } +445 +446 /** +447 * The "tritan" of the given packed float in IPT format, which when combined with protan describes the +448 * hue and saturation of a color; ranges from 0f to 1f . If tritan is 0f, the color will be more "artificial", more +449 * blue or purple; if tritan is 1f, the color will be more "natural", from green to yellow to orange. You can edit +450 * the tritan of a color with {@link #tritanUp(float, float)} and {@link #tritanDown(float, float)}. +451 * @param encoded a color encoded as a packed float, as by {@link #ipt(float, float, float, float)} +452 * @return the tritan value as a float from 0.0f to 1.0f +453 */ +454 public static float tritan(final float encoded) +455 { +456 return ((NumberUtils.floatToRawIntBits(encoded) >>> 16 & 0xff)) / 255f; +457 } +458 +459 /** +460 * Gets a variation on the packed float color basis as another packed float that has its hue, saturation, lightness, +461 * and opacity adjusted by the specified amounts. Note that this edits the color in HSL space, not IPT! Takes +462 * floats representing the amounts of change to apply to hue, saturation, lightness, and opacity; these can be +463 * between -1f and 1f. Returns a float that can be used as a packed or encoded color with methods like +464 * {@link com.badlogic.gdx.graphics.g2d.Batch#setPackedColor(float)}. The float is likely to be different than the +465 * result of {@link #ipt(float, float, float, float)} unless hue, saturation, lightness, and opacity are all 0. +466 * This won't allocate any objects. +467 * <br> +468 * The parameters this takes all specify additive changes for a color component, clamping the final values so they +469 * can't go above 1 or below 0, with an exception for hue, which can rotate around if lower or higher hues would be +470 * used. As an example, if you give this 0.4f for saturation, and the current color has saturation 0.7f, then the +471 * resulting color will have 1f for saturation. If you gave this -0.1f for saturation and the current color again +472 * has saturation 0.7f, then resulting color will have 0.6f for saturation. +473 * +474 * @param basis a packed float color that will be used as the starting point to make the next color +475 * @param hue -1f to 1f, the hue change that can be applied to the new float color (not clamped, wraps) +476 * @param saturation -1f to 1f, the saturation change that can be applied to the new float color +477 * @param light -1f to 1f, the light/brightness change that can be applied to the new float color +478 * @param opacity -1f to 1f, the opacity/alpha change that can be applied to the new float color +479 * @return a float encoding a variation of basis with the given changes +480 */ +481 public static float toEditedFloat(float basis, float hue, float saturation, float light, float opacity) { +482 final int e = NumberUtils.floatToRawIntBits(basis); +483 final float i = Math.min(Math.max(light + (e & 0xff) / 255f, 0f), 1f); +484 opacity = Math.min(Math.max(opacity + (e >>> 24 & 0xfe) * 0x1.020408p-8f, 0f), 1f); +485 if (i <= 0.001f) +486 return NumberUtils.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x808000); +487 final float p = ((e >>> 7 & 0x1fe) - 0xff) / 255f; +488 final float t = ((e >>> 15 & 0x1fe) - 0xff) / 255f; +489 final float r = Math.min(Math.max((0.999779f * i + 1.0709400f * p + 0.324891f * t), 0f), 1f); +490 final float g = Math.min(Math.max((1.000150f * i - 0.3777440f * p + 0.220439f * t), 0f), 1f); +491 final float b = Math.min(Math.max((0.999769f * i + 0.0629496f * p - 0.809638f * t), 0f), 1f); +492 float x, y, z, w; +493 if(g < b) { +494 x = b; +495 y = g; +496 z = -1f; +497 w = 2f / 3f; +498 } +499 else { +500 x = g; +501 y = b; +502 z = 0f; +503 w = -1f / 3f; +504 } +505 if(r < x) { +506 z = w; +507 w = r; +508 } +509 else { +510 w = x; +511 x = r; +512 } +513 final float d = x - Math.min(w, y); +514 final float lum = x * (1f - 0.5f * d / (x + 1e-10f)); +515 hue += Math.abs(z + (w - y) / (6f * d + 1e-10f)) + 1f; +516 saturation += (x - lum) / (Math.min(lum, 1f - lum) + 1e-10f); +517 return fromRGBA(FloatColors.hsl2rgb(hue - (int)hue, Math.min(Math.max(saturation, 0f), 1f), lum, opacity)); 518 } 519 520 /** -521 * Interpolates from the packed float color start towards black by change. While change should be between 0f (return -522 * start as-is) and 1f (return black), start should be a packed color, as from +521 * Interpolates from the packed float color start towards white by change. While change should be between 0f (return +522 * start as-is) and 1f (return white), start should be a packed color, as from 523 * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and 524 * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards -525 * black. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is. -526 * @see #lighten(float, float) the counterpart method that lightens a float color +525 * white. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is. +526 * @see #darken(float, float) the counterpart method that darkens a float color 527 * @param start the starting color as a packed float -528 * @param change how much to go from start toward black, as a float between 0 and 1; higher means closer to black -529 * @return a packed float that represents a color between start and black +528 * @param change how much to go from start toward white, as a float between 0 and 1; higher means closer to white +529 * @return a packed float that represents a color between start and white 530 */ -531 public static float darken(final float start, final float change) { +531 public static float lighten(final float start, final float change) { 532 final int s = NumberUtils.floatToRawIntBits(start), i = s & 0xFF, other = s & 0xFEFFFF00; -533 return NumberUtils.intBitsToFloat(((int) (i * (1f - change)) & 0xFF) | other); +533 return NumberUtils.intBitsToFloat(((int) (i + (0xFF - i) * change) & 0xFF) | other); 534 } 535 536 /** -537 * Interpolates from the packed float color start towards a warmer color (orange to magenta) by change. While change -538 * should be between 0f (return start as-is) and 1f (return fully warmed), start should be a packed color, as from -539 * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, -540 * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to -541 * lerp towards a warmer color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the -542 * alpha and intensity of start as-is. -543 * @see #protanDown(float, float) the counterpart method that cools a float color -544 * @param start the starting color as a packed float -545 * @param change how much to warm start, as a float between 0 and 1; higher means a warmer result -546 * @return a packed float that represents a color between start and a warmer color -547 */ -548 public static float protanUp(final float start, final float change) { -549 final int s = NumberUtils.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF; -550 return NumberUtils.intBitsToFloat(((int) (p + (0xFF - p) * change) << 8 & 0xFF00) | other); -551 } -552 -553 /** -554 * Interpolates from the packed float color start towards a cooler color (green to blue) by change. While change -555 * should be between 0f (return start as-is) and 1f (return fully cooled), start should be a packed color, as from -556 * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and -557 * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp -558 * towards a cooler color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and -559 * intensity of start as-is. -560 * @see #protanUp(float, float) the counterpart method that warms a float color -561 * @param start the starting color as a packed float -562 * @param change how much to cool start, as a float between 0 and 1; higher means a cooler result -563 * @return a packed float that represents a color between start and a cooler color -564 */ -565 public static float protanDown(final float start, final float change) { -566 final int s = NumberUtils.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF; -567 return NumberUtils.intBitsToFloat(((int) (p * (1f - change)) & 0xFF) << 8 | other); -568 } -569 -570 /** -571 * Interpolates from the packed float color start towards a "natural" color (between green and orange) by change. -572 * While change should be between 0f (return start as-is) and 1f (return fully natural), start should be a packed color, as -573 * from {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary -574 * Colors, and is a little more efficient and clear than using -575 * {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards a more natural color. Unlike -576 * {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and intensity of start as-is. -577 * @see #tritanDown(float, float) the counterpart method that makes a float color less natural -578 * @param start the starting color as a packed float -579 * @param change how much to change start to a natural color, as a float between 0 and 1; higher means a more natural result -580 * @return a packed float that represents a color between start and a more natural color -581 */ -582 public static float tritanUp(final float start, final float change) { -583 final int s = NumberUtils.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF; -584 return NumberUtils.intBitsToFloat(((int) (t + (0xFF - t) * change) << 16 & 0xFF0000) | other); -585 } -586 -587 /** -588 * Interpolates from the packed float color start towards an "artificial" color (between blue and purple) by change. -589 * While change should be between 0f (return start as-is) and 1f (return fully artificial), start should be a packed color, as -590 * from {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary -591 * Colors, and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp -592 * towards a more artificial color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the -593 * alpha and intensity of start as-is. -594 * @see #tritanUp(float, float) the counterpart method that makes a float color less artificial -595 * @param start the starting color as a packed float -596 * @param change how much to change start to a bolder color, as a float between 0 and 1; higher means a more artificial result -597 * @return a packed float that represents a color between start and a more artificial color -598 */ -599 public static float tritanDown(final float start, final float change) { -600 final int s = NumberUtils.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF; -601 return NumberUtils.intBitsToFloat(((int) (t * (1f - change)) & 0xFF) << 16 | other); -602 } -603 -604 /** -605 * Interpolates from the packed float color start towards that color made opaque by change. While change should be -606 * between 0f (return start as-is) and 1f (return start with full alpha), start should be a packed color, as from -607 * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and -608 * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards -609 * transparent. This won't change the intensity, protan, or tritan of the color. -610 * @see #fade(float, float) the counterpart method that makes a float color more translucent +537 * Interpolates from the packed float color start towards black by change. While change should be between 0f (return +538 * start as-is) and 1f (return black), start should be a packed color, as from +539 * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and +540 * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards +541 * black. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is. +542 * @see #lighten(float, float) the counterpart method that lightens a float color +543 * @param start the starting color as a packed float +544 * @param change how much to go from start toward black, as a float between 0 and 1; higher means closer to black +545 * @return a packed float that represents a color between start and black +546 */ +547 public static float darken(final float start, final float change) { +548 final int s = NumberUtils.floatToRawIntBits(start), i = s & 0xFF, other = s & 0xFEFFFF00; +549 return NumberUtils.intBitsToFloat(((int) (i * (1f - change)) & 0xFF) | other); +550 } +551 +552 /** +553 * Interpolates from the packed float color start towards a warmer color (orange to magenta) by change. While change +554 * should be between 0f (return start as-is) and 1f (return fully warmed), start should be a packed color, as from +555 * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, +556 * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to +557 * lerp towards a warmer color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the +558 * alpha and intensity of start as-is. +559 * @see #protanDown(float, float) the counterpart method that cools a float color +560 * @param start the starting color as a packed float +561 * @param change how much to warm start, as a float between 0 and 1; higher means a warmer result +562 * @return a packed float that represents a color between start and a warmer color +563 */ +564 public static float protanUp(final float start, final float change) { +565 final int s = NumberUtils.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF; +566 return NumberUtils.intBitsToFloat(((int) (p + (0xFF - p) * change) << 8 & 0xFF00) | other); +567 } +568 +569 /** +570 * Interpolates from the packed float color start towards a cooler color (green to blue) by change. While change +571 * should be between 0f (return start as-is) and 1f (return fully cooled), start should be a packed color, as from +572 * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and +573 * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp +574 * towards a cooler color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and +575 * intensity of start as-is. +576 * @see #protanUp(float, float) the counterpart method that warms a float color +577 * @param start the starting color as a packed float +578 * @param change how much to cool start, as a float between 0 and 1; higher means a cooler result +579 * @return a packed float that represents a color between start and a cooler color +580 */ +581 public static float protanDown(final float start, final float change) { +582 final int s = NumberUtils.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF; +583 return NumberUtils.intBitsToFloat(((int) (p * (1f - change)) & 0xFF) << 8 | other); +584 } +585 +586 /** +587 * Interpolates from the packed float color start towards a "natural" color (between green and orange) by change. +588 * While change should be between 0f (return start as-is) and 1f (return fully natural), start should be a packed color, as +589 * from {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary +590 * Colors, and is a little more efficient and clear than using +591 * {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards a more natural color. Unlike +592 * {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and intensity of start as-is. +593 * @see #tritanDown(float, float) the counterpart method that makes a float color less natural +594 * @param start the starting color as a packed float +595 * @param change how much to change start to a natural color, as a float between 0 and 1; higher means a more natural result +596 * @return a packed float that represents a color between start and a more natural color +597 */ +598 public static float tritanUp(final float start, final float change) { +599 final int s = NumberUtils.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF; +600 return NumberUtils.intBitsToFloat(((int) (t + (0xFF - t) * change) << 16 & 0xFF0000) | other); +601 } +602 +603 /** +604 * Interpolates from the packed float color start towards an "artificial" color (between blue and purple) by change. +605 * While change should be between 0f (return start as-is) and 1f (return fully artificial), start should be a packed color, as +606 * from {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary +607 * Colors, and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp +608 * towards a more artificial color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the +609 * alpha and intensity of start as-is. +610 * @see #tritanUp(float, float) the counterpart method that makes a float color less artificial 611 * @param start the starting color as a packed float -612 * @param change how much to go from start toward opaque, as a float between 0 and 1; higher means closer to opaque -613 * @return a packed float that represents a color between start and its opaque version +612 * @param change how much to change start to a bolder color, as a float between 0 and 1; higher means a more artificial result +613 * @return a packed float that represents a color between start and a more artificial color 614 */ -615 public static float blot(final float start, final float change) { -616 final int s = NumberUtils.floatToRawIntBits(start), opacity = s >>> 24 & 0xFE, other = s & 0x00FFFFFF; -617 return NumberUtils.intBitsToFloat(((int) (opacity + (0xFE - opacity) * change) & 0xFE) << 24 | other); +615 public static float tritanDown(final float start, final float change) { +616 final int s = NumberUtils.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF; +617 return NumberUtils.intBitsToFloat(((int) (t * (1f - change)) & 0xFF) << 16 | other); 618 } 619 620 /** -621 * Interpolates from the packed float color start towards transparent by change. While change should be between 0 -622 * (return start as-is) and 1f (return the color with 0 alpha), start should be a packed color, as from -623 * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, -624 * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards +621 * Interpolates from the packed float color start towards that color made opaque by change. While change should be +622 * between 0f (return start as-is) and 1f (return start with full alpha), start should be a packed color, as from +623 * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and +624 * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards 625 * transparent. This won't change the intensity, protan, or tritan of the color. -626 * @see #blot(float, float) the counterpart method that makes a float color more opaque +626 * @see #fade(float, float) the counterpart method that makes a float color more translucent 627 * @param start the starting color as a packed float -628 * @param change how much to go from start toward transparent, as a float between 0 and 1; higher means closer to transparent -629 * @return a packed float that represents a color between start and transparent +628 * @param change how much to go from start toward opaque, as a float between 0 and 1; higher means closer to opaque +629 * @return a packed float that represents a color between start and its opaque version 630 */ -631 public static float fade(final float start, final float change) { -632 final int s = NumberUtils.floatToRawIntBits(start), opacity = s & 0xFE, other = s & 0x00FFFFFF; -633 return NumberUtils.intBitsToFloat(((int) (opacity * (1f - change)) & 0xFE) << 24 | other); +631 public static float blot(final float start, final float change) { +632 final int s = NumberUtils.floatToRawIntBits(start), opacity = s >>> 24 & 0xFE, other = s & 0x00FFFFFF; +633 return NumberUtils.intBitsToFloat(((int) (opacity + (0xFE - opacity) * change) & 0xFE) << 24 | other); 634 } 635 636 /** -637 * Brings the chromatic components of {@code start} closer to grayscale by {@code change} (desaturating them). While -638 * change should be between 0f (return start as-is) and 1f (return fully gray), start should be a packed color, as -639 * from {@link #ipt(float, float, float, float)}. This only changes protan and tritan; it leaves intensity and alpha -640 * alone, unlike {@link #lessenChange(float, float)}, which usually changes intensity. -641 * @see #enrich(float, float) the counterpart method that makes a float color more saturated -642 * @param start the starting color as a packed float -643 * @param change how much to change start to a desaturated color, as a float between 0 and 1; higher means a less saturated result -644 * @return a packed float that represents a color between start and a desaturated color -645 */ -646 public static float dullen(final float start, final float change) { -647 final int s = NumberUtils.floatToRawIntBits(start); -648 return ipt((s & 0xFF) / 255f, -649 ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f, -650 ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f, -651 (s >>> 25) / 127f); -652 } -653 -654 /** -655 * Pushes the chromatic components of {@code start} away from grayscale by change (saturating them). While change -656 * should be between 0f (return start as-is) and 1f (return maximally saturated), start should be a packed color, as -657 * from {@link #ipt(float, float, float, float)}. This usually changes only protan and tritan, but higher values for -658 * {@code change} can force the color out of the gamut, which this corrects using -659 * {@link #limitToGamut(float, float, float, float)} (and that can change intensity somewhat). If the color stays -660 * in-gamut, then intensity won't change; alpha never changes. -661 * @see #dullen(float, float) the counterpart method that makes a float color less saturated -662 * @param start the starting color as a packed float -663 * @param change how much to change start to a saturated color, as a float between 0 and 1; higher means a more saturated result -664 * @return a packed float that represents a color between start and a saturated color -665 */ -666 public static float enrich(final float start, final float change) { -667 final int s = NumberUtils.floatToRawIntBits(start); -668 return limitToGamut((s & 0xFF) / 255f, -669 ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f, -670 ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f, -671 (s >>> 25) / 127f); -672 } -673 -674 /** -675 * Given a packed float IPT color {@code mainColor} and another IPT color that it should be made to contrast with, -676 * gets a packed float IPT color with roughly inverted intnsity but the same chromatic channels and opacity (P and T -677 * are likely to be clamped if the result gets close to white or black). This won't ever produce black or other very -678 * dark colors, and also has a gap in the range it produces for intensity values between 0.5 and 0.55. That allows -679 * most of the colors this method produces to contrast well as a foreground when displayed on a background of -680 * {@code contrastingColor}, or vice versa. This will leave the intensity unchanged if the chromatic channels of the -681 * contrastingColor and those of the mainColor are already very different. This has nothing to do with the contrast -682 * channel of the tweak in ColorfulBatch; where that part of the tweak can make too-similar lightness values further -683 * apart by just a little, this makes a modification on {@code mainColor} to maximize its lightness difference from -684 * {@code contrastingColor} without losing its other qualities. -685 * @param mainColor a packed float color, as produced by {@link #ipt(float, float, float, float)}; this is the color that will be adjusted -686 * @param contrastingColor a packed float color, as produced by {@link #ipt(float, float, float, float)}; the adjusted mainColor will contrast with this -687 * @return a different IPT packed float color, based on mainColor but with potentially very different lightness -688 */ -689 public static float inverseLightness(final float mainColor, final float contrastingColor) -690 { -691 final int bits = NumberUtils.floatToRawIntBits(mainColor), -692 contrastBits = NumberUtils.floatToRawIntBits(contrastingColor), -693 i = (bits & 0xff), -694 p = (bits >>> 8 & 0xff), -695 t = (bits >>> 16 & 0xff), -696 ci = (contrastBits & 0xff), -697 cp = (contrastBits >>> 8 & 0xff), -698 ct = (contrastBits >>> 16 & 0xff); -699 if((p - cp) * (p - cp) + (t - ct) * (t - ct) >= 0x10000) -700 return mainColor; -701 return ipt(ci < 128 ? i * (0.45f / 255f) + 0.55f : 0.5f - i * (0.45f / 255f), p / 255f, t / 255f, 0x1.0p-8f * (bits >>> 24)); -702 } -703 -704 /** -705 * Given a packed float IPT color {@code mainColor} and another IPT color that it should be made to contrast -706 * with, gets a packed float IPT color with I that should be quite different from {@code contrastingColor}'s I, -707 * but the same chromatic channels and opacity (A and B are likely to be clamped if the result gets close to white -708 * or black). This allows most of the colors this method produces to contrast well as a foreground when displayed on -709 * a background of {@code contrastingColor}, or vice versa. -710 * <br> -711 * This is similar to {@link #inverseLightness(float, float)}, but is considerably simpler, and this method will -712 * change the lightness of mainColor when the two given colors have close lightness but distant chroma. Because it -713 * averages the original I of mainColor with the modified one, this tends to not produce harsh color changes. -714 * @param mainColor a packed IPT float color; this is the color that will be adjusted -715 * @param contrastingColor a packed IPT float color; the adjusted mainColor will contrast with the I of this -716 * @return a different packed IPT float color, based on mainColor but typically with different lightness -717 */ -718 public static float differentiateLightness(final float mainColor, final float contrastingColor) -719 { -720 final int main = NumberUtils.floatToRawIntBits(mainColor), contrast = NumberUtils.floatToRawIntBits(contrastingColor); -721 return limitToGamut(NumberUtils.intBitsToFloat((main & 0xFEFFFF00) | (contrast + 128 & 0xFF) + (main & 0xFF) >>> 1)); -722 } -723 -724 /** -725 * Pretty simple; adds 0.5 to the given color's I and wraps it around if it would go above 1.0, then averages that -726 * with the original I. This means light colors become darker, and dark colors become lighter, with almost all -727 * results in the middle-range of possible lightness. -728 * @param mainColor a packed IPT float color -729 * @return a different packed IPT float color, with its I channel changed and limited to the correct gamut -730 */ -731 public static float offsetLightness(final float mainColor) { -732 final int decoded = NumberUtils.floatToRawIntBits(mainColor); -733 return limitToGamut(NumberUtils.intBitsToFloat((decoded & 0xFEFFFF00) | (decoded + 128 & 0xFF) + (decoded & 0xFF) >>> 1)); -734 } -735 -736 /** -737 * Makes the additive IPT color stored in {@code color} cause less of a change when used as a tint, as if it were -738 * mixed with neutral gray. When {@code fraction} is 1.0, this returns color unchanged; when fraction is 0.0, it -739 * returns {@link Palette#GRAY}, and when it is in-between 0.0 and 1.0 it returns something between the two. This is -740 * meant for things like area of effect abilities that make smaller color changes toward their periphery. -741 * @param color a color that should have its tinting effect potentially weakened -742 * @param fraction how much of {@code color} should be kept, from 0.0 to 1.0 -743 * @return an IPT float color between gray and {@code color} -744 */ -745 public static float lessenChange(final float color, float fraction) { -746 final int e = NumberUtils.floatToRawIntBits(color), -747 is = 0x80, ps = 0x80, ts = 0x80, as = 0xFE, -748 ie = (e & 0xFF), pe = (e >>> 8) & 0xFF, te = (e >>> 16) & 0xFF, ae = e >>> 24 & 0xFE; -749 return NumberUtils.intBitsToFloat(((int) (is + fraction * (ie - is)) & 0xFF) -750 | (((int) (ps + fraction * (pe - ps)) & 0xFF) << 8) -751 | (((int) (ts + fraction * (te - ts)) & 0xFF) << 16) -752 | (((int) (as + fraction * (ae - as)) & 0xFE) << 24)); -753 } -754 -755 /** -756 * Makes a quasi-randomly-edited variant on the given {@code color}, allowing typically a small amount of -757 * {@code variance} (such as 0.05 to 0.25) between the given color and what this can return. The {@code seed} should -758 * be different each time this is called, and can be obtained from a random number generator to make the colors more -759 * random, or can be incremented on each call. If the seed is only incremented or decremented, then this shouldn't -760 * produce two similar colors in a row unless variance is very small. The variance affects the I, P, and T of the -761 * generated color, and each of those channels can go up or down by the given variance as long as the total distance -762 * isn't greater than the variance (this considers P and T extra-wide, going from -1 to 1, while I goes from 0 to 1, -763 * but only internally for measuring distance). -764 * @param color a packed float color, as produced by {@link #ipt(float, float, float, float)} -765 * @param seed a long seed that should be different on each call; should not be 0 -766 * @param variance max amount of difference between the given color and the generated color; always less than 1 -767 * @return a generated packed float color that should be at least somewhat different from {@code color} -768 */ -769 public static float randomEdit(final float color, long seed, final float variance) { -770 final int decoded = NumberUtils.floatToRawIntBits(color); -771 final float i = (decoded & 0xff) / 255f; -772 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -773 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -774 final float limit = variance * variance; -775 float dist, x, y, z; -776 for (int j = 0; j < 50; j++) { -777 x = (((seed * 0xD1B54A32D192ED03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance; -778 y = (((seed * 0xABC98388FB8FAC03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance; -779 z = (((seed * 0x8CB92BA72F3D8DD7L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance; -780 seed += 0x9E3779B97F4A7C15L; -781 dist = x * x + y * y + z * z; -782 if(dist <= limit && inGamut(x += i, y = (p + y) * 0.5f + 0.5f, z = (t + z) * 0.5f + 0.5f)) -783 return NumberUtils.intBitsToFloat((decoded & 0xFE000000) | ((int)(z * 255.5f) << 16 & 0xFF0000) -784 | ((int)(y * 255.5f) << 8 & 0xFF00) | (int)(x * 255.5f)); -785 } -786 return color; -787 } -788 -789 /** -790 * Returns true if the given packed float color, as IPT, is valid to convert losslessly back to RGBA. -791 * @param packed a packed float color as IPT -792 * @return true if the given packed float color can be converted back and forth to RGBA -793 */ -794 public static boolean inGamut(final float packed) -795 { -796 final int decoded = NumberUtils.floatToRawIntBits(packed); -797 final float i = (decoded & 0xff) / 255f; -798 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -799 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -800 final float r = 0.999779f * i + 1.0709400f * p + 0.324891f * t; -801 if(r < -0.006f || r > 1.003f) return false; -802 final float g = 1.000150f * i - 0.3777440f * p + 0.220439f * t; -803 if(g < -0.006f || g > 1.003f) -804 return false; -805 final float b = 0.999769f * i + 0.0629496f * p - 0.809638f * t; -806 return (b >= -0.006f && b <= 1.003f); -807 } -808 /** -809 * Returns true if the given IPT values are valid to convert losslessly back to RGBA. -810 * @param i intensity channel, as a float from 0 to 1 -811 * @param p protan channel, as a float from 0 to 1 -812 * @param t tritan channel, as a float from 0 to 1 -813 * @return true if the given packed float color can be converted back and forth to RGBA -814 */ -815 public static boolean inGamut(float i, float p, float t) -816 { -817 p = (p - 0.5f) * 2f; -818 t = (t - 0.5f) * 2f; -819 final float r = 0.999779f * i + 1.0709400f * p + 0.324891f * t; -820 if(r < -0.006f || r > 1.003f) return false; -821 final float g = 1.000150f * i - 0.3777440f * p + 0.220439f * t; -822 if(g < -0.006f || g > 1.003f) -823 return false; -824 final float b = 0.999769f * i + 0.0629496f * p - 0.809638f * t; -825 return (b >= -0.006f && b <= 1.003f); -826 } -827 -828 /** -829 * Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it -830 * isn't in-gamut, or returns it as soon as it is in-gamut. -831 * @param packed a packed float color in IPT format; often this color is not in-gamut -832 * @return the first color this finds that is between the given IPT color and 50% gray, and is in-gamut -833 * @see #inGamut(float) You can use inGamut() if you just want to check whether a color is in-gamut. -834 */ -835 public static float limitToGamut(final float packed) { -836 final int decoded = NumberUtils.floatToRawIntBits(packed); -837 final float i = (decoded & 0xff) / 255f; -838 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -839 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -840 float i2 = i, p2 = p, t2 = t; -841 for (int attempt = 31; attempt >= 0; attempt--) { -842 final float r = 0.999779f * i2 + 1.0709400f * p2 + 0.324891f * t2; -843 final float g = 1.000150f * i2 - 0.3777440f * p2 + 0.220439f * t2; -844 final float b = 0.999769f * i2 + 0.0629496f * p2 - 0.809638f * t2; -845 if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f) -846 break; -847 final float progress = attempt * 0x1p-5f; -848 i2 = MathUtils.lerp(0.5f, i, progress); -849 p2 = MathUtils.lerp(0, p, progress); -850 t2 = MathUtils.lerp(0, t, progress); -851 } -852 return ipt(i2, p2 * 0.5f + 0.5f, t2 * 0.5f + 0.5f, (decoded >>> 25) / 127f); -853 } -854 -855 /** -856 * Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it -857 * isn't in-gamut, or returns it as soon as it is in-gamut. This always produces an opaque color. -858 * @param i intensity component; will be clamped between 0 and 1 if it isn't already -859 * @param p protan component; will be clamped between 0 and 1 if it isn't already -860 * @param t tritan component; will be clamped between 0 and 1 if it isn't already -861 * @return the first color this finds that is between the given IPT color and 50% gray, and is in-gamut -862 * @see #inGamut(float, float, float) You can use inGamut() if you just want to check whether a color is in-gamut. -863 */ -864 public static float limitToGamut(float i, float p, float t) { -865 return limitToGamut(i, p, t, 1f); -866 } -867 /** -868 * Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it -869 * isn't in-gamut, or returns it as soon as it is in-gamut. -870 * @param i intensity component; will be clamped between 0 and 1 if it isn't already -871 * @param p protan component; will be clamped between 0 and 1 if it isn't already -872 * @param t tritan component; will be clamped between 0 and 1 if it isn't already -873 * @param a alpha component; will be clamped between 0 and 1 if it isn't already -874 * @return the first color this finds that is between the given IPT color and 50% gray, and is in-gamut -875 * @see #inGamut(float, float, float) You can use inGamut() if you just want to check whether a color is in-gamut. -876 */ -877 public static float limitToGamut(float i, float p, float t, float a) { -878 float i2 = i = Math.min(Math.max(i, 0f), 1f); -879 float p2 = p = Math.min(Math.max((p - 0.5f) * 2f, -1f), 1f); -880 float t2 = t = Math.min(Math.max((t - 0.5f) * 2f, -1f), 1f); -881 a = Math.min(Math.max(a, 0f), 1f); -882 for (int attempt = 31; attempt >= 0; attempt--) { -883 final float r = 0.999779f * i2 + 1.0709400f * p2 + 0.324891f * t2; -884 final float g = 1.000150f * i2 - 0.3777440f * p2 + 0.220439f * t2; -885 final float b = 0.999769f * i2 + 0.0629496f * p2 - 0.809638f * t2; -886 if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f) -887 break; -888 final float progress = attempt * 0x1p-5f; -889 i2 = MathUtils.lerp(0.5f, i, progress); -890 p2 = MathUtils.lerp(0, p, progress); -891 t2 = MathUtils.lerp(0, t, progress); -892 } -893 return ipt(i2, p2 * 0.5f + 0.5f, t2 * 0.5f + 0.5f, a); -894 } -895 -896 /** -897 * Converts from a packed float in HSI format to a packed float in IPT format. -898 * @param packed a packed float in HSI format -899 * @return a packed float in IPT format -900 */ -901 public static float fromHSI(float packed){ -902 final int decoded = NumberUtils.floatToRawIntBits(packed); -903 final float h = (decoded & 0xff) / 255f; -904 final float s = (decoded >>> 8 & 0xff) / 255f; -905 final float i = (decoded >>> 16 & 0xff) / 255f; -906 final float y = TrigTools.cos_(h) * s, z = TrigTools.sin_(h) * s; -907 final float crMid = 0.3481738f * y + 0.104959644f * z; -908 final float crScale = (i - 0.5f + (NumberUtils.floatToRawIntBits(crMid) >>> 31)) * 0.16420607f / -crMid; -909 final float mgMid = 0.122068435f * y + -0.070396f * z; -910 final float mgScale = (i + 0.5f - (NumberUtils.floatToRawIntBits(mgMid) >>> 31)) * -0.16136102f / -mgMid; -911 final float ybMid = 0.020876605f * y + -0.26078433f * z; -912 final float ybScale = (i - 0.5f + (NumberUtils.floatToRawIntBits(ybMid) >>> 31)) * 0.16155326f / -ybMid; -913 final float scale = Math.max(crScale, Math.max(mgScale, ybScale)); -914 final float d = 4f * s * scale / (MathUtils.sin(3.14159f * i) + 0.000001f); -915 -916 final float p = y * d; -917 final float t = z * d; -918 return NumberUtils.intBitsToFloat((decoded & 0xFE000000) | ((int) (t * 255) << 16 & 0xFF0000) -919 | ((int) (p * 255) << 8 & 0xFF00) | (decoded >>> 16 & 0xFF)); -920 } -921 -922 /** -923 * Converts from hue, saturation, intensity, and alpha components (each ranging from 0 to 1 inclusive) to a packed -924 * float color in IPT format. -925 * @param hue hue, from 0 to 1 inclusive; 0 is red, 0.25 is yellow, 0.75 is blue -926 * @param saturation saturation from 0 (grayscale) to a limit between 0 and 1 depending on intensity (it can be 1 only when intensity is 0.5) -927 * @param intensity intensity, or lightness, from 0 (black) to 1 (white) -928 * @param alpha alpha transparency/opacity, from 0 (fully transparent) to 1 (fully opaque) -929 * @return a packed float in IPT format -930 */ -931 public static float fromHSI(float hue, float saturation, float intensity, float alpha){ -932 final float y = TrigTools.cos_(hue) * saturation, z = TrigTools.sin_(hue) * saturation; -933 final float crMid = 0.3481738f * y + 0.104959644f * z; -934 final float crScale = (intensity - 0.5f + (NumberUtils.floatToRawIntBits(crMid) >>> 31)) * 0.16420607f / -crMid; -935 final float mgMid = 0.122068435f * y + -0.070396f * z; -936 final float mgScale = (intensity + 0.5f - (NumberUtils.floatToRawIntBits(mgMid) >>> 31)) * -0.16136102f / -mgMid; -937 final float ybMid = 0.020876605f * y + -0.26078433f * z; -938 final float ybScale = (intensity - 0.5f + (NumberUtils.floatToRawIntBits(ybMid) >>> 31)) * 0.16155326f / -ybMid; -939 final float scale = Math.max(crScale, Math.max(mgScale, ybScale)); -940 final float d = 4f * saturation * scale / (MathUtils.sin(3.14159f * intensity) + 0.000001f); -941 -942 final float p = y * d; -943 final float t = z * d; -944 return NumberUtils.intBitsToFloat(((int)(alpha * 255) << 24 & 0xFE000000) | ((int) (t * 255) << 16 & 0xFF0000) -945 | ((int) (p * 255) << 8 & 0xFF00) | ((int) (intensity * 255) & 0xFF)); -946 } -947 -948 /** -949 * Produces a random packed float color that is always in-gamut and should be uniformly distributed. -950 * @param random a Random object (or preferably a subclass of Random, like {@link com.badlogic.gdx.math.RandomXS128}) -951 * @return a packed float color that is always in-gamut -952 */ -953 public static float randomColor(Random random) { -954 final float ir = 0.1882353f, pr = 0.83137256f - 0.5f, tr = 0.6431373f - 0.5f; -955 final float ig = 0.5764706f, pg = 0.12941177f - 0.5f, tg = 0.827451f - 0.5f; -956 final float ib = 0.23137255f, pb = 0.53333336f - 0.5f, tb = 0.02745098f - 0.5f; -957 final float r = random.nextFloat(), g = random.nextFloat(), b = random.nextFloat(); -958 return NumberUtils.intBitsToFloat(0xFE000000 -959 | ((int) ((tr * r + tg * g + tb * b) * 128f + 128f) << 16 & 0xFF0000) -960 | ((int) ((pr * r + pg * g + pb * b) * 128f + 128f) << 8 & 0xFF00) -961 | ((int) ((ir * r + ig * g + ib * b) * 256f) & 0xFF)); -962 } -963 /** -964 * Limited-use; like {@link #randomColor(Random)} but for cases where you already have three floats (r, g, and b) -965 * distributed how you want. This can be somewhat useful if you are using a "subrandom" or "quasi-random" sequence, -966 * like the Halton, Sobol, or R3 sequences, to get 3D points and map them to colors. It can also be useful if you -967 * want to randomly generate the RGB channels yourself and track the values produced, as you would if you wanted to -968 * avoid generating too many colors with high blue, for instance. This approximately maps the r, g, and b parameters -969 * to distances on the RGB axes of a rectangular prism, which is stretched and rotated to form the IPT gamut. -970 * @param r red value to use; will be clamped between 0 and 1 -971 * @param g green value to use; will be clamped between 0 and 1 -972 * @param b blue value to use; will be clamped between 0 and 1 -973 * @return a packed float color that is always opaque -974 */ -975 public static float subrandomColor(float r, float g, float b) { -976 r = Math.min(Math.max(r, 0f), 0.999f); -977 g = Math.min(Math.max(g, 0f), 0.999f); -978 b = Math.min(Math.max(b, 0f), 0.999f); -979 final float ir = 0.1882353f, pr = 0.83137256f - 0.5f, tr = 0.6431373f - 0.5f; -980 final float ig = 0.5764706f, pg = 0.12941177f - 0.5f, tg = 0.827451f - 0.5f; -981 final float ib = 0.23137255f, pb = 0.53333336f - 0.5f, tb = 0.02745098f - 0.5f; -982 return NumberUtils.intBitsToFloat(0xFE000000 -983 | ((int) ((tr * r + tg * g + tb * b) * 127.5f + 127.5f) << 16 & 0xFF0000) -984 | ((int) ((pr * r + pg * g + pb * b) * 127.5f + 127.5f) << 8 & 0xFF00) -985 | ((int) ((ir * r + ig * g + ib * b) * 255f) & 0xFF)); -986 } -987} +637 * Interpolates from the packed float color start towards transparent by change. While change should be between 0 +638 * (return start as-is) and 1f (return the color with 0 alpha), start should be a packed color, as from +639 * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, +640 * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards +641 * transparent. This won't change the intensity, protan, or tritan of the color. +642 * @see #blot(float, float) the counterpart method that makes a float color more opaque +643 * @param start the starting color as a packed float +644 * @param change how much to go from start toward transparent, as a float between 0 and 1; higher means closer to transparent +645 * @return a packed float that represents a color between start and transparent +646 */ +647 public static float fade(final float start, final float change) { +648 final int s = NumberUtils.floatToRawIntBits(start), opacity = s & 0xFE, other = s & 0x00FFFFFF; +649 return NumberUtils.intBitsToFloat(((int) (opacity * (1f - change)) & 0xFE) << 24 | other); +650 } +651 +652 /** +653 * Brings the chromatic components of {@code start} closer to grayscale by {@code change} (desaturating them). While +654 * change should be between 0f (return start as-is) and 1f (return fully gray), start should be a packed color, as +655 * from {@link #ipt(float, float, float, float)}. This only changes protan and tritan; it leaves intensity and alpha +656 * alone, unlike {@link #lessenChange(float, float)}, which usually changes intensity. +657 * @see #enrich(float, float) the counterpart method that makes a float color more saturated +658 * @param start the starting color as a packed float +659 * @param change how much to change start to a desaturated color, as a float between 0 and 1; higher means a less saturated result +660 * @return a packed float that represents a color between start and a desaturated color +661 */ +662 public static float dullen(final float start, final float change) { +663 final int s = NumberUtils.floatToRawIntBits(start); +664 return ipt((s & 0xFF) / 255f, +665 ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f, +666 ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f, +667 (s >>> 25) / 127f); +668 } +669 +670 /** +671 * Pushes the chromatic components of {@code start} away from grayscale by change (saturating them). While change +672 * should be between 0f (return start as-is) and 1f (return maximally saturated), start should be a packed color, as +673 * from {@link #ipt(float, float, float, float)}. This usually changes only protan and tritan, but higher values for +674 * {@code change} can force the color out of the gamut, which this corrects using +675 * {@link #limitToGamut(float, float, float, float)} (and that can change intensity somewhat). If the color stays +676 * in-gamut, then intensity won't change; alpha never changes. +677 * @see #dullen(float, float) the counterpart method that makes a float color less saturated +678 * @param start the starting color as a packed float +679 * @param change how much to change start to a saturated color, as a float between 0 and 1; higher means a more saturated result +680 * @return a packed float that represents a color between start and a saturated color +681 */ +682 public static float enrich(final float start, final float change) { +683 final int s = NumberUtils.floatToRawIntBits(start); +684 return limitToGamut((s & 0xFF) / 255f, +685 ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f, +686 ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f, +687 (s >>> 25) / 127f); +688 } +689 +690 /** +691 * Given a packed float IPT color {@code mainColor} and another IPT color that it should be made to contrast with, +692 * gets a packed float IPT color with roughly inverted intnsity but the same chromatic channels and opacity (P and T +693 * are likely to be clamped if the result gets close to white or black). This won't ever produce black or other very +694 * dark colors, and also has a gap in the range it produces for intensity values between 0.5 and 0.55. That allows +695 * most of the colors this method produces to contrast well as a foreground when displayed on a background of +696 * {@code contrastingColor}, or vice versa. This will leave the intensity unchanged if the chromatic channels of the +697 * contrastingColor and those of the mainColor are already very different. This has nothing to do with the contrast +698 * channel of the tweak in ColorfulBatch; where that part of the tweak can make too-similar lightness values further +699 * apart by just a little, this makes a modification on {@code mainColor} to maximize its lightness difference from +700 * {@code contrastingColor} without losing its other qualities. +701 * @param mainColor a packed float color, as produced by {@link #ipt(float, float, float, float)}; this is the color that will be adjusted +702 * @param contrastingColor a packed float color, as produced by {@link #ipt(float, float, float, float)}; the adjusted mainColor will contrast with this +703 * @return a different IPT packed float color, based on mainColor but with potentially very different lightness +704 */ +705 public static float inverseLightness(final float mainColor, final float contrastingColor) +706 { +707 final int bits = NumberUtils.floatToRawIntBits(mainColor), +708 contrastBits = NumberUtils.floatToRawIntBits(contrastingColor), +709 i = (bits & 0xff), +710 p = (bits >>> 8 & 0xff), +711 t = (bits >>> 16 & 0xff), +712 ci = (contrastBits & 0xff), +713 cp = (contrastBits >>> 8 & 0xff), +714 ct = (contrastBits >>> 16 & 0xff); +715 if((p - cp) * (p - cp) + (t - ct) * (t - ct) >= 0x10000) +716 return mainColor; +717 return ipt(ci < 128 ? i * (0.45f / 255f) + 0.55f : 0.5f - i * (0.45f / 255f), p / 255f, t / 255f, 0x1.0p-8f * (bits >>> 24)); +718 } +719 +720 /** +721 * Given a packed float IPT color {@code mainColor} and another IPT color that it should be made to contrast +722 * with, gets a packed float IPT color with I that should be quite different from {@code contrastingColor}'s I, +723 * but the same chromatic channels and opacity (A and B are likely to be clamped if the result gets close to white +724 * or black). This allows most of the colors this method produces to contrast well as a foreground when displayed on +725 * a background of {@code contrastingColor}, or vice versa. +726 * <br> +727 * This is similar to {@link #inverseLightness(float, float)}, but is considerably simpler, and this method will +728 * change the lightness of mainColor when the two given colors have close lightness but distant chroma. Because it +729 * averages the original I of mainColor with the modified one, this tends to not produce harsh color changes. +730 * @param mainColor a packed IPT float color; this is the color that will be adjusted +731 * @param contrastingColor a packed IPT float color; the adjusted mainColor will contrast with the I of this +732 * @return a different packed IPT float color, based on mainColor but typically with different lightness +733 */ +734 public static float differentiateLightness(final float mainColor, final float contrastingColor) +735 { +736 final int main = NumberUtils.floatToRawIntBits(mainColor), contrast = NumberUtils.floatToRawIntBits(contrastingColor); +737 return limitToGamut(NumberUtils.intBitsToFloat((main & 0xFEFFFF00) | (contrast + 128 & 0xFF) + (main & 0xFF) >>> 1)); +738 } +739 +740 /** +741 * Pretty simple; adds 0.5 to the given color's I and wraps it around if it would go above 1.0, then averages that +742 * with the original I. This means light colors become darker, and dark colors become lighter, with almost all +743 * results in the middle-range of possible lightness. +744 * @param mainColor a packed IPT float color +745 * @return a different packed IPT float color, with its I channel changed and limited to the correct gamut +746 */ +747 public static float offsetLightness(final float mainColor) { +748 final int decoded = NumberUtils.floatToRawIntBits(mainColor); +749 return limitToGamut(NumberUtils.intBitsToFloat((decoded & 0xFEFFFF00) | (decoded + 128 & 0xFF) + (decoded & 0xFF) >>> 1)); +750 } +751 +752 /** +753 * Makes the additive IPT color stored in {@code color} cause less of a change when used as a tint, as if it were +754 * mixed with neutral gray. When {@code fraction} is 1.0, this returns color unchanged; when fraction is 0.0, it +755 * returns {@link Palette#GRAY}, and when it is in-between 0.0 and 1.0 it returns something between the two. This is +756 * meant for things like area of effect abilities that make smaller color changes toward their periphery. +757 * @param color a color that should have its tinting effect potentially weakened +758 * @param fraction how much of {@code color} should be kept, from 0.0 to 1.0 +759 * @return an IPT float color between gray and {@code color} +760 */ +761 public static float lessenChange(final float color, float fraction) { +762 final int e = NumberUtils.floatToRawIntBits(color), +763 is = 0x80, ps = 0x80, ts = 0x80, as = 0xFE, +764 ie = (e & 0xFF), pe = (e >>> 8) & 0xFF, te = (e >>> 16) & 0xFF, ae = e >>> 24 & 0xFE; +765 return NumberUtils.intBitsToFloat(((int) (is + fraction * (ie - is)) & 0xFF) +766 | (((int) (ps + fraction * (pe - ps)) & 0xFF) << 8) +767 | (((int) (ts + fraction * (te - ts)) & 0xFF) << 16) +768 | (((int) (as + fraction * (ae - as)) & 0xFE) << 24)); +769 } +770 +771 /** +772 * Makes a quasi-randomly-edited variant on the given {@code color}, allowing typically a small amount of +773 * {@code variance} (such as 0.05 to 0.25) between the given color and what this can return. The {@code seed} should +774 * be different each time this is called, and can be obtained from a random number generator to make the colors more +775 * random, or can be incremented on each call. If the seed is only incremented or decremented, then this shouldn't +776 * produce two similar colors in a row unless variance is very small. The variance affects the I, P, and T of the +777 * generated color, and each of those channels can go up or down by the given variance as long as the total distance +778 * isn't greater than the variance (this considers P and T extra-wide, going from -1 to 1, while I goes from 0 to 1, +779 * but only internally for measuring distance). +780 * @param color a packed float color, as produced by {@link #ipt(float, float, float, float)} +781 * @param seed a long seed that should be different on each call; should not be 0 +782 * @param variance max amount of difference between the given color and the generated color; always less than 1 +783 * @return a generated packed float color that should be at least somewhat different from {@code color} +784 */ +785 public static float randomEdit(final float color, long seed, final float variance) { +786 final int decoded = NumberUtils.floatToRawIntBits(color); +787 final float i = (decoded & 0xff) / 255f; +788 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +789 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +790 final float limit = variance * variance; +791 float dist, x, y, z; +792 for (int j = 0; j < 50; j++) { +793 x = (((seed * 0xD1B54A32D192ED03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance; +794 y = (((seed * 0xABC98388FB8FAC03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance; +795 z = (((seed * 0x8CB92BA72F3D8DD7L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance; +796 seed += 0x9E3779B97F4A7C15L; +797 dist = x * x + y * y + z * z; +798 if(dist <= limit && inGamut(x += i, y = (p + y) * 0.5f + 0.5f, z = (t + z) * 0.5f + 0.5f)) +799 return NumberUtils.intBitsToFloat((decoded & 0xFE000000) | ((int)(z * 255.5f) << 16 & 0xFF0000) +800 | ((int)(y * 255.5f) << 8 & 0xFF00) | (int)(x * 255.5f)); +801 } +802 return color; +803 } +804 +805 /** +806 * Returns true if the given packed float color, as IPT, is valid to convert losslessly back to RGBA. +807 * @param packed a packed float color as IPT +808 * @return true if the given packed float color can be converted back and forth to RGBA +809 */ +810 public static boolean inGamut(final float packed) +811 { +812 final int decoded = NumberUtils.floatToRawIntBits(packed); +813 final float i = (decoded & 0xff) / 255f; +814 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +815 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +816 final float r = 0.999779f * i + 1.0709400f * p + 0.324891f * t; +817 if(r < -0.006f || r > 1.003f) return false; +818 final float g = 1.000150f * i - 0.3777440f * p + 0.220439f * t; +819 if(g < -0.006f || g > 1.003f) +820 return false; +821 final float b = 0.999769f * i + 0.0629496f * p - 0.809638f * t; +822 return (b >= -0.006f && b <= 1.003f); +823 } +824 /** +825 * Returns true if the given IPT values are valid to convert losslessly back to RGBA. +826 * @param i intensity channel, as a float from 0 to 1 +827 * @param p protan channel, as a float from 0 to 1 +828 * @param t tritan channel, as a float from 0 to 1 +829 * @return true if the given packed float color can be converted back and forth to RGBA +830 */ +831 public static boolean inGamut(float i, float p, float t) +832 { +833 p = (p - 0.5f) * 2f; +834 t = (t - 0.5f) * 2f; +835 final float r = 0.999779f * i + 1.0709400f * p + 0.324891f * t; +836 if(r < -0.006f || r > 1.003f) return false; +837 final float g = 1.000150f * i - 0.3777440f * p + 0.220439f * t; +838 if(g < -0.006f || g > 1.003f) +839 return false; +840 final float b = 0.999769f * i + 0.0629496f * p - 0.809638f * t; +841 return (b >= -0.006f && b <= 1.003f); +842 } +843 +844 /** +845 * Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it +846 * isn't in-gamut, or returns it as soon as it is in-gamut. +847 * @param packed a packed float color in IPT format; often this color is not in-gamut +848 * @return the first color this finds that is between the given IPT color and 50% gray, and is in-gamut +849 * @see #inGamut(float) You can use inGamut() if you just want to check whether a color is in-gamut. +850 */ +851 public static float limitToGamut(final float packed) { +852 final int decoded = NumberUtils.floatToRawIntBits(packed); +853 final float i = (decoded & 0xff) / 255f; +854 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +855 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +856 float p2 = p, t2 = t; +857 for (int attempt = 31; attempt >= 0; attempt--) { +858 final float r = 0.999779f * i + 1.0709400f * p2 + 0.324891f * t2; +859 final float g = 1.000150f * i - 0.3777440f * p2 + 0.220439f * t2; +860 final float b = 0.999769f * i + 0.0629496f * p2 - 0.809638f * t2; +861 if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f) +862 break; +863 final float progress = attempt * 0x1p-5f; +864 p2 = MathUtils.lerp(0, p, progress); +865 t2 = MathUtils.lerp(0, t, progress); +866 } +867 return ipt(i, p2 * 0.5f + 0.5f, t2 * 0.5f + 0.5f, (decoded >>> 25) / 127f); +868 } +869 +870 /** +871 * Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it +872 * isn't in-gamut, or returns it as soon as it is in-gamut. This always produces an opaque color. +873 * @param i intensity component; will be clamped between 0 and 1 if it isn't already +874 * @param p protan component; will be clamped between 0 and 1 if it isn't already +875 * @param t tritan component; will be clamped between 0 and 1 if it isn't already +876 * @return the first color this finds that is between the given IPT color and 50% gray, and is in-gamut +877 * @see #inGamut(float, float, float) You can use inGamut() if you just want to check whether a color is in-gamut. +878 */ +879 public static float limitToGamut(float i, float p, float t) { +880 return limitToGamut(i, p, t, 1f); +881 } +882 /** +883 * Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it +884 * isn't in-gamut, or returns it as soon as it is in-gamut. +885 * @param i intensity component; will be clamped between 0 and 1 if it isn't already +886 * @param p protan component; will be clamped between 0 and 1 if it isn't already +887 * @param t tritan component; will be clamped between 0 and 1 if it isn't already +888 * @param a alpha component; will be clamped between 0 and 1 if it isn't already +889 * @return the first color this finds that is between the given IPT color and 50% gray, and is in-gamut +890 * @see #inGamut(float, float, float) You can use inGamut() if you just want to check whether a color is in-gamut. +891 */ +892 public static float limitToGamut(float i, float p, float t, float a) { +893 float i2 = Math.min(Math.max(i, 0f), 1f); +894 float p2 = p = Math.min(Math.max((p - 0.5f) * 2f, -1f), 1f); +895 float t2 = t = Math.min(Math.max((t - 0.5f) * 2f, -1f), 1f); +896 a = Math.min(Math.max(a, 0f), 1f); +897 for (int attempt = 31; attempt >= 0; attempt--) { +898 final float r = 0.999779f * i2 + 1.0709400f * p2 + 0.324891f * t2; +899 final float g = 1.000150f * i2 - 0.3777440f * p2 + 0.220439f * t2; +900 final float b = 0.999769f * i2 + 0.0629496f * p2 - 0.809638f * t2; +901 if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f) +902 break; +903 final float progress = attempt * 0x1p-5f; +904 p2 = MathUtils.lerp(0, p, progress); +905 t2 = MathUtils.lerp(0, t, progress); +906 } +907 return ipt(i2, p2 * 0.5f + 0.5f, t2 * 0.5f + 0.5f, a); +908 } +909 +910 /** +911 * Given a packed float IPT color, this edits its intensity, protan, tritan, and alpha channels by adding the +912 * corresponding "add" parameter and then clamping. This returns a different float value (of course, the given float +913 * can't be edited in-place). You can give a value of 0 for any "add" parameter you want to stay unchanged. This +914 * clamps the resulting color to remain in-gamut, so it should be safe to convert it back to RGBA. +915 * @param encoded a packed float IPT color +916 * @param addI how much to add to the intensity channel; typically in the -1 to 1 range +917 * @param addP how much to add to the protan channel; typically in the -2 to 2 range +918 * @param addT how much to add to the tritan channel; typically in the -2 to 2 range +919 * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range +920 * @return a packed float IPT color with the requested edits applied to {@code encoded} +921 */ +922 public static float editIPT(float encoded, float addI, float addP, float addT, float addAlpha) { +923 return editIPT(encoded, addI, addP, addT, addAlpha, 1f, 1f, 1f, 1f); +924 } +925 /** +926 * Given a packed float IPT color, this edits its intensity, protan, tritan, and alpha channels by first +927 * multiplying each channel by the corresponding "mul" parameter and then adding the corresponding "add" parameter, +928 * before clamping. This means the intensity value is multiplied by {@code mulI}, then has {@code addI} added, and +929 * then is clamped to the normal range for intensity (0 to 1). This returns a different float value (of course, the +930 * given float can't be edited in-place). You can give a value of 0 for any "add" parameter you want to stay +931 * unchanged, or a value of 1 for any "mul" parameter that shouldn't change. Note that this manipulates protan and +932 * tritan in the -1 to 1 range, so if you multiply by a small number like {@code 0.25f}, then this will produce a +933 * less-saturated color, and if you multiply by a larger number like {@code 4f}, then you will get a much +934 * more-saturated color. This clamps the resulting color to remain in-gamut, so it should be safe to convert it back +935 * to RGBA. +936 * @param encoded a packed float IPT color +937 * @param addI how much to add to the intensity channel; typically in the -1 to 1 range +938 * @param addP how much to add to the protan channel; typically in the -2 to 2 range +939 * @param addT how much to add to the tritan channel; typically in the -2 to 2 range +940 * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range +941 * @param mulI how much to multiply the intensity channel by; should be non-negative +942 * @param mulP how much to multiply the protan channel by; usually non-negative (not always) +943 * @param mulT how much to multiply the tritan channel by; usually non-negative (not always) +944 * @param mulAlpha how much to multiply the alpha channel by; should be non-negative +945 * @return a packed float IPT color with the requested edits applied to {@code encoded} +946 */ +947 public static float editIPT(float encoded, float addI, float addP, float addT, float addAlpha, +948 float mulI, float mulP, float mulT, float mulAlpha) { +949 final int decoded = NumberUtils.floatToRawIntBits(encoded); +950 float i = (decoded & 0xff) / 255f; +951 float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +952 float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +953 float alpha = (decoded >>> 25) / 127f; +954 +955 float i2 = Math.min(Math.max(i * mulI + addI, 0f), 1f); +956 float p2 = p = Math.min(Math.max(p * mulP + addP, -1f), 1f); +957 float t2 = t = Math.min(Math.max(t * mulT + addT, -1f), 1f); +958 alpha = Math.min(Math.max(alpha * mulAlpha + addAlpha, 0f), 1f); +959 for (int attempt = 31; attempt >= 0; attempt--) { +960 final float r = 0.999779f * i2 + 1.0709400f * p2 + 0.324891f * t2; +961 final float g = 1.000150f * i2 - 0.3777440f * p2 + 0.220439f * t2; +962 final float b = 0.999769f * i2 + 0.0629496f * p2 - 0.809638f * t2; +963 if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f) +964 break; +965 final float progress = attempt * 0x1p-5f; +966 p2 = MathUtils.lerp(0, p, progress); +967 t2 = MathUtils.lerp(0, t, progress); +968 } +969 return ipt(i2, p2 * 0.5f + 0.5f, t2 * 0.5f + 0.5f, alpha); +970 } +971 +972 /** +973 * Converts from a packed float in HSI format to a packed float in IPT format. +974 * @param packed a packed float in HSI format +975 * @return a packed float in IPT format +976 */ +977 public static float fromHSI(float packed){ +978 final int decoded = NumberUtils.floatToRawIntBits(packed); +979 final float h = (decoded & 0xff) / 255f; +980 final float s = (decoded >>> 8 & 0xff) / 255f; +981 final float i = (decoded >>> 16 & 0xff) / 255f; +982 final float y = TrigTools.cos_(h) * s, z = TrigTools.sin_(h) * s; +983 final float crMid = 0.3481738f * y + 0.104959644f * z; +984 final float crScale = (i - 0.5f + (NumberUtils.floatToRawIntBits(crMid) >>> 31)) * 0.16420607f / -crMid; +985 final float mgMid = 0.122068435f * y + -0.070396f * z; +986 final float mgScale = (i + 0.5f - (NumberUtils.floatToRawIntBits(mgMid) >>> 31)) * -0.16136102f / -mgMid; +987 final float ybMid = 0.020876605f * y + -0.26078433f * z; +988 final float ybScale = (i - 0.5f + (NumberUtils.floatToRawIntBits(ybMid) >>> 31)) * 0.16155326f / -ybMid; +989 final float scale = Math.max(crScale, Math.max(mgScale, ybScale)); +990 final float d = 4f * s * scale / (MathUtils.sin(3.14159f * i) + 0.000001f); +991 +992 final float p = y * d; +993 final float t = z * d; +994 return NumberUtils.intBitsToFloat((decoded & 0xFE000000) | ((int) (t * 255) << 16 & 0xFF0000) +995 | ((int) (p * 255) << 8 & 0xFF00) | (decoded >>> 16 & 0xFF)); +996 } +997 +998 /** +999 * Converts from hue, saturation, intensity, and alpha components (each ranging from 0 to 1 inclusive) to a packed +1000 * float color in IPT format. +1001 * @param hue hue, from 0 to 1 inclusive; 0 is red, 0.25 is yellow, 0.75 is blue +1002 * @param saturation saturation from 0 (grayscale) to a limit between 0 and 1 depending on intensity (it can be 1 only when intensity is 0.5) +1003 * @param intensity intensity, or lightness, from 0 (black) to 1 (white) +1004 * @param alpha alpha transparency/opacity, from 0 (fully transparent) to 1 (fully opaque) +1005 * @return a packed float in IPT format +1006 */ +1007 public static float fromHSI(float hue, float saturation, float intensity, float alpha){ +1008 final float y = TrigTools.cos_(hue) * saturation, z = TrigTools.sin_(hue) * saturation; +1009 final float crMid = 0.3481738f * y + 0.104959644f * z; +1010 final float crScale = (intensity - 0.5f + (NumberUtils.floatToRawIntBits(crMid) >>> 31)) * 0.16420607f / -crMid; +1011 final float mgMid = 0.122068435f * y + -0.070396f * z; +1012 final float mgScale = (intensity + 0.5f - (NumberUtils.floatToRawIntBits(mgMid) >>> 31)) * -0.16136102f / -mgMid; +1013 final float ybMid = 0.020876605f * y + -0.26078433f * z; +1014 final float ybScale = (intensity - 0.5f + (NumberUtils.floatToRawIntBits(ybMid) >>> 31)) * 0.16155326f / -ybMid; +1015 final float scale = Math.max(crScale, Math.max(mgScale, ybScale)); +1016 final float d = 4f * saturation * scale / (MathUtils.sin(3.14159f * intensity) + 0.000001f); +1017 +1018 final float p = y * d; +1019 final float t = z * d; +1020 return NumberUtils.intBitsToFloat(((int)(alpha * 255) << 24 & 0xFE000000) | ((int) (t * 255) << 16 & 0xFF0000) +1021 | ((int) (p * 255) << 8 & 0xFF00) | ((int) (intensity * 255) & 0xFF)); +1022 } +1023 +1024 /** +1025 * Produces a random packed float color that is always in-gamut and should be uniformly distributed. +1026 * @param random a Random object (or preferably a subclass of Random, like {@link com.badlogic.gdx.math.RandomXS128}) +1027 * @return a packed float color that is always in-gamut +1028 */ +1029 public static float randomColor(Random random) { +1030 final float ir = 0.1882353f, pr = 0.83137256f - 0.5f, tr = 0.6431373f - 0.5f; +1031 final float ig = 0.5764706f, pg = 0.12941177f - 0.5f, tg = 0.827451f - 0.5f; +1032 final float ib = 0.23137255f, pb = 0.53333336f - 0.5f, tb = 0.02745098f - 0.5f; +1033 final float r = random.nextFloat(), g = random.nextFloat(), b = random.nextFloat(); +1034 return NumberUtils.intBitsToFloat(0xFE000000 +1035 | ((int) ((tr * r + tg * g + tb * b) * 128f + 128f) << 16 & 0xFF0000) +1036 | ((int) ((pr * r + pg * g + pb * b) * 128f + 128f) << 8 & 0xFF00) +1037 | ((int) ((ir * r + ig * g + ib * b) * 256f) & 0xFF)); +1038 } +1039 /** +1040 * Limited-use; like {@link #randomColor(Random)} but for cases where you already have three floats (r, g, and b) +1041 * distributed how you want. This can be somewhat useful if you are using a "subrandom" or "quasi-random" sequence, +1042 * like the Halton, Sobol, or R3 sequences, to get 3D points and map them to colors. It can also be useful if you +1043 * want to randomly generate the RGB channels yourself and track the values produced, as you would if you wanted to +1044 * avoid generating too many colors with high blue, for instance. This approximately maps the r, g, and b parameters +1045 * to distances on the RGB axes of a rectangular prism, which is stretched and rotated to form the IPT gamut. +1046 * @param r red value to use; will be clamped between 0 and 1 +1047 * @param g green value to use; will be clamped between 0 and 1 +1048 * @param b blue value to use; will be clamped between 0 and 1 +1049 * @return a packed float color that is always opaque +1050 */ +1051 public static float subrandomColor(float r, float g, float b) { +1052 r = Math.min(Math.max(r, 0f), 0.999f); +1053 g = Math.min(Math.max(g, 0f), 0.999f); +1054 b = Math.min(Math.max(b, 0f), 0.999f); +1055 final float ir = 0.1882353f, pr = 0.83137256f - 0.5f, tr = 0.6431373f - 0.5f; +1056 final float ig = 0.5764706f, pg = 0.12941177f - 0.5f, tg = 0.827451f - 0.5f; +1057 final float ib = 0.23137255f, pb = 0.53333336f - 0.5f, tb = 0.02745098f - 0.5f; +1058 return NumberUtils.intBitsToFloat(0xFE000000 +1059 | ((int) ((tr * r + tg * g + tb * b) * 127.5f + 127.5f) << 16 & 0xFF0000) +1060 | ((int) ((pr * r + pg * g + pb * b) * 127.5f + 127.5f) << 8 & 0xFF00) +1061 | ((int) ((ir * r + ig * g + ib * b) * 255f) & 0xFF)); +1062 } +1063} diff --git a/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/ipt_hq/ColorTools.html b/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/ipt_hq/ColorTools.html index 036eb5cf..72a8997b 100644 --- a/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/ipt_hq/ColorTools.html +++ b/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/ipt_hq/ColorTools.html @@ -167,873 +167,954 @@ 154 } 155 156 /** -157 * Takes a color encoded as an RGBA8888 int and converts to a packed float in the IPT format this uses. -158 * @param rgba an int with the channels (in order) red, green, blue, alpha; should have 8 bits per channel -159 * @return a packed float as IPT, which this class can use -160 */ -161 public static float fromRGBA8888(final int rgba) { -162 final float r = forwardGamma((rgba >>> 24) * 0x1.010101010101p-8f); -163 final float g = forwardGamma((rgba >>> 16 & 0xFF) * 0x1.010101010101p-8f); -164 final float b = forwardGamma((rgba >>> 8 & 0xFF) * 0x1.010101010101p-8f); -165 final float l = forwardTransform(0.313921f * r + 0.639468f * g + 0.0465970f * b); -166 final float m = forwardTransform(0.151693f * r + 0.748209f * g + 0.1000044f * b); -167 final float s = forwardTransform(0.017753f * r + 0.109468f * g + 0.8729690f * b); -168 return NumberUtils.intBitsToFloat( -169 Math.min(Math.max((int)((0.4000f * l + 0.4000f * m + 0.2000f * s ) * 255.999f), 0), 255) -170 | Math.min(Math.max((int)((2.2275f * l - 2.4255f * m + 0.1980f * s + 0.5f) * 255.999f), 0), 255) << 8 -171 | Math.min(Math.max((int)((0.4028f * l + 0.1786f * m - 0.5814f * s + 0.5f) * 255.999f), 0), 255) << 16 -172 | (rgba & 0xFE) << 24); -173 } -174 -175 /** -176 * Takes a color encoded as an RGBA8888 packed float and converts to a packed float in the IPT format this uses. -177 * @param packed a packed float in RGBA8888 format, with A in the MSB and R in the LSB -178 * @return a packed float as IPT, which this class can use -179 */ -180 public static float fromRGBA(final float packed) { -181 final int abgr = NumberUtils.floatToRawIntBits(packed); -182 final float r = forwardGamma((abgr & 0xFF) * 0x1.010101010101p-8f); -183 final float g = forwardGamma((abgr >>> 8 & 0xFF) * 0x1.010101010101p-8f); -184 final float b = forwardGamma((abgr >>> 16 & 0xFF) * 0x1.010101010101p-8f); -185 final float l = forwardTransform(0.313921f * r + 0.639468f * g + 0.0465970f * b); -186 final float m = forwardTransform(0.151693f * r + 0.748209f * g + 0.1000044f * b); -187 final float s = forwardTransform(0.017753f * r + 0.109468f * g + 0.8729690f * b); -188 return NumberUtils.intBitsToFloat( -189 Math.min(Math.max((int)((0.4000f * l + 0.4000f * m + 0.2000f * s ) * 255.999f), 0), 255) -190 | Math.min(Math.max((int)((2.2275f * l - 2.4255f * m + 0.1980f * s + 0.5f) * 255.999f), 0), 255) << 8 -191 | Math.min(Math.max((int)((0.4028f * l + 0.1786f * m - 0.5814f * s + 0.5f) * 255.999f), 0), 255) << 16 -192 | (abgr & 0xFE000000)); -193 } -194 -195 /** -196 * Takes a libGDX Color that uses RGBA8888 channels and converts to a packed float in the IPT format this uses. -197 * @param color a libGDX RGBA8888 Color -198 * @return a packed float as IPT, which this class can use -199 */ -200 public static float fromColor(final Color color) { -201 final float r = forwardGamma(color.r); -202 final float g = forwardGamma(color.g); -203 final float b = forwardGamma(color.b); -204 final float l = forwardTransform(0.313921f * r + 0.639468f * g + 0.0465970f * b); -205 final float m = forwardTransform(0.151693f * r + 0.748209f * g + 0.1000044f * b); -206 final float s = forwardTransform(0.017753f * r + 0.109468f * g + 0.8729690f * b); -207 return NumberUtils.intBitsToFloat( -208 Math.min(Math.max((int)((0.4000f * l + 0.4000f * m + 0.2000f * s ) * 255.999f), 0), 255) -209 | Math.min(Math.max((int)((2.2275f * l - 2.4255f * m + 0.1980f * s + 0.5f) * 255.999f), 0), 255) << 8 -210 | Math.min(Math.max((int)((0.4028f * l + 0.1786f * m - 0.5814f * s + 0.5f) * 255.999f), 0), 255) << 16 -211 | ((int)(color.a * 255f) << 24 & 0xFE000000)); -212 } -213 -214 /** -215 * Takes RGBA components from 0.0 to 1.0 each and converts to a packed float in the IPT format this uses. -216 * @param r red, from 0.0 to 1.0 (both inclusive) -217 * @param g green, from 0.0 to 1.0 (both inclusive) -218 * @param b blue, from 0.0 to 1.0 (both inclusive) -219 * @param a alpha, from 0.0 to 1.0 (both inclusive) -220 * @return a packed float as IPT, which this class can use -221 */ -222 public static float fromRGBA(float r, float g, float b, final float a) { -223 r = forwardGamma(r); -224 g = forwardGamma(g); -225 b = forwardGamma(b); -226 final float l = forwardTransform(0.313921f * r + 0.639468f * g + 0.0465970f * b); -227 final float m = forwardTransform(0.151693f * r + 0.748209f * g + 0.1000044f * b); -228 final float s = forwardTransform(0.017753f * r + 0.109468f * g + 0.8729690f * b); -229 return NumberUtils.intBitsToFloat( -230 Math.min(Math.max((int)((0.4000f * l + 0.4000f * m + 0.2000f * s ) * 255.999f), 0), 255) -231 | Math.min(Math.max((int)((2.2275f * l - 2.4255f * m + 0.1980f * s + 0.5f) * 255.999f), 0), 255) << 8 -232 | Math.min(Math.max((int)((0.4028f * l + 0.1786f * m - 0.5814f * s + 0.5f) * 255.999f), 0), 255) << 16 -233 | ((int)(a * 255f) << 24 & 0xFE000000)); -234 } -235 -236 /** -237 * Gets the red channel value of the given encoded color, as an int ranging from 0 to 255, inclusive. -238 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} -239 * @return an int from 0 to 255, inclusive, representing the red channel value of the given encoded color -240 */ -241 public static int redInt(final float encoded) -242 { -243 final int decoded = NumberUtils.floatToRawIntBits(encoded); -244 final float i = (decoded & 0xff) / 255f; -245 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -246 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -247 final float l = reverseTransform(i + 0.097569f * p + 0.205226f * t); -248 final float m = reverseTransform(i + -0.11388f * p + 0.133217f * t); -249 final float s = reverseTransform(i + 0.032615f * p + -0.67689f * t); -250 return (int)(reverseGamma(Math.min(Math.max(5.432622f * l + -4.67910f * m + 0.246257f * s, 0f), 1f)) * 255.999f); -251 } -252 -253 /** -254 * Gets the green channel value of the given encoded color, as an int ranging from 0 to 255, inclusive. -255 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} -256 * @return an int from 0 to 255, inclusive, representing the green channel value of the given encoded color -257 */ -258 public static int greenInt(final float encoded) -259 { -260 final int decoded = NumberUtils.floatToRawIntBits(encoded); -261 final float i = (decoded & 0xff) / 255f; -262 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -263 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -264 final float l = reverseTransform(i + 0.097569f * p + 0.205226f * t); -265 final float m = reverseTransform(i + -0.11388f * p + 0.133217f * t); -266 final float s = reverseTransform(i + 0.032615f * p + -0.67689f * t); -267 return (int)(reverseGamma(Math.min(Math.max(-1.10517f * l + 2.311198f * m + -0.20588f * s, 0f), 1f)) * 255.999f); -268 } -269 -270 /** -271 * Gets the blue channel value of the given encoded color, as an int ranging from 0 to 255, inclusive. -272 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} -273 * @return an int from 0 to 255, inclusive, representing the blue channel value of the given encoded color -274 */ -275 public static int blueInt(final float encoded) -276 { -277 final int decoded = NumberUtils.floatToRawIntBits(encoded); -278 final float i = (decoded & 0xff) / 255f; -279 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -280 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -281 final float l = reverseTransform(i + 0.097569f * p + 0.205226f * t); -282 final float m = reverseTransform(i + -0.11388f * p + 0.133217f * t); -283 final float s = reverseTransform(i + 0.032615f * p + -0.67689f * t); -284 return (int)(reverseGamma(Math.min(Math.max(0.028104f * l + -0.19466f * m + 1.166325f * s, 0f), 1f)) * 255.999f); -285 } -286 -287 /** -288 * Gets the alpha channel value of the given encoded color, as an even int ranging from 0 to 254, inclusive. Because -289 * of how alpha is stored in libGDX, no odd-number values are possible for alpha. -290 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} -291 * @return an even int from 0 to 254, inclusive, representing the alpha channel value of the given encoded color -292 */ -293 public static int alphaInt(final float encoded) -294 { -295 return (NumberUtils.floatToRawIntBits(encoded) & 0xfe000000) >>> 24; -296 } -297 -298 /** -299 * Gets the red channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive. -300 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} -301 * @return a float from 0.0f to 1.0f, inclusive, representing the red channel value of the given encoded color -302 */ -303 public static float red(final float encoded) -304 { -305 final int decoded = NumberUtils.floatToRawIntBits(encoded); -306 final float i = (decoded & 0xff) / 255f; -307 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -308 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -309 final float l = reverseTransform(i + 0.097569f * p + 0.205226f * t); -310 final float m = reverseTransform(i + -0.11388f * p + 0.133217f * t); -311 final float s = reverseTransform(i + 0.032615f * p + -0.67689f * t); -312 return reverseGamma(Math.min(Math.max(5.432622f * l + -4.67910f * m + 0.246257f * s, 0f), 1f)); -313 } -314 -315 /** -316 * Gets the green channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive. -317 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} -318 * @return a float from 0.0f to 1.0f, inclusive, representing the green channel value of the given encoded color -319 */ -320 public static float green(final float encoded) -321 { -322 final int decoded = NumberUtils.floatToRawIntBits(encoded); -323 final float i = (decoded & 0xff) / 255f; -324 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -325 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -326 final float l = reverseTransform(i + 0.097569f * p + 0.205226f * t); -327 final float m = reverseTransform(i + -0.11388f * p + 0.133217f * t); -328 final float s = reverseTransform(i + 0.032615f * p + -0.67689f * t); -329 return reverseGamma(Math.min(Math.max(-1.10517f * l + 2.311198f * m + -0.20588f * s, 0f), 1f)); -330 } -331 -332 /** -333 * Gets the blue channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive. -334 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} -335 * @return a float from 0.0f to 1.0f, inclusive, representing the blue channel value of the given encoded color -336 */ -337 public static float blue(final float encoded) -338 { -339 final int decoded = NumberUtils.floatToRawIntBits(encoded); -340 final float i = (decoded & 0xff) / 255f; -341 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -342 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -343 final float l = reverseTransform(i + 0.097569f * p + 0.205226f * t); -344 final float m = reverseTransform(i + -0.11388f * p + 0.133217f * t); -345 final float s = reverseTransform(i + 0.032615f * p + -0.67689f * t); -346 return reverseGamma(Math.min(Math.max(0.028104f * l + -0.19466f * m + 1.166325f * s, 0f), 1f)); -347 } -348 -349 /** -350 * Gets the alpha channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive. -351 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} -352 * @return a float from 0.0f to 1.0f, inclusive, representing the alpha channel value of the given encoded color -353 */ -354 public static float alpha(final float encoded) -355 { -356 return ((NumberUtils.floatToRawIntBits(encoded) & 0xfe000000) >>> 24) * 0x1.020408p-8f; -357 } -358 -359 /** -360 * Gets a color as an IPT packed float given floats representing hue, saturation, lightness, and opacity. -361 * All parameters should normally be between 0 and 1 inclusive, though any hue is tolerated (precision loss may -362 * affect the color if the hue is too large). A hue of 0 is red, progressively higher hue values go to orange, -363 * yellow, green, blue, and purple before wrapping around to red as it approaches 1. A saturation of 0 is grayscale, -364 * a saturation of 1 is brightly colored, and values close to 1 will usually appear more distinct than values close -365 * to 0, especially if the hue is different. A lightness of 0.001f or less is always black (also using a shortcut if -366 * this is the case, respecting opacity), while a lightness of 1f is white. Very bright colors are mostly in a band -367 * of high-saturation where lightness is 0.5f. -368 * -369 * @param hue 0f to 1f, color wheel position -370 * @param saturation 0f to 1f, 0f is grayscale and 1f is brightly colored -371 * @param lightness 0f to 1f, 0f is black and 1f is white -372 * @param opacity 0f to 1f, 0f is fully transparent and 1f is opaque -373 * @return a float encoding a color with the given properties -374 */ -375 public static float floatGetHSL(float hue, float saturation, float lightness, float opacity) { -376 if (lightness <= 0.001f) { -377 return NumberUtils.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x7F7F00); -378 } else { -379 return fromRGBA(FloatColors.hsl2rgb(hue, saturation, lightness, opacity)); -380 } -381 } -382 -383 /** -384 * Gets the saturation of the given encoded color, as a float ranging from 0.0f to 1.0f, inclusive. -385 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} -386 * @return the saturation of the color from 0.0 (a grayscale color; inclusive) to 1.0 (a bright color, inclusive) -387 */ -388 public static float saturation(final float encoded) { -389 final int decoded = NumberUtils.floatToRawIntBits(encoded); -390 final float i = (decoded & 0xff) / 255f; -391 if(Math.abs(i - 0.5) > 0.495f) return 0f; -392 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -393 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -394 final float l = reverseTransform(i + 0.097569f * p + 0.205226f * t); -395 final float m = reverseTransform(i + -0.11388f * p + 0.133217f * t); -396 final float s = reverseTransform(i + 0.032615f * p + -0.67689f * t); -397 final float r = reverseGamma(Math.min(Math.max(5.432622f * l + -4.67910f * m + 0.246257f * s, 0f), 1f)); -398 final float g = reverseGamma(Math.min(Math.max(-1.10517f * l + 2.311198f * m + -0.20588f * s, 0f), 1f)); -399 final float b = reverseGamma(Math.min(Math.max(0.028104f * l + -0.19466f * m + 1.166325f * s, 0f), 1f)); -400 float x, y, w; -401 if(g < b) { -402 x = b; -403 y = g; -404 } -405 else { -406 x = g; -407 y = b; -408 } -409 if(r < x) { -410 w = r; -411 } -412 else { -413 w = x; -414 x = r; -415 } -416 return x - Math.min(w, y); -417// float d = x - Math.min(w, y); -418// float li = x * (1f - 0.5f * d / (x + 1e-10f)); -419// return (x - li); // (Math.min(li, 1f - li) + 1e-10f); -420 } -421 -422 public static float lightness(final float encoded) { -423 final int decoded = NumberUtils.floatToRawIntBits(encoded); -424 final float i = (decoded & 0xff) / 255f; -425 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -426 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -427 final float l = reverseTransform(i + 0.097569f * p + 0.205226f * t); -428 final float m = reverseTransform(i + -0.11388f * p + 0.133217f * t); -429 final float s = reverseTransform(i + 0.032615f * p + -0.67689f * t); -430 final float r = reverseGamma(Math.min(Math.max(5.432622f * l + -4.67910f * m + 0.246257f * s, 0f), 1f)); -431 final float g = reverseGamma(Math.min(Math.max(-1.10517f * l + 2.311198f * m + -0.20588f * s, 0f), 1f)); -432 final float b = reverseGamma(Math.min(Math.max(0.028104f * l + -0.19466f * m + 1.166325f * s, 0f), 1f)); -433 -434 float x, y, w; -435 if(g < b) { -436 x = b; -437 y = g; -438 } -439 else { -440 x = g; -441 y = b; -442 } -443 if(r < x) { -444 w = r; -445 } -446 else { -447 w = x; -448 x = r; -449 } -450 float d = x - Math.min(w, y); -451 return x * (1f - 0.5f * d / (x + 1e-10f)); -452 } -453 -454 /** -455 * Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased) -456 * to 1f (exclusive, red and approaching purple if decreased). -457 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} -458 * @return The hue of the color from 0.0 (red, inclusive) towards orange, then yellow, and -459 * eventually to purple before looping back to almost the same red (1.0, exclusive) -460 */ -461 public static float hue(final float encoded) { -462 final int decoded = NumberUtils.floatToRawIntBits(encoded); -463 final float i = (decoded & 0xff) / 255f; -464 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -465 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -466 final float l = reverseTransform(i + 0.097569f * p + 0.205226f * t); -467 final float m = reverseTransform(i + -0.11388f * p + 0.133217f * t); -468 final float s = reverseTransform(i + 0.032615f * p + -0.67689f * t); -469 final float r = reverseGamma(Math.min(Math.max(5.432622f * l + -4.67910f * m + 0.246257f * s, 0f), 1f)); -470 final float g = reverseGamma(Math.min(Math.max(-1.10517f * l + 2.311198f * m + -0.20588f * s, 0f), 1f)); -471 final float b = reverseGamma(Math.min(Math.max(0.028104f * l + -0.19466f * m + 1.166325f * s, 0f), 1f)); -472 float x, y, z, w; -473 if(g < b) { -474 x = b; -475 y = g; -476 z = -1f; -477 w = 2f / 3f; -478 } -479 else { -480 x = g; -481 y = b; -482 z = 0f; -483 w = -1f / 3f; -484 } -485 if(r < x) { -486 z = w; -487 w = r; -488 } -489 else { -490 w = x; -491 x = r; -492 } -493 float d = x - Math.min(w, y); -494 return Math.abs(z + (w - y) / (6f * d + 1e-10f)); -495 } -496 -497 /** -498 * The "intensity" of the given packed float in IPT format, which is like its lightness; ranges from 0.0f to -499 * 1.0f . You can edit the intensity of a color with {@link #lighten(float, float)} and -500 * {@link #darken(float, float)}. -501 * -502 * @param encoded a color encoded as a packed float, as by {@link #ipt(float, float, float, float)} -503 * @return the intensity value as a float from 0.0f to 1.0f -504 */ -505 public static float intensity(final float encoded) -506 { -507 return (NumberUtils.floatToRawIntBits(encoded) & 0xff) / 255f; -508 } -509 -510 /** -511 * The "protan" of the given packed float in IPT format, which when combined with tritan describes the -512 * hue and saturation of a color; ranges from 0f to 1f . If protan is 0f, the color will be cooler, more green or -513 * blue; if protan is 1f, the color will be warmer, from magenta to orange. You can edit the protan of a color with -514 * {@link #protanUp(float, float)} and {@link #protanDown(float, float)}. -515 * @param encoded a color encoded as a packed float, as by {@link #ipt(float, float, float, float)} -516 * @return the protan value as a float from 0.0f to 1.0f -517 */ -518 public static float protan(final float encoded) -519 { -520 return ((NumberUtils.floatToRawIntBits(encoded) >>> 8 & 0xff)) / 255f; -521 } -522 -523 /** -524 * The "tritan" of the given packed float in IPT format, which when combined with protan describes the -525 * hue and saturation of a color; ranges from 0f to 1f . If tritan is 0f, the color will be more "artificial", more -526 * blue or purple; if tritan is 1f, the color will be more "natural", from green to yellow to orange. You can edit -527 * the tritan of a color with {@link #tritanUp(float, float)} and {@link #tritanDown(float, float)}. -528 * @param encoded a color encoded as a packed float, as by {@link #ipt(float, float, float, float)} -529 * @return the tritan value as a float from 0.0f to 1.0f -530 */ -531 public static float tritan(final float encoded) -532 { -533 return ((NumberUtils.floatToRawIntBits(encoded) >>> 16 & 0xff)) / 255f; -534 } -535 -536 /** -537 * Gets a variation on the packed float color basis as another packed float that has its hue, saturation, lightness, -538 * and opacity adjusted by the specified amounts. Note that this edits the color in HSL space, not IPT_HQ! Takes -539 * floats representing the amounts of change to apply to hue, saturation, lightness, and opacity; these can be -540 * between -1f and 1f. Returns a float that can be used as a packed or encoded color with methods like -541 * {@link com.badlogic.gdx.graphics.g2d.Batch#setPackedColor(float)}. The float is likely to be different than the -542 * result of {@link #ipt(float, float, float, float)} unless hue, saturation, lightness, and opacity are all 0. -543 * This won't allocate any objects. -544 * <br> -545 * The parameters this takes all specify additive changes for a color component, clamping the final values so they -546 * can't go above 1 or below 0, with an exception for hue, which can rotate around if lower or higher hues would be -547 * used. As an example, if you give this 0.4f for saturation, and the current color has saturation 0.7f, then the -548 * resulting color will have 1f for saturation. If you gave this -0.1f for saturation and the current color again -549 * has saturation 0.7f, then resulting color will have 0.6f for saturation. -550 * -551 * @param basis a packed float color that will be used as the starting point to make the next color -552 * @param hue -1f to 1f, the hue change that can be applied to the new float color (not clamped, wraps) -553 * @param saturation -1f to 1f, the saturation change that can be applied to the new float color -554 * @param light -1f to 1f, the light/brightness change that can be applied to the new float color -555 * @param opacity -1f to 1f, the opacity/alpha change that can be applied to the new float color -556 * @return a float encoding a variation of basis with the given changes -557 */ -558 public static float toEditedFloat(float basis, float hue, float saturation, float light, float opacity) { -559 final int e = NumberUtils.floatToRawIntBits(basis); -560 final float i = Math.min(Math.max(light + (e & 0xff) / 255f, 0f), 1f); -561 opacity = Math.min(Math.max(opacity + (e >>> 24 & 0xfe) * 0x1.020408p-8f, 0f), 1f); -562 if (i <= 0.001f) -563 return NumberUtils.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x808000); -564 final float p = ((e >>> 7 & 0x1fe) - 0xff) / 255f; -565 final float t = ((e >>> 15 & 0x1fe) - 0xff) / 255f; -566 final float l = reverseTransform(i + 0.097569f * p + 0.205226f * t); -567 final float m = reverseTransform(i + -0.11388f * p + 0.133217f * t); -568 final float s = reverseTransform(i + 0.032615f * p + -0.67689f * t); -569 final float r = reverseGamma(Math.min(Math.max(5.432622f * l + -4.67910f * m + 0.246257f * s, 0f), 1f)); -570 final float g = reverseGamma(Math.min(Math.max(-1.10517f * l + 2.311198f * m + -0.20588f * s, 0f), 1f)); -571 final float b = reverseGamma(Math.min(Math.max(0.028104f * l + -0.19466f * m + 1.166325f * s, 0f), 1f)); -572 float x, y, z, w; -573 if(g < b) { -574 x = b; -575 y = g; -576 z = -1f; -577 w = 2f / 3f; -578 } -579 else { -580 x = g; -581 y = b; -582 z = 0f; -583 w = -1f / 3f; -584 } -585 if(r < x) { -586 z = w; -587 w = r; -588 } -589 else { -590 w = x; -591 x = r; -592 } -593 final float d = x - Math.min(w, y); -594 final float lum = x * (1f - 0.5f * d / (x + 1e-10f)); -595 hue += Math.abs(z + (w - y) / (6f * d + 1e-10f)) + 1f; -596 saturation += (x - lum) / (Math.min(lum, 1f - lum) + 1e-10f); -597 return fromRGBA(FloatColors.hsl2rgb(hue - (int)hue, Math.min(Math.max(saturation, 0f), 1f), lum, opacity)); -598 } -599 -600 /** -601 * Interpolates from the packed float color start towards white by change. While change should be between 0f (return -602 * start as-is) and 1f (return white), start should be a packed color, as from -603 * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and -604 * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards -605 * white. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is. -606 * @see #darken(float, float) the counterpart method that darkens a float color -607 * @param start the starting color as a packed float -608 * @param change how much to go from start toward white, as a float between 0 and 1; higher means closer to white -609 * @return a packed float that represents a color between start and white -610 */ -611 public static float lighten(final float start, final float change) { -612 final int s = NumberUtils.floatToRawIntBits(start), i = s & 0xFF, other = s & 0xFEFFFF00; -613 return NumberUtils.intBitsToFloat(((int) (i + (0xFF - i) * change) & 0xFF) | other); -614 } -615 -616 /** -617 * Interpolates from the packed float color start towards black by change. While change should be between 0f (return -618 * start as-is) and 1f (return black), start should be a packed color, as from -619 * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and -620 * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards -621 * black. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is. -622 * @see #lighten(float, float) the counterpart method that lightens a float color -623 * @param start the starting color as a packed float -624 * @param change how much to go from start toward black, as a float between 0 and 1; higher means closer to black -625 * @return a packed float that represents a color between start and black -626 */ -627 public static float darken(final float start, final float change) { -628 final int s = NumberUtils.floatToRawIntBits(start), i = s & 0xFF, other = s & 0xFEFFFF00; -629 return NumberUtils.intBitsToFloat(((int) (i * (1f - change)) & 0xFF) | other); -630 } -631 -632 /** -633 * Interpolates from the packed float color start towards a warmer color (orange to magenta) by change. While change -634 * should be between 0f (return start as-is) and 1f (return fully warmed), start should be a packed color, as from -635 * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, -636 * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to -637 * lerp towards a warmer color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the -638 * alpha and intensity of start as-is. -639 * @see #protanDown(float, float) the counterpart method that cools a float color -640 * @param start the starting color as a packed float -641 * @param change how much to warm start, as a float between 0 and 1; higher means a warmer result -642 * @return a packed float that represents a color between start and a warmer color -643 */ -644 public static float protanUp(final float start, final float change) { -645 final int s = NumberUtils.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF; -646 return NumberUtils.intBitsToFloat(((int) (p + (0xFF - p) * change) << 8 & 0xFF00) | other); -647 } -648 -649 /** -650 * Interpolates from the packed float color start towards a cooler color (green to blue) by change. While change -651 * should be between 0f (return start as-is) and 1f (return fully cooled), start should be a packed color, as from -652 * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and -653 * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp -654 * towards a cooler color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and -655 * intensity of start as-is. -656 * @see #protanUp(float, float) the counterpart method that warms a float color -657 * @param start the starting color as a packed float -658 * @param change how much to cool start, as a float between 0 and 1; higher means a cooler result -659 * @return a packed float that represents a color between start and a cooler color -660 */ -661 public static float protanDown(final float start, final float change) { -662 final int s = NumberUtils.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF; -663 return NumberUtils.intBitsToFloat(((int) (p * (1f - change)) & 0xFF) << 8 | other); -664 } -665 -666 /** -667 * Interpolates from the packed float color start towards a "natural" color (between green and orange) by change. -668 * While change should be between 0f (return start as-is) and 1f (return fully natural), start should be a packed color, as -669 * from {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary -670 * Colors, and is a little more efficient and clear than using -671 * {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards a more natural color. Unlike -672 * {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and intensity of start as-is. -673 * @see #tritanDown(float, float) the counterpart method that makes a float color less natural -674 * @param start the starting color as a packed float -675 * @param change how much to change start to a natural color, as a float between 0 and 1; higher means a more natural result -676 * @return a packed float that represents a color between start and a more natural color -677 */ -678 public static float tritanUp(final float start, final float change) { -679 final int s = NumberUtils.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF; -680 return NumberUtils.intBitsToFloat(((int) (t + (0xFF - t) * change) << 16 & 0xFF0000) | other); -681 } -682 -683 /** -684 * Interpolates from the packed float color start towards an "artificial" color (between blue and purple) by change. -685 * While change should be between 0f (return start as-is) and 1f (return fully artificial), start should be a packed color, as -686 * from {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary -687 * Colors, and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp -688 * towards a more artificial color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the -689 * alpha and intensity of start as-is. -690 * @see #tritanUp(float, float) the counterpart method that makes a float color less artificial -691 * @param start the starting color as a packed float -692 * @param change how much to change start to a bolder color, as a float between 0 and 1; higher means a more artificial result -693 * @return a packed float that represents a color between start and a more artificial color -694 */ -695 public static float tritanDown(final float start, final float change) { -696 final int s = NumberUtils.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF; -697 return NumberUtils.intBitsToFloat(((int) (t * (1f - change)) & 0xFF) << 16 | other); -698 } -699 -700 /** -701 * Interpolates from the packed float color start towards that color made opaque by change. While change should be -702 * between 0f (return start as-is) and 1f (return start with full alpha), start should be a packed color, as from -703 * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and -704 * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards -705 * transparent. This won't change the intensity, protan, or tritan of the color. -706 * @see #fade(float, float) the counterpart method that makes a float color more translucent -707 * @param start the starting color as a packed float -708 * @param change how much to go from start toward opaque, as a float between 0 and 1; higher means closer to opaque -709 * @return a packed float that represents a color between start and its opaque version -710 */ -711 public static float blot(final float start, final float change) { -712 final int s = NumberUtils.floatToRawIntBits(start), opacity = s >>> 24 & 0xFE, other = s & 0x00FFFFFF; -713 return NumberUtils.intBitsToFloat(((int) (opacity + (0xFE - opacity) * change) & 0xFE) << 24 | other); -714 } -715 -716 /** -717 * Interpolates from the packed float color start towards transparent by change. While change should be between 0 -718 * (return start as-is) and 1f (return the color with 0 alpha), start should be a packed color, as from -719 * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, -720 * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards -721 * transparent. This won't change the intensity, protan, or tritan of the color. -722 * @see #blot(float, float) the counterpart method that makes a float color more opaque -723 * @param start the starting color as a packed float -724 * @param change how much to go from start toward transparent, as a float between 0 and 1; higher means closer to transparent -725 * @return a packed float that represents a color between start and transparent -726 */ -727 public static float fade(final float start, final float change) { -728 final int s = NumberUtils.floatToRawIntBits(start), opacity = s & 0xFE, other = s & 0x00FFFFFF; -729 return NumberUtils.intBitsToFloat(((int) (opacity * (1f - change)) & 0xFE) << 24 | other); -730 } -731 -732 /** -733 * Brings the chromatic components of {@code start} closer to grayscale by {@code change} (desaturating them). While -734 * change should be between 0f (return start as-is) and 1f (return fully gray), start should be a packed color, as -735 * from {@link #ipt(float, float, float, float)}. This only changes protan and tritan; it leaves intensity and alpha -736 * alone, unlike {@link #lessenChange(float, float)}, which usually changes intensity. -737 * @see #enrich(float, float) the counterpart method that makes a float color more saturated +157 * Writes an IPT_HQ-format packed float color (the format produced by {@link ColorTools#ipt(float, float, float, float)}) +158 * into an IPT_HQ-format Color called {@code editing}. This is mostly useful if the rest of your application expects +159 * colors in IPT_HQ format, such as because you use {@link Shaders#fragmentShaderIPT_HQ} or {@link ColorfulBatch}. +160 * <br> +161 * Internally, this simply calls {@link Color#abgr8888ToColor(Color, float)} and returns the edited Color. +162 * @param editing a libGDX Color that will be filled in-place with the color {@code ipt}, unchanged from its color space +163 * @param ipt a packed float color, as produced by {@link ColorTools#ipt(float, float, float, float)} +164 * @return an RGBA8888 int color +165 */ +166 public static Color toIPTColor(Color editing, final float ipt){ +167 Color.abgr8888ToColor(editing, ipt); +168 return editing; +169 } +170 +171 /** +172 * Takes a color encoded as an RGBA8888 int and converts to a packed float in the IPT_HQ format this uses. +173 * @param rgba an int with the channels (in order) red, green, blue, alpha; should have 8 bits per channel +174 * @return a packed float as IPT_HQ, which this class can use +175 */ +176 public static float fromRGBA8888(final int rgba) { +177 final float r = forwardGamma((rgba >>> 24) * 0x1.010101010101p-8f); +178 final float g = forwardGamma((rgba >>> 16 & 0xFF) * 0x1.010101010101p-8f); +179 final float b = forwardGamma((rgba >>> 8 & 0xFF) * 0x1.010101010101p-8f); +180 final float l = forwardTransform(0.313921f * r + 0.639468f * g + 0.0465970f * b); +181 final float m = forwardTransform(0.151693f * r + 0.748209f * g + 0.1000044f * b); +182 final float s = forwardTransform(0.017753f * r + 0.109468f * g + 0.8729690f * b); +183 return NumberUtils.intBitsToFloat( +184 Math.min(Math.max((int)((0.4000f * l + 0.4000f * m + 0.2000f * s ) * 255.999f), 0), 255) +185 | Math.min(Math.max((int)((2.2275f * l - 2.4255f * m + 0.1980f * s + 0.5f) * 255.999f), 0), 255) << 8 +186 | Math.min(Math.max((int)((0.4028f * l + 0.1786f * m - 0.5814f * s + 0.5f) * 255.999f), 0), 255) << 16 +187 | (rgba & 0xFE) << 24); +188 } +189 +190 /** +191 * Takes a color encoded as an RGBA8888 packed float and converts to a packed float in the IPT format this uses. +192 * @param packed a packed float in RGBA8888 format, with A in the MSB and R in the LSB +193 * @return a packed float as IPT, which this class can use +194 */ +195 public static float fromRGBA(final float packed) { +196 final int abgr = NumberUtils.floatToRawIntBits(packed); +197 final float r = forwardGamma((abgr & 0xFF) * 0x1.010101010101p-8f); +198 final float g = forwardGamma((abgr >>> 8 & 0xFF) * 0x1.010101010101p-8f); +199 final float b = forwardGamma((abgr >>> 16 & 0xFF) * 0x1.010101010101p-8f); +200 final float l = forwardTransform(0.313921f * r + 0.639468f * g + 0.0465970f * b); +201 final float m = forwardTransform(0.151693f * r + 0.748209f * g + 0.1000044f * b); +202 final float s = forwardTransform(0.017753f * r + 0.109468f * g + 0.8729690f * b); +203 return NumberUtils.intBitsToFloat( +204 Math.min(Math.max((int)((0.4000f * l + 0.4000f * m + 0.2000f * s ) * 255.999f), 0), 255) +205 | Math.min(Math.max((int)((2.2275f * l - 2.4255f * m + 0.1980f * s + 0.5f) * 255.999f), 0), 255) << 8 +206 | Math.min(Math.max((int)((0.4028f * l + 0.1786f * m - 0.5814f * s + 0.5f) * 255.999f), 0), 255) << 16 +207 | (abgr & 0xFE000000)); +208 } +209 +210 /** +211 * Takes a libGDX Color that uses RGBA8888 channels and converts to a packed float in the IPT format this uses. +212 * @param color a libGDX RGBA8888 Color +213 * @return a packed float as IPT, which this class can use +214 */ +215 public static float fromColor(final Color color) { +216 final float r = forwardGamma(color.r); +217 final float g = forwardGamma(color.g); +218 final float b = forwardGamma(color.b); +219 final float l = forwardTransform(0.313921f * r + 0.639468f * g + 0.0465970f * b); +220 final float m = forwardTransform(0.151693f * r + 0.748209f * g + 0.1000044f * b); +221 final float s = forwardTransform(0.017753f * r + 0.109468f * g + 0.8729690f * b); +222 return NumberUtils.intBitsToFloat( +223 Math.min(Math.max((int)((0.4000f * l + 0.4000f * m + 0.2000f * s ) * 255.999f), 0), 255) +224 | Math.min(Math.max((int)((2.2275f * l - 2.4255f * m + 0.1980f * s + 0.5f) * 255.999f), 0), 255) << 8 +225 | Math.min(Math.max((int)((0.4028f * l + 0.1786f * m - 0.5814f * s + 0.5f) * 255.999f), 0), 255) << 16 +226 | ((int)(color.a * 255f) << 24 & 0xFE000000)); +227 } +228 +229 /** +230 * Takes RGBA components from 0.0 to 1.0 each and converts to a packed float in the IPT format this uses. +231 * @param r red, from 0.0 to 1.0 (both inclusive) +232 * @param g green, from 0.0 to 1.0 (both inclusive) +233 * @param b blue, from 0.0 to 1.0 (both inclusive) +234 * @param a alpha, from 0.0 to 1.0 (both inclusive) +235 * @return a packed float as IPT, which this class can use +236 */ +237 public static float fromRGBA(float r, float g, float b, final float a) { +238 r = forwardGamma(r); +239 g = forwardGamma(g); +240 b = forwardGamma(b); +241 final float l = forwardTransform(0.313921f * r + 0.639468f * g + 0.0465970f * b); +242 final float m = forwardTransform(0.151693f * r + 0.748209f * g + 0.1000044f * b); +243 final float s = forwardTransform(0.017753f * r + 0.109468f * g + 0.8729690f * b); +244 return NumberUtils.intBitsToFloat( +245 Math.min(Math.max((int)((0.4000f * l + 0.4000f * m + 0.2000f * s ) * 255.999f), 0), 255) +246 | Math.min(Math.max((int)((2.2275f * l - 2.4255f * m + 0.1980f * s + 0.5f) * 255.999f), 0), 255) << 8 +247 | Math.min(Math.max((int)((0.4028f * l + 0.1786f * m - 0.5814f * s + 0.5f) * 255.999f), 0), 255) << 16 +248 | ((int)(a * 255f) << 24 & 0xFE000000)); +249 } +250 +251 /** +252 * Gets the red channel value of the given encoded color, as an int ranging from 0 to 255, inclusive. +253 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} +254 * @return an int from 0 to 255, inclusive, representing the red channel value of the given encoded color +255 */ +256 public static int redInt(final float encoded) +257 { +258 final int decoded = NumberUtils.floatToRawIntBits(encoded); +259 final float i = (decoded & 0xff) / 255f; +260 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +261 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +262 final float l = reverseTransform(i + 0.097569f * p + 0.205226f * t); +263 final float m = reverseTransform(i + -0.11388f * p + 0.133217f * t); +264 final float s = reverseTransform(i + 0.032615f * p + -0.67689f * t); +265 return (int)(reverseGamma(Math.min(Math.max(5.432622f * l + -4.67910f * m + 0.246257f * s, 0f), 1f)) * 255.999f); +266 } +267 +268 /** +269 * Gets the green channel value of the given encoded color, as an int ranging from 0 to 255, inclusive. +270 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} +271 * @return an int from 0 to 255, inclusive, representing the green channel value of the given encoded color +272 */ +273 public static int greenInt(final float encoded) +274 { +275 final int decoded = NumberUtils.floatToRawIntBits(encoded); +276 final float i = (decoded & 0xff) / 255f; +277 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +278 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +279 final float l = reverseTransform(i + 0.097569f * p + 0.205226f * t); +280 final float m = reverseTransform(i + -0.11388f * p + 0.133217f * t); +281 final float s = reverseTransform(i + 0.032615f * p + -0.67689f * t); +282 return (int)(reverseGamma(Math.min(Math.max(-1.10517f * l + 2.311198f * m + -0.20588f * s, 0f), 1f)) * 255.999f); +283 } +284 +285 /** +286 * Gets the blue channel value of the given encoded color, as an int ranging from 0 to 255, inclusive. +287 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} +288 * @return an int from 0 to 255, inclusive, representing the blue channel value of the given encoded color +289 */ +290 public static int blueInt(final float encoded) +291 { +292 final int decoded = NumberUtils.floatToRawIntBits(encoded); +293 final float i = (decoded & 0xff) / 255f; +294 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +295 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +296 final float l = reverseTransform(i + 0.097569f * p + 0.205226f * t); +297 final float m = reverseTransform(i + -0.11388f * p + 0.133217f * t); +298 final float s = reverseTransform(i + 0.032615f * p + -0.67689f * t); +299 return (int)(reverseGamma(Math.min(Math.max(0.028104f * l + -0.19466f * m + 1.166325f * s, 0f), 1f)) * 255.999f); +300 } +301 +302 /** +303 * Gets the alpha channel value of the given encoded color, as an even int ranging from 0 to 254, inclusive. Because +304 * of how alpha is stored in libGDX, no odd-number values are possible for alpha. +305 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} +306 * @return an even int from 0 to 254, inclusive, representing the alpha channel value of the given encoded color +307 */ +308 public static int alphaInt(final float encoded) +309 { +310 return (NumberUtils.floatToRawIntBits(encoded) & 0xfe000000) >>> 24; +311 } +312 +313 /** +314 * Gets the red channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive. +315 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} +316 * @return a float from 0.0f to 1.0f, inclusive, representing the red channel value of the given encoded color +317 */ +318 public static float red(final float encoded) +319 { +320 final int decoded = NumberUtils.floatToRawIntBits(encoded); +321 final float i = (decoded & 0xff) / 255f; +322 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +323 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +324 final float l = reverseTransform(i + 0.097569f * p + 0.205226f * t); +325 final float m = reverseTransform(i + -0.11388f * p + 0.133217f * t); +326 final float s = reverseTransform(i + 0.032615f * p + -0.67689f * t); +327 return reverseGamma(Math.min(Math.max(5.432622f * l + -4.67910f * m + 0.246257f * s, 0f), 1f)); +328 } +329 +330 /** +331 * Gets the green channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive. +332 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} +333 * @return a float from 0.0f to 1.0f, inclusive, representing the green channel value of the given encoded color +334 */ +335 public static float green(final float encoded) +336 { +337 final int decoded = NumberUtils.floatToRawIntBits(encoded); +338 final float i = (decoded & 0xff) / 255f; +339 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +340 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +341 final float l = reverseTransform(i + 0.097569f * p + 0.205226f * t); +342 final float m = reverseTransform(i + -0.11388f * p + 0.133217f * t); +343 final float s = reverseTransform(i + 0.032615f * p + -0.67689f * t); +344 return reverseGamma(Math.min(Math.max(-1.10517f * l + 2.311198f * m + -0.20588f * s, 0f), 1f)); +345 } +346 +347 /** +348 * Gets the blue channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive. +349 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} +350 * @return a float from 0.0f to 1.0f, inclusive, representing the blue channel value of the given encoded color +351 */ +352 public static float blue(final float encoded) +353 { +354 final int decoded = NumberUtils.floatToRawIntBits(encoded); +355 final float i = (decoded & 0xff) / 255f; +356 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +357 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +358 final float l = reverseTransform(i + 0.097569f * p + 0.205226f * t); +359 final float m = reverseTransform(i + -0.11388f * p + 0.133217f * t); +360 final float s = reverseTransform(i + 0.032615f * p + -0.67689f * t); +361 return reverseGamma(Math.min(Math.max(0.028104f * l + -0.19466f * m + 1.166325f * s, 0f), 1f)); +362 } +363 +364 /** +365 * Gets the alpha channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive. +366 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} +367 * @return a float from 0.0f to 1.0f, inclusive, representing the alpha channel value of the given encoded color +368 */ +369 public static float alpha(final float encoded) +370 { +371 return ((NumberUtils.floatToRawIntBits(encoded) & 0xfe000000) >>> 24) * 0x1.020408p-8f; +372 } +373 +374 /** +375 * Gets a color as an IPT packed float given floats representing hue, saturation, lightness, and opacity. +376 * All parameters should normally be between 0 and 1 inclusive, though any hue is tolerated (precision loss may +377 * affect the color if the hue is too large). A hue of 0 is red, progressively higher hue values go to orange, +378 * yellow, green, blue, and purple before wrapping around to red as it approaches 1. A saturation of 0 is grayscale, +379 * a saturation of 1 is brightly colored, and values close to 1 will usually appear more distinct than values close +380 * to 0, especially if the hue is different. A lightness of 0.001f or less is always black (also using a shortcut if +381 * this is the case, respecting opacity), while a lightness of 1f is white. Very bright colors are mostly in a band +382 * of high-saturation where lightness is 0.5f. +383 * +384 * @param hue 0f to 1f, color wheel position +385 * @param saturation 0f to 1f, 0f is grayscale and 1f is brightly colored +386 * @param lightness 0f to 1f, 0f is black and 1f is white +387 * @param opacity 0f to 1f, 0f is fully transparent and 1f is opaque +388 * @return a float encoding a color with the given properties +389 */ +390 public static float floatGetHSL(float hue, float saturation, float lightness, float opacity) { +391 if (lightness <= 0.001f) { +392 return NumberUtils.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x7F7F00); +393 } else { +394 return fromRGBA(FloatColors.hsl2rgb(hue, saturation, lightness, opacity)); +395 } +396 } +397 +398 /** +399 * Gets the saturation of the given encoded color, as a float ranging from 0.0f to 1.0f, inclusive. +400 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} +401 * @return the saturation of the color from 0.0 (a grayscale color; inclusive) to 1.0 (a bright color, inclusive) +402 */ +403 public static float saturation(final float encoded) { +404 final int decoded = NumberUtils.floatToRawIntBits(encoded); +405 final float i = (decoded & 0xff) / 255f; +406 if(Math.abs(i - 0.5) > 0.495f) return 0f; +407 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +408 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +409 final float l = reverseTransform(i + 0.097569f * p + 0.205226f * t); +410 final float m = reverseTransform(i + -0.11388f * p + 0.133217f * t); +411 final float s = reverseTransform(i + 0.032615f * p + -0.67689f * t); +412 final float r = reverseGamma(Math.min(Math.max(5.432622f * l + -4.67910f * m + 0.246257f * s, 0f), 1f)); +413 final float g = reverseGamma(Math.min(Math.max(-1.10517f * l + 2.311198f * m + -0.20588f * s, 0f), 1f)); +414 final float b = reverseGamma(Math.min(Math.max(0.028104f * l + -0.19466f * m + 1.166325f * s, 0f), 1f)); +415 float x, y, w; +416 if(g < b) { +417 x = b; +418 y = g; +419 } +420 else { +421 x = g; +422 y = b; +423 } +424 if(r < x) { +425 w = r; +426 } +427 else { +428 w = x; +429 x = r; +430 } +431 return x - Math.min(w, y); +432// float d = x - Math.min(w, y); +433// float li = x * (1f - 0.5f * d / (x + 1e-10f)); +434// return (x - li); // (Math.min(li, 1f - li) + 1e-10f); +435 } +436 +437 public static float lightness(final float encoded) { +438 final int decoded = NumberUtils.floatToRawIntBits(encoded); +439 final float i = (decoded & 0xff) / 255f; +440 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +441 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +442 final float l = reverseTransform(i + 0.097569f * p + 0.205226f * t); +443 final float m = reverseTransform(i + -0.11388f * p + 0.133217f * t); +444 final float s = reverseTransform(i + 0.032615f * p + -0.67689f * t); +445 final float r = reverseGamma(Math.min(Math.max(5.432622f * l + -4.67910f * m + 0.246257f * s, 0f), 1f)); +446 final float g = reverseGamma(Math.min(Math.max(-1.10517f * l + 2.311198f * m + -0.20588f * s, 0f), 1f)); +447 final float b = reverseGamma(Math.min(Math.max(0.028104f * l + -0.19466f * m + 1.166325f * s, 0f), 1f)); +448 +449 float x, y, w; +450 if(g < b) { +451 x = b; +452 y = g; +453 } +454 else { +455 x = g; +456 y = b; +457 } +458 if(r < x) { +459 w = r; +460 } +461 else { +462 w = x; +463 x = r; +464 } +465 float d = x - Math.min(w, y); +466 return x * (1f - 0.5f * d / (x + 1e-10f)); +467 } +468 +469 /** +470 * Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased) +471 * to 1f (exclusive, red and approaching purple if decreased). +472 * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)} +473 * @return The hue of the color from 0.0 (red, inclusive) towards orange, then yellow, and +474 * eventually to purple before looping back to almost the same red (1.0, exclusive) +475 */ +476 public static float hue(final float encoded) { +477 final int decoded = NumberUtils.floatToRawIntBits(encoded); +478 final float i = (decoded & 0xff) / 255f; +479 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +480 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +481 final float l = reverseTransform(i + 0.097569f * p + 0.205226f * t); +482 final float m = reverseTransform(i + -0.11388f * p + 0.133217f * t); +483 final float s = reverseTransform(i + 0.032615f * p + -0.67689f * t); +484 final float r = reverseGamma(Math.min(Math.max(5.432622f * l + -4.67910f * m + 0.246257f * s, 0f), 1f)); +485 final float g = reverseGamma(Math.min(Math.max(-1.10517f * l + 2.311198f * m + -0.20588f * s, 0f), 1f)); +486 final float b = reverseGamma(Math.min(Math.max(0.028104f * l + -0.19466f * m + 1.166325f * s, 0f), 1f)); +487 float x, y, z, w; +488 if(g < b) { +489 x = b; +490 y = g; +491 z = -1f; +492 w = 2f / 3f; +493 } +494 else { +495 x = g; +496 y = b; +497 z = 0f; +498 w = -1f / 3f; +499 } +500 if(r < x) { +501 z = w; +502 w = r; +503 } +504 else { +505 w = x; +506 x = r; +507 } +508 float d = x - Math.min(w, y); +509 return Math.abs(z + (w - y) / (6f * d + 1e-10f)); +510 } +511 +512 /** +513 * The "intensity" of the given packed float in IPT format, which is like its lightness; ranges from 0.0f to +514 * 1.0f . You can edit the intensity of a color with {@link #lighten(float, float)} and +515 * {@link #darken(float, float)}. +516 * +517 * @param encoded a color encoded as a packed float, as by {@link #ipt(float, float, float, float)} +518 * @return the intensity value as a float from 0.0f to 1.0f +519 */ +520 public static float intensity(final float encoded) +521 { +522 return (NumberUtils.floatToRawIntBits(encoded) & 0xff) / 255f; +523 } +524 +525 /** +526 * The "protan" of the given packed float in IPT format, which when combined with tritan describes the +527 * hue and saturation of a color; ranges from 0f to 1f . If protan is 0f, the color will be cooler, more green or +528 * blue; if protan is 1f, the color will be warmer, from magenta to orange. You can edit the protan of a color with +529 * {@link #protanUp(float, float)} and {@link #protanDown(float, float)}. +530 * @param encoded a color encoded as a packed float, as by {@link #ipt(float, float, float, float)} +531 * @return the protan value as a float from 0.0f to 1.0f +532 */ +533 public static float protan(final float encoded) +534 { +535 return ((NumberUtils.floatToRawIntBits(encoded) >>> 8 & 0xff)) / 255f; +536 } +537 +538 /** +539 * The "tritan" of the given packed float in IPT format, which when combined with protan describes the +540 * hue and saturation of a color; ranges from 0f to 1f . If tritan is 0f, the color will be more "artificial", more +541 * blue or purple; if tritan is 1f, the color will be more "natural", from green to yellow to orange. You can edit +542 * the tritan of a color with {@link #tritanUp(float, float)} and {@link #tritanDown(float, float)}. +543 * @param encoded a color encoded as a packed float, as by {@link #ipt(float, float, float, float)} +544 * @return the tritan value as a float from 0.0f to 1.0f +545 */ +546 public static float tritan(final float encoded) +547 { +548 return ((NumberUtils.floatToRawIntBits(encoded) >>> 16 & 0xff)) / 255f; +549 } +550 +551 /** +552 * Gets a variation on the packed float color basis as another packed float that has its hue, saturation, lightness, +553 * and opacity adjusted by the specified amounts. Note that this edits the color in HSL space, not IPT_HQ! Takes +554 * floats representing the amounts of change to apply to hue, saturation, lightness, and opacity; these can be +555 * between -1f and 1f. Returns a float that can be used as a packed or encoded color with methods like +556 * {@link com.badlogic.gdx.graphics.g2d.Batch#setPackedColor(float)}. The float is likely to be different than the +557 * result of {@link #ipt(float, float, float, float)} unless hue, saturation, lightness, and opacity are all 0. +558 * This won't allocate any objects. +559 * <br> +560 * The parameters this takes all specify additive changes for a color component, clamping the final values so they +561 * can't go above 1 or below 0, with an exception for hue, which can rotate around if lower or higher hues would be +562 * used. As an example, if you give this 0.4f for saturation, and the current color has saturation 0.7f, then the +563 * resulting color will have 1f for saturation. If you gave this -0.1f for saturation and the current color again +564 * has saturation 0.7f, then resulting color will have 0.6f for saturation. +565 * +566 * @param basis a packed float color that will be used as the starting point to make the next color +567 * @param hue -1f to 1f, the hue change that can be applied to the new float color (not clamped, wraps) +568 * @param saturation -1f to 1f, the saturation change that can be applied to the new float color +569 * @param light -1f to 1f, the light/brightness change that can be applied to the new float color +570 * @param opacity -1f to 1f, the opacity/alpha change that can be applied to the new float color +571 * @return a float encoding a variation of basis with the given changes +572 */ +573 public static float toEditedFloat(float basis, float hue, float saturation, float light, float opacity) { +574 final int e = NumberUtils.floatToRawIntBits(basis); +575 final float i = Math.min(Math.max(light + (e & 0xff) / 255f, 0f), 1f); +576 opacity = Math.min(Math.max(opacity + (e >>> 24 & 0xfe) * 0x1.020408p-8f, 0f), 1f); +577 if (i <= 0.001f) +578 return NumberUtils.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x808000); +579 final float p = ((e >>> 7 & 0x1fe) - 0xff) / 255f; +580 final float t = ((e >>> 15 & 0x1fe) - 0xff) / 255f; +581 final float l = reverseTransform(i + 0.097569f * p + 0.205226f * t); +582 final float m = reverseTransform(i + -0.11388f * p + 0.133217f * t); +583 final float s = reverseTransform(i + 0.032615f * p + -0.67689f * t); +584 final float r = reverseGamma(Math.min(Math.max(5.432622f * l + -4.67910f * m + 0.246257f * s, 0f), 1f)); +585 final float g = reverseGamma(Math.min(Math.max(-1.10517f * l + 2.311198f * m + -0.20588f * s, 0f), 1f)); +586 final float b = reverseGamma(Math.min(Math.max(0.028104f * l + -0.19466f * m + 1.166325f * s, 0f), 1f)); +587 float x, y, z, w; +588 if(g < b) { +589 x = b; +590 y = g; +591 z = -1f; +592 w = 2f / 3f; +593 } +594 else { +595 x = g; +596 y = b; +597 z = 0f; +598 w = -1f / 3f; +599 } +600 if(r < x) { +601 z = w; +602 w = r; +603 } +604 else { +605 w = x; +606 x = r; +607 } +608 final float d = x - Math.min(w, y); +609 final float lum = x * (1f - 0.5f * d / (x + 1e-10f)); +610 hue += Math.abs(z + (w - y) / (6f * d + 1e-10f)) + 1f; +611 saturation += (x - lum) / (Math.min(lum, 1f - lum) + 1e-10f); +612 return fromRGBA(FloatColors.hsl2rgb(hue - (int)hue, Math.min(Math.max(saturation, 0f), 1f), lum, opacity)); +613 } +614 +615 /** +616 * Interpolates from the packed float color start towards white by change. While change should be between 0f (return +617 * start as-is) and 1f (return white), start should be a packed color, as from +618 * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and +619 * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards +620 * white. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is. +621 * @see #darken(float, float) the counterpart method that darkens a float color +622 * @param start the starting color as a packed float +623 * @param change how much to go from start toward white, as a float between 0 and 1; higher means closer to white +624 * @return a packed float that represents a color between start and white +625 */ +626 public static float lighten(final float start, final float change) { +627 final int s = NumberUtils.floatToRawIntBits(start), i = s & 0xFF, other = s & 0xFEFFFF00; +628 return NumberUtils.intBitsToFloat(((int) (i + (0xFF - i) * change) & 0xFF) | other); +629 } +630 +631 /** +632 * Interpolates from the packed float color start towards black by change. While change should be between 0f (return +633 * start as-is) and 1f (return black), start should be a packed color, as from +634 * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and +635 * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards +636 * black. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is. +637 * @see #lighten(float, float) the counterpart method that lightens a float color +638 * @param start the starting color as a packed float +639 * @param change how much to go from start toward black, as a float between 0 and 1; higher means closer to black +640 * @return a packed float that represents a color between start and black +641 */ +642 public static float darken(final float start, final float change) { +643 final int s = NumberUtils.floatToRawIntBits(start), i = s & 0xFF, other = s & 0xFEFFFF00; +644 return NumberUtils.intBitsToFloat(((int) (i * (1f - change)) & 0xFF) | other); +645 } +646 +647 /** +648 * Interpolates from the packed float color start towards a warmer color (orange to magenta) by change. While change +649 * should be between 0f (return start as-is) and 1f (return fully warmed), start should be a packed color, as from +650 * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, +651 * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to +652 * lerp towards a warmer color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the +653 * alpha and intensity of start as-is. +654 * @see #protanDown(float, float) the counterpart method that cools a float color +655 * @param start the starting color as a packed float +656 * @param change how much to warm start, as a float between 0 and 1; higher means a warmer result +657 * @return a packed float that represents a color between start and a warmer color +658 */ +659 public static float protanUp(final float start, final float change) { +660 final int s = NumberUtils.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF; +661 return NumberUtils.intBitsToFloat(((int) (p + (0xFF - p) * change) << 8 & 0xFF00) | other); +662 } +663 +664 /** +665 * Interpolates from the packed float color start towards a cooler color (green to blue) by change. While change +666 * should be between 0f (return start as-is) and 1f (return fully cooled), start should be a packed color, as from +667 * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and +668 * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp +669 * towards a cooler color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and +670 * intensity of start as-is. +671 * @see #protanUp(float, float) the counterpart method that warms a float color +672 * @param start the starting color as a packed float +673 * @param change how much to cool start, as a float between 0 and 1; higher means a cooler result +674 * @return a packed float that represents a color between start and a cooler color +675 */ +676 public static float protanDown(final float start, final float change) { +677 final int s = NumberUtils.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF; +678 return NumberUtils.intBitsToFloat(((int) (p * (1f - change)) & 0xFF) << 8 | other); +679 } +680 +681 /** +682 * Interpolates from the packed float color start towards a "natural" color (between green and orange) by change. +683 * While change should be between 0f (return start as-is) and 1f (return fully natural), start should be a packed color, as +684 * from {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary +685 * Colors, and is a little more efficient and clear than using +686 * {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards a more natural color. Unlike +687 * {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and intensity of start as-is. +688 * @see #tritanDown(float, float) the counterpart method that makes a float color less natural +689 * @param start the starting color as a packed float +690 * @param change how much to change start to a natural color, as a float between 0 and 1; higher means a more natural result +691 * @return a packed float that represents a color between start and a more natural color +692 */ +693 public static float tritanUp(final float start, final float change) { +694 final int s = NumberUtils.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF; +695 return NumberUtils.intBitsToFloat(((int) (t + (0xFF - t) * change) << 16 & 0xFF0000) | other); +696 } +697 +698 /** +699 * Interpolates from the packed float color start towards an "artificial" color (between blue and purple) by change. +700 * While change should be between 0f (return start as-is) and 1f (return fully artificial), start should be a packed color, as +701 * from {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary +702 * Colors, and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp +703 * towards a more artificial color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the +704 * alpha and intensity of start as-is. +705 * @see #tritanUp(float, float) the counterpart method that makes a float color less artificial +706 * @param start the starting color as a packed float +707 * @param change how much to change start to a bolder color, as a float between 0 and 1; higher means a more artificial result +708 * @return a packed float that represents a color between start and a more artificial color +709 */ +710 public static float tritanDown(final float start, final float change) { +711 final int s = NumberUtils.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF; +712 return NumberUtils.intBitsToFloat(((int) (t * (1f - change)) & 0xFF) << 16 | other); +713 } +714 +715 /** +716 * Interpolates from the packed float color start towards that color made opaque by change. While change should be +717 * between 0f (return start as-is) and 1f (return start with full alpha), start should be a packed color, as from +718 * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and +719 * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards +720 * transparent. This won't change the intensity, protan, or tritan of the color. +721 * @see #fade(float, float) the counterpart method that makes a float color more translucent +722 * @param start the starting color as a packed float +723 * @param change how much to go from start toward opaque, as a float between 0 and 1; higher means closer to opaque +724 * @return a packed float that represents a color between start and its opaque version +725 */ +726 public static float blot(final float start, final float change) { +727 final int s = NumberUtils.floatToRawIntBits(start), opacity = s >>> 24 & 0xFE, other = s & 0x00FFFFFF; +728 return NumberUtils.intBitsToFloat(((int) (opacity + (0xFE - opacity) * change) & 0xFE) << 24 | other); +729 } +730 +731 /** +732 * Interpolates from the packed float color start towards transparent by change. While change should be between 0 +733 * (return start as-is) and 1f (return the color with 0 alpha), start should be a packed color, as from +734 * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, +735 * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards +736 * transparent. This won't change the intensity, protan, or tritan of the color. +737 * @see #blot(float, float) the counterpart method that makes a float color more opaque 738 * @param start the starting color as a packed float -739 * @param change how much to change start to a desaturated color, as a float between 0 and 1; higher means a less saturated result -740 * @return a packed float that represents a color between start and a desaturated color +739 * @param change how much to go from start toward transparent, as a float between 0 and 1; higher means closer to transparent +740 * @return a packed float that represents a color between start and transparent 741 */ -742 public static float dullen(final float start, final float change) { -743 final int s = NumberUtils.floatToRawIntBits(start); -744 return ipt((s & 0xFF) / 255f, -745 ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f, -746 ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f, -747 (s >>> 25) / 127f); -748 } -749 -750 /** -751 * Pushes the chromatic components of {@code start} away from grayscale by change (saturating them). While change -752 * should be between 0f (return start as-is) and 1f (return maximally saturated), start should be a packed color, as -753 * from {@link #ipt(float, float, float, float)}. This usually changes only protan and tritan, but higher values for -754 * {@code change} can force the color out of the gamut, which this corrects using -755 * {@link #limitToGamut(float, float, float, float)} (and that can change intensity somewhat). If the color stays -756 * in-gamut, then intensity won't change; alpha never changes. -757 * @see #dullen(float, float) the counterpart method that makes a float color less saturated -758 * @param start the starting color as a packed float -759 * @param change how much to change start to a saturated color, as a float between 0 and 1; higher means a more saturated result -760 * @return a packed float that represents a color between start and a saturated color -761 */ -762 public static float enrich(final float start, final float change) { -763 final int s = NumberUtils.floatToRawIntBits(start); -764 return limitToGamut((s & 0xFF) / 255f, -765 ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f, -766 ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f, -767 (s >>> 25) / 127f); -768 } -769 -770 -771 /** -772 * Given a packed float IPT color {@code mainColor} and another IPT color that it should be made to contrast with, -773 * gets a packed float IPT color with roughly inverted intnsity but the same chromatic channels and opacity (P and T -774 * are likely to be clamped if the result gets close to white or black). This won't ever produce black or other very -775 * dark colors, and also has a gap in the range it produces for intensity values between 0.5 and 0.55. That allows -776 * most of the colors this method produces to contrast well as a foreground when displayed on a background of -777 * {@code contrastingColor}, or vice versa. This will leave the intensity unchanged if the chromatic channels of the -778 * contrastingColor and those of the mainColor are already very different. This has nothing to do with the contrast -779 * channel of the tweak in ColorfulBatch; where that part of the tweak can make too-similar lightness values further -780 * apart by just a little, this makes a modification on {@code mainColor} to maximize its lightness difference from -781 * {@code contrastingColor} without losing its other qualities. -782 * @param mainColor a packed float color, as produced by {@link #ipt(float, float, float, float)}; this is the color that will be adjusted -783 * @param contrastingColor a packed float color, as produced by {@link #ipt(float, float, float, float)}; the adjusted mainColor will contrast with this -784 * @return a different IPT packed float color, based on mainColor but with potentially very different lightness -785 */ -786 public static float inverseLightness(final float mainColor, final float contrastingColor) -787 { -788 final int bits = NumberUtils.floatToRawIntBits(mainColor), -789 contrastBits = NumberUtils.floatToRawIntBits(contrastingColor), -790 i = (bits & 0xff), -791 p = (bits >>> 8 & 0xff), -792 t = (bits >>> 16 & 0xff), -793 ci = (contrastBits & 0xff), -794 cp = (contrastBits >>> 8 & 0xff), -795 ct = (contrastBits >>> 16 & 0xff); -796 if((p - cp) * (p - cp) + (t - ct) * (t - ct) >= 0x10000) -797 return mainColor; -798 return ipt(ci < 128 ? i * (0.45f / 255f) + 0.55f : 0.5f - i * (0.45f / 255f), p / 255f, t / 255f, 0x1.0p-8f * (bits >>> 24)); -799 } -800 -801 /** -802 * Given a packed float IPT_HQ color {@code mainColor} and another IPT_HQ color that it should be made to contrast -803 * with, gets a packed float IPT_HQ color with I that should be quite different from {@code contrastingColor}'s I, -804 * but the same chromatic channels and opacity (A and B are likely to be clamped if the result gets close to white -805 * or black). This allows most of the colors this method produces to contrast well as a foreground when displayed on -806 * a background of {@code contrastingColor}, or vice versa. -807 * <br> -808 * This is similar to {@link #inverseLightness(float, float)}, but is considerably simpler, and this method will -809 * change the lightness of mainColor when the two given colors have close lightness but distant chroma. Because it -810 * averages the original I of mainColor with the modified one, this tends to not produce harsh color changes. -811 * @param mainColor a packed IPT_HQ float color; this is the color that will be adjusted -812 * @param contrastingColor a packed IPT_HQ float color; the adjusted mainColor will contrast with the I of this -813 * @return a different packed IPT_HQ float color, based on mainColor but typically with different lightness -814 */ -815 public static float differentiateLightness(final float mainColor, final float contrastingColor) -816 { -817 final int main = NumberUtils.floatToRawIntBits(mainColor), contrast = NumberUtils.floatToRawIntBits(contrastingColor); -818 return limitToGamut(NumberUtils.intBitsToFloat((main & 0xFEFFFF00) | (contrast + 128 & 0xFF) + (main & 0xFF) >>> 1)); -819 } -820 -821 /** -822 * Pretty simple; adds 0.5 to the given color's I and wraps it around if it would go above 1.0, then averages that -823 * with the original I. This means light colors become darker, and dark colors become lighter, with almost all -824 * results in the middle-range of possible lightness. -825 * @param mainColor a packed IPT_HQ float color -826 * @return a different packed IPT_HQ float color, with its I channel changed and limited to the correct gamut -827 */ -828 public static float offsetLightness(final float mainColor) { -829 final int decoded = NumberUtils.floatToRawIntBits(mainColor); -830 return limitToGamut(NumberUtils.intBitsToFloat((decoded & 0xFEFFFF00) | (decoded + 128 & 0xFF) + (decoded & 0xFF) >>> 1)); -831 } -832 -833 /** -834 * Makes the additive IPT color stored in {@code color} cause less of a change when used as a tint, as if it were -835 * mixed with neutral gray. When {@code fraction} is 1.0, this returns color unchanged; when fraction is 0.0, it -836 * returns {@link Palette#GRAY}, and when it is in-between 0.0 and 1.0 it returns something between the two. This is -837 * meant for things like area of effect abilities that make smaller color changes toward their periphery. -838 * @param color a color that should have its tinting effect potentially weakened -839 * @param fraction how much of {@code color} should be kept, from 0.0 to 1.0 -840 * @return an IPT float color between gray and {@code color} -841 */ -842 public static float lessenChange(final float color, float fraction) { -843 final int e = NumberUtils.floatToRawIntBits(color), -844 is = 0x80, ps = 0x80, ts = 0x80, as = 0xFE, -845 ie = (e & 0xFF), pe = (e >>> 8) & 0xFF, te = (e >>> 16) & 0xFF, ae = e >>> 24 & 0xFE; -846 return NumberUtils.intBitsToFloat(((int) (is + fraction * (ie - is)) & 0xFF) -847 | (((int) (ps + fraction * (pe - ps)) & 0xFF) << 8) -848 | (((int) (ts + fraction * (te - ts)) & 0xFF) << 16) -849 | (((int) (as + fraction * (ae - as)) & 0xFE) << 24)); -850 } -851 -852 /** -853 * Makes a quasi-randomly-edited variant on the given {@code color}, allowing typically a small amount of -854 * {@code variance} (such as 0.05 to 0.25) between the given color and what this can return. The {@code seed} should -855 * be different each time this is called, and can be obtained from a random number generator to make the colors more -856 * random, or can be incremented on each call. If the seed is only incremented or decremented, then this shouldn't -857 * produce two similar colors in a row unless variance is very small. The variance affects the I, P, and T of the -858 * generated color, and each of those channels can go up or down by the given variance as long as the total distance -859 * isn't greater than the variance (this considers P and T extra-wide, going from -1 to 1, while I goes from 0 to 1, -860 * but only internally for measuring distance). -861 * @param color a packed float color, as produced by {@link #ipt(float, float, float, float)} -862 * @param seed a long seed that should be different on each call; should not be 0 -863 * @param variance max amount of difference between the given color and the generated color; always less than 1 -864 * @return a generated packed float color that should be at least somewhat different from {@code color} -865 */ -866 public static float randomEdit(final float color, long seed, final float variance) { -867 final int decoded = NumberUtils.floatToRawIntBits(color); -868 final float i = (decoded & 0xff) / 255f; -869 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -870 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -871 final float limit = variance * variance; -872 float dist, x, y, z; -873 for (int j = 0; j < 50; j++) { -874 x = (((seed * 0xD1B54A32D192ED03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance; -875 y = (((seed * 0xABC98388FB8FAC03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance; -876 z = (((seed * 0x8CB92BA72F3D8DD7L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance; -877 seed += 0x9E3779B97F4A7C15L; -878 dist = x * x + y * y + z * z; -879 if(dist <= limit && inGamut(x += i, y = (p + y) * 0.5f + 0.5f, z = (t + z) * 0.5f + 0.5f)) -880 return NumberUtils.intBitsToFloat((decoded & 0xFE000000) | ((int)(z * 255.5f) << 16 & 0xFF0000) -881 | ((int)(y * 255.5f) << 8 & 0xFF00) | (int)(x * 255.5f)); -882 } -883 return color; -884 } -885 -886 /** -887 * Returns true if the given packed float color, as IPT, is valid to convert losslessly back to RGBA. -888 * @param packed a packed float color as IPT -889 * @return true if the given packed float color can be converted back and forth to RGBA -890 */ -891 public static boolean inGamut(final float packed) -892 { -893 final int decoded = NumberUtils.floatToRawIntBits(packed); -894 final float i = (decoded & 0xff) / 255f; -895 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -896 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -897 final float l = reverseTransform(i + 0.097569f * p + 0.205226f * t); -898 final float m = reverseTransform(i + -0.11388f * p + 0.133217f * t); -899 final float s = reverseTransform(i + 0.032615f * p + -0.67689f * t); +742 public static float fade(final float start, final float change) { +743 final int s = NumberUtils.floatToRawIntBits(start), opacity = s & 0xFE, other = s & 0x00FFFFFF; +744 return NumberUtils.intBitsToFloat(((int) (opacity * (1f - change)) & 0xFE) << 24 | other); +745 } +746 +747 /** +748 * Brings the chromatic components of {@code start} closer to grayscale by {@code change} (desaturating them). While +749 * change should be between 0f (return start as-is) and 1f (return fully gray), start should be a packed color, as +750 * from {@link #ipt(float, float, float, float)}. This only changes protan and tritan; it leaves intensity and alpha +751 * alone, unlike {@link #lessenChange(float, float)}, which usually changes intensity. +752 * @see #enrich(float, float) the counterpart method that makes a float color more saturated +753 * @param start the starting color as a packed float +754 * @param change how much to change start to a desaturated color, as a float between 0 and 1; higher means a less saturated result +755 * @return a packed float that represents a color between start and a desaturated color +756 */ +757 public static float dullen(final float start, final float change) { +758 final int s = NumberUtils.floatToRawIntBits(start); +759 return ipt((s & 0xFF) / 255f, +760 ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f, +761 ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f, +762 (s >>> 25) / 127f); +763 } +764 +765 /** +766 * Pushes the chromatic components of {@code start} away from grayscale by change (saturating them). While change +767 * should be between 0f (return start as-is) and 1f (return maximally saturated), start should be a packed color, as +768 * from {@link #ipt(float, float, float, float)}. This usually changes only protan and tritan, but higher values for +769 * {@code change} can force the color out of the gamut, which this corrects using +770 * {@link #limitToGamut(float, float, float, float)} (and that can change intensity somewhat). If the color stays +771 * in-gamut, then intensity won't change; alpha never changes. +772 * @see #dullen(float, float) the counterpart method that makes a float color less saturated +773 * @param start the starting color as a packed float +774 * @param change how much to change start to a saturated color, as a float between 0 and 1; higher means a more saturated result +775 * @return a packed float that represents a color between start and a saturated color +776 */ +777 public static float enrich(final float start, final float change) { +778 final int s = NumberUtils.floatToRawIntBits(start); +779 return limitToGamut((s & 0xFF) / 255f, +780 ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f, +781 ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f, +782 (s >>> 25) / 127f); +783 } +784 +785 +786 /** +787 * Given a packed float IPT color {@code mainColor} and another IPT color that it should be made to contrast with, +788 * gets a packed float IPT color with roughly inverted intnsity but the same chromatic channels and opacity (P and T +789 * are likely to be clamped if the result gets close to white or black). This won't ever produce black or other very +790 * dark colors, and also has a gap in the range it produces for intensity values between 0.5 and 0.55. That allows +791 * most of the colors this method produces to contrast well as a foreground when displayed on a background of +792 * {@code contrastingColor}, or vice versa. This will leave the intensity unchanged if the chromatic channels of the +793 * contrastingColor and those of the mainColor are already very different. This has nothing to do with the contrast +794 * channel of the tweak in ColorfulBatch; where that part of the tweak can make too-similar lightness values further +795 * apart by just a little, this makes a modification on {@code mainColor} to maximize its lightness difference from +796 * {@code contrastingColor} without losing its other qualities. +797 * @param mainColor a packed float color, as produced by {@link #ipt(float, float, float, float)}; this is the color that will be adjusted +798 * @param contrastingColor a packed float color, as produced by {@link #ipt(float, float, float, float)}; the adjusted mainColor will contrast with this +799 * @return a different IPT packed float color, based on mainColor but with potentially very different lightness +800 */ +801 public static float inverseLightness(final float mainColor, final float contrastingColor) +802 { +803 final int bits = NumberUtils.floatToRawIntBits(mainColor), +804 contrastBits = NumberUtils.floatToRawIntBits(contrastingColor), +805 i = (bits & 0xff), +806 p = (bits >>> 8 & 0xff), +807 t = (bits >>> 16 & 0xff), +808 ci = (contrastBits & 0xff), +809 cp = (contrastBits >>> 8 & 0xff), +810 ct = (contrastBits >>> 16 & 0xff); +811 if((p - cp) * (p - cp) + (t - ct) * (t - ct) >= 0x10000) +812 return mainColor; +813 return ipt(ci < 128 ? i * (0.45f / 255f) + 0.55f : 0.5f - i * (0.45f / 255f), p / 255f, t / 255f, 0x1.0p-8f * (bits >>> 24)); +814 } +815 +816 /** +817 * Given a packed float IPT_HQ color {@code mainColor} and another IPT_HQ color that it should be made to contrast +818 * with, gets a packed float IPT_HQ color with I that should be quite different from {@code contrastingColor}'s I, +819 * but the same chromatic channels and opacity (A and B are likely to be clamped if the result gets close to white +820 * or black). This allows most of the colors this method produces to contrast well as a foreground when displayed on +821 * a background of {@code contrastingColor}, or vice versa. +822 * <br> +823 * This is similar to {@link #inverseLightness(float, float)}, but is considerably simpler, and this method will +824 * change the lightness of mainColor when the two given colors have close lightness but distant chroma. Because it +825 * averages the original I of mainColor with the modified one, this tends to not produce harsh color changes. +826 * @param mainColor a packed IPT_HQ float color; this is the color that will be adjusted +827 * @param contrastingColor a packed IPT_HQ float color; the adjusted mainColor will contrast with the I of this +828 * @return a different packed IPT_HQ float color, based on mainColor but typically with different lightness +829 */ +830 public static float differentiateLightness(final float mainColor, final float contrastingColor) +831 { +832 final int main = NumberUtils.floatToRawIntBits(mainColor), contrast = NumberUtils.floatToRawIntBits(contrastingColor); +833 return limitToGamut(NumberUtils.intBitsToFloat((main & 0xFEFFFF00) | (contrast + 128 & 0xFF) + (main & 0xFF) >>> 1)); +834 } +835 +836 /** +837 * Pretty simple; adds 0.5 to the given color's I and wraps it around if it would go above 1.0, then averages that +838 * with the original I. This means light colors become darker, and dark colors become lighter, with almost all +839 * results in the middle-range of possible lightness. +840 * @param mainColor a packed IPT_HQ float color +841 * @return a different packed IPT_HQ float color, with its I channel changed and limited to the correct gamut +842 */ +843 public static float offsetLightness(final float mainColor) { +844 final int decoded = NumberUtils.floatToRawIntBits(mainColor); +845 return limitToGamut(NumberUtils.intBitsToFloat((decoded & 0xFEFFFF00) | (decoded + 128 & 0xFF) + (decoded & 0xFF) >>> 1)); +846 } +847 +848 /** +849 * Makes the additive IPT color stored in {@code color} cause less of a change when used as a tint, as if it were +850 * mixed with neutral gray. When {@code fraction} is 1.0, this returns color unchanged; when fraction is 0.0, it +851 * returns {@link Palette#GRAY}, and when it is in-between 0.0 and 1.0 it returns something between the two. This is +852 * meant for things like area of effect abilities that make smaller color changes toward their periphery. +853 * @param color a color that should have its tinting effect potentially weakened +854 * @param fraction how much of {@code color} should be kept, from 0.0 to 1.0 +855 * @return an IPT float color between gray and {@code color} +856 */ +857 public static float lessenChange(final float color, float fraction) { +858 final int e = NumberUtils.floatToRawIntBits(color), +859 is = 0x80, ps = 0x80, ts = 0x80, as = 0xFE, +860 ie = (e & 0xFF), pe = (e >>> 8) & 0xFF, te = (e >>> 16) & 0xFF, ae = e >>> 24 & 0xFE; +861 return NumberUtils.intBitsToFloat(((int) (is + fraction * (ie - is)) & 0xFF) +862 | (((int) (ps + fraction * (pe - ps)) & 0xFF) << 8) +863 | (((int) (ts + fraction * (te - ts)) & 0xFF) << 16) +864 | (((int) (as + fraction * (ae - as)) & 0xFE) << 24)); +865 } +866 +867 /** +868 * Makes a quasi-randomly-edited variant on the given {@code color}, allowing typically a small amount of +869 * {@code variance} (such as 0.05 to 0.25) between the given color and what this can return. The {@code seed} should +870 * be different each time this is called, and can be obtained from a random number generator to make the colors more +871 * random, or can be incremented on each call. If the seed is only incremented or decremented, then this shouldn't +872 * produce two similar colors in a row unless variance is very small. The variance affects the I, P, and T of the +873 * generated color, and each of those channels can go up or down by the given variance as long as the total distance +874 * isn't greater than the variance (this considers P and T extra-wide, going from -1 to 1, while I goes from 0 to 1, +875 * but only internally for measuring distance). +876 * @param color a packed float color, as produced by {@link #ipt(float, float, float, float)} +877 * @param seed a long seed that should be different on each call; should not be 0 +878 * @param variance max amount of difference between the given color and the generated color; always less than 1 +879 * @return a generated packed float color that should be at least somewhat different from {@code color} +880 */ +881 public static float randomEdit(final float color, long seed, final float variance) { +882 final int decoded = NumberUtils.floatToRawIntBits(color); +883 final float i = (decoded & 0xff) / 255f; +884 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +885 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +886 final float limit = variance * variance; +887 float dist, x, y, z; +888 for (int j = 0; j < 50; j++) { +889 x = (((seed * 0xD1B54A32D192ED03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance; +890 y = (((seed * 0xABC98388FB8FAC03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance; +891 z = (((seed * 0x8CB92BA72F3D8DD7L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance; +892 seed += 0x9E3779B97F4A7C15L; +893 dist = x * x + y * y + z * z; +894 if(dist <= limit && inGamut(x += i, y = (p + y) * 0.5f + 0.5f, z = (t + z) * 0.5f + 0.5f)) +895 return NumberUtils.intBitsToFloat((decoded & 0xFE000000) | ((int)(z * 255.5f) << 16 & 0xFF0000) +896 | ((int)(y * 255.5f) << 8 & 0xFF00) | (int)(x * 255.5f)); +897 } +898 return color; +899 } 900 -901 final float r = 5.432622f * l + -4.67910f * m + 0.246257f * s; -902 if(r < 0f || r > 1.0f) return false; -903 final float g = -1.10517f * l + 2.311198f * m + -0.20588f * s; -904 if(g < 0f || g > 1.0f) return false; -905 final float b = 0.028104f * l + -0.19466f * m + 1.166325f * s; -906 return (b >= 0f && b <= 1.0f); -907 } -908 /** -909 * Returns true if the given IPT values are valid to convert losslessly back to RGBA. -910 * @param i intensity channel, as a float from 0 to 1 -911 * @param p protan channel, as a float from 0 to 1 -912 * @param t tritan channel, as a float from 0 to 1 -913 * @return true if the given packed float color can be converted back and forth to RGBA -914 */ -915 public static boolean inGamut(float i, float p, float t) -916 { -917 p = (p - 0.5f) * 2f; -918 t = (t - 0.5f) * 2f; -919 final float l = reverseTransform(i + 0.097569f * p + 0.205226f * t); -920 final float m = reverseTransform(i + -0.11388f * p + 0.133217f * t); -921 final float s = reverseTransform(i + 0.032615f * p + -0.67689f * t); -922 -923 final float r = 5.432622f * l + -4.67910f * m + 0.246257f * s; -924 if(r < 0f || r > 1.0f) return false; -925 final float g = -1.10517f * l + 2.311198f * m + -0.20588f * s; -926 if(g < 0f || g > 1.0f) return false; -927 final float b = 0.028104f * l + -0.19466f * m + 1.166325f * s; -928 return (b >= 0f && b <= 1.0f); -929 } -930 -931 /** -932 * Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it -933 * isn't in-gamut, or returns it as soon as it is in-gamut. -934 * @param packed a packed float color in IPT format; often this color is not in-gamut -935 * @return the first color this finds that is between the given IPT color and 50% gray, and is in-gamut -936 * @see #inGamut(float) You can use inGamut() if you just want to check whether a color is in-gamut. -937 */ -938 public static float limitToGamut(final float packed) { -939 final int decoded = NumberUtils.floatToRawIntBits(packed); -940 final float i = (decoded & 0xff) / 255f; -941 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; -942 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; -943 float i2 = i, p2 = p, t2 = t; -944 for (int attempt = 31; attempt >= 0; attempt--) { -945 final float l = reverseTransform(i2 + 0.097569f * p2 + 0.205226f * t2); -946 final float m = reverseTransform(i2 + -0.11388f * p2 + 0.133217f * t2); -947 final float s = reverseTransform(i2 + 0.032615f * p2 + -0.67689f * t2); -948 -949 final float r = 5.432622f * l + -4.67910f * m + 0.246257f * s; -950 final float g = -1.10517f * l + 2.311198f * m + -0.20588f * s; -951 final float b = 0.028104f * l + -0.19466f * m + 1.166325f * s; -952 if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f) -953 break; -954 final float progress = attempt * 0x1p-5f; -955 i2 = MathUtils.lerp(0.55f, i, progress); -956 p2 = MathUtils.lerp(0, p, progress); -957 t2 = MathUtils.lerp(0, t, progress); -958 } -959 return ipt(i2, p2 * 0.5f + 0.5f, t2 * 0.5f + 0.5f, (decoded >>> 25) / 127f); -960 } -961 -962 /** -963 * Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it -964 * isn't in-gamut, or returns it as soon as it is in-gamut. This always produces an opaque color. -965 * @param i intensity component; will be clamped between 0 and 1 if it isn't already -966 * @param p protan component; will be clamped between 0 and 1 if it isn't already -967 * @param t tritan component; will be clamped between 0 and 1 if it isn't already -968 * @return the first color this finds that is between the given IPT color and 50% gray, and is in-gamut -969 * @see #inGamut(float, float, float) You can use inGamut() if you just want to check whether a color is in-gamut. -970 */ -971 public static float limitToGamut(float i, float p, float t) { -972 return limitToGamut(i, p, t, 1f); -973 } -974 /** -975 * Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it -976 * isn't in-gamut, or returns it as soon as it is in-gamut. -977 * @param i intensity component; will be clamped between 0 and 1 if it isn't already -978 * @param p protan component; will be clamped between 0 and 1 if it isn't already -979 * @param t tritan component; will be clamped between 0 and 1 if it isn't already -980 * @param a alpha component; will be clamped between 0 and 1 if it isn't already -981 * @return the first color this finds that is between the given IPT color and 50% gray, and is in-gamut -982 * @see #inGamut(float, float, float) You can use inGamut() if you just want to check whether a color is in-gamut. -983 */ -984 public static float limitToGamut(float i, float p, float t, float a) { -985 float i2 = i = Math.min(Math.max(i, 0f), 1f); -986 float p2 = p = Math.min(Math.max((p - 0.5f) * 2f, -1f), 1f); -987 float t2 = t = Math.min(Math.max((t - 0.5f) * 2f, -1f), 1f); -988 a = Math.min(Math.max(a, 0f), 1f); -989 for (int attempt = 31; attempt >= 0; attempt--) { -990 final float l = reverseTransform(i2 + 0.097569f * p2 + 0.205226f * t2); -991 final float m = reverseTransform(i2 + -0.11388f * p2 + 0.133217f * t2); -992 final float s = reverseTransform(i2 + 0.032615f * p2 + -0.67689f * t2); -993 -994 final float r = 5.432622f * l + -4.67910f * m + 0.246257f * s; -995 final float g = -1.10517f * l + 2.311198f * m + -0.20588f * s; -996 final float b = 0.028104f * l + -0.19466f * m + 1.166325f * s; -997 if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f) -998 break; -999 final float progress = attempt * 0x1p-5f; -1000 i2 = MathUtils.lerp(0.55f, i, progress); -1001 p2 = MathUtils.lerp(0, p, progress); -1002 t2 = MathUtils.lerp(0, t, progress); -1003 } -1004 return ipt(i2, p2 * 0.5f + 0.5f, t2 * 0.5f + 0.5f, a); -1005 } -1006 -1007 /** -1008 * Produces a random packed float color that is always in-gamut and should be uniformly distributed. -1009 * @param random a Random object (preferably a subclass of Random, like {@link com.badlogic.gdx.math.RandomXS128}) -1010 * @return a packed float color that is always in-gamut -1011 */ -1012 public static float randomColor(Random random) { -1013 float i = random.nextFloat(); -1014 float p = random.nextFloat(); -1015 float t = random.nextFloat(); -1016 while (!inGamut(i, p, t)) { -1017 i = random.nextFloat(); -1018 p = random.nextFloat(); -1019 t = random.nextFloat(); -1020 } -1021 return ipt(i, p, t, 1f); -1022 } -1023} +901 /** +902 * Returns true if the given packed float color, as IPT, is valid to convert losslessly back to RGBA. +903 * @param packed a packed float color as IPT +904 * @return true if the given packed float color can be converted back and forth to RGBA +905 */ +906 public static boolean inGamut(final float packed) +907 { +908 final int decoded = NumberUtils.floatToRawIntBits(packed); +909 final float i = (decoded & 0xff) / 255f; +910 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +911 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +912 final float l = reverseTransform(i + 0.097569f * p + 0.205226f * t); +913 final float m = reverseTransform(i + -0.11388f * p + 0.133217f * t); +914 final float s = reverseTransform(i + 0.032615f * p + -0.67689f * t); +915 +916 final float r = 5.432622f * l + -4.67910f * m + 0.246257f * s; +917 if(r < 0f || r > 1.0f) return false; +918 final float g = -1.10517f * l + 2.311198f * m + -0.20588f * s; +919 if(g < 0f || g > 1.0f) return false; +920 final float b = 0.028104f * l + -0.19466f * m + 1.166325f * s; +921 return (b >= 0f && b <= 1.0f); +922 } +923 /** +924 * Returns true if the given IPT values are valid to convert losslessly back to RGBA. +925 * @param i intensity channel, as a float from 0 to 1 +926 * @param p protan channel, as a float from 0 to 1 +927 * @param t tritan channel, as a float from 0 to 1 +928 * @return true if the given packed float color can be converted back and forth to RGBA +929 */ +930 public static boolean inGamut(float i, float p, float t) +931 { +932 p = (p - 0.5f) * 2f; +933 t = (t - 0.5f) * 2f; +934 final float l = reverseTransform(i + 0.097569f * p + 0.205226f * t); +935 final float m = reverseTransform(i + -0.11388f * p + 0.133217f * t); +936 final float s = reverseTransform(i + 0.032615f * p + -0.67689f * t); +937 +938 final float r = 5.432622f * l + -4.67910f * m + 0.246257f * s; +939 if(r < 0f || r > 1.0f) return false; +940 final float g = -1.10517f * l + 2.311198f * m + -0.20588f * s; +941 if(g < 0f || g > 1.0f) return false; +942 final float b = 0.028104f * l + -0.19466f * m + 1.166325f * s; +943 return (b >= 0f && b <= 1.0f); +944 } +945 +946 /** +947 * Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to grayscale if it +948 * isn't in-gamut, or returns it as soon as it is in-gamut. Maintains the intensity of the color, only bringing +949 * protan and tritan closer to grayscale. +950 * @param packed a packed float color in IPT format; often this color is not in-gamut +951 * @return the first color this finds that is between the given IPT color and grayscale, and is in-gamut +952 * @see #inGamut(float) You can use inGamut() if you just want to check whether a color is in-gamut. +953 */ +954 public static float limitToGamut(final float packed) { +955 final int decoded = NumberUtils.floatToRawIntBits(packed); +956 final float i = (decoded & 0xff) / 255f; +957 final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +958 final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +959 float p2 = p, t2 = t; +960 for (int attempt = 31; attempt >= 0; attempt--) { +961 final float l = reverseTransform(i + 0.097569f * p2 + 0.205226f * t2); +962 final float m = reverseTransform(i + -0.11388f * p2 + 0.133217f * t2); +963 final float s = reverseTransform(i + 0.032615f * p2 + -0.67689f * t2); +964 +965 final float r = 5.432622f * l + -4.67910f * m + 0.246257f * s; +966 final float g = -1.10517f * l + 2.311198f * m + -0.20588f * s; +967 final float b = 0.028104f * l + -0.19466f * m + 1.166325f * s; +968 if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f) +969 break; +970 final float progress = attempt * 0x1p-5f; +971 p2 = MathUtils.lerp(0, p, progress); +972 t2 = MathUtils.lerp(0, t, progress); +973 } +974 return ipt(i, p2 * 0.5f + 0.5f, t2 * 0.5f + 0.5f, (decoded >>> 25) / 127f); +975 } +976 +977 /** +978 * Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to grayscale if it +979 * isn't in-gamut, or returns it as soon as it is in-gamut. Maintains the intensity of the color, only bringing +980 * protan and tritan closer to grayscale. This always produces an opaque color. +981 * @param i intensity component; will be clamped between 0 and 1 if it isn't already +982 * @param p protan component; will be clamped between 0 and 1 if it isn't already +983 * @param t tritan component; will be clamped between 0 and 1 if it isn't already +984 * @return the first color this finds that is between the given IPT color and grayscale, and is in-gamut +985 * @see #inGamut(float, float, float) You can use inGamut() if you just want to check whether a color is in-gamut. +986 */ +987 public static float limitToGamut(float i, float p, float t) { +988 return limitToGamut(i, p, t, 1f); +989 } +990 /** +991 * Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to grayscale if it +992 * isn't in-gamut, or returns it as soon as it is in-gamut. +993 * @param i intensity component; will be clamped between 0 and 1 if it isn't already +994 * @param p protan component; will be clamped between 0 and 1 if it isn't already +995 * @param t tritan component; will be clamped between 0 and 1 if it isn't already +996 * @param a alpha component; will be clamped between 0 and 1 if it isn't already +997 * @return the first color this finds that is between the given IPT color and grayscale, and is in-gamut +998 * @see #inGamut(float, float, float) You can use inGamut() if you just want to check whether a color is in-gamut. +999 */ +1000 public static float limitToGamut(float i, float p, float t, float a) { +1001 float i2 = Math.min(Math.max(i, 0f), 1f); +1002 float p2 = p = Math.min(Math.max((p - 0.5f) * 2f, -1f), 1f); +1003 float t2 = t = Math.min(Math.max((t - 0.5f) * 2f, -1f), 1f); +1004 a = Math.min(Math.max(a, 0f), 1f); +1005 for (int attempt = 31; attempt >= 0; attempt--) { +1006 final float l = reverseTransform(i2 + 0.097569f * p2 + 0.205226f * t2); +1007 final float m = reverseTransform(i2 + -0.11388f * p2 + 0.133217f * t2); +1008 final float s = reverseTransform(i2 + 0.032615f * p2 + -0.67689f * t2); +1009 +1010 final float r = 5.432622f * l + -4.67910f * m + 0.246257f * s; +1011 final float g = -1.10517f * l + 2.311198f * m + -0.20588f * s; +1012 final float b = 0.028104f * l + -0.19466f * m + 1.166325f * s; +1013 if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f) +1014 break; +1015 final float progress = attempt * 0x1p-5f; +1016 p2 = MathUtils.lerp(0, p, progress); +1017 t2 = MathUtils.lerp(0, t, progress); +1018 } +1019 return ipt(i2, p2 * 0.5f + 0.5f, t2 * 0.5f + 0.5f, a); +1020 } +1021 +1022 /** +1023 * Given a packed float IPT_HQ color, this edits its intensity, protan, tritan, and alpha channels by adding the +1024 * corresponding "add" parameter and then clamping. This returns a different float value (of course, the given float +1025 * can't be edited in-place). You can give a value of 0 for any "add" parameter you want to stay unchanged. This +1026 * clamps the resulting color to remain in-gamut, so it should be safe to convert it back to RGBA. +1027 * @param encoded a packed float IPT_HQ color +1028 * @param addI how much to add to the intensity channel; typically in the -1 to 1 range +1029 * @param addP how much to add to the protan channel; typically in the -2 to 2 range +1030 * @param addT how much to add to the tritan channel; typically in the -2 to 2 range +1031 * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range +1032 * @return a packed float IPT_HQ color with the requested edits applied to {@code encoded} +1033 */ +1034 public static float editIPT(float encoded, float addI, float addP, float addT, float addAlpha) { +1035 return editIPT(encoded, addI, addP, addT, addAlpha, 1f, 1f, 1f, 1f); +1036 } +1037 /** +1038 * Given a packed float IPT_HQ color, this edits its intensity, protan, tritan, and alpha channels by first +1039 * multiplying each channel by the corresponding "mul" parameter and then adding the corresponding "add" parameter, +1040 * before clamping. This means the intensity value is multiplied by {@code mulI}, then has {@code addI} added, and +1041 * then is clamped to the normal range for intensity (0 to 1). This returns a different float value (of course, the +1042 * given float can't be edited in-place). You can give a value of 0 for any "add" parameter you want to stay +1043 * unchanged, or a value of 1 for any "mul" parameter that shouldn't change. Note that this manipulates protan and +1044 * tritan in the -1 to 1 range, so if you multiply by a small number like {@code 0.25f}, then this will produce a +1045 * less-saturated color, and if you multiply by a larger number like {@code 4f}, then you will get a much +1046 * more-saturated color. This clamps the resulting color to remain in-gamut, so it should be safe to convert it back +1047 * to RGBA. +1048 * @param encoded a packed float IPT_HQ color +1049 * @param addI how much to add to the intensity channel; typically in the -1 to 1 range +1050 * @param addP how much to add to the protan channel; typically in the -2 to 2 range +1051 * @param addT how much to add to the tritan channel; typically in the -2 to 2 range +1052 * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range +1053 * @param mulI how much to multiply the intensity channel by; should be non-negative +1054 * @param mulP how much to multiply the protan channel by; usually non-negative (not always) +1055 * @param mulT how much to multiply the tritan channel by; usually non-negative (not always) +1056 * @param mulAlpha how much to multiply the alpha channel by; should be non-negative +1057 * @return a packed float IPT_HQ color with the requested edits applied to {@code encoded} +1058 */ +1059 public static float editIPT(float encoded, float addI, float addP, float addT, float addAlpha, +1060 float mulI, float mulP, float mulT, float mulAlpha) { +1061 final int decoded = NumberUtils.floatToRawIntBits(encoded); +1062 float i = (decoded & 0xff) / 255f; +1063 float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f; +1064 float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f; +1065 float alpha = (decoded >>> 25) / 127f; +1066 +1067 float i2 = Math.min(Math.max(i * mulI + addI, 0f), 1f); +1068 float p2 = p = Math.min(Math.max(p * mulP + addP, -1f), 1f); +1069 float t2 = t = Math.min(Math.max(t * mulT + addT, -1f), 1f); +1070 alpha = Math.min(Math.max(alpha * mulAlpha + addAlpha, 0f), 1f); +1071 for (int attempt = 31; attempt >= 0; attempt--) { +1072 final float l = reverseTransform(i2 + 0.097569f * p2 + 0.205226f * t2); +1073 final float m = reverseTransform(i2 + -0.11388f * p2 + 0.133217f * t2); +1074 final float s = reverseTransform(i2 + 0.032615f * p2 + -0.67689f * t2); +1075 +1076 final float r = 5.432622f * l + -4.67910f * m + 0.246257f * s; +1077 final float g = -1.10517f * l + 2.311198f * m + -0.20588f * s; +1078 final float b = 0.028104f * l + -0.19466f * m + 1.166325f * s; +1079 if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f) +1080 break; +1081 final float progress = attempt * 0x1p-5f; +1082 p2 = MathUtils.lerp(0, p, progress); +1083 t2 = MathUtils.lerp(0, t, progress); +1084 } +1085 return ipt(i2, p2 * 0.5f + 0.5f, t2 * 0.5f + 0.5f, alpha); +1086 } +1087 +1088 /** +1089 * Produces a random packed float color that is always in-gamut and should be uniformly distributed. +1090 * @param random a Random object (preferably a subclass of Random, like {@link com.badlogic.gdx.math.RandomXS128}) +1091 * @return a packed float color that is always in-gamut +1092 */ +1093 public static float randomColor(Random random) { +1094 float i = random.nextFloat(); +1095 float p = random.nextFloat(); +1096 float t = random.nextFloat(); +1097 while (!inGamut(i, p, t)) { +1098 i = random.nextFloat(); +1099 p = random.nextFloat(); +1100 t = random.nextFloat(); +1101 } +1102 return ipt(i, p, t, 1f); +1103 } +1104} diff --git a/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/ipt_hq/SimplePalette.html b/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/ipt_hq/SimplePalette.html index 0b532620..37142a7c 100644 --- a/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/ipt_hq/SimplePalette.html +++ b/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/ipt_hq/SimplePalette.html @@ -753,13 +753,13 @@ 740 if (len > 2 && term.charAt(2) == 'g') { 741 switch (len) { 742 case 9: -743 intensity += 0.125f; +743 intensity += 0.14f; 744 case 8: -745 intensity += 0.125f; +745 intensity += 0.14f; 746 case 7: -747 intensity += 0.125f; +747 intensity += 0.14f; 748 case 5: -749 intensity += 0.125f; +749 intensity += 0.14f; 750 break; 751 default: 752 mixing.add(TRANSPARENT); @@ -793,13 +793,13 @@ 780 if (len > 1 && term.charAt(1) == 'a') { 781 switch (len) { 782 case 8: -783 intensity -= 0.125f; +783 intensity -= 0.14f; 784 case 7: -785 intensity -= 0.125f; +785 intensity -= 0.14f; 786 case 6: -787 intensity -= 0.125f; +787 intensity -= 0.14f; 788 case 4: -789 intensity -= 0.125f; +789 intensity -= 0.14f; 790 break; 791 default: 792 mixing.add(TRANSPARENT); @@ -884,7 +884,7 @@ 871 mixing.set(i, colorsByHue.get((c / e) % paletteSize)); 872 } 873 int idxI = ((c / colorTries) % 9 - 4), idxS = (c / (colorTries * 9) - 4); -874 float intensity = idxI * 0.125f, saturation = idxS * 0.2f; +874 float intensity = idxI * 0.14f, saturation = idxS * 0.2f; 875 876 float result = FloatColors.mix(mixing.items, 0, mixCount); 877 if(intensity > 0) result = ColorTools.lighten(result, intensity); diff --git a/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/oklab/ColorTools.html b/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/oklab/ColorTools.html index 12356881..ed49c3e6 100644 --- a/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/oklab/ColorTools.html +++ b/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/oklab/ColorTools.html @@ -14,311 +14,311 @@
        001package com.github.tommyettinger.colorful.oklab;
         002
         003import com.badlogic.gdx.graphics.Color;
        -004import com.badlogic.gdx.utils.NumberUtils;
        -005import com.github.tommyettinger.colorful.FloatColors;
        -006import com.github.tommyettinger.colorful.Shaders;
        -007import com.github.tommyettinger.colorful.TrigTools;
        -008
        -009import java.io.UnsupportedEncodingException;
        -010import java.util.Random;
        -011
        -012/**
        -013 * Contains code for manipulating colors as {@code int} and packed {@code float} values in the Oklab color space.
        -014 * Oklab is a very new color space that builds on the same foundation as IPT, but seems to be better-calibrated for
        -015 * uniform lightness and colorfulness, instead of just the emphasis on uniform hue that IPT has. Relative to IPT, Oklab
        -016 * has a noticeably smaller range in chromatic channels (IPT's protan and tritan can range past 0.8 or as low as 0.35,
        -017 * but the similar A and B channels in Oklab don't stray past about 0.65 at the upper end, if that), but it does this so
        -018 * the difference between two Oklab colors is just the Euclidean distance between their components. A slight difference
        -019 * between Oklab and IPT here is that IPT shrinks the chromatic channels to store their -1 to 1 range in a color float's
        -020 * 0 to 1 range, then offsets the shrunken range from -0.5 to 0.5, to 0 to 1; Oklab does not need to shrink the range,
        -021 * and only offsets it in the same way (both just add 0.5).
        -022 * <br>
        -023 * Here's <a href="https://bottosson.github.io/posts/oklab/">Björn Ottosson's original post introducing Oklab</a>.
        -024 * So far, <a href="https://raphlinus.github.io/color/2021/01/18/oklab-critique.html">it stood up to analysis by Raph
        -025 * Levien</a>, and seems to be gaining fans quickly.
        -026 */
        -027public class ColorTools {
        -028        /**
        -029         * Gets a packed float representation of a color given as 4 float components, here, L (luminance or lightness), A
        -030         * (a chromatic component ranging from greenish to reddish, called protan in IPT), B (a chromatic component ranging
        -031         * from bluish to yellowish, called tritan in IPT), and alpha (or opacity). As long as you use a batch with
        -032         * {@link Shaders#fragmentShaderOklab} as its shader, colors passed with
        -033         * {@link com.badlogic.gdx.graphics.g2d.Batch#setPackedColor(float)} will be interpreted as Oklab. L should be
        -034         * between 0 and 1, inclusive, with 0 used for very dark colors (almost only black), and 1 used for very light
        -035         * colors (almost only white). A and B range from 0.0 to 1.0, with grayscale results when both are about 0.5.
        -036         * There's some aesthetic value in changing just one chroma value. When A is high and B is low, the color is more
        -037         * purple/magenta, when both are low it is more bluish, when B is high and A is low, the color tends to be greenish,
        -038         * and when both are high it tends to be orange. When A and B are both near 0.5f, the color is closer to gray.
        -039         * Alpha is the multiplicative opacity of the color, and acts like RGBA's alpha.
        -040         * <br>
        -041         * This method bit-masks the resulting color's byte values, so any values can technically be given to this as
        -042         * L, A, and B, but they will only be reversible from the returned float color to the original L,
        -043         * A, and B values if the original values were in the range that {@link #channelL(float)}, {@link #channelA(float)},
        -044         * and {@link #channelB(float)} return. You can use {@link #inGamut(float, float, float)} to check if a given set of
        -045         * L, A, and B values is in-gamut, that is, it can be converted to and from an RGB color without going out of the
        -046         * valid range. If you just want to enforce that a color is in-gamut, you can use
        -047         * {@link #limitToGamut(float, float, float, float)}, which takes the same parameters this method does, or
        -048         * {@link #limitToGamut(float)} if you already have a packed float color that could be out-of-gamut.
        -049         *
        -050         * @param l     0f to 1f, lightness or L component of Oklab, with 0.5f meaning "no change" and 1f brightening
        -051         * @param a     0f to 1f, protan or A component of Oklab, with 1f more orange, red, or magenta
        -052         * @param b     0f to 1f, tritan or B component of Oklab, with 1f more green, yellow, or red
        -053         * @param alpha 0f to 1f, 0f makes the color transparent and 1f makes it opaque
        -054         * @return a float encoding a color with the given properties
        -055         */
        -056        public static float oklab(float l, float a, float b, float alpha) {
        -057                return NumberUtils.intBitsToFloat(((int) (alpha * 255) << 24 & 0xFE000000) | ((int) (b * 255) << 16 & 0xFF0000)
        -058                                | ((int) (a * 255) << 8 & 0xFF00) | ((int) (l * 255) & 0xFF));
        -059        }
        -060
        +004import com.badlogic.gdx.math.MathUtils;
        +005import com.badlogic.gdx.utils.NumberUtils;
        +006import com.github.tommyettinger.colorful.FloatColors;
        +007import com.github.tommyettinger.colorful.Shaders;
        +008import com.github.tommyettinger.colorful.TrigTools;
        +009
        +010import java.io.UnsupportedEncodingException;
        +011import java.util.Random;
        +012
        +013/**
        +014 * Contains code for manipulating colors as {@code int} and packed {@code float} values in the Oklab color space.
        +015 * Oklab is a very new color space that builds on the same foundation as IPT, but seems to be better-calibrated for
        +016 * uniform lightness and colorfulness, instead of just the emphasis on uniform hue that IPT has. Relative to IPT, Oklab
        +017 * has a noticeably smaller range in chromatic channels (IPT's protan and tritan can range past 0.8 or as low as 0.35,
        +018 * but the similar A and B channels in Oklab don't stray past about 0.65 at the upper end, if that), but it does this so
        +019 * the difference between two Oklab colors is just the Euclidean distance between their components. A slight difference
        +020 * between Oklab and IPT here is that IPT shrinks the chromatic channels to store their -1 to 1 range in a color float's
        +021 * 0 to 1 range, then offsets the shrunken range from -0.5 to 0.5, to 0 to 1; Oklab does not need to shrink the range,
        +022 * and only offsets it in the same way (both just add 0.5).
        +023 * <br>
        +024 * Here's <a href="https://bottosson.github.io/posts/oklab/">Björn Ottosson's original post introducing Oklab</a>.
        +025 * So far, <a href="https://raphlinus.github.io/color/2021/01/18/oklab-critique.html">it stood up to analysis by Raph
        +026 * Levien</a>, and seems to be gaining fans quickly.
        +027 */
        +028public class ColorTools {
        +029        /**
        +030         * Gets a packed float representation of a color given as 4 float components, here, L (luminance or lightness), A
        +031         * (a chromatic component ranging from greenish to reddish, called protan in IPT), B (a chromatic component ranging
        +032         * from bluish to yellowish, called tritan in IPT), and alpha (or opacity). As long as you use a batch with
        +033         * {@link Shaders#fragmentShaderOklab} as its shader, colors passed with
        +034         * {@link com.badlogic.gdx.graphics.g2d.Batch#setPackedColor(float)} will be interpreted as Oklab. L should be
        +035         * between 0 and 1, inclusive, with 0 used for very dark colors (almost only black), and 1 used for very light
        +036         * colors (almost only white). A and B range from 0.0 to 1.0, with grayscale results when both are about 0.5.
        +037         * There's some aesthetic value in changing just one chroma value. When A is high and B is low, the color is more
        +038         * purple/magenta, when both are low it is more bluish, when B is high and A is low, the color tends to be greenish,
        +039         * and when both are high it tends to be orange. When A and B are both near 0.5f, the color is closer to gray.
        +040         * Alpha is the multiplicative opacity of the color, and acts like RGBA's alpha.
        +041         * <br>
        +042         * This method bit-masks the resulting color's byte values, so any values can technically be given to this as
        +043         * L, A, and B, but they will only be reversible from the returned float color to the original L,
        +044         * A, and B values if the original values were in the range that {@link #channelL(float)}, {@link #channelA(float)},
        +045         * and {@link #channelB(float)} return. You can use {@link #inGamut(float, float, float)} to check if a given set of
        +046         * L, A, and B values is in-gamut, that is, it can be converted to and from an RGB color without going out of the
        +047         * valid range. If you just want to enforce that a color is in-gamut, you can use
        +048         * {@link #limitToGamut(float, float, float, float)}, which takes the same parameters this method does, or
        +049         * {@link #limitToGamut(float)} if you already have a packed float color that could be out-of-gamut.
        +050         *
        +051         * @param l     0f to 1f, lightness or L component of Oklab, with 0.5f meaning "no change" and 1f brightening
        +052         * @param a     0f to 1f, protan or A component of Oklab, with 1f more orange, red, or magenta
        +053         * @param b     0f to 1f, tritan or B component of Oklab, with 1f more green, yellow, or red
        +054         * @param alpha 0f to 1f, 0f makes the color transparent and 1f makes it opaque
        +055         * @return a float encoding a color with the given properties
        +056         */
        +057        public static float oklab(float l, float a, float b, float alpha) {
        +058                return NumberUtils.intBitsToFloat(((int) (alpha * 255) << 24 & 0xFE000000) | ((int) (b * 255) << 16 & 0xFF0000)
        +059                                | ((int) (a * 255) << 8 & 0xFF00) | ((int) (l * 255) & 0xFF));
        +060        }
         061
        -062        /**
        -063         * An approximation of the cube-root function for float inputs and outputs.
        -064         * This can be about twice as fast as {@link Math#cbrt(double)}. This
        -065         * version does not tolerate negative inputs, because in the narrow use
        -066         * case it has in this class, it never is given negative inputs.
        -067         * <br>
        -068         * Has very low relative error (less than 1E-9) when inputs are uniformly
        -069         * distributed between 0 and 512, and absolute mean error of less than
        -070         * 1E-6 in the same scenario. Uses a bit-twiddling method similar to one
        -071         * presented in Hacker's Delight and also used in early 3D graphics (see
        -072         * https://en.wikipedia.org/wiki/Fast_inverse_square_root for more, but
        -073         * this code approximates cbrt(x) and not 1/sqrt(x)). This specific code
        -074         * was originally by Marc B. Reynolds, posted in his "Stand-alone-junk"
        -075         * repo: https://github.com/Marc-B-Reynolds/Stand-alone-junk/blob/master/src/Posts/ballcube.c#L182-L197 .
        -076         * It's worth noting that while hardware instructions for finding the
        -077         * square root of a float have gotten extremely fast, the same is not
        -078         * true for the cube root (which has to allow negative inputs), so while
        -079         * the bit-twiddling inverse square root is no longer a beneficial
        -080         * optimization on current hardware, this does seem to help.
        -081         * <br>
        -082         * This is used when converting from RGB to Oklab, as an intermediate step.
        -083         * @param x any non-negative finite float to find the cube root of
        -084         * @return the cube root of x, approximated
        -085         */
        -086        private static float cbrtPositive(float x) {
        -087                int ix = NumberUtils.floatToRawIntBits(x);
        -088                final float x0 = x;
        -089                ix = (ix>>>2) + (ix>>>4);
        -090                ix += (ix>>>4);
        -091                ix += (ix>>>8) + 0x2A5137A0;
        -092                x  = NumberUtils.intBitsToFloat(ix);
        -093                x  = 0.33333334f*(2f * x + x0/(x*x));
        +062
        +063        /**
        +064         * An approximation of the cube-root function for float inputs and outputs.
        +065         * This can be about twice as fast as {@link Math#cbrt(double)}. This
        +066         * version does not tolerate negative inputs, because in the narrow use
        +067         * case it has in this class, it never is given negative inputs.
        +068         * <br>
        +069         * Has very low relative error (less than 1E-9) when inputs are uniformly
        +070         * distributed between 0 and 512, and absolute mean error of less than
        +071         * 1E-6 in the same scenario. Uses a bit-twiddling method similar to one
        +072         * presented in Hacker's Delight and also used in early 3D graphics (see
        +073         * https://en.wikipedia.org/wiki/Fast_inverse_square_root for more, but
        +074         * this code approximates cbrt(x) and not 1/sqrt(x)). This specific code
        +075         * was originally by Marc B. Reynolds, posted in his "Stand-alone-junk"
        +076         * repo: https://github.com/Marc-B-Reynolds/Stand-alone-junk/blob/master/src/Posts/ballcube.c#L182-L197 .
        +077         * It's worth noting that while hardware instructions for finding the
        +078         * square root of a float have gotten extremely fast, the same is not
        +079         * true for the cube root (which has to allow negative inputs), so while
        +080         * the bit-twiddling inverse square root is no longer a beneficial
        +081         * optimization on current hardware, this does seem to help.
        +082         * <br>
        +083         * This is used when converting from RGB to Oklab, as an intermediate step.
        +084         * @param x any non-negative finite float to find the cube root of
        +085         * @return the cube root of x, approximated
        +086         */
        +087        private static float cbrtPositive(float x) {
        +088                int ix = NumberUtils.floatToRawIntBits(x);
        +089                final float x0 = x;
        +090                ix = (ix>>>2) + (ix>>>4);
        +091                ix += (ix>>>4);
        +092                ix += (ix>>>8) + 0x2A5137A0;
        +093                x  = NumberUtils.intBitsToFloat(ix);
         094                x  = 0.33333334f*(2f * x + x0/(x*x));
        -095                return x;
        -096        }
        -097
        -098        /**
        -099         * Used when converting from Oklab to RGB, as an intermediate step.
        -100         * Really just {@code x * x * x}.
        -101         * @param x one of the LMS Prime channels to be converted to LMS
        -102         * @return an LMS channel value, which can be converted to RGB
        -103         */
        -104        private static float cube(final float x) {
        -105                return x * x * x;
        -106        }
        -107
        -108        /**
        -109         * Used when given non-linear sRGB inputs to make them linear, approximating with gamma 2.0.
        -110         * Really just {@code component * component}.
        -111         * @param component any non-linear channel of a color, to be made linear
        -112         * @return a linear version of component
        -113         */
        -114        private static float forwardGamma(final float component) {
        -115                return component * component;
        -116        }
        -117
        -118        /**
        -119         * Used to return from a linear, gamma-corrected input to an sRGB, non-linear output, using gamma 2.0.
        -120         * Really just a float version of the square root of component.
        -121         * @param component a linear channel of a color, to be made non-linear
        -122         * @return a non-linear version of component
        -123         */
        -124        private static float reverseGamma(final float component) {
        -125                return (float)Math.sqrt(component);
        -126        }
        -127
        +095                x  = 0.33333334f*(2f * x + x0/(x*x));
        +096                return x;
        +097        }
        +098
        +099        /**
        +100         * Used when converting from Oklab to RGB, as an intermediate step.
        +101         * Really just {@code x * x * x}.
        +102         * @param x one of the LMS Prime channels to be converted to LMS
        +103         * @return an LMS channel value, which can be converted to RGB
        +104         */
        +105        private static float cube(final float x) {
        +106                return x * x * x;
        +107        }
        +108
        +109        /**
        +110         * Used when given non-linear sRGB inputs to make them linear, approximating with gamma 2.0.
        +111         * Really just {@code component * component}.
        +112         * @param component any non-linear channel of a color, to be made linear
        +113         * @return a linear version of component
        +114         */
        +115        private static float forwardGamma(final float component) {
        +116                return component * component;
        +117        }
        +118
        +119        /**
        +120         * Used to return from a linear, gamma-corrected input to an sRGB, non-linear output, using gamma 2.0.
        +121         * Really just a float version of the square root of component.
        +122         * @param component a linear channel of a color, to be made non-linear
        +123         * @return a non-linear version of component
        +124         */
        +125        private static float reverseGamma(final float component) {
        +126                return (float)Math.sqrt(component);
        +127        }
         128
        -129        /**
        -130         * Converts a packed float color in the format produced by {@link ColorTools#oklab(float, float, float, float)} to an RGBA8888 int.
        -131         * This format of int can be used with Pixmap and in some other places in libGDX.
        -132         * @param packed a packed float color, as produced by {@link ColorTools#oklab(float, float, float, float)}
        -133         * @return an RGBA8888 int color
        -134         */
        -135        public static int toRGBA8888(final float packed)
        -136        {
        -137                final int decoded = NumberUtils.floatToRawIntBits(packed);
        -138                final float L = (decoded & 0xff) / 255f;
        -139                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        -140                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        -141                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
        -142                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
        -143                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
        -144                final int r = (int)(reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f)) * 255.999f);
        -145                final int g = (int)(reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f)) * 255.999f);
        -146                final int b = (int)(reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f)) * 255.999f);
        -147                return r << 24 | g << 16 | b << 8 | (decoded & 0xfe000000) >>> 24 | decoded >>> 31;
        -148        }
        -149
        -150        /**
        -151         * Converts a packed float color in the format produced by {@link ColorTools#oklab(float, float, float, float)}
        -152         * to a packed float in RGBA format.
        -153         * This format of float can be used with the standard SpriteBatch and in some other places in libGDX.
        -154         * @param packed a packed float color, as produced by {@link ColorTools#oklab(float, float, float, float)}
        -155         * @return a packed float color as RGBA
        -156         */
        -157        public static float toRGBA(final float packed)
        -158        {
        -159                final int decoded = NumberUtils.floatToRawIntBits(packed);
        -160                final float L = (decoded & 0xff) / 255f;
        -161                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        -162                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        -163                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
        -164                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
        -165                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
        -166                final int r = (int)(reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f)) * 255.999f);
        -167                final int g = (int)(reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f)) * 255.999f);
        -168                final int b = (int)(reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f)) * 255.999f);
        -169                return NumberUtils.intBitsToFloat(r | g << 8 | b << 16 | (decoded & 0xfe000000));
        -170        }
        -171        /**
        -172         * Writes an Oklab-format packed float color (the format produced by {@link ColorTools#oklab(float, float, float, float)})
        -173         * into an RGBA8888 Color as used by libGDX (called {@code editing}).
        -174         * @param editing a libGDX color that will be filled in-place with an RGBA conversion of {@code packed}
        -175         * @param packed a packed float color, as produced by {@link ColorTools#oklab(float, float, float, float)}
        -176         * @return an RGBA8888 int color
        -177         */
        -178        public static Color toColor(Color editing, final float packed)
        -179        {
        -180                final int decoded = NumberUtils.floatToRawIntBits(packed);
        -181                final float L = (decoded & 0xff) / 255f;
        -182                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        -183                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        -184                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
        -185                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
        -186                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
        -187                editing.r = reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f));
        -188                editing.g = reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f));
        -189                editing.b = reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f));
        -190                editing.a = (decoded >>> 25) * 0x1.020408p-7f; // this is 1/127 as a float
        -191                return editing.clamp();
        -192        }
        -193
        -194        /**
        -195         * Takes a color encoded as an RGBA8888 int and converts to a packed float in the Oklab format this uses.
        -196         * @param rgba an int with the channels (in order) red, green, blue, alpha; should have 8 bits per channel
        -197         * @return a packed float as Oklab, which this class can use
        -198         */
        -199        public static float fromRGBA8888(final int rgba) {
        -200                final float r = forwardGamma((rgba >>> 24) * 0x1.010101010101p-8f);
        -201                final float g = forwardGamma((rgba >>> 16 & 0xFF) * 0x1.010101010101p-8f);
        -202                final float b = forwardGamma((rgba >>> 8 & 0xFF) * 0x1.010101010101p-8f);
        -203
        -204                final float l = cbrtPositive(0.4121656120f * r + 0.5362752080f * g + 0.0514575653f * b);
        -205                final float m = cbrtPositive(0.2118591070f * r + 0.6807189584f * g + 0.1074065790f * b);
        -206                final float s = cbrtPositive(0.0883097947f * r + 0.2818474174f * g + 0.6302613616f * b);
        -207
        -208                return NumberUtils.intBitsToFloat(
        -209                                      Math.min(Math.max((int)((0.2104542553f * l + 0.7936177850f * m - 0.0040720468f * s) * 255.999f         ), 0), 255)
        -210                                                | Math.min(Math.max((int)((1.9779984951f * l - 2.4285922050f * m + 0.4505937099f * s) * 127.999f + 127.5f), 0), 255) << 8
        -211                                                | Math.min(Math.max((int)((0.0259040371f * l + 0.7827717662f * m - 0.8086757660f * s) * 127.999f + 127.5f), 0), 255) << 16
        -212                                                | (rgba & 0xFE) << 24);
        -213        }
        -214
        -215        /**
        -216         * Takes a color encoded as an RGBA8888 packed float and converts to a packed float in the Oklab format this uses.
        -217         * @param packed a packed float in RGBA8888 format, with A in the MSB and R in the LSB
        -218         * @return a packed float as Oklab, which this class can use
        -219         */
        -220        public static float fromRGBA(final float packed) {
        -221                final int abgr = NumberUtils.floatToRawIntBits(packed);
        -222                final float r = forwardGamma((abgr & 0xFF) * 0x1.010101010101p-8f);
        -223                final float g = forwardGamma((abgr >>> 8 & 0xFF) * 0x1.010101010101p-8f);
        -224                final float b = forwardGamma((abgr >>> 16 & 0xFF) * 0x1.010101010101p-8f);
        -225                final float l = cbrtPositive(0.4121656120f * r + 0.5362752080f * g + 0.0514575653f * b);
        -226                final float m = cbrtPositive(0.2118591070f * r + 0.6807189584f * g + 0.1074065790f * b);
        -227                final float s = cbrtPositive(0.0883097947f * r + 0.2818474174f * g + 0.6302613616f * b);
        -228                return NumberUtils.intBitsToFloat(
        -229                                          Math.min(Math.max((int)((0.2104542553f * l + 0.7936177850f * m - 0.0040720468f * s) * 255.999f         ), 0), 255)
        -230                                                | Math.min(Math.max((int)((1.9779984951f * l - 2.4285922050f * m + 0.4505937099f * s) * 127.999f + 127.5f), 0), 255) << 8
        -231                                                | Math.min(Math.max((int)((0.0259040371f * l + 0.7827717662f * m - 0.8086757660f * s) * 127.999f + 127.5f), 0), 255) << 16
        -232                                                | (abgr & 0xFE000000));
        -233        }
        -234
        -235        // original multipliers for LMS when obtaining the non-shrunken A and B values:
        -236        //+0.2104542553 +0.7936177850 -0.0040720468
        -237        //+1.9779984951 -2.4285922050 +0.4505937099
        -238        //+0.0259040371 +0.7827717662 -0.8086757660
        -239
        -240        // shrunken multipliers:
        -241        //+0.2104542553 +0.7936177850 -0.0040720468
        -242        //+0.9889992500 -1.2142961000 +0.2252968500
        -243        //+0.0129520185 +0.3913858800 -0.4043378800
        -244
        -245        /**
        -246         * Takes a libGDX Color that uses RGBA8888 channels and converts to a packed float in the Oklab format this uses.
        -247         * @param color a libGDX RGBA8888 Color
        -248         * @return a packed float as Oklab, which this class can use
        -249         */
        -250        public static float fromColor(final Color color) {
        -251                final float r = forwardGamma(color.r);
        -252                final float g = forwardGamma(color.g);
        -253                final float b = forwardGamma(color.b);
        -254                final float l = cbrtPositive(0.4121656120f * r + 0.5362752080f * g + 0.0514575653f * b);
        -255                final float m = cbrtPositive(0.2118591070f * r + 0.6807189584f * g + 0.1074065790f * b);
        -256                final float s = cbrtPositive(0.0883097947f * r + 0.2818474174f * g + 0.6302613616f * b);
        -257                return NumberUtils.intBitsToFloat(
        -258                                          Math.min(Math.max((int)((0.2104542553f * l + 0.7936177850f * m - 0.0040720468f * s) * 255.999f         ), 0), 255)
        -259                                                | Math.min(Math.max((int)((1.9779984951f * l - 2.4285922050f * m + 0.4505937099f * s) * 127.999f + 127.5f), 0), 255) << 8
        -260                                                | Math.min(Math.max((int)((0.0259040371f * l + 0.7827717662f * m - 0.8086757660f * s) * 127.999f + 127.5f), 0), 255) << 16
        -261                                                | ((int)(color.a * 255f) << 24 & 0xFE000000));
        -262        }
        -263
        -264        /**
        -265         * Takes RGBA components from 0.0 to 1.0 each and converts to a packed float in the Oklab format this uses.
        -266         * @param r red, from 0.0 to 1.0 (both inclusive)
        -267         * @param g green, from 0.0 to 1.0 (both inclusive)
        -268         * @param b blue, from 0.0 to 1.0 (both inclusive)
        -269         * @param a alpha, from 0.0 to 1.0 (both inclusive)
        -270         * @return a packed float as Oklab, which this class can use
        -271         */
        -272        public static float fromRGBA(float r, float g, float b, final float a) {
        -273                r = forwardGamma(r);
        -274                g = forwardGamma(g);
        -275                b = forwardGamma(b);
        -276                final float l = cbrtPositive(0.4121656120f * r + 0.5362752080f * g + 0.0514575653f * b);
        -277                final float m = cbrtPositive(0.2118591070f * r + 0.6807189584f * g + 0.1074065790f * b);
        -278                final float s = cbrtPositive(0.0883097947f * r + 0.2818474174f * g + 0.6302613616f * b);
        -279                return NumberUtils.intBitsToFloat(
        -280                                          Math.min(Math.max((int)((0.2104542553f * l + 0.7936177850f * m - 0.0040720468f * s) * 255.999f         ), 0), 255)
        -281                                                | Math.min(Math.max((int)((1.9779984951f * l - 2.4285922050f * m + 0.4505937099f * s) * 127.999f + 127.5f), 0), 255) << 8
        -282                                                | Math.min(Math.max((int)((0.0259040371f * l + 0.7827717662f * m - 0.8086757660f * s) * 127.999f + 127.5f), 0), 255) << 16
        -283                                                | ((int)(a * 255f) << 24 & 0xFE000000));
        -284        }
        -285
        -286        /**
        -287         * Gets the red channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
        -288         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
        -289         * @return an int from 0 to 255, inclusive, representing the red channel value of the given encoded color
        -290         */
        -291        public static int redInt(final float encoded)
        -292        {
        -293                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        -294                final float L = (decoded & 0xff) / 255f;
        -295                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        -296                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        -297                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
        -298                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
        -299                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
        -300                return (int)(reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f)) * 255.999f);
        +129
        +130        /**
        +131         * Converts a packed float color in the format produced by {@link ColorTools#oklab(float, float, float, float)} to an RGBA8888 int.
        +132         * This format of int can be used with Pixmap and in some other places in libGDX.
        +133         * @param packed a packed float color, as produced by {@link ColorTools#oklab(float, float, float, float)}
        +134         * @return an RGBA8888 int color
        +135         */
        +136        public static int toRGBA8888(final float packed)
        +137        {
        +138                final int decoded = NumberUtils.floatToRawIntBits(packed);
        +139                final float L = (decoded & 0xff) / 255f;
        +140                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        +141                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        +142                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
        +143                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
        +144                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
        +145                final int r = (int)(reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f)) * 255.999f);
        +146                final int g = (int)(reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f)) * 255.999f);
        +147                final int b = (int)(reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f)) * 255.999f);
        +148                return r << 24 | g << 16 | b << 8 | (decoded & 0xfe000000) >>> 24 | decoded >>> 31;
        +149        }
        +150
        +151        /**
        +152         * Converts a packed float color in the format produced by {@link ColorTools#oklab(float, float, float, float)}
        +153         * to a packed float in RGBA format.
        +154         * This format of float can be used with the standard SpriteBatch and in some other places in libGDX.
        +155         * @param packed a packed float color, as produced by {@link ColorTools#oklab(float, float, float, float)}
        +156         * @return a packed float color as RGBA
        +157         */
        +158        public static float toRGBA(final float packed)
        +159        {
        +160                final int decoded = NumberUtils.floatToRawIntBits(packed);
        +161                final float L = (decoded & 0xff) / 255f;
        +162                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        +163                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        +164                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
        +165                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
        +166                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
        +167                final int r = (int)(reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f)) * 255.999f);
        +168                final int g = (int)(reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f)) * 255.999f);
        +169                final int b = (int)(reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f)) * 255.999f);
        +170                return NumberUtils.intBitsToFloat(r | g << 8 | b << 16 | (decoded & 0xfe000000));
        +171        }
        +172
        +173        /**
        +174         * Writes an Oklab-format packed float color (the format produced by {@link ColorTools#oklab(float, float, float, float)})
        +175         * into an RGBA8888 Color as used by libGDX (called {@code editing}).
        +176         * @param editing a libGDX color that will be filled in-place with an RGBA conversion of {@code packed}
        +177         * @param packed a packed float color, as produced by {@link ColorTools#oklab(float, float, float, float)}
        +178         * @return an RGBA8888 int color
        +179         */
        +180        public static Color toColor(Color editing, final float packed)
        +181        {
        +182                final int decoded = NumberUtils.floatToRawIntBits(packed);
        +183                final float L = (decoded & 0xff) / 255f;
        +184                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        +185                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        +186                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
        +187                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
        +188                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
        +189                editing.r = reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f));
        +190                editing.g = reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f));
        +191                editing.b = reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f));
        +192                editing.a = (decoded >>> 25) * 0x1.020408p-7f; // this is 1/127 as a float
        +193                return editing.clamp();
        +194        }
        +195
        +196        /**
        +197         * Writes an Oklab-format packed float color (the format produced by {@link ColorTools#oklab(float, float, float, float)})
        +198         * into an Oklab-format Color called {@code editing}. This is mostly useful if the rest of your application expects
        +199         * colors in Oklab format, such as because you use {@link Shaders#fragmentShaderOklab} or {@link ColorfulBatch}.
        +200         * <br>
        +201         * Internally, this simply calls {@link Color#abgr8888ToColor(Color, float)} and returns the edited Color.
        +202         * @param editing a libGDX Color that will be filled in-place with the color {@code oklab}, unchanged from its color space
        +203         * @param oklab a packed float color, as produced by {@link ColorTools#oklab(float, float, float, float)}
        +204         * @return an RGBA8888 int color
        +205         */
        +206        public static Color toOklabColor(Color editing, final float oklab){
        +207                Color.abgr8888ToColor(editing, oklab);
        +208                return editing;
        +209        }
        +210
        +211        /**
        +212         * Takes a color encoded as an RGBA8888 int and converts to a packed float in the Oklab format this uses.
        +213         * @param rgba an int with the channels (in order) red, green, blue, alpha; should have 8 bits per channel
        +214         * @return a packed float as Oklab, which this class can use
        +215         */
        +216        public static float fromRGBA8888(final int rgba) {
        +217                final float r = forwardGamma((rgba >>> 24) * 0x1.010101010101p-8f);
        +218                final float g = forwardGamma((rgba >>> 16 & 0xFF) * 0x1.010101010101p-8f);
        +219                final float b = forwardGamma((rgba >>> 8 & 0xFF) * 0x1.010101010101p-8f);
        +220
        +221                final float l = cbrtPositive(0.4121656120f * r + 0.5362752080f * g + 0.0514575653f * b);
        +222                final float m = cbrtPositive(0.2118591070f * r + 0.6807189584f * g + 0.1074065790f * b);
        +223                final float s = cbrtPositive(0.0883097947f * r + 0.2818474174f * g + 0.6302613616f * b);
        +224
        +225                return NumberUtils.intBitsToFloat(
        +226                                      Math.min(Math.max((int)((0.2104542553f * l + 0.7936177850f * m - 0.0040720468f * s) * 255.999f         ), 0), 255)
        +227                                                | Math.min(Math.max((int)((1.9779984951f * l - 2.4285922050f * m + 0.4505937099f * s) * 127.999f + 127.5f), 0), 255) << 8
        +228                                                | Math.min(Math.max((int)((0.0259040371f * l + 0.7827717662f * m - 0.8086757660f * s) * 127.999f + 127.5f), 0), 255) << 16
        +229                                                | (rgba & 0xFE) << 24);
        +230        }
        +231
        +232        /**
        +233         * Takes a color encoded as an RGBA8888 packed float and converts to a packed float in the Oklab format this uses.
        +234         * @param packed a packed float in RGBA8888 format, with A in the MSB and R in the LSB
        +235         * @return a packed float as Oklab, which this class can use
        +236         */
        +237        public static float fromRGBA(final float packed) {
        +238                final int abgr = NumberUtils.floatToRawIntBits(packed);
        +239                final float r = forwardGamma((abgr & 0xFF) * 0x1.010101010101p-8f);
        +240                final float g = forwardGamma((abgr >>> 8 & 0xFF) * 0x1.010101010101p-8f);
        +241                final float b = forwardGamma((abgr >>> 16 & 0xFF) * 0x1.010101010101p-8f);
        +242                final float l = cbrtPositive(0.4121656120f * r + 0.5362752080f * g + 0.0514575653f * b);
        +243                final float m = cbrtPositive(0.2118591070f * r + 0.6807189584f * g + 0.1074065790f * b);
        +244                final float s = cbrtPositive(0.0883097947f * r + 0.2818474174f * g + 0.6302613616f * b);
        +245                return NumberUtils.intBitsToFloat(
        +246                                          Math.min(Math.max((int)((0.2104542553f * l + 0.7936177850f * m - 0.0040720468f * s) * 255.999f         ), 0), 255)
        +247                                                | Math.min(Math.max((int)((1.9779984951f * l - 2.4285922050f * m + 0.4505937099f * s) * 127.999f + 127.5f), 0), 255) << 8
        +248                                                | Math.min(Math.max((int)((0.0259040371f * l + 0.7827717662f * m - 0.8086757660f * s) * 127.999f + 127.5f), 0), 255) << 16
        +249                                                | (abgr & 0xFE000000));
        +250        }
        +251
        +252        // original multipliers for LMS when obtaining the non-shrunken A and B values:
        +253        //+0.2104542553 +0.7936177850 -0.0040720468
        +254        //+1.9779984951 -2.4285922050 +0.4505937099
        +255        //+0.0259040371 +0.7827717662 -0.8086757660
        +256
        +257        // shrunken multipliers:
        +258        //+0.2104542553 +0.7936177850 -0.0040720468
        +259        //+0.9889992500 -1.2142961000 +0.2252968500
        +260        //+0.0129520185 +0.3913858800 -0.4043378800
        +261
        +262        /**
        +263         * Takes a libGDX Color that uses RGBA8888 channels and converts to a packed float in the Oklab format this uses.
        +264         * @param color a libGDX RGBA8888 Color
        +265         * @return a packed float as Oklab, which this class can use
        +266         */
        +267        public static float fromColor(final Color color) {
        +268                final float r = forwardGamma(color.r);
        +269                final float g = forwardGamma(color.g);
        +270                final float b = forwardGamma(color.b);
        +271                final float l = cbrtPositive(0.4121656120f * r + 0.5362752080f * g + 0.0514575653f * b);
        +272                final float m = cbrtPositive(0.2118591070f * r + 0.6807189584f * g + 0.1074065790f * b);
        +273                final float s = cbrtPositive(0.0883097947f * r + 0.2818474174f * g + 0.6302613616f * b);
        +274                return NumberUtils.intBitsToFloat(
        +275                                          Math.min(Math.max((int)((0.2104542553f * l + 0.7936177850f * m - 0.0040720468f * s) * 255.999f         ), 0), 255)
        +276                                                | Math.min(Math.max((int)((1.9779984951f * l - 2.4285922050f * m + 0.4505937099f * s) * 127.999f + 127.5f), 0), 255) << 8
        +277                                                | Math.min(Math.max((int)((0.0259040371f * l + 0.7827717662f * m - 0.8086757660f * s) * 127.999f + 127.5f), 0), 255) << 16
        +278                                                | ((int)(color.a * 255f) << 24 & 0xFE000000));
        +279        }
        +280
        +281        /**
        +282         * Takes RGBA components from 0.0 to 1.0 each and converts to a packed float in the Oklab format this uses.
        +283         * @param r red, from 0.0 to 1.0 (both inclusive)
        +284         * @param g green, from 0.0 to 1.0 (both inclusive)
        +285         * @param b blue, from 0.0 to 1.0 (both inclusive)
        +286         * @param a alpha, from 0.0 to 1.0 (both inclusive)
        +287         * @return a packed float as Oklab, which this class can use
        +288         */
        +289        public static float fromRGBA(float r, float g, float b, final float a) {
        +290                r = forwardGamma(r);
        +291                g = forwardGamma(g);
        +292                b = forwardGamma(b);
        +293                final float l = cbrtPositive(0.4121656120f * r + 0.5362752080f * g + 0.0514575653f * b);
        +294                final float m = cbrtPositive(0.2118591070f * r + 0.6807189584f * g + 0.1074065790f * b);
        +295                final float s = cbrtPositive(0.0883097947f * r + 0.2818474174f * g + 0.6302613616f * b);
        +296                return NumberUtils.intBitsToFloat(
        +297                                          Math.min(Math.max((int)((0.2104542553f * l + 0.7936177850f * m - 0.0040720468f * s) * 255.999f         ), 0), 255)
        +298                                                | Math.min(Math.max((int)((1.9779984951f * l - 2.4285922050f * m + 0.4505937099f * s) * 127.999f + 127.5f), 0), 255) << 8
        +299                                                | Math.min(Math.max((int)((0.0259040371f * l + 0.7827717662f * m - 0.8086757660f * s) * 127.999f + 127.5f), 0), 255) << 16
        +300                                                | ((int)(a * 255f) << 24 & 0xFE000000));
         301        }
         302
         303        /**
        -304         * Gets the green channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
        +304         * Gets the red channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
         305         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
        -306         * @return an int from 0 to 255, inclusive, representing the green channel value of the given encoded color
        +306         * @return an int from 0 to 255, inclusive, representing the red channel value of the given encoded color
         307         */
        -308        public static int greenInt(final float encoded)
        +308        public static int redInt(final float encoded)
         309        {
         310                final int decoded = NumberUtils.floatToRawIntBits(encoded);
         311                final float L = (decoded & 0xff) / 255f;
        @@ -327,15 +327,15 @@
         314                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
         315                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
         316                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
        -317                return (int)(reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f)) * 255.999f);
        +317                return (int)(reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f)) * 255.999f);
         318        }
         319
         320        /**
        -321         * Gets the blue channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
        +321         * Gets the green channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
         322         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
        -323         * @return an int from 0 to 255, inclusive, representing the blue channel value of the given encoded color
        +323         * @return an int from 0 to 255, inclusive, representing the green channel value of the given encoded color
         324         */
        -325        public static int blueInt(final float encoded)
        +325        public static int greenInt(final float encoded)
         326        {
         327                final int decoded = NumberUtils.floatToRawIntBits(encoded);
         328                final float L = (decoded & 0xff) / 255f;
        @@ -344,43 +344,43 @@
         331                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
         332                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
         333                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
        -334                return (int)(reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f)) * 255.999f);
        +334                return (int)(reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f)) * 255.999f);
         335        }
         336
         337        /**
        -338         * Gets the alpha channel value of the given encoded color, as an even int ranging from 0 to 254, inclusive. Because
        -339         * of how alpha is stored in libGDX, no odd-number values are possible for alpha.
        -340         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
        -341         * @return an even int from 0 to 254, inclusive, representing the alpha channel value of the given encoded color
        -342         */
        -343        public static int alphaInt(final float encoded)
        -344        {
        -345                return (NumberUtils.floatToRawIntBits(encoded) & 0xfe000000) >>> 24;
        -346        }
        -347
        -348        /**
        -349         * Gets the red channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
        -350         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
        -351         * @return a float from 0.0f to 1.0f, inclusive, representing the red channel value of the given encoded color
        -352         */
        -353        public static float red(final float encoded)
        -354        {
        -355                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        -356                final float L = (decoded & 0xff) / 255f;
        -357                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        -358                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        -359                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
        -360                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
        -361                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
        -362                return reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f));
        +338         * Gets the blue channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
        +339         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
        +340         * @return an int from 0 to 255, inclusive, representing the blue channel value of the given encoded color
        +341         */
        +342        public static int blueInt(final float encoded)
        +343        {
        +344                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        +345                final float L = (decoded & 0xff) / 255f;
        +346                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        +347                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        +348                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
        +349                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
        +350                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
        +351                return (int)(reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f)) * 255.999f);
        +352        }
        +353
        +354        /**
        +355         * Gets the alpha channel value of the given encoded color, as an even int ranging from 0 to 254, inclusive. Because
        +356         * of how alpha is stored in libGDX, no odd-number values are possible for alpha.
        +357         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
        +358         * @return an even int from 0 to 254, inclusive, representing the alpha channel value of the given encoded color
        +359         */
        +360        public static int alphaInt(final float encoded)
        +361        {
        +362                return (NumberUtils.floatToRawIntBits(encoded) & 0xfe000000) >>> 24;
         363        }
         364
         365        /**
        -366         * Gets the green channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
        +366         * Gets the red channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
         367         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
        -368         * @return a float from 0.0f to 1.0f, inclusive, representing the green channel value of the given encoded color
        +368         * @return a float from 0.0f to 1.0f, inclusive, representing the red channel value of the given encoded color
         369         */
        -370        public static float green(final float encoded)
        +370        public static float red(final float encoded)
         371        {
         372                final int decoded = NumberUtils.floatToRawIntBits(encoded);
         373                final float L = (decoded & 0xff) / 255f;
        @@ -389,15 +389,15 @@
         376                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
         377                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
         378                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
        -379                return reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f));
        +379                return reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f));
         380        }
         381
         382        /**
        -383         * Gets the blue channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
        +383         * Gets the green channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
         384         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
        -385         * @return a float from 0.0f to 1.0f, inclusive, representing the blue channel value of the given encoded color
        +385         * @return a float from 0.0f to 1.0f, inclusive, representing the green channel value of the given encoded color
         386         */
        -387        public static float blue(final float encoded)
        +387        public static float green(final float encoded)
         388        {
         389                final int decoded = NumberUtils.floatToRawIntBits(encoded);
         390                final float L = (decoded & 0xff) / 255f;
        @@ -406,838 +406,993 @@
         393                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
         394                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
         395                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
        -396                return reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f));
        +396                return reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f));
         397        }
         398
         399        /**
        -400         * Gets the alpha channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
        +400         * Gets the blue channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
         401         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
        -402         * @return a float from 0.0f to 1.0f, inclusive, representing the alpha channel value of the given encoded color
        +402         * @return a float from 0.0f to 1.0f, inclusive, representing the blue channel value of the given encoded color
         403         */
        -404        public static float alpha(final float encoded)
        +404        public static float blue(final float encoded)
         405        {
        -406                return ((NumberUtils.floatToRawIntBits(encoded) & 0xfe000000) >>> 24) * 0x1.020408p-8f;
        -407        }
        -408
        -409        /**
        -410         * Gets the "chroma" or "colorfulness" of a given Oklab color. Chroma is similar to saturation in that grayscale
        -411         * values have 0 saturation and 0 chroma, while brighter colors have high saturation and chroma. The difference is
        -412         * that colors that are perceptually more-colorful have higher chroma that colors that are perceptually
        -413         * less-colorful, regardless of hue, whereas saturation changes its range depending on how colorful a value can be
        -414         * at its hue. That is, the most saturated color always has a saturation of 1, but if that color isn't perceptually
        -415         * very colorful, it could have a chroma that is somewhat lower than 1. I don't yet know the range of this function,
        -416         * other than it can't be negative, grayscale values have 0 chroma, and the most colorful values should be near 1,
        -417         * maybe as high as the square root of 2.
        +406                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        +407                final float L = (decoded & 0xff) / 255f;
        +408                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        +409                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        +410                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
        +411                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
        +412                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
        +413                return reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f));
        +414        }
        +415
        +416        /**
        +417         * Gets the alpha channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
         418         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
        -419         * @return a non-negative float that represents how colorful the given value is
        +419         * @return a float from 0.0f to 1.0f, inclusive, representing the alpha channel value of the given encoded color
         420         */
        -421        public static float chroma(final float encoded) {
        -422                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        -423                final float a = ((decoded >>> 7 & 0x1FE) - 255) / 255f;
        -424                final float b = ((decoded >>> 15 & 0x1FE) - 255) / 255f;
        -425                return (float) Math.sqrt(a * a + b * b);
        -426        }
        -427        /**
        -428         * Gets a color as an Oklab packed float given floats representing hue, saturation, lightness, and opacity.
        -429         * All parameters should normally be between 0 and 1 inclusive, though any hue is tolerated (precision loss may
        -430         * affect the color if the hue is too large). A hue of 0 is red, progressively higher hue values go to orange,
        -431         * yellow, green, blue, and purple before wrapping around to red as it approaches 1. A saturation of 0 is grayscale,
        -432         * a saturation of 1 is brightly colored, and values close to 1 will usually appear more distinct than values close
        -433         * to 0, especially if the hue is different. A lightness of 0.001f or less is always black (also using a shortcut if
        -434         * this is the case, respecting opacity), while a lightness of 1f is white. Very bright colors are mostly in a band
        -435         * of high-saturation where lightness is 0.5f.
        -436         *
        -437         * @param hue        0f to 1f, color wheel position
        -438         * @param saturation 0f to 1f, 0f is grayscale and 1f is brightly colored
        -439         * @param lightness  0f to 1f, 0f is black and 1f is white
        -440         * @param opacity    0f to 1f, 0f is fully transparent and 1f is opaque
        -441         * @return a float encoding a color with the given properties
        -442         */
        -443        public static float floatGetHSL(float hue, float saturation, float lightness, float opacity) {
        -444                if (lightness <= 0.001f) {
        -445                        return NumberUtils.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x7F7F00);
        -446                } else {
        -447                        return fromRGBA(FloatColors.hsl2rgb(hue, saturation, lightness, opacity));
        -448                }
        -449        }
        -450
        -451        /**
        -452         * Gets the saturation of the given encoded color as HSL would calculate it, as a float ranging from 0.0f to 1.0f,
        -453         * inclusive. This is different from {@link #chroma(float)}; see that method's documentation for details.
        -454         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
        -455         * @return the saturation of the color from 0.0 (a grayscale color; inclusive) to 1.0 (a bright color, inclusive)
        -456         */
        -457        public static float saturation(final float encoded) {
        -458                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        -459                final float L = (decoded & 0xff) / 255f;
        -460                if(Math.abs(L - 0.5) > 0.495f) return 0f;
        -461                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        -462                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        -463                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
        -464                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
        -465                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
        -466                final float r = reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f));
        -467                final float g = reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f));
        -468                final float b = reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f));
        -469                float x, y, w;
        -470                if(g < b) {
        -471                        x = b;
        -472                        y = g;
        -473                }
        -474                else {
        -475                        x = g;
        -476                        y = b;
        -477                }
        -478                if(r < x) {
        -479                        w = r;
        -480                }
        -481                else {
        -482                        w = x;
        -483                        x = r;
        -484                }
        -485                return x - Math.min(w, y);
        -486        }
        -487
        -488        /**
        -489         * Defined as per HSL; normally you only need {@link #channelL(float)} to get accurate lightness for Oklab.
        -490         * This ranges from 0.0f (black) to 1.0f (white).
        -491         * @param encoded a packed float Oklab color
        -492         * @return the lightness of the given color as HSL would calculate it
        -493         */
        -494        public static float lightness(final float encoded) {
        -495                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        -496                final float L = (decoded & 0xff) / 255f;
        -497                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        -498                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        -499                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
        -500                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
        -501                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
        -502                final float r = reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f));
        -503                final float g = reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f));
        -504                final float b = reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f));
        -505                float x, y, w;
        -506                if(g < b) {
        -507                        x = b;
        -508                        y = g;
        -509                }
        -510                else {
        -511                        x = g;
        -512                        y = b;
        -513                }
        -514                if(r < x) {
        -515                        w = r;
        +421        public static float alpha(final float encoded)
        +422        {
        +423                return ((NumberUtils.floatToRawIntBits(encoded) & 0xfe000000) >>> 24) * 0x1.020408p-8f;
        +424        }
        +425
        +426        /**
        +427         * Gets the "chroma" or "colorfulness" of a given Oklab color. Chroma is similar to saturation in that grayscale
        +428         * values have 0 saturation and 0 chroma, while brighter colors have high saturation and chroma. The difference is
        +429         * that colors that are perceptually more-colorful have higher chroma than colors that are perceptually
        +430         * less-colorful, regardless of hue, whereas saturation changes its meaning depending on the hue and lightness. That
        +431         * is, the most saturated color for a given hue and lightness always has a saturation of 1, but if that color
        +432         * isn't perceptually very colorful (as is the case for very dark and very light colors), it will have a chroma that
        +433         * is much lower than the maximum. The result of this method can't be negative, grayscale values have very close to
        +434         * 0 chroma, and the most colorful values (all very close to magenta) should have 0.31613f chroma.
        +435         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
        +436         * @return a float between 0.0f and 0.31613f that represents how colorful the given value is
        +437         */
        +438        public static float chroma(final float encoded) {
        +439                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        +440                final float a = ((decoded >>> 7 & 0x1FE) - 255) / 510f;
        +441                final float b = ((decoded >>> 15 & 0x1FE) - 255) / 510f;
        +442                return (float) Math.sqrt(a * a + b * b);
        +443        }
        +444
        +445        /**
        +446         * Given a hue and lightness, this gets the (approximate) maximum chroma possible for that hue-lightness
        +447         * combination. This is useful to know the bounds of {@link #chroma(float)}. This should be no greater
        +448         * than 0.31613f .
        +449         * @param hue the hue, typically between 0.0f and 1.0f, to look up
        +450         * @param lightness the lightness, clamped between 0.0f and 1.0f, to look up
        +451         * @return the maximum possible chroma for the given hue and lightness, between 0.0f and 0.31613f
        +452         */
        +453        public static float chromaLimit(final float hue, final float lightness){
        +454                final int idx = (int) (Math.min(Math.max(lightness, 0f), 1f) * 255.999f) << 8
        +455                                | (int) (256f * (hue - MathUtils.floor(hue)));
        +456                return GAMUT_DATA[idx] * 0x1p-8f;
        +457        }
        +458
        +459        /**
        +460         * Gets a color as an Oklab packed float given floats representing hue, saturation, lightness, and opacity.
        +461         * All parameters should normally be between 0 and 1 inclusive, though any hue is tolerated (precision loss may
        +462         * affect the color if the hue is too large). A hue of 0 is red, progressively higher hue values go to orange,
        +463         * yellow, green, blue, and purple before wrapping around to red as it approaches 1. A saturation of 0 is grayscale,
        +464         * a saturation of 1 is brightly colored, and values close to 1 will usually appear more distinct than values close
        +465         * to 0, especially if the hue is different. A lightness of 0.001f or less is always black (also using a shortcut if
        +466         * this is the case, respecting opacity), while a lightness of 1f is white. Very bright colors are mostly in a band
        +467         * of high-saturation where lightness is 0.5f.
        +468         * <br>
        +469         * This method considers its hue, saturation, and lightness parameters as the HSL color space does. You may instead
        +470         * want the method {@link #oklabByHSL(float, float, float, float)}, which treats lightness exactly as Oklab does,
        +471         * and handles hue and saturation with the Oklab color solid (which is shaped oddly) instead of the HSL color solid
        +472         * (which is a bicone, with a wide cone pointing up attached at the base to another wide cone pointing down).
        +473         * Using oklabByHSL() should be faster in many cases, and the lightness handling alone may be a reason to use it.
        +474         * There is also {@link #oklabByHCL(float, float, float, float)}, which may be preferable if you want a specific
        +475         * amount of chroma (colorful-ness) and no greater.
        +476         *
        +477         * @param hue        0f to 1f, color wheel position
        +478         * @param saturation 0f to 1f, 0f is grayscale and 1f is brightly colored
        +479         * @param lightness  0f to 1f, 0f is black and 1f is white
        +480         * @param opacity    0f to 1f, 0f is fully transparent and 1f is opaque
        +481         * @return a float encoding a color with the given properties
        +482         */
        +483        public static float floatGetHSL(float hue, float saturation, float lightness, float opacity) {
        +484                if (lightness <= 0.001f) {
        +485                        return NumberUtils.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x7F7F00);
        +486                } else {
        +487                        return fromRGBA(FloatColors.hsl2rgb(hue, saturation, lightness, opacity));
        +488                }
        +489        }
        +490
        +491        /**
        +492         * Gets the saturation of the given encoded color as HSL would calculate it, as a float ranging from 0.0f to 1.0f,
        +493         * inclusive. This is different from {@link #chroma(float)}; see that method's documentation for details. It is also
        +494         * different from {@link #oklabSaturation(float)}, which gets the saturation as Oklab understands it rather than how
        +495         * HSL understands it.
        +496         *
        +497         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
        +498         * @return the saturation of the color from 0.0 (a grayscale color; inclusive) to 1.0 (a bright color, inclusive)
        +499         */
        +500        public static float saturation(final float encoded) {
        +501                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        +502                final float L = (decoded & 0xff) / 255f;
        +503                if(Math.abs(L - 0.5) > 0.495f) return 0f;
        +504                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        +505                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        +506                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
        +507                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
        +508                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
        +509                final float r = reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f));
        +510                final float g = reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f));
        +511                final float b = reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f));
        +512                float x, y, w;
        +513                if(g < b) {
        +514                        x = b;
        +515                        y = g;
         516                }
         517                else {
        -518                        w = x;
        -519                        x = r;
        +518                        x = g;
        +519                        y = b;
         520                }
        -521                float d = x - Math.min(w, y);
        -522                return x * (1f - 0.5f * d / (x + 1e-10f));
        -523        }
        -524
        -525        /**
        -526         * Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased)
        -527         * to 1f (exclusive, red and approaching purple if decreased).
        -528         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
        -529         * @return The hue of the color from 0.0 (red, inclusive) towards orange, then yellow, and
        -530         * eventually to purple before looping back to almost the same red (1.0, exclusive)
        -531         */
        -532        public static float hue(final float encoded) {
        -533                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        -534                final float L = (decoded & 0xff) / 255f;
        -535                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        -536                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        -537                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
        -538                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
        -539                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
        -540                final float r = reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f));
        -541                final float g = reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f));
        -542                final float b = reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f));
        -543                float x, y, z, w;
        -544                if(g < b) {
        -545                        x = b;
        -546                        y = g;
        -547                        z = -1f;
        -548                        w = 2f / 3f;
        -549                }
        -550                else {
        -551                        x = g;
        -552                        y = b;
        -553                        z = 0f;
        -554                        w = -1f / 3f;
        -555                }
        -556                if(r < x) {
        -557                        z = w;
        -558                        w = r;
        -559                }
        -560                else {
        -561                        w = x;
        -562                        x = r;
        -563                }
        -564                float d = x - Math.min(w, y);
        -565                return Math.abs(z + (w - y) / (6f * d + 1e-10f));
        -566        }
        -567
        -568        /**
        -569         * The "L" channel of the given packed float in Oklab format, which is its lightness; ranges from 0.0f to
        -570         * 1.0f . You can edit the L of a color with {@link #lighten(float, float)} and {@link #darken(float, float)}.
        -571         *
        -572         * @param encoded a color encoded as a packed float, as by {@link #oklab(float, float, float, float)}
        -573         * @return the L value as a float from 0.0f to 1.0f
        -574         */
        -575        public static float channelL(final float encoded)
        -576        {
        -577                return (NumberUtils.floatToRawIntBits(encoded) & 0xff) / 255f;
        -578        }
        -579
        -580        /**
        -581         * The "A" channel of the given packed float in Oklab format, which when combined with the B channel describes the
        -582         * hue and saturation of a color; ranges from 0f to 1f . If A is 0f, the color will be cooler, more green or
        -583         * blue; if A is 1f, the color will be warmer, from magenta to orange. You can edit the A of a color with
        -584         * {@link #raiseA(float, float)} and {@link #lowerA(float, float)}.
        -585         * @param encoded a color encoded as a packed float, as by {@link #oklab(float, float, float, float)}
        -586         * @return the A value as a float from 0.0f to 1.0f
        -587         */
        -588        public static float channelA(final float encoded)
        -589        {
        -590                return ((NumberUtils.floatToRawIntBits(encoded) >>> 8 & 0xff)) / 255f;
        -591        }
        -592
        -593        /**
        -594         * The "B" channel of the given packed float in Oklab format, which when combined with the A channel describes the
        -595         * hue and saturation of a color; ranges from 0f to 1f . If B is 0f, the color will be more "artificial", more
        -596         * blue or purple; if B is 1f, the color will be more "natural", from green to yellow to orange. You can edit
        -597         * the B of a color with {@link #raiseB(float, float)} and {@link #lowerB(float, float)}.
        -598         * @param encoded a color encoded as a packed float, as by {@link #oklab(float, float, float, float)}
        -599         * @return the B value as a float from 0.0f to 1.0f
        -600         */
        -601        public static float channelB(final float encoded)
        -602        {
        -603                return ((NumberUtils.floatToRawIntBits(encoded) >>> 16 & 0xff)) / 255f;
        -604        }
        -605
        -606        /**
        -607         * Gets a variation on the packed float color basis as another packed float that has its hue, saturation, lightness,
        -608         * and opacity adjusted by the specified amounts. Note that this edits the color in HSL space, not Oklab! Takes
        -609         * floats representing the amounts of change to apply to hue, saturation, lightness, and opacity; these can be
        -610         * between -1f and 1f. Returns a float that can be used as a packed or encoded color with methods like
        -611         * {@link com.badlogic.gdx.graphics.g2d.Batch#setPackedColor(float)}. The float is likely to be different than the
        -612         * result of {@link #oklab(float, float, float, float)} unless hue, saturation, lightness, and opacity are all 0.
        -613         * This won't allocate any objects.
        -614         * <br>
        -615         * The parameters this takes all specify additive changes for a color component, clamping the final values so they
        -616         * can't go above 1 or below 0, with an exception for hue, which can rotate around if lower or higher hues would be
        -617         * used. As an example, if you give this 0.4f for saturation, and the current color has saturation 0.7f, then the
        -618         * resulting color will have 1f for saturation. If you gave this -0.1f for saturation and the current color again
        -619         * has saturation 0.7f, then resulting color will have 0.6f for saturation.
        -620         *
        -621         * @param basis      a packed float color that will be used as the starting point to make the next color
        -622         * @param hue        -1f to 1f, the hue change that can be applied to the new float color (not clamped, wraps)
        -623         * @param saturation -1f to 1f, the saturation change that can be applied to the new float color
        -624         * @param light      -1f to 1f, the light/brightness change that can be applied to the new float color
        -625         * @param opacity    -1f to 1f, the opacity/alpha change that can be applied to the new float color
        -626         * @return a float encoding a variation of basis with the given changes
        -627         */
        -628        public static float toEditedFloat(float basis, float hue, float saturation, float light, float opacity) {
        -629                final int decoded = NumberUtils.floatToRawIntBits(basis);
        -630                final float L = Math.min(Math.max(light + (decoded & 0xff) / 255f, 0f), 1f);
        -631                opacity = Math.min(Math.max(opacity + (decoded >>> 24 & 0xfe) * 0x1.020408p-8f, 0f), 1f);
        -632                if (L <= 0.001f)
        -633                        return NumberUtils.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x808000);
        -634                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        -635                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        -636                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
        -637                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
        -638                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
        -639                final float r = reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f));
        -640                final float g = reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f));
        -641                final float b = reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f));
        -642                float x, y, z, w;
        -643                if(g < b) {
        -644                        x = b;
        -645                        y = g;
        -646                        z = -1f;
        -647                        w = 2f / 3f;
        -648                }
        -649                else {
        -650                        x = g;
        -651                        y = b;
        -652                        z = 0f;
        -653                        w = -1f / 3f;
        -654                }
        -655                if(r < x) {
        -656                        z = w;
        -657                        w = r;
        -658                }
        -659                else {
        -660                        w = x;
        -661                        x = r;
        -662                }
        -663                final float d = x - Math.min(w, y);
        -664                final float lum = x * (1f - 0.5f * d / (x + 1e-10f));
        -665                hue += Math.abs(z + (w - y) / (6f * d + 1e-10f)) + 1f;
        -666                saturation += (x - lum) / (Math.min(lum, 1f - lum) + 1e-10f);
        -667                return fromRGBA(FloatColors.hsl2rgb(hue - (int)hue, Math.min(Math.max(saturation, 0f), 1f), lum, opacity));
        -668        }
        -669
        -670        /**
        -671         * Interpolates from the packed float color start towards white by change. While change should be between 0f (return
        -672         * start as-is) and 1f (return white), start should be a packed color, as from
        -673         * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
        -674         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
        -675         * white. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is.
        -676         * @see #darken(float, float) the counterpart method that darkens a float color
        -677         * @param start the starting color as a packed float
        -678         * @param change how much to go from start toward white, as a float between 0 and 1; higher means closer to white
        -679         * @return a packed float that represents a color between start and white
        -680         */
        -681        public static float lighten(final float start, final float change) {
        -682                final int s = NumberUtils.floatToRawIntBits(start), i = s & 0xFF, other = s & 0xFEFFFF00;
        -683                return NumberUtils.intBitsToFloat(((int) (i + (0xFF - i) * change) & 0xFF) | other);
        -684        }
        -685
        -686        /**
        -687         * Interpolates from the packed float color start towards black by change. While change should be between 0f (return
        -688         * start as-is) and 1f (return black), start should be a packed color, as from
        -689         * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
        -690         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
        -691         * black. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is.
        -692         * @see #lighten(float, float) the counterpart method that lightens a float color
        -693         * @param start the starting color as a packed float
        -694         * @param change how much to go from start toward black, as a float between 0 and 1; higher means closer to black
        -695         * @return a packed float that represents a color between start and black
        -696         */
        -697        public static float darken(final float start, final float change) {
        -698                final int s = NumberUtils.floatToRawIntBits(start), i = s & 0xFF, other = s & 0xFEFFFF00;
        -699                return NumberUtils.intBitsToFloat(((int) (i * (1f - change)) & 0xFF) | other);
        -700        }
        -701
        -702        /**
        -703         * Interpolates from the packed float color start towards a warmer color (orange to magenta) by change. While change
        -704         * should be between 0f (return start as-is) and 1f (return fully warmed), start should be a packed color, as from
        -705         * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors,
        -706         * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to
        -707         * lerp towards a warmer color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the
        -708         * alpha and L of start as-is.
        -709         * @see #lowerA(float, float) the counterpart method that cools a float color
        -710         * @param start the starting color as a packed float
        -711         * @param change how much to warm start, as a float between 0 and 1; higher means a warmer result
        -712         * @return a packed float that represents a color between start and a warmer color
        -713         */
        -714        public static float raiseA(final float start, final float change) {
        -715                final int s = NumberUtils.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF;
        -716                return NumberUtils.intBitsToFloat(((int) (p + (0xFF - p) * change) << 8 & 0xFF00) | other);
        -717        }
        -718
        -719        /**
        -720         * Interpolates from the packed float color start towards a cooler color (green to blue) by change. While change
        -721         * should be between 0f (return start as-is) and 1f (return fully cooled), start should be a packed color, as from
        -722         * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
        -723         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp
        -724         * towards a cooler color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and
        -725         * L of start as-is.
        -726         * @see #raiseA(float, float) the counterpart method that warms a float color
        -727         * @param start the starting color as a packed float
        -728         * @param change how much to cool start, as a float between 0 and 1; higher means a cooler result
        -729         * @return a packed float that represents a color between start and a cooler color
        -730         */
        -731        public static float lowerA(final float start, final float change) {
        -732                final int s = NumberUtils.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF;
        -733                return NumberUtils.intBitsToFloat(((int) (p * (1f - change)) & 0xFF) << 8 | other);
        -734        }
        -735
        -736        /**
        -737         * Interpolates from the packed float color start towards a "natural" color (between green and orange) by change.
        -738         * While change should be between 0f (return start as-is) and 1f (return fully natural), start should be a packed color, as
        -739         * from {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary
        -740         * Colors, and is a little more efficient and clear than using
        -741         * {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards a more natural color. Unlike
        -742         * {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and L of start as-is.
        -743         * @see #lowerB(float, float) the counterpart method that makes a float color less natural
        +521                if(r < x) {
        +522                        w = r;
        +523                }
        +524                else {
        +525                        w = x;
        +526                        x = r;
        +527                }
        +528                return x - Math.min(w, y);
        +529        }
        +530
        +531        /**
        +532         * Defined as per HSL; normally you only need {@link #channelL(float)} to get accurate lightness for Oklab. You can
        +533         * also use {@link #oklabLightness(float)}, which is an alias for channelL(). This ranges from 0.0f (black) to 1.0f
        +534         * (white).
        +535         *
        +536         * @param encoded a packed float Oklab color
        +537         * @return the lightness of the given color as HSL would calculate it
        +538         */
        +539        public static float lightness(final float encoded) {
        +540                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        +541                final float L = (decoded & 0xff) / 255f;
        +542                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        +543                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        +544                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
        +545                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
        +546                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
        +547                final float r = reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f));
        +548                final float g = reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f));
        +549                final float b = reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f));
        +550                float x, y, w;
        +551                if(g < b) {
        +552                        x = b;
        +553                        y = g;
        +554                }
        +555                else {
        +556                        x = g;
        +557                        y = b;
        +558                }
        +559                if(r < x) {
        +560                        w = r;
        +561                }
        +562                else {
        +563                        w = x;
        +564                        x = r;
        +565                }
        +566                float d = x - Math.min(w, y);
        +567                return x * (1f - 0.5f * d / (x + 1e-10f));
        +568        }
        +569
        +570        /**
        +571         * Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased)
        +572         * to 1f (exclusive, red and approaching purple if decreased). You can also use {@link #oklabHue(float)}, which
        +573         * positions the different hues at different values, somewhat, from this, but is more accurate to how Oklab handles
        +574         * hues.
        +575         *
        +576         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
        +577         * @return The hue of the color from 0.0 (red, inclusive) towards orange, then yellow, and
        +578         * eventually to purple before looping back to almost the same red (1.0, exclusive)
        +579         */
        +580        public static float hue(final float encoded) {
        +581                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        +582                final float L = (decoded & 0xff) / 255f;
        +583                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        +584                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        +585                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
        +586                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
        +587                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
        +588                final float r = reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f));
        +589                final float g = reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f));
        +590                final float b = reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f));
        +591                float x, y, z, w;
        +592                if(g < b) {
        +593                        x = b;
        +594                        y = g;
        +595                        z = -1f;
        +596                        w = 2f / 3f;
        +597                }
        +598                else {
        +599                        x = g;
        +600                        y = b;
        +601                        z = 0f;
        +602                        w = -1f / 3f;
        +603                }
        +604                if(r < x) {
        +605                        z = w;
        +606                        w = r;
        +607                }
        +608                else {
        +609                        w = x;
        +610                        x = r;
        +611                }
        +612                float d = x - Math.min(w, y);
        +613                return Math.abs(z + (w - y) / (6f * d + 1e-10f));
        +614        }
        +615
        +616        /**
        +617         * The "L" channel of the given packed float in Oklab format, which is its lightness; ranges from 0.0f to
        +618         * 1.0f . You can edit the L of a color with {@link #lighten(float, float)} and {@link #darken(float, float)}.
        +619         *
        +620         * @param encoded a color encoded as a packed float, as by {@link #oklab(float, float, float, float)}
        +621         * @return the L value as a float from 0.0f to 1.0f
        +622         */
        +623        public static float channelL(final float encoded)
        +624        {
        +625                return (NumberUtils.floatToRawIntBits(encoded) & 0xff) / 255f;
        +626        }
        +627
        +628        /**
        +629         * The "A" channel of the given packed float in Oklab format, which when combined with the B channel describes the
        +630         * hue and saturation of a color; ranges from 0f to 1f . If A is 0f, the color will be cooler, more green or
        +631         * blue; if A is 1f, the color will be warmer, from magenta to orange. You can edit the A of a color with
        +632         * {@link #raiseA(float, float)} and {@link #lowerA(float, float)}.
        +633         * @param encoded a color encoded as a packed float, as by {@link #oklab(float, float, float, float)}
        +634         * @return the A value as a float from 0.0f to 1.0f
        +635         */
        +636        public static float channelA(final float encoded)
        +637        {
        +638                return ((NumberUtils.floatToRawIntBits(encoded) >>> 8 & 0xff)) / 255f;
        +639        }
        +640
        +641        /**
        +642         * The "B" channel of the given packed float in Oklab format, which when combined with the A channel describes the
        +643         * hue and saturation of a color; ranges from 0f to 1f . If B is 0f, the color will be more "artificial", more
        +644         * blue or purple; if B is 1f, the color will be more "natural", from green to yellow to orange. You can edit
        +645         * the B of a color with {@link #raiseB(float, float)} and {@link #lowerB(float, float)}.
        +646         * @param encoded a color encoded as a packed float, as by {@link #oklab(float, float, float, float)}
        +647         * @return the B value as a float from 0.0f to 1.0f
        +648         */
        +649        public static float channelB(final float encoded)
        +650        {
        +651                return ((NumberUtils.floatToRawIntBits(encoded) >>> 16 & 0xff)) / 255f;
        +652        }
        +653
        +654        /**
        +655         * Gets a variation on the packed float color basis as another packed float that has its hue, saturation, lightness,
        +656         * and opacity adjusted by the specified amounts. Note that this edits the color in HSL space, not Oklab! Takes
        +657         * floats representing the amounts of change to apply to hue, saturation, lightness, and opacity; these can be
        +658         * between -1f and 1f. Returns a float that can be used as a packed or encoded color with methods like
        +659         * {@link com.badlogic.gdx.graphics.g2d.Batch#setPackedColor(float)}. The float is likely to be different than the
        +660         * result of {@link #oklab(float, float, float, float)} unless hue, saturation, lightness, and opacity are all 0.
        +661         * This won't allocate any objects.
        +662         * <br>
        +663         * The parameters this takes all specify additive changes for a color component, clamping the final values so they
        +664         * can't go above 1 or below 0, with an exception for hue, which can rotate around if lower or higher hues would be
        +665         * used. As an example, if you give this 0.4f for saturation, and the current color has saturation 0.7f, then the
        +666         * resulting color will have 1f for saturation. If you gave this -0.1f for saturation and the current color again
        +667         * has saturation 0.7f, then resulting color will have 0.6f for saturation.
        +668         * <br>
        +669         * You may want {@link #editOklab(float, float, float, float, float, float, float, float, float)} instead, which
        +670         * adjusts the L, A, B, and alpha channels directly instead of converting to HSL and back.
        +671         *
        +672         * @param basis      a packed float color that will be used as the starting point to make the next color
        +673         * @param hue        -1f to 1f, the hue change that can be applied to the new float color (not clamped, wraps)
        +674         * @param saturation -1f to 1f, the saturation change that can be applied to the new float color
        +675         * @param light      -1f to 1f, the light/brightness change that can be applied to the new float color
        +676         * @param opacity    -1f to 1f, the opacity/alpha change that can be applied to the new float color
        +677         * @return a float encoding a variation of basis with the given changes
        +678         */
        +679        public static float toEditedFloat(float basis, float hue, float saturation, float light, float opacity) {
        +680                final int decoded = NumberUtils.floatToRawIntBits(basis);
        +681                final float L = Math.min(Math.max(light + (decoded & 0xff) / 255f, 0f), 1f);
        +682                opacity = Math.min(Math.max(opacity + (decoded >>> 24 & 0xfe) * 0x1.020408p-8f, 0f), 1f);
        +683                if (L <= 0.001f)
        +684                        return NumberUtils.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x808000);
        +685                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        +686                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        +687                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
        +688                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
        +689                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
        +690                final float r = reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f));
        +691                final float g = reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f));
        +692                final float b = reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f));
        +693                float x, y, z, w;
        +694                if(g < b) {
        +695                        x = b;
        +696                        y = g;
        +697                        z = -1f;
        +698                        w = 2f / 3f;
        +699                }
        +700                else {
        +701                        x = g;
        +702                        y = b;
        +703                        z = 0f;
        +704                        w = -1f / 3f;
        +705                }
        +706                if(r < x) {
        +707                        z = w;
        +708                        w = r;
        +709                }
        +710                else {
        +711                        w = x;
        +712                        x = r;
        +713                }
        +714                final float d = x - Math.min(w, y);
        +715                final float lum = x * (1f - 0.5f * d / (x + 1e-10f));
        +716                hue += Math.abs(z + (w - y) / (6f * d + 1e-10f)) + 1f;
        +717                saturation += (x - lum) / (Math.min(lum, 1f - lum) + 1e-10f);
        +718                return fromRGBA(FloatColors.hsl2rgb(hue - (int)hue, Math.min(Math.max(saturation, 0f), 1f), lum, opacity));
        +719        }
        +720
        +721        /**
        +722         * Interpolates from the packed float color start towards white by change. While change should be between 0f (return
        +723         * start as-is) and 1f (return white), start should be a packed color, as from
        +724         * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
        +725         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
        +726         * white. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is.
        +727         * @see #darken(float, float) the counterpart method that darkens a float color
        +728         * @param start the starting color as a packed float
        +729         * @param change how much to go from start toward white, as a float between 0 and 1; higher means closer to white
        +730         * @return a packed float that represents a color between start and white
        +731         */
        +732        public static float lighten(final float start, final float change) {
        +733                final int s = NumberUtils.floatToRawIntBits(start), i = s & 0xFF, other = s & 0xFEFFFF00;
        +734                return NumberUtils.intBitsToFloat(((int) (i + (0xFF - i) * change) & 0xFF) | other);
        +735        }
        +736
        +737        /**
        +738         * Interpolates from the packed float color start towards black by change. While change should be between 0f (return
        +739         * start as-is) and 1f (return black), start should be a packed color, as from
        +740         * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
        +741         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
        +742         * black. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is.
        +743         * @see #lighten(float, float) the counterpart method that lightens a float color
         744         * @param start the starting color as a packed float
        -745         * @param change how much to change start to a natural color, as a float between 0 and 1; higher means a more natural result
        -746         * @return a packed float that represents a color between start and a more natural color
        +745         * @param change how much to go from start toward black, as a float between 0 and 1; higher means closer to black
        +746         * @return a packed float that represents a color between start and black
         747         */
        -748        public static float raiseB(final float start, final float change) {
        -749                final int s = NumberUtils.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF;
        -750                return NumberUtils.intBitsToFloat(((int) (t + (0xFF - t) * change) << 16 & 0xFF0000) | other);
        +748        public static float darken(final float start, final float change) {
        +749                final int s = NumberUtils.floatToRawIntBits(start), i = s & 0xFF, other = s & 0xFEFFFF00;
        +750                return NumberUtils.intBitsToFloat(((int) (i * (1f - change)) & 0xFF) | other);
         751        }
         752
         753        /**
        -754         * Interpolates from the packed float color start towards an "artificial" color (between blue and purple) by change.
        -755         * While change should be between 0f (return start as-is) and 1f (return fully artificial), start should be a packed color, as
        -756         * from {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary
        -757         * Colors, and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp
        -758         * towards a more artificial color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the
        +754         * Interpolates from the packed float color start towards a warmer color (orange to magenta) by change. While change
        +755         * should be between 0f (return start as-is) and 1f (return fully warmed), start should be a packed color, as from
        +756         * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors,
        +757         * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to
        +758         * lerp towards a warmer color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the
         759         * alpha and L of start as-is.
        -760         * @see #raiseB(float, float) the counterpart method that makes a float color less artificial
        +760         * @see #lowerA(float, float) the counterpart method that cools a float color
         761         * @param start the starting color as a packed float
        -762         * @param change how much to change start to a bolder color, as a float between 0 and 1; higher means a more artificial result
        -763         * @return a packed float that represents a color between start and a more artificial color
        +762         * @param change how much to warm start, as a float between 0 and 1; higher means a warmer result
        +763         * @return a packed float that represents a color between start and a warmer color
         764         */
        -765        public static float lowerB(final float start, final float change) {
        -766                final int s = NumberUtils.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF;
        -767                return NumberUtils.intBitsToFloat(((int) (t * (1f - change)) & 0xFF) << 16 | other);
        +765        public static float raiseA(final float start, final float change) {
        +766                final int s = NumberUtils.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF;
        +767                return NumberUtils.intBitsToFloat(((int) (p + (0xFF - p) * change) << 8 & 0xFF00) | other);
         768        }
         769
         770        /**
        -771         * Interpolates from the packed float color start towards that color made opaque by change. While change should be
        -772         * between 0f (return start as-is) and 1f (return start with full alpha), start should be a packed color, as from
        +771         * Interpolates from the packed float color start towards a cooler color (green to blue) by change. While change
        +772         * should be between 0f (return start as-is) and 1f (return fully cooled), start should be a packed color, as from
         773         * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
        -774         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
        -775         * transparent. This won't change the L, A, or B of the color.
        -776         * @see #fade(float, float) the counterpart method that makes a float color more translucent
        -777         * @param start the starting color as a packed float
        -778         * @param change how much to go from start toward opaque, as a float between 0 and 1; higher means closer to opaque
        -779         * @return a packed float that represents a color between start and its opaque version
        -780         */
        -781        public static float blot(final float start, final float change) {
        -782                final int s = NumberUtils.floatToRawIntBits(start), opacity = s >>> 24 & 0xFE, other = s & 0x00FFFFFF;
        -783                return NumberUtils.intBitsToFloat(((int) (opacity + (0xFE - opacity) * change) & 0xFE) << 24 | other);
        -784        }
        -785
        -786        /**
        -787         * Interpolates from the packed float color start towards transparent by change. While change should be between 0
        -788         * (return start as-is) and 1f (return the color with 0 alpha), start should be a packed color, as from
        -789         * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors,
        -790         * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
        -791         * transparent. This won't change the L, A, or B of the color.
        -792         * @see #blot(float, float) the counterpart method that makes a float color more opaque
        -793         * @param start the starting color as a packed float
        -794         * @param change how much to go from start toward transparent, as a float between 0 and 1; higher means closer to transparent
        -795         * @return a packed float that represents a color between start and transparent
        -796         */
        -797        public static float fade(final float start, final float change) {
        -798                final int s = NumberUtils.floatToRawIntBits(start), opacity = s & 0xFE, other = s & 0x00FFFFFF;
        -799                return NumberUtils.intBitsToFloat(((int) (opacity * (1f - change)) & 0xFE) << 24 | other);
        -800        }
        -801
        -802        /**
        -803         * Brings the chromatic components of {@code start} closer to grayscale by {@code change} (desaturating them). While
        -804         * change should be between 0f (return start as-is) and 1f (return fully gray), start should be a packed color, as
        -805         * from {@link #oklab(float, float, float, float)}. This only changes A and B; it leaves L and alpha alone, unlike
        -806         * {@link #lessenChange(float, float)}, which usually changes L.
        -807         * @see #enrich(float, float) the counterpart method that makes a float color more saturated
        -808         * @param start the starting color as a packed float
        -809         * @param change how much to change start to a desaturated color, as a float between 0 and 1; higher means a less saturated result
        -810         * @return a packed float that represents a color between start and a desaturated color
        -811         */
        -812        public static float dullen(final float start, final float change) {
        -813                final int s = NumberUtils.floatToRawIntBits(start);
        -814                return oklab((s & 0xFF) / 255f,
        -815                                ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f,
        -816                                ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f,
        -817                                (s >>> 25) / 127f);
        -818        }
        -819
        -820        /**
        -821         * Pushes the chromatic components of {@code start} away from grayscale by change (saturating them). While change
        -822         * should be between 0f (return start as-is) and 1f (return maximally saturated), start should be a packed color, as
        -823         * from {@link #oklab(float, float, float, float)}. This changes only A and B. Higher values for {@code change} can
        -824         * force the color out of the gamut, which this corrects using {@link #limitToGamut(float, float, float, float)}.
        -825         * The alpha never changes.
        -826         * @see #dullen(float, float) the counterpart method that makes a float color less saturated
        -827         * @param start the starting color as a packed float
        -828         * @param change how much to change start to a saturated color, as a float between 0 and 1; higher means a more saturated result
        -829         * @return a packed float that represents a color between start and a saturated color
        -830         */
        -831        public static float enrich(final float start, final float change) {
        -832                final int s = NumberUtils.floatToRawIntBits(start);
        -833                return limitToGamut((s & 0xFF) / 255f,
        -834                                ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f,
        -835                                ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f,
        -836                                (s >>> 25) / 127f);
        -837        }
        -838
        -839
        -840        /**
        -841         * Given a packed float Oklab color {@code mainColor} and another Oklab color that it should be made to contrast with,
        -842         * gets a packed float Oklab color with roughly inverted L but the same chromatic channels and opacity (A and B
        -843         * are likely to be clamped if the result gets close to white or black). This won't ever produce black or other very
        -844         * dark colors, and also has a gap in the range it produces for L values between 0.5 and 0.55. That allows
        -845         * most of the colors this method produces to contrast well as a foreground when displayed on a background of
        -846         * {@code contrastingColor}, or vice versa. This will leave the L unchanged if the chromatic channels of the
        -847         * contrastingColor and those of the mainColor are already very different. This has nothing to do with the contrast
        -848         * channel of the tweak in ColorfulBatch; where that part of the tweak can make too-similar lightness values further
        -849         * apart by just a little, this makes a modification on {@code mainColor} to maximize its lightness difference from
        -850         * {@code contrastingColor} without losing its other qualities.
        -851         * @param mainColor a packed float color, as produced by {@link #oklab(float, float, float, float)};
        -852         *                     this is the color that will be adjusted
        -853         * @param contrastingColor a packed float color, as produced by {@link #oklab(float, float, float, float)};
        -854         *                            the adjusted mainColor will contrast with this
        -855         * @return a different Oklab packed float color, based on mainColor but with potentially very different lightness
        -856         */
        -857        public static float inverseLightness(final float mainColor, final float contrastingColor)
        -858        {
        -859                final int bits = NumberUtils.floatToRawIntBits(mainColor),
        -860                                contrastBits = NumberUtils.floatToRawIntBits(contrastingColor),
        -861                                L = (bits & 0xff),
        -862                                A = (bits >>> 8 & 0xff),
        -863                                B = (bits >>> 16 & 0xff),
        -864                                cL = (contrastBits & 0xff),
        -865                                cA = (contrastBits >>> 8 & 0xff),
        -866                                cB = (contrastBits >>> 16 & 0xff);
        -867                if((A - cA) * (A - cA) + (B - cB) * (B - cB) >= 0x10000)
        -868                        return mainColor;
        -869                return NumberUtils.intBitsToFloat((bits & 0xFEFFFF00) | (int) (cL < 128 ? L * 0.45f + 140 : 127 - L * 0.45f));
        -870        }
        -871
        -872        /**
        -873         * Given a packed float Oklab color {@code mainColor} and another Oklab color that it should be made to contrast
        -874         * with, gets a packed float Oklab color with L that should be quite different from {@code contrastingColor}'s L,
        -875         * but the same chromatic channels and opacity (A and B are likely to be clamped if the result gets close to white
        -876         * or black). This allows most of the colors this method produces to contrast well as a foreground when displayed on
        -877         * a background of {@code contrastingColor}, or vice versa.
        -878         * <br>
        -879         * This is similar to {@link #inverseLightness(float, float)}, but is considerably simpler, and this method will
        -880         * change the lightness of mainColor when the two given colors have close lightness but distant chroma. Because it
        -881         * averages the original L of mainColor with the modified one, this tends to not produce harsh color changes.
        -882         * @param mainColor a packed Oklab float color; this is the color that will be adjusted
        -883         * @param contrastingColor a packed Oklab float color; the adjusted mainColor will contrast with the L of this
        -884         * @return a different packed Oklab float color, based on mainColor but typically with different lightness
        -885         */
        -886        public static float differentiateLightness(final float mainColor, final float contrastingColor)
        -887        {
        -888                final int main = NumberUtils.floatToRawIntBits(mainColor), contrast = NumberUtils.floatToRawIntBits(contrastingColor);
        -889                return limitToGamut(NumberUtils.intBitsToFloat((main & 0xFEFFFF00) | (contrast + 128 & 0xFF) + (main & 0xFF) >>> 1));
        -890        }
        -891
        -892        /**
        -893         * Pretty simple; adds 0.5 to the given color's L and wraps it around if it would go above 1.0, then averages that
        -894         * with the original L. This means light colors become darker, and dark colors become lighter, with almost all
        -895         * results in the middle-range of possible lightness.
        -896         * @param mainColor a packed Oklab float color
        -897         * @return a different packed Oklab float color, with its L channel changed and limited to the correct gamut
        -898         */
        -899        public static float offsetLightness(final float mainColor) {
        -900                final int oklab = NumberUtils.floatToRawIntBits(mainColor);
        -901                return limitToGamut(NumberUtils.intBitsToFloat((oklab & 0xFEFFFF00) | (oklab + 128 & 0xFF) + (oklab & 0xFF) >>> 1));
        -902        }
        -903
        -904        /**
        -905         * Makes the additive Oklab color stored in {@code color} cause less of a change when used as a tint, as if it were
        -906         * mixed with neutral gray. When {@code fraction} is 1.0, this returns color unchanged; when fraction is 0.0, it
        -907         * returns {@link Palette#GRAY}, and when it is in-between 0.0 and 1.0 it returns something between the two. This is
        -908         * meant for things like area of effect abilities that make smaller color changes toward their periphery.
        -909         * @param color a color that should have its tinting effect potentially weakened
        -910         * @param fraction how much of {@code color} should be kept, from 0.0 to 1.0
        -911         * @return an Oklab float color between gray and {@code color}
        -912         */
        -913        public static float lessenChange(final float color, float fraction) {
        -914                final int e = NumberUtils.floatToRawIntBits(color),
        -915                                sL = 0x80, sA = 0x80, sB = 0x80, sAlpha = 0xFE,
        -916                                eL = (e & 0xFF), eA = (e >>> 8) & 0xFF, eB = (e >>> 16) & 0xFF, eAlpha = e >>> 24 & 0xFE;
        -917                return NumberUtils.intBitsToFloat(((int) (sL + fraction * (eL - sL)) & 0xFF)
        -918                                | (((int) (sA + fraction * (eA - sA)) & 0xFF) << 8)
        -919                                | (((int) (sB + fraction * (eB - sB)) & 0xFF) << 16)
        -920                                | (((int) (sAlpha + fraction * (eAlpha - sAlpha)) & 0xFE) << 24));
        +774         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp
        +775         * towards a cooler color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and
        +776         * L of start as-is.
        +777         * @see #raiseA(float, float) the counterpart method that warms a float color
        +778         * @param start the starting color as a packed float
        +779         * @param change how much to cool start, as a float between 0 and 1; higher means a cooler result
        +780         * @return a packed float that represents a color between start and a cooler color
        +781         */
        +782        public static float lowerA(final float start, final float change) {
        +783                final int s = NumberUtils.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF;
        +784                return NumberUtils.intBitsToFloat(((int) (p * (1f - change)) & 0xFF) << 8 | other);
        +785        }
        +786
        +787        /**
        +788         * Interpolates from the packed float color start towards a "natural" color (between green and orange) by change.
        +789         * While change should be between 0f (return start as-is) and 1f (return fully natural), start should be a packed color, as
        +790         * from {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary
        +791         * Colors, and is a little more efficient and clear than using
        +792         * {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards a more natural color. Unlike
        +793         * {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and L of start as-is.
        +794         * @see #lowerB(float, float) the counterpart method that makes a float color less natural
        +795         * @param start the starting color as a packed float
        +796         * @param change how much to change start to a natural color, as a float between 0 and 1; higher means a more natural result
        +797         * @return a packed float that represents a color between start and a more natural color
        +798         */
        +799        public static float raiseB(final float start, final float change) {
        +800                final int s = NumberUtils.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF;
        +801                return NumberUtils.intBitsToFloat(((int) (t + (0xFF - t) * change) << 16 & 0xFF0000) | other);
        +802        }
        +803
        +804        /**
        +805         * Interpolates from the packed float color start towards an "artificial" color (between blue and purple) by change.
        +806         * While change should be between 0f (return start as-is) and 1f (return fully artificial), start should be a packed color, as
        +807         * from {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary
        +808         * Colors, and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp
        +809         * towards a more artificial color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the
        +810         * alpha and L of start as-is.
        +811         * @see #raiseB(float, float) the counterpart method that makes a float color less artificial
        +812         * @param start the starting color as a packed float
        +813         * @param change how much to change start to a bolder color, as a float between 0 and 1; higher means a more artificial result
        +814         * @return a packed float that represents a color between start and a more artificial color
        +815         */
        +816        public static float lowerB(final float start, final float change) {
        +817                final int s = NumberUtils.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF;
        +818                return NumberUtils.intBitsToFloat(((int) (t * (1f - change)) & 0xFF) << 16 | other);
        +819        }
        +820
        +821        /**
        +822         * Interpolates from the packed float color start towards that color made opaque by change. While change should be
        +823         * between 0f (return start as-is) and 1f (return start with full alpha), start should be a packed color, as from
        +824         * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
        +825         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
        +826         * transparent. This won't change the L, A, or B of the color.
        +827         * @see #fade(float, float) the counterpart method that makes a float color more translucent
        +828         * @param start the starting color as a packed float
        +829         * @param change how much to go from start toward opaque, as a float between 0 and 1; higher means closer to opaque
        +830         * @return a packed float that represents a color between start and its opaque version
        +831         */
        +832        public static float blot(final float start, final float change) {
        +833                final int s = NumberUtils.floatToRawIntBits(start), opacity = s >>> 24 & 0xFE, other = s & 0x00FFFFFF;
        +834                return NumberUtils.intBitsToFloat(((int) (opacity + (0xFE - opacity) * change) & 0xFE) << 24 | other);
        +835        }
        +836
        +837        /**
        +838         * Interpolates from the packed float color start towards transparent by change. While change should be between 0
        +839         * (return start as-is) and 1f (return the color with 0 alpha), start should be a packed color, as from
        +840         * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors,
        +841         * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
        +842         * transparent. This won't change the L, A, or B of the color.
        +843         * @see #blot(float, float) the counterpart method that makes a float color more opaque
        +844         * @param start the starting color as a packed float
        +845         * @param change how much to go from start toward transparent, as a float between 0 and 1; higher means closer to transparent
        +846         * @return a packed float that represents a color between start and transparent
        +847         */
        +848        public static float fade(final float start, final float change) {
        +849                final int s = NumberUtils.floatToRawIntBits(start), opacity = s & 0xFE, other = s & 0x00FFFFFF;
        +850                return NumberUtils.intBitsToFloat(((int) (opacity * (1f - change)) & 0xFE) << 24 | other);
        +851        }
        +852
        +853        /**
        +854         * Brings the chromatic components of {@code start} closer to grayscale by {@code change} (desaturating them). While
        +855         * change should be between 0f (return start as-is) and 1f (return fully gray), start should be a packed color, as
        +856         * from {@link #oklab(float, float, float, float)}. This only changes A and B; it leaves L and alpha alone, unlike
        +857         * {@link #lessenChange(float, float)}, which usually changes L.
        +858         * @see #enrich(float, float) the counterpart method that makes a float color more saturated
        +859         * @param start the starting color as a packed float
        +860         * @param change how much to change start to a desaturated color, as a float between 0 and 1; higher means a less saturated result
        +861         * @return a packed float that represents a color between start and a desaturated color
        +862         */
        +863        public static float dullen(final float start, final float change) {
        +864                final int s = NumberUtils.floatToRawIntBits(start);
        +865                return oklab((s & 0xFF) / 255f,
        +866                                ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f,
        +867                                ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f,
        +868                                (s >>> 25) / 127f);
        +869        }
        +870
        +871        /**
        +872         * Pushes the chromatic components of {@code start} away from grayscale by change (saturating them). While change
        +873         * should be between 0f (return start as-is) and 1f (return maximally saturated), start should be a packed color, as
        +874         * from {@link #oklab(float, float, float, float)}. This changes only A and B. Higher values for {@code change} can
        +875         * force the color out of the gamut, which this corrects using {@link #limitToGamut(float, float, float, float)}.
        +876         * The alpha never changes.
        +877         * @see #dullen(float, float) the counterpart method that makes a float color less saturated
        +878         * @param start the starting color as a packed float
        +879         * @param change how much to change start to a saturated color, as a float between 0 and 1; higher means a more saturated result
        +880         * @return a packed float that represents a color between start and a saturated color
        +881         */
        +882        public static float enrich(final float start, final float change) {
        +883                final int s = NumberUtils.floatToRawIntBits(start);
        +884                return limitToGamut((s & 0xFF) / 255f,
        +885                                ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f,
        +886                                ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f,
        +887                                (s >>> 25) / 127f);
        +888        }
        +889
        +890
        +891        /**
        +892         * Given a packed float Oklab color {@code mainColor} and another Oklab color that it should be made to contrast with,
        +893         * gets a packed float Oklab color with roughly inverted L but the same chromatic channels and opacity (A and B
        +894         * are likely to be clamped if the result gets close to white or black). This won't ever produce black or other very
        +895         * dark colors, and also has a gap in the range it produces for L values between 0.5 and 0.55. That allows
        +896         * most of the colors this method produces to contrast well as a foreground when displayed on a background of
        +897         * {@code contrastingColor}, or vice versa. This will leave the L unchanged if the chromatic channels of the
        +898         * contrastingColor and those of the mainColor are already very different. This has nothing to do with the contrast
        +899         * channel of the tweak in ColorfulBatch; where that part of the tweak can make too-similar lightness values further
        +900         * apart by just a little, this makes a modification on {@code mainColor} to maximize its lightness difference from
        +901         * {@code contrastingColor} without losing its other qualities.
        +902         * @param mainColor a packed float color, as produced by {@link #oklab(float, float, float, float)};
        +903         *                     this is the color that will be adjusted
        +904         * @param contrastingColor a packed float color, as produced by {@link #oklab(float, float, float, float)};
        +905         *                            the adjusted mainColor will contrast with this
        +906         * @return a different Oklab packed float color, based on mainColor but with potentially very different lightness
        +907         */
        +908        public static float inverseLightness(final float mainColor, final float contrastingColor)
        +909        {
        +910                final int bits = NumberUtils.floatToRawIntBits(mainColor),
        +911                                contrastBits = NumberUtils.floatToRawIntBits(contrastingColor),
        +912                                L = (bits & 0xff),
        +913                                A = (bits >>> 8 & 0xff),
        +914                                B = (bits >>> 16 & 0xff),
        +915                                cL = (contrastBits & 0xff),
        +916                                cA = (contrastBits >>> 8 & 0xff),
        +917                                cB = (contrastBits >>> 16 & 0xff);
        +918                if((A - cA) * (A - cA) + (B - cB) * (B - cB) >= 0x10000)
        +919                        return mainColor;
        +920                return NumberUtils.intBitsToFloat((bits & 0xFEFFFF00) | (int) (cL < 128 ? L * 0.45f + 140 : 127 - L * 0.45f));
         921        }
         922
         923        /**
        -924         * Makes a quasi-randomly-edited variant on the given {@code color}, allowing typically a small amount of
        -925         * {@code variance} (such as 0.05 to 0.25) between the given color and what this can return. The {@code seed} should
        -926         * be different each time this is called, and can be obtained from a random number generator to make the colors more
        -927         * random, or can be incremented on each call. If the seed is only incremented or decremented, then this shouldn't
        -928         * produce two similar colors in a row unless variance is very small. The variance affects the L, A, and B of the
        -929         * generated color, and each of those channels can go up or down by the given variance as long as the total distance
        -930         * isn't greater than the variance (this considers A and B extra-wide, going from -1 to 1, while L goes from 0 to 1,
        -931         * but only internally for measuring distance).
        -932         * @param color a packed float color, as produced by {@link #oklab(float, float, float, float)}
        -933         * @param seed a long seed that should be different on each call; should not be 0
        -934         * @param variance max amount of difference between the given color and the generated color; always less than 1
        -935         * @return a generated packed float color that should be at least somewhat different from {@code color}
        +924         * Given a packed float Oklab color {@code mainColor} and another Oklab color that it should be made to contrast
        +925         * with, gets a packed float Oklab color with L that should be quite different from {@code contrastingColor}'s L,
        +926         * but the same chromatic channels and opacity (A and B are likely to be clamped if the result gets close to white
        +927         * or black). This allows most of the colors this method produces to contrast well as a foreground when displayed on
        +928         * a background of {@code contrastingColor}, or vice versa.
        +929         * <br>
        +930         * This is similar to {@link #inverseLightness(float, float)}, but is considerably simpler, and this method will
        +931         * change the lightness of mainColor when the two given colors have close lightness but distant chroma. Because it
        +932         * averages the original L of mainColor with the modified one, this tends to not produce harsh color changes.
        +933         * @param mainColor a packed Oklab float color; this is the color that will be adjusted
        +934         * @param contrastingColor a packed Oklab float color; the adjusted mainColor will contrast with the L of this
        +935         * @return a different packed Oklab float color, based on mainColor but typically with different lightness
         936         */
        -937        public static float randomEdit(final float color, long seed, final float variance) {
        -938                final int decoded = NumberUtils.floatToRawIntBits(color);
        -939                final float L = (decoded & 0xff) / 255f;
        -940                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        -941                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        -942                final float limit = variance * variance;
        -943                float dist, x, y, z;
        -944                for (int j = 0; j < 50; j++) {
        -945                        x = (((seed * 0xD1B54A32D192ED03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
        -946                        y = (((seed * 0xABC98388FB8FAC03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
        -947                        z = (((seed * 0x8CB92BA72F3D8DD7L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
        -948                        seed += 0x9E3779B97F4A7C15L;
        -949                        dist = x * x + y * y + z * z;
        -950                        if(dist <= limit && inGamut(x += L, y = (A + y) * 0.5f + 0.5f, z = (B + z) * 0.5f + 0.5f))
        -951                                return NumberUtils.intBitsToFloat((decoded & 0xFE000000) | ((int)(z * 255.5f) << 16 & 0xFF0000)
        -952                                        | ((int)(y * 255.5f) << 8 & 0xFF00) | (int)(x * 255.5f));
        -953                }
        -954                return color;
        -955        }
        -956
        -957        private static byte[] GAMUT_DATA;
        -958
        -959        static {
        -960                try {
        -961                        GAMUT_DATA = (new StringBuilder().append("\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\001\001\001\001\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\003\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\003\003\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\003\003\003\004\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\004\004\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\003\003\003\003\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\004\004\005\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\004\004\004\005\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\004\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\004\004\004\004\005\006\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\004\004\004\004\004\005\005\006\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\005\005\005\006\007\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\005\005\005\005\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\005\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\005\005\005\006\006\007\n\n\n\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\005\005\005\006\006\007\b\013\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\005\005\005\005\006\006\006\007\b\013\013\013\013\013\013\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\006\005\005\005\005\005\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\005\005\005\005\006\006\006\007\b\t\f\f\f\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\006\006\006\006\006\005\005\005\005\005\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\005\005\005\005\005\006\006\006\007\007\b\t\r\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\007\007\007\007\b\b\b\b\b\b\b\b\b\b\007\007\007\006\006\006\006\006\006\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\006\006\006\007\007\b\b\n\r\r\r\r\r\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\007\006\006\006\006\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\006\006\006\007\007\b\b\t\n\016\016\016\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\007\007\007\006\006\006\006\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\006\006\006\006\007\007\007\b\t\t\013\017\016\016\016\016\016\016\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\007\007\007\007\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\007\007\007\007\007\007\006\006\006\006\006\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\006\006\006\006\007\007\007\b\b\t\n\013\017\017\017\017\017\016\016\016\016\016\016\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\007\007\007\007\007\b\007\007\007\007\006\006\006\006\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\006\006\006\006\006\007\007\007\b\b\t\t\n\f\020\020\020\017\017\017\017\017\017\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\n\n\n\n\n\n\n\n\t\t\t\t\n\n\n\n\n\n\n\n\n\n\t\t\t\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\007\007\007\007\006\006\006\006\006\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\006\006\006\006\006\007\007\007\b\b\b\t\n\013\f\021\021\020\020\020\020\020\017\017\017\017\017\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\b\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\b\b\b\007\007\007\007\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\007\007\007\b\b\b\t\t\n\013\r\021\021\021\021\021\020\020\020\020\020\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\n\n\n\t\t\t\b\b\b\b\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\b\b\b\b\t\b\b\b\007\007\007\007\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\007\007\007\b\b\b\t\t\n\013\f\r\022\022\022\021\021\021\021\021\020\020\020\020\020\020\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\n\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\n\n\n\t\t\t\b\b\b\b\b\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\b\b\b\b\t\t\t\b\b\b\007\007\007\007\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\007\007\007\007\007\b\b\t\t\n\n\013\f\016\023\023\022\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\n\n\n\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\b\b\b\b\b\t\t\t\t\t\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\t\t\n\013\013\f\016\024\023\023\023\023\022\022\022\022\021\021\021\021\021\021\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\f\f\f\f\f\f\f\f\013\013\013\013\f\f\f\f\f\f\f\f\f\f\013\013\n\n\n\t\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\b\b\b\b\b\t\t\t\n\t\t\t\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\t\t\n\n\013\f\r\017\024\024\024\023\023\023\023\022\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\013\013\n\n\n\t\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\b\b\b\b\b\t\t\t\t\n\n\n\t\t\t\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\t\t\n\n\013\013\f\r\017\025\025\024\024\024\024\023\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\f\f\013\013\n\n\n\t\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\t\t\t\t\n\n\n\n\n\t\t\t\b\b\b\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\b\t\t\t\n\n\013\f\r\016\020\026\025\025\025\024\024\024\024\024\023\023\023\023\023\022\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\f\f\013\013\013\n\n\n\t\t\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\t\t\t\t\n\n\n\013\n\n\n\t\t\b\b\b\b\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\b\t\t\t\n\n\013\013\f\r\016\020\026\026\026\025\025\025\025\024\024\024\024\023\023\023\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\f\f\013\013\013\n\n\n\t\t\t\t\t\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\013\013\013\n\n\t\t\t\b\b\b\b\b\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\b\b\b\b\t\t\t\n\n\013\013\f\r\r\017\021\027\027\026\026\026\026\025\025\025\025\024\024\024\024\023\023\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\r\r\r\r\016\016\016\016\016\016\016\016\r\r\r\r\016\016\016\016\016\016\016\016\016\016\r\r\f\f\013\013\013\n\n\n\n\t\t\t\t\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\013\013\013\013\013\n\n\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\b\b\b\b\t\t\t\t\n\n\013\013\f\r\016\017\021\030\027\027\027\026\026\026\026\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\r\r\f\f\013\013\013\n\n\n\n\t\t\t\t\t\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\n\013\013\013\f\013\013\n\n\n\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\b\b\b\b\t\t\t\t\n\n\013\013\f\f\r\016\020\022\030\030\030\027\027\027\027\026\026\026\026\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\022\022\022\022\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\016\r\r\f\f\f\013\013\013\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\f\013\013\n\n\n\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\b\b\b\b\b\t\t\t\n\n\n\013\013\f\r\016\017\020\022\031\031\030\030\030\027\027\027\027\026\026\026\026\025\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\016\016\r\r\f\f\f\013\013\013\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\f\f\f\013\013\n\n\n\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\t\t\t\n\n\n\013\013\f\f\r\016\017\021\023\032\031\031\031\030\030\030\030\027\027\027\027\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\016\016\r\r\f\f\f\013\013\013\n\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\f\r\f\f\013\013\n\n\n\t\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\t\t\t\t\n\n\n\013\013\f\f\r\016\016\020\021\023\032\032\032\031\031\031\030\030\030\030\027\027\027\027\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\017\017\017\020\020\020\020\020\020\020\020\017\017\017\017\020\020\020\020\020\020\020\020\020\020\017\017\016\r\r\r\f\f\f\013\013\013\n\n\n\n\n\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\r\r\r\f\f\013\013\n\n\n\t\t\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\t\t\t\t\n\n\n\013\013\013\f\f\r\016\017\020\021\024\033\033\032\032\032\031\031\031\031\030\030\030\027\027\027\027\027\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\017\017\016\016\r\r\r\f\f\f\013\013\013\n\n\n\n\n\n\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\f\r\r\r\f\f\013\013\013\n\n\n\t\t\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\t\t\t\t\t\n\n\n\013\013\f\f\r\r\016\017\020\022\024\034\033\033\033\032\032\032\031\031\031\031\030\030\030\030\027\027\027\027\027\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\020\020\020\020\020\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\020\017\017\016\016\r\r\f\f\f\f\013\013\013\013\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\013\013\013\013\f\f\f\r\r\016\r\r\f\f\013\013\013\n\n\n\t\t\t\t\t\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\013\013\013\f\r\r\016\017\020\021\022\025\035\034\034\033\033\033\032\032\032\031\031\031\031\030\030\030\030\030\027\027\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\020\020\017\017\016\016\r\r\f\f\f\f\013\013\013\013\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\016\016\016\r\r\f\f\013\013\013\n\n\n\t\t\t\t\t\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\013\013\013\f\f\r\r\016\017\020\021\023\025\035\035\034\034\034\033\033\033\032\032\032\032\031\031\031\031\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\020\017\017\016\016\r\r\r\f\f\f\f\013\013\013\013\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\r\016\016\016\r\r\f\f\013\013\013\n\n\n\n\t\t\t\t\t\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\013\013\013\f\f\r\r\016\016\017\020\022\023\026\036\035\035\035\034\034\034\033\033\033\032\032\032\032\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\021\021\022\022\022\022\022\022\022\022\021\021\021\021\022\022\022\022\022\022\022\022\022\022\021\020\020\017\017\016\016\r\r\r\f\f\f\f\013\013\013\013\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\r\016\016\017\016\016\r\r\f\f\013\013\013\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\r\r\016\017\020\021\022\024\026\037\036\036\035\035\035\034\034\034\033\033\033\032\032\032\032\031\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\021\021\020\020\017\017\016\016\r\r\r\f\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\f\r\r\r\016\016\017\017\017\016\r\r\f\f\f\013\013\013\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\r\r\016\016\017\020\021\022\024\027\037\037\036\036\036\035\035\035\034\034\034\033\033\033\033\032\032\032\032\031\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\022\022\022\022\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\022\021\021\020\017\017\016\016\016\r\r\r\f\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\f\r\r\r\016\016\016\017\017\017\016\016\r\r\f\f\f\013\013\013\n\n\n\n\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\f\r\r\016\017\020\020\021\023\025\027  \037\037\036\036\036\035\035\035\034\034\034\033\033\033\033\032\032\032\032\031\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\026\026\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\022\022\021\020\020\017\017\016\016\016\r\r\r\f\f\f\f\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\f\f\f\f\r\r\r\016\016\016\017\017\020\017\017\016\016\r\r\f\f\013\013\013\013\n\n\n\n\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\f\r\r\016\016\017\020\021\022\023\025\030!  \037\037\037\036\036\036\035\035\035\034\034\034\033\033\033\033\032\032\032\032\032\031\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\023\023\022\021\021\020\020\017\017\016\016\016\r\r\r\f\f\f\f\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\f\f\f\f\r\r\r\r\016\016\017\017\017\020\020\017\016\016\r\r\f\f\f\013\013\013\013\n\n\n\n\n\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\r\r\r\016\017\017\020\021\022\024\025\030!!   \037\037\037\036\036\035\035\035\035\034\034\034\034\033\033\033\033\032\032\032\032\032\031\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\023\024\024\024\024\024\024\024\024\023\023\023\023\024\024\024\024\024\024\024\024\024\024\023\022\022\021\020\020\017\017\017\016\016\r\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\f\f\f\f\r\r\r\r\016\016\016\017\017\020\020\020\017\017\016\016\r\r\f\f\f\013\013\013\013\n\n\n\n\n\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\f\r\r\016\016\017\020\021\021\023\024\026\031\"\"!!   \037\037\036\036\036\035\035\035\035\034\034\034\034\033\033\033\033\032\032\032\032\032\031\031\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\023\023\022\021\021\020\020\017\017\016\016\016\r\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\r\016\016\016\017\017\020\020\021\020\020\017\016\016\r\r\r\f\f\f\013\013\013\013\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\f\r\r\016\016\017\017\020\021\022\023\024\026\031#\"\"!!!  \037\037\037\036\036\036\035\035\035\035\034\034\034\034\033\033\033\033\033\032\032\032\032\032\031\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\024\024\024\024\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\024\023\022\022\021\021\020\020\017\017\016\016\016\r\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\r\016\016\016\017\017\020\020\020\021\021\020\017\017\016\016\r\r\f\f\f\013\013\013\013\013\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\f\r\r\r\016\016\017\020\020\021\022\023\025\027\032##\"\"\"!!   \037\037\037\036\036\036\036\035\035\035\034\034\034\034\034\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\024\023\023\022\021\021\020\020\017\017\017\016\016\016\r\r\r\r\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\r\r\r\r\016\016\016\017\017\017\020\020\021\021\021\020\020\017\016\016\r\r\r\f\f\f\013\013\013\013\013\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\016\016\017\017\020\021\022\023\024\025\027\032$$##\"\"!!!   \037\037\037\036\036\036\036\035\035\035\035\034\034\034\034\033\033\033\033\033\032\032\032\032\032\031\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\027\027\026\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\025\025\024\023\022\022\021\021\020\020\017\017\017\016\016\016\r\r\r\r\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\r\r\r\r\016\016\016\017\017\017\020\020\021\021\022\021\021\020\017\017\016\016\r\r\r\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\r\016\016\017\020\020\021\022\023\024\026\030\033%$$##\"\"\"!!!   \037\037\037\036\036\036\036\035\035\035\035\034\034\034\034\034\033\033\033\033\033\032\032\032\032\032\031\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\025\026\026\026\026\026\026\026\026\025\025\025\025\026\026\026\026\026\026\026\026\026\026\025\024\023\023\022\022\021\020\020\020\017\017\017\016\016\016\r\r\r\r\r\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\r\r\r\r\016\016\016\016\017\017\020\020\020\021\021\022\022\021\020\020\017\016\016\016\r\r\f\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\r\016\016\017\017\020\021\021\022\023\025\026\030\033&%$$$##\"\"\"!!    \037\037\037\036\036\036\036\035\035\035\035\034\034\034\034\034\033\033\033\033\033\032\032\032\032\032\031\031\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\025\025\024\023\022\022\021\021\020\020\020\017\017\016\016\016\016\r\r\r\r\r\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\016\017\017\017\020\020\021\021\022\022\022\021\020\020\017\017\016\016\r\r\r\f\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\f\r\r\016\016\016\017\017\020\021\022\023\024\025\027\031\034&&%%$$###\"\"!!!    \037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\026\026\026\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\026\025\024\023\023\022\022\021\021\020\020\017\017\017\016\016\016\016\r\r\r\r\r\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\016\017\017\017\020\020\021\021\022\022\023\022\022\021\020\020\017\017\016\016\r\r\r\f\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\f\r\r\r\016\016\017\017\020\020\021\022\023\024\025\027\031\034'&&%%$$$##\"\"\"!!!    \037\037\037\037\036\036\036\036\035\035\035\035\034\034\034\034\034\033\033\033\033\033\032\032\032\032\032\031\031\031\031\031\031\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\026\025\024\024\023\022\022\021\021\020\020\020\017\017\017\016\016\016\016\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\016\016\016\016\017\017\017\020\020\020\021\021\022\022\023\023\022\021\020\020\017\017\016\016\016\r\r\r\f\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\f\r\r\r\016\016\016\017\017\020\021\021\022\023\024\026\027\031\035(''&&%%$$###\"\"\"!!!    \037\037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\033\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\027\027\026\025\024\023\023\022\022\021\021\020\020\020\017\017\017\016\016\016\016\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\016\016\016\016\017\017\017\020\020\020\021\021\022\022\023\023\023\022\021\021\020\020\017\017\016\016\r\r\r\f\f\f\f\f\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\f\f\f\f\r\r\r\r\016\016\017\017\020\020\021\022\023\024\025\026\030\032\035((''&&%%$$$###\"\"\"!!!    \037\037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\033\033\033\033\033\032\032\032\032\032\031\031\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\027\027\027\027\030\030\030\030\030\030\030\030\030\030\027\026\025\024\024\023\023\022\022\021\021\020\020\020\017\017\017\016\016\016\016\016\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\016\016\016\016\017\017\017\017\020\020\021\021\021\022\022\023\024\023\022\022\021\020\020\017\017\016\016\016\r\r\r\f\f\f\f\f\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\f\f\f\f\f\r\r\r\016\016\017\017\017\020\021\021\022\023\024\025\026\030\032\036)((''&&%%%$$###\"\"\"\"!!!    \037\037\037\037\036\036\036\036\036\035\035\035\035\034\034\034\034\034\033\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\027\026\026\025\024\023\023\022\022\021\021\021\020\020\017\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\016\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\023\023\024\024\023\022\021\021\020\020\017\017\016\016\016\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\016\016\016\017\017\020\020\021\022\022\023\024\025\027\031\033\036*))('''&&%%$$$###\"\"\"\"!!!    \037\037\037\037\036\036\036\036\036\035\035\035\035\034\034\034\034\034\033\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\031\031\030\030\030\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\031\030\027\026\025\024\024\023\023\022\022\021\021\020\020\020\017\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\r\r\016\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\023\023\024\024\024\023\022\022\021\020\020\017\017\017\016\016\r\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\r\016\016\017\017\017\020\021\021\022\023\024\025\026\027\031\033\037**))((''&&%%%$$$###\"\"\"!!!!    \037\037\037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\033\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\030\027\026\026\025\024\024\023\022\022\022\021\021\020\020\020\017\017\017\017\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\017\017\017\017\020\020\020\021\021\021\022\022\023\023\024\025\024\023\023\022\021\021\020\020\017\017\016\016\016\r\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\r\016\016\016\017\017\020\020\021\021\022\023\024\025\026\030\031\034\037+**))((''&&&%%%$$$###\"\"\"!!!!    \037\037\037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\033\033\033\033\033\033\032\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\030\030\027\026\025\024\024\023\023\022\022\021\021\021\020\020\020\017\017\017\017\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\017\017\017\017\020\020\020\021\021\021\022\022\023\023\024\024\025\025\024\023\022\022\021\020\020\017\017\017\016\016\016\r\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\r\016\016\016\017\017\020\020\021\021\022\022\023\024\025\027\030\032\034 ,++*))(((''&&&%%$$$####\"\"\"!!!!     \037\037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\031\031\031\031\032\032\032\032\032\032\032\032\032\032\031\030\027\026\025\025\024\024\023\023\022\022\021\021\021\020\020\020\017\017\017\017\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\017\017\017\017\020\020\020\020\021\021\022\022\022\023\024\024\025\025\025\024\023\022\022\021\021\020\020\017\017\016\016\016\016\r\r\r\r\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\r\r\r\r\016\016\016\017\017\017\020\020\021\021\022\023\024\025\026\027\030\032\035 ,,++**))((''&&&%%%$$$####\"\"\"\"!!!     \037\037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\034\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\031\030\027\027\026\025\024\024\023\023\022\022\022\021\021\020\020\020\020\017\017\017\017\017\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\016\017\017\017\017\020\020\020\020\021\021\021\022\022\023\023\024\024\025\026\025\024\024\023\022\021\021\020\020\017\017\017\016\016\016\r\r\r\r\r\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\r\r\r\r\r\016\016\016\017\017\020\020\021\021\022\022\023\024\025\026\027\031\033\035!-,,++**))(('''&&&%%%$$$####\"\"\"\"!!!!    \037\037\037\037\036\036\036\036\036\035\035\035\035\035\034\034\034\034\034\033\033\033\033\033\033\033\033\032\032\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\033\032\031\030\027\026\025\025\024\024\023\023\022\022\021\021\021\020\020\020\020\017\017\017\017\017\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\016\017\017\017\017\017\020\020\020\020\021\021\021\022\022\023\023\024\024\025\025\026\026\025\024\023\022\022\021\021\020\020\017\017\017\016\016\016\r\r\r\r\r\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\017\017\017\020\020\021\021\022\023\023\024\025\026\030\031\033\036!.--,++**)))(('''&&&%%%$$$####\"\"\"\"!!!!    \037\037\037\037\036\036\036\036\036\035\035\035\035\035\034\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033").append("\033\033\033\033\033\033\033\033\033\033\033\033\033\033\032\031\030\027\026\026\025\025\024\023\023\022\022\022\021\021\021\020\020\020\020\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\020\020\020\020\021\021\021\022\022\022\023\023\024\024\025\026\026\026\025\024\023\023\022\021\021\020\020\020\017\017\016\016\016\016\r\r\r\r\r\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\016\017\017\020\020\021\021\022\022\023\024\025\026\027\030\032\033\036\"..--,,++**))(('''&&&%%%$$$$####\"\"\"\"!!!!    \037\037\037\037\036\036\036\036\036\035\035\035\035\035\034\034\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\032\031\030\030\027\026\025\025\024\024\023\023\022\022\022\021\021\021\020\020\020\020\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\020\020\020\020\021\021\021\022\022\022\023\023\024\024\025\025\026\027\026\025\024\024\023\022\022\021\021\020\020\017\017\017\016\016\016\016\r\r\r\r\r\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\016\017\017\017\020\020\021\021\022\022\023\024\025\026\027\030\032\034\036\"//.--,,++**))((('''&&&%%%$$$$####\"\"\"\"!!!!    \037\037\037\037\036\036\036\036\036\035\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\033\033\033\033\034\034\034\034\034\034\034\034\034\034\033\032\031\030\027\026\026\025\025\024\024\023\023\022\022\021\021\021\021\020\020\020\020\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\020\020\020\020\021\021\021\021\022\022\023\023\023\024\024\025\026\026\027\027\026\025\024\023\023\022\021\021\020\020\020\017\017\017\016\016\016\016\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\016\017\017\017\020\020\021\021\022\022\023\023\024\025\026\027\031\032\034\037#0//.--,,++**)))((('''&&&%%%$$$$####\"\"\"!!!!!    \037\037\037\037\036\036\036\036\036\036\035\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\034\033\032\031\030\027\027\026\025\025\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\020\020\020\020\021\021\021\021\022\022\022\023\023\024\024\025\025\026\027\027\027\026\025\024\024\023\022\022\021\021\020\020\017\017\017\017\016\016\016\016\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\016\016\016\016\017\017\017\020\020\020\021\021\022\022\023\024\025\025\027\030\031\033\035\037#10//.--,,+++**))((('''&&&&%%%$$$$###\"\"\"\"!!!!     \037\037\037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\034\034\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\035\034\033\032\031\030\027\026\026\025\025\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\020\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\017\017\020\020\020\020\021\021\021\021\022\022\022\023\023\024\024\025\025\026\026\027\030\027\026\025\025\024\023\023\022\021\021\020\020\020\017\017\017\016\016\016\016\016\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\016\016\016\016\016\017\017\017\020\020\021\021\022\022\023\023\024\025\026\027\030\031\033\035 $110//..--,,++**)))((('''&&&%%%%$$$$###\"\"\"\"!!!!     \037\037\037\037\037\036\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\034\033\032\031\030\027\027\026\025\025\024\024\023\023\023\022\022\022\021\021\021\021\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\021\022\022\022\023\023\023\024\024\025\025\026\027\027\030\030\027\026\025\024\023\023\022\022\021\021\020\020\020\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\016\016\016\016\016\017\017\017\020\020\020\021\021\022\022\023\024\024\025\026\027\030\032\033\036 $2110//..--,,++***)))((('''&&&%%%%$$$####\"\"\"\"!!!!     \037\037\037\037\037\036\036\036\036\036\036\036\035\035\035\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\034\033\032\031\031\030\027\026\026\025\025\024\024\023\023\023\022\022\022\021\021\021\021\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\021\022\022\022\022\023\023\024\024\025\025\026\026\027\030\030\030\027\026\025\024\024\023\022\022\021\021\021\020\020\017\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\016\016\016\016\016\017\017\017\017\020\020\021\021\021\022\023\023\024\025\025\026\027\031\032\034\036!%32110//..--,,+++**)))(((''''&&&%%%%$$$####\"\"\"\"!!!!     \037\037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\035\035\035\035\036\036\036\036\036\036\036\036\036\036\035\034\033\032\031\030\027\027\026\025\025\024\024\024\023\023\022\022\022\022\021\021\021\021\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\021\021\021\021\021\022\022\022\023\023\023\024\024\025\025\026\027\027\030\031\030\027\026\025\025\024\023\023\022\022\021\021\020\020\020\017\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\r\r\016\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\023\023\024\025\026\027\030\031\032\034\036!%3321100/..--,,,++***)))((('''&&&&%%%$$$$####\"\"\"\"!!!!     \037\037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\036\035\034\033\032\031\030\030\027\026\026\025\025\024\024\023\023\023\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\023\023\023\024\024\025\025\026\026\027\030\030\031\031\030\027\026\025\024\024\023\022\022\021\021\021\020\020\020\017\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\017\017\017\017\020\020\020\021\021\021\022\023\023\024\024\025\026\027\030\031\033\035\037\"&43321100//..--,,+++***)))((('''&&&&%%%$$$$####\"\"\"\"!!!!      \037\037\037\037\037\037\037\036\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037\037\036\034\033\032\032\031\030\027\027\026\026\025\025\024\024\023\023\023\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\023\023\023\024\024\024\025\025\026\027\027\030\031\031\031\030\027\026\025\024\024\023\023\022\022\021\021\020\020\020\017\017\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\023\023\024\025\025\026\027\030\032\033\035\037\"&543321100//..--,,,++***)))(((''''&&&%%%%$$$$####\"\"\"\"!!!!!     \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\036\035\034\033\032\031\030\030\027\026\026\025\025\024\024\024\023\023\023\022\022\022\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\022\023\023\023\024\024\025\025\026\026\027\030\030\031\032\031\030\027\026\025\025\024\023\023\022\022\021\021\021\020\020\020\017\017\017\017\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\022\023\024\024\025\026\027\030\031\032\034\035 \"'5543321100//..---,,+++***)))(((''''&&&%%%%$$$####\"\"\"\"\"!!!!!      \037\037\037 \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037    \036\035\034\033\032\031\031\030\027\027\026\026\025\025\024\024\023\023\023\022\022\022\022\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\022\022\022\022\023\023\023\024\024\025\025\025\026\027\027\030\031\031\032\032\030\027\027\026\025\024\024\023\023\022\022\021\021\021\020\020\020\017\017\017\017\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\017\017\017\017\020\020\020\021\021\021\022\022\023\023\024\025\025\026\027\030\031\032\034\036 #'65543321100//...--,,,++***))))((('''&&&&%%%$$$$####\"\"\"\"\"!!!!!               \037\037\037\037          \037\036\034\033\033\032\031\030\030\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\021\022\022\022\022\023\023\023\024\024\024\025\025\026\026\027\027\030\031\032\032\032\031\030\027\026\025\025\024\023\023\022\022\022\021\021\020\020\020\020\017\017\017\017\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\016\017\017\017\017\020\020\020\020\021\021\022\022\022\023\024\024\025\026\026\027\030\031\033\034\036 #(765543322100///..--,,,+++***)))(((('''&&&&%%%$$$$####\"\"\"\"\"!!!!!!                        ! \037\036\035\034\033\032\031\031\030\027\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\021\022\022\022\022\023\023\023\024\024\024\025\025\026\026\027\027\030\030\031\032\033\032\031\030\027\026\026\025\024\024\023\023\022\022\021\021\021\020\020\020\020\017\017\017\017\017\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\016\016\017\017\017\017\020\020\020\020\021\021\021\022\022\023\023\024\024\025\026\027\030\031\032\033\035\037!$(77655433221100//..---,,,+++***)))(((''''&&&%%%%$$$$####\"\"\"\"\"!!!!!!! !!!             !!!!!!\037\036\035\034\033\032\032\031\030\030\027\026\026\025\025\025\024\024\024\023\023\023\022\022\022\022\022\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\023\024\024\025\025\025\026\026\027\027\030\031\031\032\033\033\031\030\027\027\026\025\024\024\023\023\022\022\022\021\021\021\020\020\020\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\020\020\020\021\021\021\022\022\022\023\023\024\025\025\026\027\030\031\032\033\035\037!$)877655433221100//...--,,,+++***))))((('''&&&&%%%%$$$$####\"\"\"\"\"\"!!!!!!!!!!!!!!!!!!!!!!!!!!! \037\036\034\034\033\032\031\030\030\027\027\026\026\025\025\024\024\024\023\023\023\023\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\020\020\020\020\020\020\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\023\024\024\024\025\025\026\026\027\027\030\030\031\032\033\033\033\032\031\030\027\026\025\025\024\024\023\023\022\022\021\021\021\020\020\020\020\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\020\020\020\020\021\021\021\022\022\023\023\024\024\025\026\026\027\030\031\032\034\035\037\"%)9877655433221100///..---,,,+++***)))(((('''&&&&%%%$$$$$####\"\"\"\"\"\"\"!!\"!!!!!!!!!!!!!!!!!\"\"\"\" \037\036\035\034\033\032\031\031\030\030\027\026\026\026\025\025\024\024\024\023\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\023\024\024\024\025\025\025\026\026\027\027\030\031\031\032\033\034\033\032\031\030\027\026\026\025\024\024\023\023\022\022\022\021\021\021\020\020\020\020\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\020\020\020\020\021\021\021\022\022\022\023\023\024\025\025\026\027\027\030\032\033\034\036 \"%*:98776554332211000//...--,,,+++****)))(((''''&&&%%%%$$$$$#####\"\"\"\"\"\"\"\"\"\"\"\"\"\"!!!!\"\"\"\"\"\"\"\"\"\"!\037\036\035\034\033\033\032\031\030\030\027\027\026\026\025\025\025\024\024\024\023\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\023\023\023\023\024\024\024\025\025\025\026\026\027\027\030\030\031\032\032\033\034\034\032\031\030\027\027\026\025\025\024\024\023\023\022\022\021\021\021\021\020\020\020\020\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\020\020\020\020\021\021\021\021\022\022\023\023\024\024\025\025\026\027\030\031\032\033\034\036 \"&*:998776554432211100//...---,,,+++***)))(((('''&&&&%%%%$$$$$#####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"##\"! \037\036\035\034\033\032\031\031\030\030\027\026\026\026\025\025\024\024\024\024\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\022\023\023\023\023\024\024\024\024\025\025\026\026\026\027\027\030\031\031\032\033\034\034\034\033\032\031\030\027\026\026\025\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\022\022\022\023\023\024\024\025\026\026\027\030\031\032\033\035\036 #&+;:998776554433221100///...--,,,++++***)))(((''''&&&&%%%%$$$$$######\"####\"\"\"\"\"\"\"\"\"\"\"#######! \037\036\035\034\033\032\032\031\030\030\027\027\026\026\025\025\025\024\024\024\024\023\023\023\023\022\022\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\022\022\023\023\023\023\024\024\024\024\025\025\025\026\026\027\027\030\030\031\032\032\033\034\035\034\033\032\031\030\027\026\026\025\025\024\024\023\023\022\022\022\021\021\021\020\020\020\020\020\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\022\022\022\023\023\024\024\025\025\026\027\027\030\031\032\034\035\037!#&+<;:9987765544332211000//...---,,,+++***))))(((''''&&&%%%%%$$$$$###########################\"!\037\036\035\034\033\033\032\031\031\030\030\027\027\026\026\025\025\025\024\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\021\021\021\021\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\024\024\024\025\025\025\026\026\026\027\027\030\031\031\032\033\033\034\035\035\033\032\031\030\027\027\026\025\025\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\016\016\016\016\016\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\021\022\022\023\023\023\024\024\025\026\026\027\030\031\032\033\034\035\037!$',<;;:9887765544332211100///...---,,,+++***)))(((('''&&&&%%%%%$$$$$$##$#################$$$$\"! \037\036\035\034\033\032\032\031\030\030\027\027\026\026\026\025\025\025\024\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\024\024\024\025\025\025\026\026\026\027\027\030\030\031\031\032\033\034\035\035\035\034\033\032\031\030\027\026\026\025\025\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\021\022\022\022\023\023\024\024\025\025\026\026\027\030\031\032\033\034\036 \"$',=<;;:98877655443322211000//...---,,,+++***))))(((''''&&&&%%%%%$$$$$$$$$$$$$$####$$$$$$$$$$#! \037\036\035\034\033\033\032\031\031\030\030\027\027\026\026\025\025\025\025\024\024\024\024\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\023\024\024\024\024\025\025\025\026\026\027\027\027\030\031\031\032\032\033\034\035\036\035\034\033\032\031\030\027\027\026\025\025\024\024\023\023\023\022\022\022\021\021\021\021\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\021\021\021\021\022\022\022\023\023\023\024\024\025\025\026\027\027\030\031\032\033\035\036 \"%(->=<;;:98877655443332211000///...---,,,+++***)))((((''''&&&&%%%%%%$$$$$$$$$$$$$$$$$$$$$$%%$#\" \037\036\035\034\034\033\032\032\031\030\030\027\027\026\026\026\025\025\025\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\024\024\024\024\024\025\025\025\026\026\026\027\027\030\030\031\031\032\033\034\034\035\036\036\034\033\032\031\030\030\027\026\026\025\024\024\024\023\023\022\022\022\021\021\021\021\021\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\021\021\021\021\021\022\022\022\023\023\024\024\025\025\026\026\027\030\031\031\033\034\035\036 \"%(->>=<;::98877665544332211100///...---,,,+++***))))((((''''&&&&%%%%%%%%%%%$$$$$$$$$$$%%%%%%%#\"! \037\036\035\034\033\032\032\031\031\030\030\027\027\026\026\026\025\025\025\024\024\024\024\024\023\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\023\023\024\024\024\024\024\025\025\025\026\026\026\027\027\030\030\031\031\032\032\033\034\035\036\036\036\035\033\032\031\031\030\027\026\026\025\025\024\024\023\023\023\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\023\023\023\024\024\025\025\026\027\027\030\031\032\033\034\035\037!#%).?>==<;::988776655443322211000///...---,,,+++***)))((((''''&&&&&&%%%%%%%%%%%%%%%%%%%%%%%%&%$\"! \037\036\035\034\033\033\032\031\031\030\030\027\027\027\026\026\026\025\025\025\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\022\022\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\025\025\025\025\026\026\027\027\027\030\030\031\031\032\033\033\034\035\036\037\036\035\034\033\032\031\030\027\027\026\025\025\024\024\024\023\023\022\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\022\023\023\024\024\024\025\026\026\027\027\030\031\032\033\034\036\037!#&).@?>=<<;::988776655443322211100///...---,,,+++****)))((((''''&&&&&&%%&&%%%%%%%%%%%%%%%&&&&&$#\" \037\036\035\035\034\033\032\032\031\031\030\030\027\027\026\026\026\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\025\025\025\025\026\026\026\027\027\030\030\031\031\032\032\033\034\034\035\036\037\037\035\034\033\032\031\030\030\027\026\026\025\025\024\024\023\023\023\022\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\017\017\017\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\022\023\023\023\024\024\025\025\026\026\027\030\031\031\032\033\035\036 !#&*/@@?>=<<;::9887766554433322111000///..---,,,,+++***))))(((('''''&&&&&&&&&&&&&%%%%&&&&&&&&&&%#\"! \037\036\035\034\033\033\032\031\031\030\030\027\027\027\026\026\026\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\025\025\025\025\026\026\026\027\027\027\030\030\031\031\032\033\033\034\035\036\036\037\037\036\034\033\032\031\031\030\027\027\026\025\025\024\024\024\023\023\023\022\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\022\023\023\023\024\024\024\025\025\026\027\027\030\031\032\033\034\035\036 \"$'*/A@??>=<<;::9887766554443322211000///...---,,,+++****)))((((('''''&&&&&&&&&&&&&&&&&&&&&&'''%$\"! \037\036\035\034\034\033\032\032\031\031\030\030\027\027\027\026\026\026\025\025\025\025\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\024\025\025\025\025\026\026\026\027\027\027\030\030\031\031\032\032\033\034\034\035\036\037 \037\036\035\034\033\032\031\030\027\027\026\026\025\025\024\024\023\023\023\022\022\022\022\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\022\022\022\022\023\023\023\024\024\025\025\026\026\027\030\030\031\032\033\034\035\037 \"$'+0BA@?>>=<<;::99877665554433222111000//...---,,,++++***))))(((((''''''''''&&&&&&&&&&&'''''''%$#! \037\036\035\035\034\033\033\032\031\031\030\030\030\027\027\026\026\026\026\025\025\025\025\024\024\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\024\024\025\025\025\025\026\026\026\026\027\027\027\030\030\031\031\032\032\033\034\035\035\036\037  \036\035\034\033\032\031\030\030\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\021\022\022\022\022\023\023\023\024\024\024\025\025\026\026\027\030\030\031\032\033\034\036\037!\"%'+0CBA@?>>=<<;::99887766554433322111000///...---,,,+++****))))(((((''''''''''''''''''''''''('&$#\"! \037\036\035\034\034\033\032\032\031\031\030\030\027\027\027\026\026\026\026\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\026\026\026\026\027\027\027\030\030\031\031\032\032\033\033\034\035\036\037\037  \036\035\034\033\032\031\031\030\027\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\021\021\022\022\022\022\023\023\023\024\024\024\025\025\026\026\027\027\030\031\032\032\033\035\036\037!#%(+1CBAA@?>>=<;;::99887766554443322211100///...---,,,++++****))))(((((('(('''''''''''''''(((((&%#\"! \037\036\035\035\034\033\033\032\031\031\030\030\030\027\027\027\026\026\026\026\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\026\026\026\027\027\027\030\030\030\031\031\032\032\033\034\034\035\036\037 ! \037\036\034\033\032\032\031\030\027\027\026\026\025\025\024\024\024\023\023\023\023\022\022\022\022\021\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\021\021\021\022\022\022\022\023\023\023\023\024\024\024\025\025\026\026\027\030\030\031\032\033\034\035\036 !#%(,1DCBA@@?>==<;;::998877665554433322111000///...---,,,+++****)))))(((((((((((((''''(((((((((('%$\"! \037\036\036\035\034\033\033\032\032\031\031\030\030\030\027\027\027\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\026\026\026\026\027\027\027\030\030\031\031\032\032\033\033\034\035\035\036\037 !!\037\036\035\034\033\032\031\030\030\027\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\024\024\024\025\025\026\026\027\027\030\031\031\032\033\034\035\036 \"#&),2EDCBA@@?>==<;;::998877665554433322211000///...---,,,++++****)))))(((((((((((((((((((((()))'%$#\"! \037\036\035\034\034\033\032\032\031\031\031\030\030\027\027\027\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\025\026\026\026\026\027\027\027\030\030\030\031\031\032\032\033\034\034\035\036\037\037 !!\037\036\035\034\033\032\031\031\030\027\027\026\026\025\025\024\024\024\023\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\023\024\024\024\025\025\026\026\027\027\030\031\032\032\033\034\035\037 \"$&)-2EDCCBA@??>==<;;::998877666554443322211100///...---,,,,++++****))))))))))((((((((((()))))))'&$#\"! \037\036\035\035\034\033\033\032\032\031\031\030\030\030\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\025\025\026\026\026\026\026\027\027\027\030\030\030\031\031\032\032\033\033\034\035\035\036\037 !\"! \036\035\034\033\032\032\031\030\030\027\026\026\026\025\025\024\024\024\023\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\023\023\023\023\024\024\024\025\025\026\026\027\027\030\030\031\032\033\034\035\036\037!\"$')-3FEDCBBA@??>==<;;::9988777665544433322111000///...---,,,++++*****))))))))))))))))))))))))*)(&%#\"! \037\036\036\035\034\034\033\032\032\031\031\031\030\030\030\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\027\027\027\027\030\030\031\031\031\032\032\033\034\034\035\036\036\037 !\"\" \037\036\035\034\033\032\031\030\030\027\027\026\026\025\025\025\024\024\024\023\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\023\023\023\023\024\024\024\025\025\025\026\026\027\027\030\031\031\032\033\034\035\036\037!#%'*.3GFEDCBAA@??>==<<;::9988877665554433322211000///...---,,,,++++******)**)))))))))))))))*****('%$#\"! \037\036\035\035\034\033\033\032\032\031\031\030\030\030\027\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\027\027\027\027\030\030\030\031\031\032\032\033\033\034\034\035\036\037  !\"\" \037\036\035\034\033\032\031\031\030\027\027\026\026\026\025\025\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\022\023\023\023\023\023\024\024\024\025\025\026\026\026\027\030\030\031\032\032\033\034\035\036 !#%'*.4GFEEDCBAA@??>==<<;::9998877665554443322211100///....---,,,,++++*************))))**********('%$#\"! \037\036\036\035\034\034\033\032\032\032\031\031\030\030\030\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\027\027\027\027\030\030\030\031\031\031\032\032\033\033\034\035\035\036\037 !\"#\"!\037\036\035\034\033\032\032\031\030\030\027\027\026\026\025\025\025\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\022\022\023\023\023\023\023\024\024\024\025\025\025\026\026\027\027\030\030\031\032\033\033\034\035\037 \"#%(+/4HGFEDDCBA@@?>>==<<;;::9988776665544433222111000///...----,,,,+++++********************++++)'&%#\"! \037\037\036\035\034\034\033\033\032\032\031\031\031\030\030\030\027\027\027\027\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\026\027\027\027\027\030\030\030\031\031\031\032\032\033\033\034\034\035\036\036\037 !\"#\"! \036\035\034\033\033\032\031\031\030\027\027\026\026\026\025\025\024\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\024\024\024\024\025\025\026\026\026\027\027\030\031\031\032\033\034\035\036\037 \"$&(+/5IHGFEDCCBA@@?>>==<<;;::9988777665554433322111000///....---,,,,,+++++++++***********+++++++)(&%$#\"! \037\036\035\035\034\034\033\032\032\032\031\031\030\030\030\030\027\027\027\027\026\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\026\026\027\027\027\027\030\030\030\030\031\031\032\032\032\033\033\034\035\035\036\037  !\"$#! \037\036\035\034\033\032\031\031\030\030\027\027\026\026\025\025\025\024\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\024\024\024\024\025\025\025\026\026\027\027\030\030\031\032\032\033\034\035\036\037!\"$&(,/5IHGGFEDCBBA@@?>>==<<;;::9988777665554433322211100////...----,,,,,+++++++++++++++++++++++,+*('%$#\"! \037\036\036\035\034\034\033\033\032\032\031\031\031\030\030\030\030\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\030\030\030\031\031\031\032\032\033\033\034\034\035\036\036\037 !\"#$#\" \037\036\035\034\033\032\032\031\030\030\027\027\026\026\026\025\025\025\024\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\024\024\024\025\025\025\026\026\026\027\027\030\030\031\032\033\033\034\035\036 !\"$&),06JIHGFEEDCBBA@@?>>==<<;;::99888776665544433222111000///....----,,,,,+,,+++++++++++++++,,,,,*('&$#\"! \037\037\036\035\035\034\034\033\033\032\032\031\031\031\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\030\030\030\031\031\031\032\032\032\033\033\034\035\035\036\037\037 !\"#$#\"!\037\036\035\034\033\033\032\031\031\030\030\027\027\026\026\025\025\025\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\023\024\024\024\024\025\025\025\026\026\027\027\030\030\031\031\032\033\034\034\035\037 !#%'),06KJIHGFEDDCBBA@@?>>==<<;;::99988776665544433322111000////...-----,,,,,,,,,,,,++++,,,,,,,,,,*)'&%$\"!! \037\036\036\035\034\034\033\033\032\032\032\031\031\031\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\030\030\030\030\031\031\031\032\032\033\033\034\034\035\035\036\037  !\"#%$\"! \037\035\035\034\033\032\031\031\030\030\027\027\026\026\026\025\025\025\024\024\024\024\023\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\023\024\024\024\024\025\025\025\026\026\026\027\027\030\030\031\032\032\033\034\035\036\037 \"#%'*-17LJIIHGFEDDCBAA@@?>>==<<;;::999887776655544333222111000///....-----,,-,,,,,,,,,,,,,,,,,----+)(&%$#\"! \037\036\036\035\035\034\034\033\033\032\032\031\031\031\030\030\030\030\027\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\027\030\030\030\030\031\031\031\032\032\033\033\033\034\034\035\036\036\037 !\"#$%$#! \037\036\035\034\033\032\032\031\030\030\027\027\027\026\026\025\025\025\025\024\024\024\024\023\023\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\023\023\023\024\024\024\024\025\025\025\025\026\026\027\027\027\030\031\031\032\032\033\034\035\036\037 \"#%'*-17LKJIHGGFEDCCBAA@@?>>==<<;;:::99887776655544333222111000////....---------,,,,,,,,,,,-------+*('%$#\"!  \037\036\035\035\034\034\033\033\032\032\032\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\027\026\026\026\026\026\026\026\026\027\027\027\027\027\027\027\027\027\030\030\030\030\031\031\031\032\032\032\033\033\034\034\035\035\036\037\037 !\"#$%$#! \037\036\035\034\033\033\032\031\031\030\030\027\027\026\026\026\025\025\025\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\025\025\025\026\026\026\027\027\030\030\031\031\032\033\034\034\035\036\037!\"$&(*.28MLKJIHGFFEDCCBAA@@?>>==<<;;;::998887766555444332221110000///.....----------------------..-,*('&%#\"!! \037\036\036\035\035\034\034\033\033\032\032\032\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\031\032\032\033\033\033\034\034\035\036\036\037  !\"#$&%#\"!\037\036\035\034\034\033\032\032\031\030\030\027\027\027\026\026\026\025\025\025\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\025\025\025\025\026\026\027\027\027\030\030\031\032\032\033\034\035\036\037 !\"$&(+.28NMKKJIHGFEEDCCBAA@@??>==<<<;;::998887766655444333222111000////.....-..---------------.....,*)'&%$#\"! \037\037\036\035\035\034\034\033\033\032\032\032\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\031\032\032\032\033\033\034\034\035\035\036\037\037 !\"#$%&%$\"! \037\036\035\034\033\032\032\031\031\030\030\027\027\026\026\026\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\025\025\025\025\026\026\026\027\027\030\030\031\031\032\032\033\034\035\036\037 !#$&)+.39NMLKJIHHGFEEDCCBAA@@??>>==<<;;::9998877666554443332221110000////............----......../.,+)(&%$#\"!  \037\036\036\035\035\034\034\033\033\032\032\032\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\030\031\031\031\031\032\032\032\033\033\033\034\034\035\036\036\037  !\"#$%&%$\"! \037\036\035\034\033\033\032\031\031\030\030\027\027\027\026\026\026\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\025\025\025\025\026\026\026\027\027\027\030\030\031\031\032\033\033\034\035\036\037 \"#%'),/39ONMLKJIHGGFEDDCCBAA@@??>>==<<;;::9998877766555443332221111000/////../.................////-+)('%$#\"!! \037\037\036\035\035\034\034\033\033\033\032\032\032\031\031\031\031\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\030\031\031\031\031\032\032\032\033\033\033\034\034\035\035\036\036\037 !!\"#$%'&$#! \037\036\035\034\034\033\032\032\031\031\030\030\027\027\026\026\026\025\025\025\025\025\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\024\025\025\025\025\025\026\026\026\027\027\030\030\031\031\032\032\033\034\035\035\036\037!\"#%'),/3:OONMLKJIHGGFEDDCBBAA@@??>>==<<;;:::9988777665554443322221110000/////////...........///////-+*('&%$#\"! \037\037\036\036\035\035\034\034\033\033\032\032\032\032\031\031\031\031\030\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\030\030\030\030\030\030\030\030\031\031\031\031\031\032\032\032\033\033\034\034\034\035\035\036\037\037 !\"#$%&'&$#\" \037\036\035\035\034\033\032\032\031\031\030\030\027\027\027\026\026\026\025\025\025\025\025\024\024\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\024\024\024\024\024\024\024\024\025\025\025\025\025\026\026\026\027\027\027\030\030\031\031\032\033\033\034\035\036\037 !\"$%'*,04:OONMLKJJIHGFFEDDCBBAA@@??>>==<<;;:::99887776655544433322211110000//////////////////////00/.,*)'&%$#\"!  \037\036\036\035\035\034\034\033\033\033\032\032\032\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\032\032\032\033\033\033\034\034\035\035\036\036\037  !\"#$%&'&%#\"! \037\036\035\034\033\033\032\031\031\030\030\030\027\027\026\026\026\026\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\026\026\026\026\027\027\030\030\030\031\032\032\033\033\034\035\036\037 !#$&(*-04;NNNNMLKJIIHGFFEDDCBBAA@@??>>==<<;;;::998887766655444333222211100000000///////////////00000.,+)(&%$#\"\"! \037\037\036\036\035\035\034\034\033\033\033\032\032\032\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\032\032\032\033\033\033\034\034\034\035\035\036\037\037 !!\"#$%&('%$\"! \037\036\035\034\034\033\032\032\031\031\030\030\027\027\027\026\026\026\026\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\026\026\026\026\027\027\027\030\030\031\031\032\032\033\034\034\035\036\037 !#$&(*-05;MMMMNMLKJIHHGFEEDDCBBAA@@??>>==<<;;;::99888776665554433332221111000000000000////0000000010.-+)('&%$#\"!  \037\036\036\035\035\034\034\034\033\033\032\032\032\032\031\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\031\032\032\032\032\033\033\033\034\034\035\035\036\036\037\037 !\"##$%'('%$#! \037\036\035\035\034\033\033\032\031\031\030\030\030\027\027\027\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\026\026\026\027\027\027\030\030\030\031\031\032\033\033\034\035\036\036\037!\"#%&(+-15<MMMMMMLKKJIHGGFEEDDCBBAA@@??>>==<<<;;::999887766655544433322221111001000000000000000001111/-+*('&%$#\"!! \037\037\036\036\035\035\034\034\033\033\033\032\032\032\032\031\031\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\031\031\032\032\032\032\033\033\033\034\034\035\035\035\036\037\037  !\"#$%&'('&$#\" \037\036\036\035\034\033\033\032\032\031\031\030\030\027\027\027\026\026\026\026\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\025\026\026\026\026\027\027\027\030\030\031\031\032\032\033\033\034\035\036\037 !\"#%')+.16<LLLLLLMLKJJIHGGFEEDDCBBAA@@??>>==<<<;;::99988777665554443332222111111111000000000001111111/-,*)'&%$#\"\"! \037\037\036\036\035\035\034\034\034\033\033\033\032\032\032\032\031\031\031\031\031\031\031\031\031\030\030\030\030\030\030\031\031\031\031\031\031\031\031\031\032\032\032\032\033\033\033\034\034\034\035\035\036\036\037\037 !!\"#$%&')(&%#\"! \037\036\035\034\034\033\032\032\031\031\030\030\030\027\027\027\026\026\026\026\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\025\026\026\026\026\027\027\027\030\030\030\031\031\032\032\033\034\034\035\036\037 !\"$%')+.26=KKKKLLLLLKJIIHGGFEEDDCBBAA@@??>>===<<;;::9998877766555444333322221111111111111111111111222/.,*)('%$$#\"!  \037\037\036\036\035\035\034\034\033\033\033\033\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\033\033\033\033\034\034\035\035\035\036\036\037  !\"##$%&()(&%#\"! \037\036\035\035\034\033\033\032\032\031\031\030\030\027\027\027\027\026\026\026\026\025\025\025\025\025\025\025\025\025\024\024\024\024\024\024\024\025\025\025\025\025\025\025\025\025\026\026\026\026\027\027\027\027\030\030\031\031\032\032\033\033\034\035\035\036\037 !#$&'),/27=KKKKKKKKLLKJIIHGGFEEDDCBBAA@@??>>===<<;;:::998877766655544433332222222211111111111112222220.,+)('&%$#\"!! \037\037\036\036\035\035\034\034\034\033\033\033\033\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\033\033\033\033\034\034\034\035\035\036\036\037\037 !!\"#$%&'()('%$\"! \037\036\036\035\034\033\033\032\032\031\031\030\030\030\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\027\027\027\030\030\030\031\031\032\032\033\033\034\035\036\037\037 \"#$&(*,/27>JJJJJJJKKKKKJIHHGFFEEDCCBBAA@@??>>>==<<;;:::99888776665554443333322222222222111122222222320.-+*('&%$#\"\"!  \037\036\036\036\035\035\034\034\034\033\033\033\033\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\032\033\033\033\034\034\034\035\035\035\036\036\037  !\"\"#$%&'(*)'%$#\"  \037\036\035\034\034\033\032\032\031\031\031\030\030\030\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\027\027\027\027\030\030\031\031\031\032\032\033\034\034\035\036\037 !\"#%&(*,/38>IIIIJJJJJKKKJJIHHGFFEEDCCBBAA@@??>>>==<<;;:::9988877666555444433333232222222222222222233331/-,*)(&%$$#\"!! \037\037\036\036\035\035\035\034\034\034\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\032\032\033\033\033\033\034\034\034\035\035\036\036\037\037  !\"##$%&')*)'&$#\"! \037\036\035\035\034\033\033\032\032\031\031\030\030\030\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\027\027\027\027\030\030\030\031\031\032\032\033\033\034\035\035\036\037 !\"#%'(*-038?IIIIIIIIJJJKKJJIHHGFFEEDCCBBAA@@???>>==<<;;:::998887776665554444333333332222222222233333331/-,*)('&%$#\"!!  \037\036\036\036\035\035\034\034\034\033\033\033\033\033\032\032\032\032\032\032\032\032\031\031\031\031\031\031\032\032\032\032\032\032\032\032\032\033\033\033\033\034\034\034\035\035\035\036\036\037\037 !!\"#$%&'()*)(&%#\"! \037\036\035\035\034\033\033\032\032\031\031\031\030\030\030\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\027\027\027\027\030\030\030\031\031\031\032\032\033\034\034\035\036\036\037 !\"$%')+-048?HHHHHHHIIIJJJKJJIHHGFFEEDCCBBAA@@???>>==<<;;;::998887776665554444433333333333333333333344410.,+)('&%$#\"\"!  \037\037\036\036\035\035\035\034\034\034\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\034\034\035\035\035\036\036\037\037  !\"\"#$%&'()+*(&%$\"! \037\037\036\035\034\034\033\033\032\032\031\031\030\030\030\027\027\027\027\027\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\026\026\027\027\027\027\030\030\030\031\031\032\032\033\033\034\034\035\036\037  \"#$%')+.149@GGGGHHHHHIIIJJKJIIHGGFFEEDCCBBAA@@@??>>==<<;;;::99988777666555544444444333333333333344444420.-+*('&%$$#\"!! \037\037\036\036\036\035\035\035\034\034\034\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\034\034\034\035\035\036\036\036\037\037 !!\"##$%&'(*+*('%$#\"! \037\036\035\035\034\033\033\032\032\031\031\031\030\030\030\027\027\027\027\027\026\026\026\026\026\026\026\026\026\025\025\025\025\025\025\026\026\026\026\026\026\026\026\026\027\027\027\027\030\030\030\031\031\031\032\032\033\033\034\035\035\036\037 !\"#$&')+.159@GGGGGGGGHHHIIJJKJIIHGGFFEEDDCBBAA@@@??>>==<<;;;::9998877766665555444444444443333444444445420/-+*)('&%$#\"\"!  \037\037\036\036\035\035\035\034\034\034\034\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\033\034\034\034\034\035\035\035\036\036\037\037  !!\"#$%%&()*+*)'%$#\"! \037\036\035\035\034\034\033\033\032\032\031\031\030\030\030\030\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\030\030\030\030\031\031\032\032\033\033\034\034\035\036\036\037 !\"#%&(*,.15:AFFFFFFFGGGHHHIIJKJIIHGGFFEEDDCBBAAA@@??>>==<<;;;::999888777666555554544444444444444444555531/-,*)('&%$##\"!! \037\037\037\036\036\035\035\035\034\034\034\034\033\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\033\034\034\034\034\035\035\035\036\036\036\037\037  !\"\"#$%&'()*,+)'&$#\"! \037\036\036\035\034\034\033\033\032\032\031\031\031\030\030\030\030\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\030\030\030\031\031\031\032\032\033\033\034\034\035\036\037\037 !\"$%&(*,/25:AEEEEFFFFFGGGHHIIJJJIIHGGFFEEDDCBBBAA@@??>>==<<<;;::99988877766665555555554444444444555555531/.,+)('&%$$#\"!!  \037\037\036\036\036\035\035\035\034\034\034\034\033\033\033\033\033\033\033\033\033\032\032\032\032\033\033\033\033\033\033\033\033\033\034\034\034\034\035\035\035\035\036\036\037\037  !!\"##$%&'()+,+)(&%#\"! \037\037\036\035\035\034\033\033\032\032\032\031\031\031\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\030\030\030\031\031\031\032\032\032\033\033\034\035\035\036\037 !\"#$%'(*,/26;BEEEEEEEEFFFGGHHIIJJJIHHGGFFEEDDCCBBAA@@??>>==<<<;;:::9988877776666555555555555555555555666310.,+*)'&&%$#\"\"!  \037\037\037\036\036\035\035\035\035\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\035\035\035\036\036\036\037\037  !\"\"#$%%&'(*+,+*(&%$#\"! \037\036\035\035\034\034\033\033\032\032\031\031\031\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\030\030\030\030\031\031\031\032\032\033\033\034\034\035\035\036\037 !\"#$%')+-/26;BDDDDDDDEEEFFFGGHIIJJJIHHGGFFEEDDCCBBAA@@??>>==<<<;;:::999888777666666665555555555555666666420.-+*)('&%$##\"!!  \037\037\036\036\036\035\035\035\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\035\035\035\036\036\036\037\037  !!\"##$%&'()*+-,*('%$#\"! \037\036\036\035\034\034\033\033\032\032\032\031\031\031\030\030\030\030\027\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\027\030\030\030\030\031\031\031\032\032\032\033\033\034\034\035\036\036\037 !\"#$&')+-037<CDCCCDDDDDEEEFFGGHIIJJJIHHGGFFEEDDCCBBAA@@??>>==<<<;;:::99988877776666666666655556666666676420/-,*)('&%$$#\"\"!  \037\037\037\036\036\036\035\035\035\034\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\034\035\035\035\035\036\036\037\037\037  !!\"##$%&'()*,-,*('&$#\"! \037\037\036\035\035\034\034\033\033\032\032\031\031\031\031\030\030\030\030\027\027\027\027\027\027\027\027\027\026\026\026\026\026\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\032\032\033\033\034\034\035\035\036\037\037 !\"#%&()+-037<CCCCCCCCCDDDEEEFGGHIIJJJIHHGGFFEEDDCCBBAA@@??>>==<<<;;:::9998888777767666666666666666677777531/-,+*('&%%$#\"\"!!  \037\037\036\036\036\035\035\035\035\034\034\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037  !!\"\"#$%%&'()+,-,*)'&%#\"!  \037\036\035\035\034\034\033\033\032\032\032\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\032\032\032\033\033\034\034\035\035\036\037 !\"#$%&(*,.047<BBBBBBBCCCCDDDEEFFGHIIJJIIHHGGFFEEDDCCBBAA@@??>>===<<;;;::999988877777777766666666677777787531/.,+*)('&%$##\"!!  \037\037\037\036\036\036\035\035\035\035\034\034\034\034\034\034\034\034\034\034\033\033\034\034\034\034\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037\037  !!\"##$%&'')*+,.-+)(&%$#\"! \037\036\036\035\034\034\033\033\033\032\032\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\031\032\032\033\033\033\034\035\035\036\036\037 !\"#$%'(*,.148=BBBABBBBBBCCCDDEEFFGHIJKJIIHHGGFFEEDDCCBBAA@@??>>===<<;;;:::99988887777777777777777777778885310.-+*)('&%$$#\"\"!!  \037\037\037\036\036\036\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\036\036\036\036\037\037  !!\"\"#$$%&'()*+-.-+)(&%$#\"! \037\037\036\035\035\034\034\033\033\032\032\032\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\031\032\032\032\033\033\034\034\035\035\036\037\037 !\"#$%'(*,/148=AAAAAAAAABBBCCCDDEFFGHIJKJIIHHGGFFEEDDCCBBAA@@??>>===<<;;;:::9999888888877777777777778888886420.-,*)('&%%$##\"!!   \037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\036\036\036\036\037\037\037  !!\"\"#$%%&'()*,-.-+*('%$#\"!  \037\036\035\035\034\034\033\033\033\032\032\032\031\031\031\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\030\030\031\031\031\032\032\032\033\033\033\034\034\035\036\036\037  !\"#$&')+-/259>@@@@@@@AAAABBBCCDDEFFGHIJKJIIHHGGFFEEDCCCBBAA@@??>>===<<;;;:::999988888888888777788888889986420/-,+*)('&%$##\"\"!!  \037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\035\036\036\036\037\037\037  !!\"\"##$%&&'()+,-/.,*('&$#\"!! \037\036\036\035\035\034\034\033\033\032\032\032\031\031\031\031\030\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\030\030\031\031\031\031\032\032\032\033\033\034\034\035\035\036\036\037 !\"#$%&')+-/259>@@@@@@@@@@AAABBCCDDEFGGHIJJJIIHHGGFFEDDCCBBBAA@@??>>===<<<;;;:::9999899888888888888888999997431/.,+*)('&%$$#\"\"!!   \037\037\037\036\036\036\036\035\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\035\035\036\036\036\036\037\037   !!\"\"#$$%&'()*+,-/.,*)'&%$#\"! \037\037\036\035\035\034\034\033\033\033\032\032\032\031\031\031\031\030\030\030\030\030\030\030\030\030\030\027\027\027\030\030\030\030\030\030\030\030\030\030\031\031\031\031\032\032\032\033\033\033\034\034\035\035\036\037\037 !\"#$%&()+-0259??????????@@@AAABBCDDEFGHIJKJJIIHHGGFEEDDCCBBBAA@@??>>===<<<;;;::::99999999888888888999999:97531/.-+*)('&%%$##\"\"!!  \037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\037\037\037  !!\"\"##$%%&'()*+,./.,+)(&%$#\"! \037\037\036\036\035\034\034\034\033\033\032\032\032\032\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\032\032\032\032\033\033\034\034\034\035\036\036\037  !\"#$%'(*+.036:?>>>>>>>????@@@AABBCDDEFGHIJKJJIIHHGGFEEDDCCBBAAA@@??>>>==<<<;;;::::99999999999999999999::::75310.-,*)(''&%$$#\"\"!!   \037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\037\037\037   !!\"\"##$%&&'()*,-.0/-+)(&%$#\"!  \037\036\036\035\035\034\034\033\033\033\032\032\032\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\032\032\032\033\033\033\034\034\035\035\036\036\037 !!\"#$&'(*,.036:>>>>>>>>>>>???@@AABBCDDEFGHIKKJJIIHHGFFEEDDCCBBAAA@@??>>>==<<<;;;;:::::::9999999999999::::::86420/-,+*)('&%%$##\"\"!!   \037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\037\037\037\037  !!\"\"##$$%&'()*+,-.0/-+*('&$#\"!! \037\037\036\035\035\034\034\034\033\033\032\032\032\032\031\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\032\032\032\032\033\033\034\034\034\035\035\036\037\037 !\"#$%&')*,.137;=========>>>>???@@ABBCDEEFGIJKKJJIIHHGFFEEDDCCBBAAA@@??>>>===<<<;;;;::::::::::9999:::::::;;:86421/.,+*)('&%%$##\"\"!!   \037\037\037\037\036\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\037\037\037\037   !!\"\"##$%%&'()*+,-/0/-,*('&%$#\"! \037\037\036\036\035\035\034\034\033\033\033\032\032\032\032\031\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\031\032\032\032\032\033\033\033\034\034\035\035\036\036\037\037 !\"#$%&')+,.147;=<<<<<<=====>>>??@@ABBCDEFGHIJKKJJIIHGGFFEEDDCCBBAAA@@??>>>===<<<;;;;:;;:::::::::::::::;;;;;86431/.-+*)(''&%$$##\"\"!!   \037\037\037\037\036\036\036\036\036\036\036\035\035\035\035\035\035\035\035\036\036\036\036\036\036\036\037\037\037\037   !!\"\"\"#$$%&&'()*+,./10.,*)'&%$#\"!  \037\036\036\035\035\034\034\034\033\033\033\032\032\032\032\031\031\031\031\031\031\031\030\030\030\030\030\030\030\030\030\031\031\031\031\031\031\031\032\032\032\032\033\033\033\034\034\034\035\035\036\036\037  !\"#$%&()+-/147<<<<<<<<<<<<===>>??@@ABBCDEFGHIKKKJJIIHGGFFEEDDCCBBAAA@@??>>>===<<<<;;;;;;;;:::::::::;;;;;;<;975310.-,+*)('&%%$##\"\"!!!   \037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037   !!!\"\"##$%%&'(()*,-./10.,*)(&%$#\"!! \037\037\036\036\035\035\034\034\033\033\033\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\030\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\033\033\033\034\034\035\035\036\036\037\037 !!\"#$%'()+-/248;;;;;;;;;;<<<<===>>?@@ABBCDEFGIJKKKJJIHHGGFFEEDDCCBBAAA@@???>>====<<<<;<;;;;;;;;;;;;;;;;;<<<<975320/-,+*)('&&%$$##\"\"!!   \037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037   !!\"\"\"#$$%%&'()*+,-.010.,+)('%$#\"\"! \037\037\036\036\035\035\034\034\034\033\033\033\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\033\033\033\034\034\034\035\035\036\036\037\037 !\"##%&'(*+-/258;;;;:::;;;;;;<<<==>>??@ABCCDFGHIKLKKJJIHHGGFFEEDDCCBBAAA@@???>>>===<<<<<<<;;;;;;;;;;;;;<<<<<<:75420/.,+*)(''&%$$##\"\"!!!   \037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037   !!!\"\"##$$%&&'()*+,-/021/-+)('&%$#\"!  \037\036\036\035\035\035\034\034\033\033\033\033\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\033\033\033\033\034\034\035\035\035\036\036\037  !\"#$%&')*,.0259:::::::::::;;;;<<==>>??@ABCDEFGHJKLKKJIIHHGGFFEEDDCCBBAAA@@???>>>====<<<<<<<<<<;;;;<<<<<<<==<:86421/.-+*)(('&%%$$##\"\"!!!   \037\037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037\037    !!\"\"\"##$%%&''()*+,./021/-+*('&%$#\"!! \037\037\036\036\035\035\034\034\034\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\032\033\033\033\034\034\034\035\035\036\036\037\037 !!\"#$%&')*,.0359:999999999::::;;;<<==>??@ABCDEFHIJLLKKJIIHHGGFFEEDDCCBBAAA@@???>>>=======<<<<<<<<<<<<<<<=====:86431/.-,+*)('&&%$$##\"\"!!!    \037\037\037\037\037\037\037\036\036\036\036\036\036\036\036\037\037\037\037\037\037\037    !!!\"\"##$$%&&'()*+,-./121/-,*)'&%$#\"\"! \037\037\036\036\035\035\035\034\034\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\032\033\033\033\033\034\034\034\035\035\036\036\037\037 !\"\"#$%&()+,.03699999999999999:::;;<<==>?@@ABCDFGHJKLLKJJIIHHGGFFEEDDCCBBAAA@@???>>>>========<<<<<<<<<======>=;965310.-,+*)(''&%%$###\"\"!!!    \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037    !!!\"\"\"##$$%&&'()*+,-.01320.,*)(&%$##\"!  \037\037\036\036\035\035\034\034\034\033\033\033\033\032\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\032\032\032\032\032\032\032\033\033\033\033\034\034\034\035\035\036\036\037\037  !\"##$&'()+-/1369888888888889999::;;<<==>?@AACDEFGIJLLLKJJIIHHGGFFEEDDCCBBAAA@@@???>>>>=>=================>>>>;975320/-,+*)(('&%%$$##\"\"\"!!!    \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037    !!!!\"\"##$$%%&''()*+,-/01320.,+)('&%$#\"!! \037\037\036\036\035\035\035\034\034\034\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\034\034\034\034\035\035\036\036\037\037 !!\"#$%&'(*+-/147888777777788888999::;;<==>?@ABCDEGHJKMLKKJJIIHHGGFFEEDDCCBBAAA@@@???>>>>>>>=============>>>>>><975420/.-,**)('&&%$$###\"\"!!!!     \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037     !!!\"\"\"##$$%&&'())*+,./02320.,+)('&%$#\"!! \037\037\036\036\036\035\035\034\034\034\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\034\034\035\035\035\036\036\037\037 !!\"#$%&'(*+-/1477777777777777888899::;;<==>?@ABCDFGIJLMLKKJJIIHHGGFFEEDDCCBBBAA@@@????>>>>>>>>>>====>>>>>>>???<:86421/.-,+*)(''&%%$$##\"\"\"!!!      \037\037\037\037\037\037\037\037\037\037\037\037      !!!\"\"\"##$$%%&''()*+,-./12430/-+*('&%$#\"\"!  \037\037\036\036\035\035\035\034\034\034\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\034\034\035\035\035\036\036\037\037  !\"\"#$%&')*,./24776666666666777778899::;;<=>>?@ABDEFHIKMLLKKJJIIHHGGFFEEDDCCBBBAA@@@@??????>>>>>>>>>>>>>>>?????<:864310.-,+*)(('&&%$$###\"\"\"!!!       \037\037\037\037\037\037\037\037       !!!!\"\"###$$%%&''()*+,-.012431/-+*)'&%$##\"!! \037\037\036\036\035\035\035\034\034\034\034\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\034\034\034\035\035\035\036\036\037\037 !!\"#$$%'()*,.02566666555566666677788899:;;<=>?@ABCDFGIJLMLLKKJJIIHGGFFEEEDDCCBBBAAA@@@????????>>>>>>>>>??????@?=:865310/-,+*))('&&%%$$##\"\"\"!!!!                    !!!!\"\"\"##$$%%&&'())*+,-/013431/-,*)('&%$#\"!!  \037\037\036\036\035\035\035\034\034\034\033\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\033\033\034\034\034\035\035\035\036\036\037\037  !!\"#$%&'()+,.025655555555555556667778899:;;<=>?@ABCEFHIKMMLLKKJJIHHGGFFEEEDDCCBBBAAA@@@@?@?????????????????@@@@=;975320/.-,+*)(''&%%$$###\"\"\"!!!!!                 !!!!\"\"\"###$$%%&''()*++-./023541/.,+)('&%$#\"\"!  \037\037\036\036\035\035\035\034\034\034\034\033\033\033\033\033\033\033\033\032\032\032\032\032\032\032\033\033\033\033\033\033\033\033\034\034\034\034\035\035\035\036\036\037\037  !\"\"#$%&'(*+-.0355554444444445555666778899:;;<=>?@ACDEGIJLMMLLKKJIIHHGGFFEEEDDCCBBBAAAA@@@@@@?????????????@@@@A@>;975421/.-,+*)(('&&%%$$###\"\"\"!!!!!              !!!!!\"\"\"\"##$$%%&&'(()*+,-./0235420.,+)('&%$##\"!! \037\037\036\036\036\035\035\035\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\035\035\035\036\036\036\037\037 !!\"##$%&'(*+-/13544444444444444455566677899:;<<=>?ABCEFHIKMMMLLKJJIIHHGGFFEEEDDCCCBBBAAA@@@@@@@@@@????@@@@@@@AAA><9764210.-,+*))(''&%%$$###\"\"\"\"!!!!!            !!!!!\"\"\"\"###$$%%&&'())*+,-./1245420.-+*('&%$$#\"!!  \037\037\036\036\035\035\035\035\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\035\035\035\035\036\036\037\037  !!\"#$$%&()*,-/134443333333333344445556677899:;<=>?@ABDEGIJLNMMLLKJJIIHHGGFFEEEDDCCCBBBAAAAAA@@@@@@@@@@@@@@@AAAAA><:864310/.,++*)(''&&%%$$###\"\"\"\"!!!!!!!      !!!!!!!!\"\"\"###$$%%&&''()**+,-/01246520/-+*)(&&%$#\"\"!  \037\037\036\036\036\035\035\035\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\035\035\035\036\036\036\037\037  !\"\"#$%&'()*,-/1433333222222333333444556677899:;<=>?@BCDFHJLNNMMLKKJJIIHHGGFFEEEDDCCCBBBAAAAAAAA@@@@@@@@@A@@@@@").append("@@?<:865320/.-,+*)(('&&%%$$$###\"\"\"\"!!!!!!!!!!!!!!!!!!!\"\"\"\"###$$%%&&'(()*+,-./01346531/-,*)('&%$#\"\"!!  \037\037\036\036\036\035\035\035\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\035\035\035\035\036\036\037\037  !!\"\"#$%&'()+,.023322222222222222333344455677899:;<=>?ABDEGIKMNNMLLKKJJIIHHGGFFEEEDDCCCBBBBABAAAAAAAAA@@@@@????????=:875320/.-,+*))(''&&%%$$###\"\"\"\"\"!!!!!!!!!!!!!!!!\"\"\"\"\"###$$%%%&''())*+,-./02356531/-,+)('&%$##\"!!  \037\037\036\036\036\035\035\035\035\034\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037  !!\"##$%&'(*+,.0222222111111111222223334455677899:;<=?@ACDFHJLNNMMLLKKJJIIHHGGFFEEEDDCCCCBBBBBBAAAAA@@?????>>>>>>>>=;9754210.-,+**)(('&&%%$$$###\"\"\"\"\"!!!!!!!!!!!!!!\"\"\"\"\"###$$$%%&&''()**+,-./12357631/.,+)('&%$$#\"\"!  \037\037\037\036\036\036\035\035\035\035\034\034\034\034\034\034\034\033\033\033\033\033\033\033\034\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037\037  !\"\"#$$%&')*+-.0221111111111111111222233445566789:;<=>?@BCEGIKMONMMLLKKJJIIHHGGFFEEEDDDCCCBBBBBBA@@@??>>>>>=========;9764210/.-,+*)((''&&%%$$####\"\"\"\"\"\"!!!!!!!!!!\"\"\"\"\"\"####$$%%%&&'(()*++,-/0124576420.,+*)'&&%$#\"\"!!  \037\037\036\036\036\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037  !!\"\"#$%&'()*+-/01111000000000000011112233345567789:;<=>@ACDFHJLONNMMLLKKJJIIHHGGFFEEEDDDCCCCCBAA@???>>=====<<<<<<<<=<9864310/.-,+*))(''&&%%$$$####\"\"\"\"\"\"\"!!!!!!\"\"\"\"\"\"\"####$$$%%&&''())*+,-./0134676420.-+*)('&%$##\"!!  \037\037\037\036\036\036\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037\037  !!\"##$%&'()*,-/11000000///////000001112223344567789:;<>?@BCEGIKNONNMMLLKJJIIHHHGGFFEEEDDDDCCAA@@?>>>===<<<<;;;;;;;<<<:865320/.-,+**)(('&&%%%$$$####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"####$$$%%%&&'(()**+,-./0234687420/-,*)('&%$$#\"\"!!  \037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\036\036\036\036\037\037   !\"\"#$$%&'()+,-/0000///////////////000111223344567789:<=>?ABDFHJMOONNMMLKKJJIIHHHGGFFFEEEDDCB@@?>>===<<<;;;;;::::::;;;:8753210.-,,+*)((''&&%%$$$$####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"#####$$$%%&&''(()*++,-./1235687521/-,+)('&%%$#\"\"!!  \037\037\037\036\036\036\035\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\035\036\036\036\037\037\037  !!\"\"#$%%&'(*+,./00////...........////0001122334456789:;<=?@BCEGILNOONNMLLKKJJIIHHHGGFFFEEDCBA??>==<<<;;;::::::9999:::::9754210/.-,+*))(''&&%%%$$$#####\"\"\"\"\"\"\"\"\"\"\"\"\"\"#####$$$%%%&&''())*+,-./01245787531/.,+*('&&%$##\"!!   \037\037\036\036\036\036\035\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\035\036\036\036\036\037\037   !!\"##$%&'()*+,.0///.................///000112234456789:;<>?ABDFHKMPOONMMLLKKJJIIHHHGGFFDCCBA@>>=<<;;;:::9999999999999999764310/.-,+**)((''&&%%%$$$######\"\"\"\"\"\"\"\"\"\"######$$$%%%&&''(()**+,-./01245798531/.,+*)('&%$##\"\"!!  \037\037\037\036\036\036\036\035\035\035\035\035\035\035\034\034\034\034\034\034\034\035\035\035\035\035\035\035\036\036\036\036\037\037\037  !!\"\"##$%&'()*+-.//....-------------....///00112234556789:<=>@BCEGJLOPOONMMLLKKJJIIHHHGEDCBAA@?==<;;:::9998888888888888889764320/.-,++*))(''&&&%%$$$$#######\"\"\"\"\"\"#######$$$$%%%&&''(()*++,-./013467986310.-+*)('&%$$#\"\"!!   \037\037\037\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\037\037\037   !!\"\"#$$%&'()*,-/...------,,,,,,,------...//0011223455678:;<>?ABDFIKNPPONNMMLLKKJJIIHGFDCBA@??><<;::99988877777777777777788653210.--,+*))((''&&%%%$$$$##################$$$$%%%&&''(())*+,,-./123468986420.-,*)('&%%$##\"\"!!  \037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\037\037\037  !!!\"##$%%&'()+,-..----,,,,,,,,,,,,,,,----..///001223456789:;=>@BCEHJMOPOONNMMLLKKJJHGFDCBA@?>>=;;:9998877776666666666666777654210/.-,+**)((''&&&%%%$$$$################$$$$%%%&&&''(()**+,-./0123568:96420/-,+)('&&%$##\"\"!!   \037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\037\037\037   !!\"\"##$%&''(*+,.---,,,,,+++++++++++,,,,----..//001223456789:<=?ABDGILNPPOONNMMLLKJHGFDCBA@?>==<::99887766665555555555555666654210/.-,++*))((''&&%%%%$$$$$#############$$$$$%%%&&''(())*++,-./0124578:97421/-,+*)('&%$$#\"\"!!   \037\037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\037\037\037\037   !!\"\"#$$%&'()*+,--,,,,+++++++++++++++++,,,---..//00123345678:;<>@BDFHJMPPPOONNMLLJIGFDCBA@?>=<<;9988776665555444444444445555664320/.-,,+**)((''&&&%%%$$$$$$##########$$$$$$%%%&&&''(())*+,,-./0134579:97531/.,+*)('&%%$##\"\"!!   \037\037\037\036\036\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\036\037\037\037   !!\"\"##$%%&'()*+--,,,++++*************++++,,,---.//00123345689:<=?ACEGILOQPPOONMMKIHFECBA@?>=<;;:88776655544443333333333344445543210/.-,+**))((''&&&%%%$$$$$$$$####$$$$$$$$%%%%&&'''(()**+,--./0234679;:7531/.-+*)('&%%$##\"\"!!   \037\037\037\037\036\036\036\036\036\036\036\036\035\035\035\035\035\036\036\036\036\036\036\036\036\037\037\037\037   !!\"\"##$%&&'()*,,,,+++******)))))))******+++,,,--../00123456789;<>@BDFHKNQQPPONMKJHFECBA@?>=<;::977665544433333222222222333334443210/.-,++*))((''&&&%%%%$$$$$$$$$$$$$$$$$$%%%%&&&''(())*++,-./01235689;:75310.-,*)('&&%$$#\"\"\"!!   \037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037   !!!\"\"#$$%&''()+,,+++****)))))))))))))))****+++,,--../0012345679:;=?ACEGJMPQQPONLJHGEDBA@?>=<;:99866554433332222221111122222233344210/.-,,+**)(((''&&&%%%%$$$$$$$$$$$$$$$$%%%%&&&'''(()**+,,-./0123568:;:86420.-,+*)('&%$$##\"\"!!    \037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037   !!\"\"##$$%&'()*+,++***))))))((((((((())))))***++,,--../0012345689;<>@BDFILORQPOLKIGEDBA@?>=<;:988755443332221111111111111111122233310/.--,+**))(('''&&&%%%%%$$$$$$$$$$$$%%%%%&&&&''(())**+,--./0124578:<;86420/-,+*)('&%%$##\"\"!!!   \037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037   !!!\"\"##$%%&'()*+++**))))((((((((((((((((())))**+++,,-../011235678:;=?ACEHKNQROMKIGFDCA@?><;;:98776443322211110000000000000001111223210/.-,++**)(((''&&&&%%%%%%$$$$$$$$$%%%%%&&&&'''(())*++,-.//1234578:<;86421/.,+*)('&&%$$##\"\"!!    \037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037    !!\"\"##$$%&&'()*+**))))(((('''''''''''''(((()))***++,,-../012345679:<>@BDGJMPPNLJHFDCA@?><;:998766533222110000//////////////00001112210/.-,,+**))(('''&&&&%%%%%%%%$$$%%%%%%%%&&&'''(())**+,,-./01234679;<;96431/.-+*)(''&%$$##\"\"!!!    \037\037\037\037\037\037\036\036\036\036\036\036\036\036\036\037\037\037\037\037\037    !!!\"\"##$$%&''()***)))(((''''''''&&&''''''''((()))**++,,-../01234578:;=?ACFHKOOMJIGECB@?><;:9887655422111000////............/////0001110/.--,++*))((('''&&&&%%%%%%%%%%%%%%%%%&&&&''((())**+,--./01235689;=<975310.-,*)(('&%%$##\"\"\"!!!   \037\037\037\037\037\037\037\037\036\036\036\036\036\037\037\037\037\037\037\037\037   !!!\"\"\"##$%%&'()**)))(((''''&&&&&&&&&&&&&&&''''((()))**+,,-../01235679:<>@BEGJMMKIGEDBA?>=;:98776544321100///.....----------.....///00010//.-,++**))(('''&&&&&%%%%%%%%%%%%%%&&&&&'''(())**++,-../01245689;=<975310.-,+*)('&&%$$##\"\"!!!    \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037    !!!\"\"##$$%&&'()*))((('''&&&&&&%%%%%%%%%&&&&&&'''((())**+,,-.//01345689;=?ADFILLJHFDBA?>=;:9876654332100//....------,,,,,,,------...//0000/.-,,+**))((('''&&&&&%%%%%%%%%%%%&&&&&'''((())**+,,-./01234578:<=<:75320/-,+*)('&&%$$##\"\"\"!!!    \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037    !!!\"\"\"##$$%&&'()))(('''&&&&%%%%%%%%%%%%%%%%%&&&&'''(())**+,,-./01234579:<>@CEHKKIGECA@>=<:987655432210//...---,,,,,,,,,,,,,,,,,,---...//00/.--,++**))((''''&&&&&&%%%%%%%%&&&&&&''''(())**++,--./01234678:<>=:86420/.,+*)(''&%%$$##\"\"!!!     \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037     !!!\"\"##$$%%&''())((''&&&&%%%%%$$$$$$$$$$$%%%%%&&&&''(())**+,,-./01235689;=?ADGJIGECB@>=<:987654432110/...--,,,,++++++++++++++++,,,,---..///..-,,+**))(((''''&&&&&&&&%%&&&&&&&&''''((())**++,-../01234679:<>=:86421/.-+*)(('&%%$$##\"\"\"!!!      \037\037\037\037\037\037\037\037\037\037\037\037     !!!\"\"\"##$$%%&'()(('''&&&%%%$$$$$$$$$$$$$$$$$$$%%%&&&'''(()**+,,-./0134578:<>@CFIHFDB@?=<;987654332110/.---,,,++++**************++++,,,---..//.-,,++**))(((''''&&&&&&&&&&&&&&&&''''((()))**+,,-.//01245689;<>=;86421/.-,+*)('&&%$$###\"\"!!!!      \037\037\037\037\037\037\037\037\037      !!!!\"\"###$$%&&'(((''&&&%%%$$$$$#############$$$$$%%%&&&''(()**+,--./1234679;=?BEHGECA?><;987654322100/.--,,+++******)))))))))))*****+++,,--../.--,++**))((((''''&&&&&&&&&&&&&&'''''((())**++,--./012345689;=?>;964310.-,+*)(''&%%$$##\"\"\"!!!!        \037\037\037        !!!!\"\"\"##$$%%&''((''&&%%%$$$$#######\"\"\"\"\"#######$$$$%%%&&''(()**+,-./0124578:<>ACFECA@><;:8765432110//..,,+++***))))))(((((((())))))***+++,,--...-,,+***))((('''''&&&&&&&&&&&&'''''((()))**+,,-../01234578:;=?>;975310/-,+*)(''&%%$$###\"\"!!!!!                  !!!!\"\"\"##$$%%&'((''&&%%$$$#####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"#####$$$%%&&&'(()**+,-./0134679;=@BEDB@>=;:8765432100/..--++***))))(((((((((((((((((())))**+++,,-..-,,++**)))(((''''''&&&&&&&&''''''((()))**++,,-.//01234678:<=?><975320/.,+*))('&&%%$$##\"\"\"!!!!                 !!!!\"\"\"##$$$%&&'('&&%%%$$####\"\"\"\"\"\"!!!!!!!!!\"\"\"\"\"\"####$$$%%&&''()**+,-./023568:<?ADCA?=<:9765432100/.--,,***)))((((''''''''''''''''(((()))**++,,----,++***))((((''''''''''''''''''(((()))**++,--./001235679:<>@?<975420/.-,+*)('&&%%$$###\"\"\"!!!!!              !!!!\"\"\"\"##$$%%&&''&&%%$$$###\"\"\"\"!!!!!!!!!!!!!!!!!\"\"\"\"####$$%%&&''()**+,-.0124579;>@CA?><:986543210//.--,++*))((((''''&&&&&&&&&&&&&'''''((()))**++,,--,,++**)))((((''''''''''''''''(((()))**++,,-../012345689;<>@?<:86421/.-,+*)(''&%%$$###\"\"\"!!!!!!           !!!!!!\"\"\"###$$%%&''&&%%$$###\"\"\"!!!!!!           !!!!!!\"\"\"###$$%%&&''()*+,-./013568:<?B@><;986543210/..-,,++*)((('''&&&&&&%%%%%%%%%&&&&&&''''((())**+,,--,++***)))((((''''''''''''''(((()))***++,,-../012345689;=>@?=:864210.-,+*)(('&&%%$$###\"\"\"!!!!!!         !!!!!!\"\"\"\"##$$%%&&'&&%$$$##\"\"\"!!!!                   !!!!\"\"\"###$$%%&''()*+,-./124579;>A?=;:87543210/.--,++**)((''&&&&%%%%%%%%%%%%%%%%%%%&&&&'''(())**++,-,,++**)))(((((('''''''''''((((()))**++,,--.//01234578:;=?A@=:864310.-,+*))('&&%%$$###\"\"\"\"!!!!!!!!!  !!!!!!!!\"\"\"\"###$$%%&&&&%$$##\"\"\"!!!!     \037\037\037\037\037\037\037\037\037\037\037\037\037      !!!\"\"\"##$$%%&''()*+,-.013468:=?=<:87643210/.--,++*))(''&&&%%%%$$$$$$$$$$$$$$$$$%%%%&&&'''(())*++,,,++***)))((((((''''''''(((((()))***++,,-../011235678:<=?A@=;865310/.,+**)(''&%%$$$###\"\"\"\"!!!!!!!!!!!!!!!!!\"\"\"\"###$$$%%&&&%$$##\"\"!!!    \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037    !!!\"\"##$$%%&'(()*+,./023579<><:97643210/.-,,+**))((&&&%%%$$$$$##############$$$$$%%%&&'''(()**+,,,++***)))(((((((((((((((((())))**++,,--../012345679:<>?A@=;975320/.-,+*)(('&&%%$$###\"\"\"\"\"!!!!!!!!!!!!!!!\"\"\"\"\"###$$%%&&&%$$##\"\"!!!   \037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037    !!\"\"\"#$$%%&'())*,-./12468;=;98653210/.-,++*))((''%%%$$$$######\"\"\"\"\"\"\"\"\"#######$$$%%%&&''(()**+,,++***))))(((((((((((((((())))***++,,--.//012345689;<>@BA>;975321/.-,+*)(('&&%%$$$###\"\"\"\"\"!!!!!!!!!!!!!\"\"\"\"\"###$$$%%&&%$$#\"\"!!!   \037\037\037\037\036\036\036\036\036\036\036\035\035\035\035\035\035\035\036\036\036\036\036\036\036\037\037\037\037   !!!\"\"##$%%&'()*+,-/023579<:8654210/.-,+**)((''&&%$$$####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"####$$$%%%&&''())*+,,++***))))(((((((((((((())))***+++,,-../0012345789;<>@BA><975421/.-,+*))(''&&%%$$####\"\"\"\"\"!!!!!!!!!!!\"\"\"\"\"####$$%%&&%$##\"\"!!   \037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\037\037\037   !!\"\"##$%%&'()*+,./12468:9754210/.-,+**)(('&&&%$$###\"\"\"\"!!!!!!!!!!!!!!!!!\"\"\"\"\"###$$%%&&''(()*+,+++***)))))(((((((((()))))****++,,--.//012335678:;=>@BA><:864210.-,+**)(''&&%%$$$###\"\"\"\"\"\"\"!!!!!!!\"\"\"\"\"\"\"###$$$%%&%$##\"\"!!  \037\037\037\036\036\036\036\035\035\035\035\035\035\035\034\034\034\034\034\034\034\034\034\035\035\035\035\035\035\035\036\036\036\036\037\037\037  !!\"\"##$%%&'()*+-.013579764310/.-,+*))(''&&%%$##\"\"\"\"!!!!!             !!!!!!\"\"\"###$$%%&&'(()*+,++****))))))((((((())))))***+++,,--.//012345678:;=?ACB?<:864310/.-,+*)(('&&%%%$$####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"####$$%%%%$##\"\"!!  \037\037\036\036\036\036\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\036\036\036\037\037\037  !!\"##$%&&'()+,-/0246864320/.-,+*)(('&&%%$$#\"\"\"!!!!       \037\037\037\037\037\037\037       !!!!\"\"\"###$$%&&''()*++++***))))))))))))))))))***+++,,--../0012345679:<=?ACB?=:865320/.-,+*))(''&&%%$$$####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"####$$$%%%$##\"!!  \037\037\037\036\036\036\035\035\035\034\034\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037  !!\"##$%&'()*+,./13575320/.-,+*)(('&&%$$$##\"!!!    \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037    !!!!\"\"##$$%%&''()*+++****))))))))))))))))****+++,,--.//0112345689:<>?ACB?=;875320/.-,+*))(''&&%%%$$$####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"#####$$$%%$##\"!!  \037\037\036\036\036\035\035\035\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\035\035\035\036\036\036\037\037  !!\"##$%&'()*+-.0245421/.-,+*)(''&%%$$##\"\"!    \037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037    !!!\"\"##$$%&&'()*+++*****)))))))))))))****+++,,--..//0123456789;<>@BDC@=;975321/.-,+**)((''&&%%$$$#####\"\"\"\"\"\"\"\"\"\"\"\"\"#####$$$%%$$#\"!!  \037\037\036\036\035\035\035\034\034\034\034\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\033\034\034\034\034\035\035\035\036\036\036\037\037 !!\"##$%&'()+,./134310.-,+*)('&&%$$##\"\"!!  \037\037\037\037\036\036\036\036\036\036\036\035\035\035\035\035\035\035\035\035\036\036\036\036\036\036\036\037\037\037\037   !!\"\"##$$%&&'()*+++*****))))))))))*****+++,,,--../0012345678:;=>@BDC@=;9754210/-,,+*)((''&&%%%$$$#####\"\"\"\"\"\"\"\"\"\"\"#####$$$$%%$#\"!! \037\037\036\036\036\035\035\034\034\034\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\034\034\035\035\035\036\036\037\037  !\"##$%&'(*+-.02310.-,+*)('&&%$$##\"\"!! \037\037\037\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\037\037\037   !!\"\"##$%&&'()*+++******))))))******++++,,--..//0112345679:;=?@BDC@>;9764310/.-,+*))(''&&%%%$$$$######\"\"\"\"\"\"\"######$$$$%%$#\"!! \037\037\036\036\035\035\035\034\034\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\032\033\033\033\033\034\034\034\035\035\036\036\037\037  !\"##$%&()*,-/120/-,+*)('&%%$##\"\"!!   \036\036\036\036\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\036\036\036\037\037\037   !!\"##$%%&'()*+++*****************+++,,,--..//0122345689:<=?ACEDA><:864310/.-,+**)((''&&%%%$$$###################$$$%%$#\"!! \037\037\036\036\035\035\034\034\034\033\033\033\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\033\033\033\033\034\034\035\035\035\036\037\037  !\"#$%&'()+,.01/.,+*)('&%%$##\"!!   \037\037\036\035\035\035\035\034\034\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037  !!\"\"#$%%&'()*+++***************+++,,,---.//00123456789:<>?ACEDA><:865320/.-,++*)((''&&%%%$$$$#################$$$$%$#\"!! \037\037\036\036\035\035\034\034\033\033\033\032\032\032\032\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\031\032\032\032\033\033\033\034\034\034\035\035\036\036\037  !\"#$%&'(*+-//.-+*)('&%$$#\"\"!!  \037\037\036\036\035\035\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\035\035\035\036\036\037\037\037  !\"\"#$$%&'()++++************+++++,,,--..//01123456789;<>@ACEDA?<:865321/.-,,+*))(''&&&%%%$$$$###############$$$$%$#\"\"! \037\037\036\035\035\034\034\033\033\033\032\032\032\031\031\031\031\031\030\030\030\030\030\030\030\030\030\027\027\027\027\027\027\030\030\030\030\030\030\030\030\030\031\031\031\031\032\032\032\033\033\033\034\034\035\035\036\036\037  !\"#$%&')*,..-+*)('&%$##\"!!  \037\037\036\036\036\035\034\034\034\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\034\034\034\035\035\035\036\036\037\037  !!\"#$$%&'(*++++**********+++++,,,---../00122345678:;=>@BDFDB?=:8754210/.-,+*))((''&&%%%$$$$$#############$$$$$%$#\"! \037\037\036\035\035\034\034\033\033\032\032\032\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\031\032\032\032\033\033\034\034\035\035\036\036\037  !\"#$%'()+--,*)('&%$##\"!! \037\037\036\036\036\035\035\035\034\033\033\033\033\032\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\032\032\033\033\033\033\034\034\034\035\035\035\036\036\037\037 !!\"#$$%&')*+++++******++++++,,,,--..//00123345679:;=>@BDFEB?=;9754210/.-,+**)((''&&&%%%$$$$$$##########$$$$$%$#\"! \037\036\036\035\035\034\034\033\033\032\032\031\031\031\031\030\030\030\030\027\027\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\032\032\032\033\033\034\034\035\036\036\037  !\"#$&'(*,,+)('&%$#\"\"!  \037\037\036\036\035\035\034\034\034\033\033\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\033\033\033\034\034\034\035\035\036\036\037\037  !\"#$$%'()*+++++++++++++++,,,,---..//01123456789:<=?@BDGEB@=;9764310/.-,++*))((''&&%%%%$$$$$$#######$$$$$$%$#\"! \037\036\036\035\035\034\033\033\032\032\032\031\031\031\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\030\030\030\030\031\031\031\032\032\033\033\034\034\035\036\036\037 !\"\"$%&')++)('&%$#\"\"! \037\037\036\036\035\035\035\034\034\033\033\032\032\032\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\031\032\032\032\033\033\033\034\034\034\035\035\036\036\037  !\"#$$&'()++++++++++++++,,,,---..//001223456789;<=?ACEGEC@=;9764320/.-,,+*))((''&&&%%%%$$$$$$$$$$$$$$$$$$$#\"! \037\036\036\035\034\034\033\033\032\032\031\031\031\030\030\030\027\027\027\027\027\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\026\026\027\027\027\027\030\030\030\030\031\031\032\032\033\033\034\034\035\035\036\037 !\"#$%&(**('&%$#\"!! \037\037\036\036\035\035\034\034\033\033\033\032\031\031\031\031\030\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\030\030\031\031\031\031\032\032\032\032\033\033\034\034\035\035\036\036\037\037 !\"#$%&'(*++++++++++++,,,,,---..//001233456789;<>?ACEGFC@><:865321/.--,+**)(('''&&%%%%$$$$$$$$$$$$$$$$$%#\"! \037\037\036\035\034\034\033\033\032\032\031\031\030\030\030\027\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\027\027\027\030\030\030\031\031\031\032\032\033\033\034\035\035\036\037 !\"#$&'))'&%$#\"!  \037\036\036\035\035\034\034\033\033\033\032\032\032\031\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\031\032\032\032\033\033\034\034\035\035\036\037\037 !\"#$%&'(*++++++++++,,,,,---..//001123445679:;<>@ACEHFC@><:8653210/.-,+**))((''&&&%%%%$$$$$$$$$$$$$$$%$#! \037\037\036\035\034\034\033\032\032\031\031\031\030\030\027\027\027\027\026\026\026\026\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\025\025\026\026\026\026\027\027\027\030\030\030\031\031\032\032\033\033\034\035\035\036\037 !\"#%&('&%$#\"!  \037\036\036\035\034\034\033\033\033\032\032\032\031\031\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\030\030\030\030\031\031\031\032\032\033\033\033\034\035\035\036\036\037 !\"#$%&')*,,+++++,,,,,,---...//001223456789:;=>@BDFHFCA><:8754210/.-,++*))(('''&&&%%%%$$$$$$$$$$$$$%$#\"! \037\036\035\034\034\033\032\032\031\031\030\030\030\027\027\027\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\026\026\026\026\027\027\027\030\030\031\031\032\032\033\033\034\035\035\036\037 !\"$%&&%$#\"! \037\037\036\035\035\034\034\033\033\032\032\031\031\031\031\030\027\027\027\027\026\026\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\026\026\027\027\027\027\027\030\030\030\031\031\031\032\032\033\033\034\034\035\036\036\037 !\"#$%&()+,,,,,,,,,,,----..///011233456789:<=?@BDFHGDA?<:9754210/.-,,+**)(((''&&&%%%%%%$$$$$$$$$%%%#\"! \037\036\035\034\034\033\032\032\031\031\030\030\027\027\027\026\026\026\025\025\025\025\024\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\024\025\025\025\025\025\026\026\026\027\027\027\030\030\031\031\032\033\033\034\035\035\036\037 !#$%%$#\"! \037\036\036\035\034\034\033\033\032\032\032\031\031\030\030\030\030\027\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\027\027\027\027\030\030\030\031\031\031\032\032\033\034\034\035\035\036\037 !\"#$%'(*,,,,,,,,,,----...//0011234456789;<=?@BDFIGDA?=;9754310/.--,+**))(('''&&&%%%%%%%$$$$$%%%%$\"! \037\036\035\034\033\033\032\032\031\030\030\027\027\027\026\026\026\025\025\025\025\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\025\025\025\025\026\026\026\027\027\030\030\031\031\032\032\033\034\035\036\036\037!\"#$$#\"! \037\036\036\035\034\034\033\033\032\032\031\031\030\030\030\027\027\027\026\026\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\025\026\026\026\026\027\027\027\030\030\030\031\031\032\032\033\033\034\035\035\036\037 !\"#$&')*,,,,,,,,----...///001223455678:;<>?ACEGIGDB?=;97643210/.-,++*))(('''&&&&%%%%%%%%%%%%%%$#! \037\036\035\034\033\033\032\031\031\030\030\027\027\026\026\026\025\025\025\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\023\023\024\024\024\024\025\025\025\025\026\026\027\027\030\030\031\031\032\032\033\034\035\036\037 !\"##\"! \037\036\035\035\034\033\033\032\032\031\031\030\030\030\027\027\027\026\026\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\026\026\026\027\027\027\030\030\030\031\031\032\033\033\034\034\035\036\037 !\"#$&')+,,,,,------...//0011233456789:;<>?ACEGIHEB?=;98653210/.-,++**))(('''&&&&%%%%%%%%%%%%%#\" \037\036\035\034\033\033\032\031\031\030\030\027\027\026\026\025\025\025\024\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\024\024\024\024\025\025\025\026\026\026\027\027\030\030\031\032\032\033\034\035\036\037 !\"\"! \037\036\035\035\034\033\033\032\031\031\030\030\030\027\027\027\026\026\026\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\025\025\025\025\026\026\026\027\027\027\030\030\031\031\032\032\033\034\034\035\036\037 !\"#%&(*,,,-------...///0011233456789:;=>@ACEGJHEB@>;:8653210/.-,,+**))(('''&&&&&%%%%%%%%%%%$\"! \036\035\034\034\033\032\031\031\030\027\027\026\026\026\025\025\024\024\024\024\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\022\023\023\023\023\023\024\024\024\025\025\025\026\026\027\027\030\030\031\032\032\033\034\035\036\037 !! \037\036\035\034\034\033\032\032\031\031\030\030\027\027\027\026\026\026\025\025\025\024\024\024\023\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\023\023\024\024\024\024\024\025\025\025\025\026\026\027\027\027\030\030\031\031\032\033\033\034\035\036\037 !\"$%')+--------....//00112234456789:<=>@BDEHJHEC@><:8654210/.--,++*))((('''&&&&&%%%%%%%%%$#! \037\036\034\034\033\032\031\030\030\027\027\026\026\025\025\025\024\024\024\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\023\024\024\024\025\025\026\026\026\027\030\030\031\031\032\033\034\035\036\037  \037\036\035\034\033\033\032\031\031\030\030\027\027\027\026\026\025\025\025\025\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\024\024\024\024\025\025\025\026\026\027\027\030\030\031\031\032\033\033\034\035\036\037 !#$&')+------....///00112334566789;<=?@BDFHJIFC@><:8754310/..-,++**))((''''&&&&&%%%%%%%%#\" \037\036\035\034\033\032\031\030\030\027\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\024\024\024\025\025\026\026\027\027\030\031\031\032\033\034\035\036\037\037\036\035\034\033\033\032\031\031\030\030\027\027\026\026\025\025\025\024\024\024\024\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\022\023\023\023\023\024\024\024\024\025\025\025\026\026\027\027\030\030\031\032\032\033\034\035\036\037 \"#$&(*,----....///00112233456789:;<>?ABDFHHFDCA><:97643210/.-,,+**))((('''&&&&&&&%%%%%$\"!\037\036\035\034\033\032\031\030\030\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\022\022\022\022\023\023\023\024\024\025\025\026\026\027\027\030\031\031\032\033\034\035\036\036\035\034\033\032\032\031\030\030\027\027\026\026\025\025\025\024\024\024\023\023\023\023\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\020\020\020\020\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\023\024\024\024\025\025\026\026\027\027\030\030\031\032\032\033\034\035\036\037 \"#%')+--.....////00112234456789:;<>?ACDFGECB@?=<;97643210/.-,,++*)))((''''&&&&&&&&&&%#! \036\035\034\033\032\031\030\030\027\026\026\025\025\024\024\023\023\023\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\020\020\021\021\021\021\022\022\022\022\023\023\024\024\024\025\025\026\027\027\030\031\031\032\033\034\035\035\034\033\032\031\031\030\030\027\026\026\026\025\025\024\024\024\023\023\023\023\022\022\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\022\022\022\022\022\023\023\023\024\024\024\025\025\026\026\027\027\030\031\031\032\033\034\035\036\037!\"$%'*,......///001112334556789:;=>@ACEGDBA?=<;:987653210/.--,++**))(((''''&&&&&&&&%#\" \036\035\034\033\032\031\030\027\027\026\026\025\024\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\021\022\022\022\022\023\023\024\024\025\025\026\026\027\030\031\031\032\033\034\034\033\032\031\031\030\027\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\021\021\020\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\022\023\023\023\024\024\024\025\025\026\027\027\030\031\031\032\033\034\035\036 !\"$&(+-....///0001122334567789;<=>@ACEDB@><;:97665433210/..-,,+**)))(('''''&&&&&&&$\" \037\035\034\033\032\031\030\027\027\026\025\025\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\022\022\022\023\023\023\024\024\025\026\026\027\030\031\031\032\033\033\032\031\030\030\027\026\026\025\025\024\024\024\023\023\023\022\022\022\021\021\021\021\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\021\021\021\021\022\022\022\023\023\023\024\024\025\025\026\026\027\030\030\031\032\033\034\035\036 !#%'),...////001112234456789:;<=?@BCCA?=;:976543321100///.-,,++**))((('''''&&&&&%#!\037\036\034\033\032\031\030\027\027\026\025\025\024\024\023\023\022\022\021\021\021\020\020\020\020\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\020\020\020\020\021\021\021\022\022\022\023\023\024\024\025\025\026\027\030\031\031\032\032\031\030\027\027\026\026\025\025\024\024\023\023\022\022\022\022\021\021\021\021\020\020\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\022\022\022\023\023\023\024\024\025\025\026\027\027\030\031\032\033\034\035\037 \"#%(*-.////0001122334556789:;<>?@BB@><:9765432110//..---,,,,++**)))((('''''&&&&$\" \036\035\033\032\031\030\027\026\026\025\024\024\023\023\022\022\022\021\021\020\020\020\020\017\017\017\017\017\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\016\017\017\017\017\017\020\020\020\021\021\021\022\022\023\023\023\024\025\025\026\027\030\031\032\031\030\027\027\026\025\025\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\020\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\020\020\020\020\021\021\021\021\022\022\023\023\024\024\025\025\026\027\027\030\031\032\033\034\035\037 \"$&),////00011122344566789:;=>?AB?=;986543210/..--,,++++*******)))((('''''''&%\" \037\035\034\032\031\030\027\026\026\025\024\024\023\023\022\022\021\021\020\020\020\020\017\017\017\017\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\017\017\017\017\020\020\020\021\021\021\022\022\023\023\024\024\025\026\027\030\031\030\027\026\026\025\024\024\023\023\022\022\022\021\021\021\020\020\020\020\017\017\017\017\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\017\017\017\017\017\020\020\020\020\021\021\021\022\022\023\023\024\024\025\026\026\027\030\031\032\033\034\036\037!#%'*-//000011223344567789:<=>@A><:8754310//.-,,++***)))((((((((((((((''''''&#!\037\035\034\033\031\030\027\026\026\025\024\023\023\022\022\021\021\021\020\020\020\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\r\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\023\023\024\024\025\026\027\030\027\026\025\025\024\024\023\023\022\022\021\021\021\020\020\020\020\017\017\017\017\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\022\023\024\024\025\025\026\027\030\031\032\033\034\036 !#&(+//00011122334556789:;<=>@>;9764310/.-,,+**))(((''''&&&&&&&&&&&''''''''$\" \036\034\033\031\030\027\026\025\025\024\023\023\022\022\021\021\020\020\020\017\017\017\016\016\016\016\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\016\016\016\016\017\017\017\020\020\020\021\021\022\022\023\023\024\025\026\027\026\025\024\024\023\023\022\022\021\021\021\020\020\020\017\017\017\017\016\016\016\016\016\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\023\023\024\025\025\026\027\030\031\032\033\035\036 \"$'*-000011223344566789:;<=?=:864310/.-,+**)(('''&&&%%%%%$$$$$$$%%%%%%&&&%# \036\035\033\032\030\027\026\025\025\024\023\022\022\021\021\020\020\020\017\017\017\016\016\016\r\r\r\r\r\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\016\017\017\017\020\020\021\021\022\022\023\023\024\025\026\025\024\024\023\022\022\021\021\021\020\020\020\017\017\017\016\016\016\016\016\r\r\r\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\016\016\016\016\017\017\017\020\020\020\021\021\022\022\023\024\024\025\026\027\030\031\032\033\035\037 #%(+/00111223344567789:;<><:75320/.-,+*)(('&&%%%$$$#################$$$%$!\037\035\033\032\031\027\026\025\024\024\023\022\022\021\021\020\020\017\017\017\016\016\016\r\r\r\r\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\r\r\r\r\r\016\016\016\017\017\017\020\020\021\021\022\022\023\024\025\024\023\023\022\022\021\021\020\020\017\017\017\016\016\016\016\r\r\r\r\r\r\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\017\017\017\020\020\020\021\022\022\023\023\024\025\026\027\030\031\032\034\035\037!#&)-01112223345567889:;=<96421/.,+*)(('&&%%$$##\"\"\"\"!!!!!!!!!!!!!!!\"\"\"\"#\" \036\034\032\031\027\026\025\024\023\023\022\021\021\020\020\017\017\017\016\016\016\r\r\r\f\f\f\f\f\f\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\r\016\016\016\017\017\017\020\020\021\022\022\023\024\023\022\022\021\021\020\020\017\017\017\016\016\016\016\r\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\r\016\016\016\016\017\017\020\020\021\021\022\022\023\024\025\026\027\030\031\032\034\036 \"$'+/111223344566789:;<;86310.,+*)('&&%$$##\"\"!!!     \037\037\037\037\037\037\037\037\037\037\037\037     ! \036\034\032\031\027\026\025\024\023\023\022\021\021\020\020\017\017\016\016\016\r\r\r\f\f\f\f\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\f\f\f\f\f\r\r\r\016\016\016\017\017\020\020\021\021\022\023\022\021\021\020\020\017\017\017\016\016\016\r\r\r\r\f\f\f\f\f\f\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\f\f\f\f\r\r\r\r\016\016\016\017\017\020\020\021\021\022\023\024\024\025\027\030\031\032\034\036 #&)-112223344566789:;:7520.-+*)('&%$##\"\"!!   \037\037\037\036\036\036\036\036\036\036\035\035\035\035\035\035\036\036\036\036\036\036\036\037\037\037\035\033\031\030\026\025\024\023\022\022\021\020\020\017\017\016\016\016\r\r\r\f\f\f\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\f\r\r\r\016\016\016\017\017\020\020\021\022\021\020\020\017\017\017\016\016\016\r\r\r\f\f\f\f\f\013\013\013\013\013\013\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\f\f\f\f\r\r\r\016\016\016\017\017\020\021\021\022\023\023\024\025\026\030\031\033\035\037!$'+022233445567789::741/-,*)'&%$$#\"!!  \037\037\036\036\036\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\033\031\030\026\025\024\023\022\021\021\020\017\017\016\016\016\r\r\f\f\f\f\013\013\013\013\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\r\016\016\017\017\020\020\021\020\020\017\017\016\016\r\r\r\f\f\f\f\013\013\013\013\013\013\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\r\016\016\017\017\020\020\021\022\022\023\024\025\026\030\031\033\035\037\"%)-222334456678999630.,*)'&%$#\"!! \037\037\036\036\035\035\035\034\034\034\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\032\030\026\025\024\023\022\021\020\020\017\017\016\016\r\r\f\f\f\013\013\013\013\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\f\r\r\r\016\016\017\017\020\017\017\016\016\r\r\r\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\f\f\r\r\016\016\017\017\020\021\021\022\023\024\025\026\030\031\033\036 #'+0233445566789952/-+)'&%$#\"! \037\037\036\035\035\034\034\034\033\033\033\032\032\032\032\031\031\031\031\031\031\031\031\030\030\030\030\031\031\031\031\031\031\031\031\031\032\032\030\027\025\024\023\022\021\020\020\017\016\016\r\r\f\f\f\013\013\013\013\n\n\n\n\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\r\r\r\016\016\017\016\016\r\r\r\f\f\f\013\013\013\013\n\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\n\n\n\n\013\013\013\013\f\f\f\r\r\016\016\017\017\020\021\022\023\024\025\026\030\032\034\036!%).33344556778841.,*(&%#\"! \037\037\036\035\035\034\033\033\033\032\032\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\027\025\024\023\022\021\020\017\017\016\r\r\f\f\f\013\013\013\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\r\r\016\016\r\r\f\f\f\013\013\013\013\n\n\n\n\t\t\t\t\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\n\013\013\013\f\f\f\r\r\016\016\017\020\021\022\023\024\025\026\030\032\034\037\"&+1344456678830-*(&%#\"! \037\036\035\034\034\033\033\032\032\031\031\030\030\030\027\027\027\027\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\026\025\024\023\021\021\020\017\016\016\r\r\f\f\013\013\013\n\n\n\t\t\t\t\t\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\013\013\013\f\f\r\r\f\f\f\013\013\013\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\t\t\t\t\n\n\n\n\013\013\013\f\f\r\r\016\017\017\020\021\022\024\025\026\030\032\035 $)/3445566772/,)'%#\" \037\036\035\034\034\033\032\032\031\031\030\030\027\027\027\026\026\026\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\024\022\021\020\017\017\016\r\r\f\f\013\013\n\n\n\n\t\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\t\t\t\t\n\n\n\013\013\013\f\f\f\013\013\n\n\n\n\t\t\t\t\b\b\b\b\b\b\b\b\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\t\t\t\t\n\n\n\013\013\013\f\f\r\016\016\017\020\021\022\023\025\027\031\033\036!&,344556771-*(%#\" \037\036\035\034\033\032\031\031\030\030\027\027\026\026\025\025\025\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\022\021\020\017\016\r\r\f\f\013\013\n\n\n\t\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\b\b\b\b\b\t\t\t\t\n\n\n\013\013\013\n\n\n\t\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\b\b\b\b\t\t\t\t\n\n\n\013\013\f\r\r\016\017\020\021\022\023\025\027\031\034\037#)04556660,)&$\" \037\035\034\033\032\031\031\030\027\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\020\017\016\r\f\f\013\013\n\n\n\t\t\t\b\b\b\b\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\b\b\b\b\t\t\t\n\n\n\n\t\t\t\t\b\b\b\b\007\007\007\007\007\007\007\007\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\b\t\t\t\n\n\n\013\013\f\r\r\016\017\020\022\023\025\027\031\035!&,45566/+'$\" \036\035\034\033\031\031\030\027\026\026\025\025\024\024\023\023\022\022\022\022\021\021\021\021\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\017\016\r\r\f\013\013\n\n\t\t\t\b\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\b\t\t\t\t\t\b\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\t\t\t\n\n\013\013\f\r\016\017\020\021\023\025\027\032\036\")1565.)%# \036\035\033\032\031\030\027\026\025\025\024\023\023\022\022\022\021\021\021\020\020\020\020\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\r\f\013\013\n\n\t\t\b\b\b\b\007\007\007\007\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\007\007\007\007\b\b\b\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\007\007\007\007\b\b\b\t\t\n\n\013\f\f\r\016\020\021\023\025\030\033\037%-54,'# \036\034\033\031\030\027\026\025\024\024\023\022\022\021\021\020\020\020\017\017\017\017\016\016\016\016\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\f\013\n\n\t\t\b\b\b\007\007\007\007\006\006\006\006\006\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\006\006\006\006\006\007\007\007\007\007\007\007\007\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\006\006\006\006\007\007\007\007\b\b\t\t\n\n\013\f\r\016\017\021\023\025\030\034!)3*%!\036\034\032\031\027\026\025\024\023\022\022\021\021\020\020\017\017\016\016\016\016\r\r\r\r\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\n\n\t\t\b\b\007\007\007\006\006\006\006\006\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\006\006\006\006\007\007\007\b\b\t\n\n\013\f\r\017\020\022\025\031\036%(\"\037\034\032\030\026\025\024\023\022\021\021\020\017\017\016\016\r\r\r\f\f\f\f\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\t\b\b\007\007\007\006\006\006\006\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\006\006\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\005\005\005\005\005\006\006\006\007\007\b\b\t\t\n\013\f\016\020\022\026\032 \037\034\031\027\025\024\023\022\021\020\017\016\016\r\r\f\f\f\013\013\013\013\n\n\n\n\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\006\006\006\005\005\005\005\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\005\005\005\005\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\005\005\005\005\006\006\007\007\b\b\t\n\f\r\017\022\026\034\030\026\024\022\021\020\017\016\016\r\f\f\013\013\013\n\n\n\t\t\t\t\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\006\006\005\005\005\005\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\004\004\004\004\005\005\005\006\006\007\007\b\t\013\f\017\022\024\022\021\017\016\r\f\f\013\013\n\n\t\t\t\b\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\004\004\004\005\005\006\007\b\t\013\016\016\r\f\013\n\n\t\b\b\b\007\007\007\006\006\006\006\006\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\003\003\003\003\004\004\005\006\007\t\t\b\007\007\006\006\006\005\005\005\005\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\002\002\002\003\003\004\004\004\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000").toString()).getBytes("ISO-8859-1");
        -962                } catch (UnsupportedEncodingException e) {
        -963                        e.printStackTrace();
        -964                        GAMUT_DATA = new byte[65536];
        -965                }
        -966        }
        -967
        -968        /**
        -969         * Given a 1D int index between 0 and 65535 (both inclusive), this treats the 1D index as two parts (lightness and
        -970         * hue angle, both from 0 to 255) and gets the distance from grayscale to the edge of the gamut at that lightness
        -971         * and hue. The index can be constructed from a lightness value {@code L} from 0 to 255, and a hue value {@code H}
        -972         * from 0 to 255 with: {@code (L << 8 | H)} or the simpler equivalent {@code (L * 256 + H)}. These assume L and H
        -973         * have been limited to the 0 to 255 range already. This does not bounds-check index. Because hue is not typically
        -974         * measured between 0 and 255, getting that value is a bit different; you can use
        -975         * {@link TrigTools#atan2_(float, float)} (with an Oklab color's B for y, then its A for x) and multiply it by 256
        -976         * to get H.
        -977         * <br>
        -978         * The distance this returns is a byte between 0 and 82 (both inclusive), as the Euclidean distance from the center
        -979         * grayscale value at the lightness in the index, to the edge of the gamut at the same lightness, along the hue in
        -980         * the index. This is measured in a space from -1 to 1 for both A and B, with the 0 in the center meaning grayscale,
        -981         * and multiplied by 256 to get a meaningful byte value. To return to the A and B values Oklab uses here, you would
        -982         * need to use some trigonometry on the hue (if it's in the 0 to 1 range, you can call
        -983         * {@link TrigTools#cos_(float)} on the hue to almost get A, and {@link TrigTools#sin_(float)} to almost get B),
        -984         * then multiply each of those by the distance, divide each by 256.0, and add 0.5.
        -985         * <br>
        -986         * Only intended for the narrow cases where external code needs read-only access to the internal Oklab gamut data.
        -987         * The gamut data is quite large (the Oklab ColorTools file is 236 KB at the time of writing, while the IPT_HQ
        -988         * ColorTools file is just 56 KB, with the main difference being the sizable exact gamut), so it's better to have
        -989         * direct read access to it without being able to accidentally rewrite it.
        -990         * @param index must be between 0 and 65535; the upper 8 bits are lightness and the lower 8 are hue angle.
        -991         * @return a byte (always between 0 and 82, inclusive) representing the Euclidean distance between a grayscale value and the most saturated value possible, using the above measurements
        -992         */
        -993        public static byte getRawGamutValue(int index){
        -994                return GAMUT_DATA[index];
        -995        }
        -996
        -997        /**
        -998         * Returns true if the given packed float color, as Oklab, is valid to convert losslessly back to RGBA.
        -999         * @param packed a packed float color as Oklab
        -1000         * @return true if the given packed float color can be converted back and forth to RGBA
        -1001         */
        -1002        public static boolean inGamut(final float packed)
        -1003        {
        -1004                final int decoded = NumberUtils.floatToRawIntBits(packed);
        -1005                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        -1006                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        -1007                final int idx = (decoded & 0xff) << 8 | (int)(256f * TrigTools.atan2_(B, A));
        -1008                return GAMUT_DATA[idx] * 0x1p-8f >= (float) Math.sqrt(A * A + B * B);
        -1009        }
        -1010//      public static boolean inGamut(final float packed)
        -1011//      {
        -1012//              final float L = (decoded & 0xff) / 255f;
        -1013//              final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        -1014//              final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        -1015//              final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
        -1016//              final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
        -1017//              final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
        -1018//
        -1019//              final float r = +4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s;
        -1020//              if(r < 0f || r > 1.0f) return false;
        -1021//              final float g = -1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s;
        -1022//              if(g < 0f || g > 1.0f) return false;
        -1023//              final float b = -0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s;
        -1024//              return (b >= 0f && b <= 1.0f);
        -1025//  }
        -1026        /**
        -1027         * Returns true if the given Oklab values are valid to convert losslessly back to RGBA.
        -1028         * @param L lightness channel, as a float from 0 to 1
        -1029         * @param A green-to-red chromatic channel, as a float from 0 to 1
        -1030         * @param B blue-to-yellow chromatic channel, as a float from 0 to 1
        -1031         * @return true if the given Oklab channels can be converted back and forth to RGBA
        -1032         */
        -1033        public static boolean inGamut(float L, float A, float B)
        -1034        {
        -1035                A = (A - 0.5f);
        -1036                B = (B - 0.5f);
        -1037                final int idx = ((int)(L * 255.999f) << 8) | (int)(256f * TrigTools.atan2_(B, A));
        -1038                return GAMUT_DATA[idx] * 0x1p-8f >= (float) Math.sqrt(A * A + B * B);
        -1039        }
        -1040//      public static boolean inGamut(float L, float A, float B)
        -1041//      {
        -1042//              A = (A - 0.5f) * 2f;
        -1043//              B = (B - 0.5f) * 2f;
        -1044//              final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
        -1045//              final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
        -1046//              final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
        -1047//
        -1048//              final float r = +4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s;
        -1049//              if(r < 0f || r > 1.0f) return false;
        -1050//              final float g = -1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s;
        -1051//              if(g < 0f || g > 1.0f) return false;
        -1052//              final float b = -0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s;
        -1053//              return (b >= 0f && b <= 1.0f);
        -1054//  }
        -1055        /**
        -1056         * Gets the color with the same L as the Oklab color stored in the given packed float, but the furthest A
        -1057         * B from gray possible for that lightness while keeping the same hue as the given color. This is very
        -1058         * similar to calling {@link #enrich(float, float)} with a very large {@code change} value.
        -1059         * @param packed a packed float color in Oklab format; does not need to be in-gamut
        -1060         * @return the color that is as far from grayscale as this can get while keeping the L and hue of packed
        -1061         * @see #limitToGamut(float) You can use limitToGamut() if you only want max saturation for out-of-gamut colors.
        -1062         */
        -1063        public static float maximizeSaturation(final float packed) {
        -1064                final int decoded = NumberUtils.floatToRawIntBits(packed);
        -1065                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        -1066                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        -1067                final float hue = TrigTools.atan2_(B, A);
        -1068                final int idx = (decoded & 0xff) << 8 | (int) (256f * hue);
        -1069                final float dist = GAMUT_DATA[idx] * 0x1p-8f;
        -1070                return NumberUtils.intBitsToFloat(
        -1071                                (decoded & 0xFE0000FF) |
        -1072                                                (int) (TrigTools.cos_(hue) * dist * 127.999f + 127.999f) << 8 |
        -1073                                                (int) (TrigTools.sin_(hue) * dist * 127.999f + 127.999f) << 16);
        -1074        }
        -1075        /**
        -1076         * Gets the color with the same L as the Oklab color stored in the given packed float, but the furthest A
        -1077         * B from gray possible for that lightness while keeping the same hue as the given color. This is very
        -1078         * similar to calling {@link #enrich(float, float)} with a very large {@code change} value.
        -1079         * @param L lightness component; will be clamped between 0 and 1 if it isn't already
        -1080         * @param A green-to-red chromatic component; will be clamped between 0 and 1 if it isn't already
        -1081         * @param B blue-to-yellow chromatic component; will be clamped between 0 and 1 if it isn't already
        -1082         * @param alpha alpha component; will be clamped between 0 and 1 if it isn't already
        -1083         * @return the color that is as far from grayscale as this can get while keeping the L and hue of packed
        -1084         * @see #limitToGamut(float, float, float, float) You can use limitToGamut() if you only want max saturation for out-of-gamut colors.
        -1085         */
        -1086        public static float maximizeSaturation(float L, float A, float B, float alpha) {
        -1087                L = Math.min(Math.max(L, 0f), 1f);
        -1088                A = Math.min(Math.max(A, 0f), 1f);
        -1089                B = Math.min(Math.max(B, 0f), 1f);
        -1090                alpha = Math.min(Math.max(alpha, 0f), 1f);
        -1091                final float A2 = (A - 0.5f);
        -1092                final float B2 = (B - 0.5f);
        -1093                final float hue = TrigTools.atan2_(B2, A2);
        -1094                final int idx = (int) (L * 255.999f) << 8 | (int) (256f * hue);
        -1095                final float dist = GAMUT_DATA[idx] * 0x1p-8f;
        -1096                return NumberUtils.intBitsToFloat(
        -1097                                (int) (alpha * 127.999f) << 25 |
        -1098                                                (int) (TrigTools.sin_(hue) * dist * 127.999f + 127.999f) << 16 |
        -1099                                                (int) (TrigTools.cos_(hue) * dist * 127.999f + 127.999f) << 8 |
        -1100                                                (int) (L * 255.999f));
        -1101        }
        -1102        /**
        -1103         * Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside
        -1104         * the gamut at the same lightness, or if it is already in-gamut, returns the color as-is.
        -1105         * @param packed a packed float color in Oklab format; often this color is not in-gamut
        -1106         * @return the first color this finds that is in-gamut, as if it was moving toward a grayscale color with the same L
        -1107         * @see #inGamut(float) You can use inGamut() if you just want to check whether a color is in-gamut.
        +937        public static float differentiateLightness(final float mainColor, final float contrastingColor)
        +938        {
        +939                final int main = NumberUtils.floatToRawIntBits(mainColor), contrast = NumberUtils.floatToRawIntBits(contrastingColor);
        +940                return limitToGamut(NumberUtils.intBitsToFloat((main & 0xFEFFFF00) | (contrast + 128 & 0xFF) + (main & 0xFF) >>> 1));
        +941        }
        +942
        +943        /**
        +944         * Pretty simple; adds 0.5 to the given color's L and wraps it around if it would go above 1.0, then averages that
        +945         * with the original L. This means light colors become darker, and dark colors become lighter, with almost all
        +946         * results in the middle-range of possible lightness.
        +947         * @param mainColor a packed Oklab float color
        +948         * @return a different packed Oklab float color, with its L channel changed and limited to the correct gamut
        +949         */
        +950        public static float offsetLightness(final float mainColor) {
        +951                final int oklab = NumberUtils.floatToRawIntBits(mainColor);
        +952                return limitToGamut(NumberUtils.intBitsToFloat((oklab & 0xFEFFFF00) | (oklab + 128 & 0xFF) + (oklab & 0xFF) >>> 1));
        +953        }
        +954
        +955        /**
        +956         * Makes the additive Oklab color stored in {@code color} cause less of a change when used as a tint, as if it were
        +957         * mixed with neutral gray. When {@code fraction} is 1.0, this returns color unchanged; when fraction is 0.0, it
        +958         * returns {@link Palette#GRAY}, and when it is in-between 0.0 and 1.0 it returns something between the two. This is
        +959         * meant for things like area of effect abilities that make smaller color changes toward their periphery.
        +960         * @param color a color that should have its tinting effect potentially weakened
        +961         * @param fraction how much of {@code color} should be kept, from 0.0 to 1.0
        +962         * @return an Oklab float color between gray and {@code color}
        +963         */
        +964        public static float lessenChange(final float color, float fraction) {
        +965                final int e = NumberUtils.floatToRawIntBits(color),
        +966                                sL = 0x80, sA = 0x80, sB = 0x80, sAlpha = 0xFE,
        +967                                eL = (e & 0xFF), eA = (e >>> 8) & 0xFF, eB = (e >>> 16) & 0xFF, eAlpha = e >>> 24 & 0xFE;
        +968                return NumberUtils.intBitsToFloat(((int) (sL + fraction * (eL - sL)) & 0xFF)
        +969                                | (((int) (sA + fraction * (eA - sA)) & 0xFF) << 8)
        +970                                | (((int) (sB + fraction * (eB - sB)) & 0xFF) << 16)
        +971                                | (((int) (sAlpha + fraction * (eAlpha - sAlpha)) & 0xFE) << 24));
        +972        }
        +973
        +974        /**
        +975         * Makes a quasi-randomly-edited variant on the given {@code color}, allowing typically a small amount of
        +976         * {@code variance} (such as 0.05 to 0.25) between the given color and what this can return. The {@code seed} should
        +977         * be different each time this is called, and can be obtained from a random number generator to make the colors more
        +978         * random, or can be incremented on each call. If the seed is only incremented or decremented, then this shouldn't
        +979         * produce two similar colors in a row unless variance is very small. The variance affects the L, A, and B of the
        +980         * generated color, and each of those channels can go up or down by the given variance as long as the total distance
        +981         * isn't greater than the variance (this considers A and B extra-wide, going from -1 to 1, while L goes from 0 to 1,
        +982         * but only internally for measuring distance).
        +983         * @param color a packed float color, as produced by {@link #oklab(float, float, float, float)}
        +984         * @param seed a long seed that should be different on each call; should not be 0
        +985         * @param variance max amount of difference between the given color and the generated color; always less than 1
        +986         * @return a generated packed float color that should be at least somewhat different from {@code color}
        +987         */
        +988        public static float randomEdit(final float color, long seed, final float variance) {
        +989                final int decoded = NumberUtils.floatToRawIntBits(color);
        +990                final float L = (decoded & 0xff) / 255f;
        +991                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        +992                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        +993                final float limit = variance * variance;
        +994                float dist, x, y, z;
        +995                for (int j = 0; j < 50; j++) {
        +996                        x = (((seed * 0xD1B54A32D192ED03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
        +997                        y = (((seed * 0xABC98388FB8FAC03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
        +998                        z = (((seed * 0x8CB92BA72F3D8DD7L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
        +999                        seed += 0x9E3779B97F4A7C15L;
        +1000                        dist = x * x + y * y + z * z;
        +1001                        if(dist <= limit && inGamut(x += L, y = (A + y) * 0.5f + 0.5f, z = (B + z) * 0.5f + 0.5f))
        +1002                                return NumberUtils.intBitsToFloat((decoded & 0xFE000000) | ((int)(z * 255.5f) << 16 & 0xFF0000)
        +1003                                        | ((int)(y * 255.5f) << 8 & 0xFF00) | (int)(x * 255.5f));
        +1004                }
        +1005                return color;
        +1006        }
        +1007
        +1008        private static byte[] GAMUT_DATA;
        +1009
        +1010        static {
        +1011                try {
        +1012                        GAMUT_DATA = (new StringBuilder().append("\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\001\001\001\001\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\003\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\003\003\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\003\003\003\004\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\004\004\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\003\003\003\003\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\004\004\005\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\004\004\004\005\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\004\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\004\004\004\004\005\006\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\004\004\004\004\004\005\005\006\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\005\005\005\006\007\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\005\005\005\005\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\005\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\005\005\005\006\006\007\n\n\n\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\005\005\005\006\006\007\b\013\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\005\005\005\005\006\006\006\007\b\013\013\013\013\013\013\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\006\005\005\005\005\005\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\005\005\005\005\006\006\006\007\b\t\f\f\f\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\006\006\006\006\006\005\005\005\005\005\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\005\005\005\005\005\006\006\006\007\007\b\t\r\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\007\007\007\007\b\b\b\b\b\b\b\b\b\b\007\007\007\006\006\006\006\006\006\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\006\006\006\007\007\b\b\n\r\r\r\r\r\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\007\006\006\006\006\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\006\006\006\007\007\b\b\t\n\016\016\016\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\007\007\007\006\006\006\006\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\006\006\006\006\007\007\007\b\t\t\013\017\016\016\016\016\016\016\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\007\007\007\007\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\007\007\007\007\007\007\006\006\006\006\006\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\006\006\006\006\007\007\007\b\b\t\n\013\017\017\017\017\017\016\016\016\016\016\016\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\007\007\007\007\007\b\007\007\007\007\006\006\006\006\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\006\006\006\006\006\007\007\007\b\b\t\t\n\f\020\020\020\017\017\017\017\017\017\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\n\n\n\n\n\n\n\n\t\t\t\t\n\n\n\n\n\n\n\n\n\n\t\t\t\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\007\007\007\007\006\006\006\006\006\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\006\006\006\006\006\007\007\007\b\b\b\t\n\013\f\021\021\020\020\020\020\020\017\017\017\017\017\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\b\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\b\b\b\007\007\007\007\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\007\007\007\b\b\b\t\t\n\013\r\021\021\021\021\021\020\020\020\020\020\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\n\n\n\t\t\t\b\b\b\b\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\b\b\b\b\t\b\b\b\007\007\007\007\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\007\007\007\b\b\b\t\t\n\013\f\r\022\022\022\021\021\021\021\021\020\020\020\020\020\020\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\n\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\n\n\n\t\t\t\b\b\b\b\b\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\b\b\b\b\t\t\t\b\b\b\007\007\007\007\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\007\007\007\007\007\b\b\t\t\n\n\013\f\016\023\023\022\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\n\n\n\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\b\b\b\b\b\t\t\t\t\t\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\t\t\n\013\013\f\016\024\023\023\023\023\022\022\022\022\021\021\021\021\021\021\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\f\f\f\f\f\f\f\f\013\013\013\013\f\f\f\f\f\f\f\f\f\f\013\013\n\n\n\t\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\b\b\b\b\b\t\t\t\n\t\t\t\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\t\t\n\n\013\f\r\017\024\024\024\023\023\023\023\022\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\013\013\n\n\n\t\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\b\b\b\b\b\t\t\t\t\n\n\n\t\t\t\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\t\t\n\n\013\013\f\r\017\025\025\024\024\024\024\023\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\f\f\013\013\n\n\n\t\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\t\t\t\t\n\n\n\n\n\t\t\t\b\b\b\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\b\t\t\t\n\n\013\f\r\016\020\026\025\025\025\024\024\024\024\024\023\023\023\023\023\022\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\f\f\013\013\013\n\n\n\t\t\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\t\t\t\t\n\n\n\013\n\n\n\t\t\b\b\b\b\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\b\t\t\t\n\n\013\013\f\r\016\020\026\026\026\025\025\025\025\024\024\024\024\023\023\023\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\f\f\013\013\013\n\n\n\t\t\t\t\t\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\013\013\013\n\n\t\t\t\b\b\b\b\b\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\b\b\b\b\t\t\t\n\n\013\013\f\r\r\017\021\027\027\026\026\026\026\025\025\025\025\024\024\024\024\023\023\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\r\r\r\r\016\016\016\016\016\016\016\016\r\r\r\r\016\016\016\016\016\016\016\016\016\016\r\r\f\f\013\013\013\n\n\n\n\t\t\t\t\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\013\013\013\013\013\n\n\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\b\b\b\b\t\t\t\t\n\n\013\013\f\r\016\017\021\030\027\027\027\026\026\026\026\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\r\r\f\f\013\013\013\n\n\n\n\t\t\t\t\t\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\n\013\013\013\f\013\013\n\n\n\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\b\b\b\b\t\t\t\t\n\n\013\013\f\f\r\016\020\022\030\030\030\027\027\027\027\026\026\026\026\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\022\022\022\022\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\016\r\r\f\f\f\013\013\013\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\f\013\013\n\n\n\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\b\b\b\b\b\t\t\t\n\n\n\013\013\f\r\016\017\020\022\031\031\030\030\030\027\027\027\027\026\026\026\026\025\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\016\016\r\r\f\f\f\013\013\013\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\f\f\f\013\013\n\n\n\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\t\t\t\n\n\n\013\013\f\f\r\016\017\021\023\032\031\031\031\030\030\030\030\027\027\027\027\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\016\016\r\r\f\f\f\013\013\013\n\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\f\r\f\f\013\013\n\n\n\t\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\t\t\t\t\n\n\n\013\013\f\f\r\016\016\020\021\023\032\032\032\031\031\031\030\030\030\030\027\027\027\027\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\017\017\017\020\020\020\020\020\020\020\020\017\017\017\017\020\020\020\020\020\020\020\020\020\020\017\017\016\r\r\r\f\f\f\013\013\013\n\n\n\n\n\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\r\r\r\f\f\013\013\n\n\n\t\t\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\t\t\t\t\n\n\n\013\013\013\f\f\r\016\017\020\021\024\033\033\032\032\032\031\031\031\031\030\030\030\027\027\027\027\027\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\017\017\016\016\r\r\r\f\f\f\013\013\013\n\n\n\n\n\n\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\f\r\r\r\f\f\013\013\013\n\n\n\t\t\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\t\t\t\t\t\n\n\n\013\013\f\f\r\r\016\017\020\022\024\034\033\033\033\032\032\032\031\031\031\031\030\030\030\030\027\027\027\027\027\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\020\020\020\020\020\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\020\017\017\016\016\r\r\f\f\f\f\013\013\013\013\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\013\013\013\013\f\f\f\r\r\016\r\r\f\f\013\013\013\n\n\n\t\t\t\t\t\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\013\013\013\f\r\r\016\017\020\021\022\025\035\034\034\033\033\033\032\032\032\031\031\031\031\030\030\030\030\030\027\027\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\020\020\017\017\016\016\r\r\f\f\f\f\013\013\013\013\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\016\016\016\r\r\f\f\013\013\013\n\n\n\t\t\t\t\t\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\013\013\013\f\f\r\r\016\017\020\021\023\025\035\035\034\034\034\033\033\033\032\032\032\032\031\031\031\031\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\020\017\017\016\016\r\r\r\f\f\f\f\013\013\013\013\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\r\016\016\016\r\r\f\f\013\013\013\n\n\n\n\t\t\t\t\t\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\013\013\013\f\f\r\r\016\016\017\020\022\023\026\036\035\035\035\034\034\034\033\033\033\032\032\032\032\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\021\021\022\022\022\022\022\022\022\022\021\021\021\021\022\022\022\022\022\022\022\022\022\022\021\020\020\017\017\016\016\r\r\r\f\f\f\f\013\013\013\013\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\r\016\016\017\016\016\r\r\f\f\013\013\013\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\r\r\016\017\020\021\022\024\026\037\036\036\035\035\035\034\034\034\033\033\033\032\032\032\032\031\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\021\021\020\020\017\017\016\016\r\r\r\f\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\f\r\r\r\016\016\017\017\017\016\r\r\f\f\f\013\013\013\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\r\r\016\016\017\020\021\022\024\027\037\037\036\036\036\035\035\035\034\034\034\033\033\033\033\032\032\032\032\031\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\022\022\022\022\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\022\021\021\020\017\017\016\016\016\r\r\r\f\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\f\r\r\r\016\016\016\017\017\017\016\016\r\r\f\f\f\013\013\013\n\n\n\n\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\007\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\f\r\r\016\017\020\020\021\023\025\027  \037\037\036\036\036\035\035\035\034\034\034\033\033\033\033\032\032\032\032\031\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\026\026\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\022\022\021\020\020\017\017\016\016\016\r\r\r\f\f\f\f\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\f\f\f\f\r\r\r\016\016\016\017\017\020\017\017\016\016\r\r\f\f\013\013\013\013\n\n\n\n\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\f\r\r\016\016\017\020\021\022\023\025\030!  \037\037\037\036\036\036\035\035\035\034\034\034\033\033\033\033\032\032\032\032\032\031\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\023\023\022\021\021\020\020\017\017\016\016\016\r\r\r\f\f\f\f\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\f\f\f\f\r\r\r\r\016\016\017\017\017\020\020\017\016\016\r\r\f\f\f\013\013\013\013\n\n\n\n\n\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\r\r\r\016\017\017\020\021\022\024\025\030!!   \037\037\037\036\036\035\035\035\035\034\034\034\034\033\033\033\033\032\032\032\032\032\031\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\023\024\024\024\024\024\024\024\024\023\023\023\023\024\024\024\024\024\024\024\024\024\024\023\022\022\021\020\020\017\017\017\016\016\r\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\f\f\f\f\r\r\r\r\016\016\016\017\017\020\020\020\017\017\016\016\r\r\f\f\f\013\013\013\013\n\n\n\n\n\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\f\r\r\016\016\017\020\021\021\023\024\026\031\"\"!!   \037\037\036\036\036\035\035\035\035\034\034\034\034\033\033\033\033\032\032\032\032\032\031\031\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\023\023\022\021\021\020\020\017\017\016\016\016\r\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\r\016\016\016\017\017\020\020\021\020\020\017\016\016\r\r\r\f\f\f\013\013\013\013\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\f\r\r\016\016\017\017\020\021\022\023\024\026\031#\"\"!!!  \037\037\037\036\036\036\035\035\035\035\034\034\034\034\033\033\033\033\033\032\032\032\032\032\031\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\024\024\024\024\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\024\023\022\022\021\021\020\020\017\017\016\016\016\r\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\r\016\016\016\017\017\020\020\020\021\021\020\017\017\016\016\r\r\f\f\f\013\013\013\013\013\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\f\r\r\r\016\016\017\020\020\021\022\023\025\027\032##\"\"\"!!   \037\037\037\036\036\036\036\035\035\035\034\034\034\034\034\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\024\023\023\022\021\021\020\020\017\017\017\016\016\016\r\r\r\r\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\r\r\r\r\016\016\016\017\017\017\020\020\021\021\021\020\020\017\016\016\r\r\r\f\f\f\013\013\013\013\013\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\016\016\017\017\020\021\022\023\024\025\027\032$$##\"\"!!!   \037\037\037\036\036\036\036\035\035\035\035\034\034\034\034\033\033\033\033\033\032\032\032\032\032\031\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\027\027\026\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\025\025\024\023\022\022\021\021\020\020\017\017\017\016\016\016\r\r\r\r\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\r\r\r\r\016\016\016\017\017\017\020\020\021\021\022\021\021\020\017\017\016\016\r\r\r\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\r\016\016\017\020\020\021\022\023\024\026\030\033%$$##\"\"\"!!!   \037\037\037\036\036\036\036\035\035\035\035\034\034\034\034\034\033\033\033\033\033\032\032\032\032\032\031\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\025\026\026\026\026\026\026\026\026\025\025\025\025\026\026\026\026\026\026\026\026\026\026\025\024\023\023\022\022\021\020\020\020\017\017\017\016\016\016\r\r\r\r\r\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\r\r\r\r\016\016\016\016\017\017\020\020\020\021\021\022\022\021\020\020\017\016\016\016\r\r\f\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\r\016\016\017\017\020\021\021\022\023\025\026\030\033&%$$$##\"\"\"!!    \037\037\037\036\036\036\036\035\035\035\035\034\034\034\034\034\033\033\033\033\033\032\032\032\032\032\031\031\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\025\025\024\023\022\022\021\021\020\020\020\017\017\016\016\016\016\r\r\r\r\r\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\016\017\017\017\020\020\021\021\022\022\022\021\020\020\017\017\016\016\r\r\r\f\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\f\r\r\016\016\016\017\017\020\021\022\023\024\025\027\031\034&&%%$$###\"\"!!!    \037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\026\026\026\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\026\025\024\023\023\022\022\021\021\020\020\017\017\017\016\016\016\016\r\r\r\r\r\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\016\017\017\017\020\020\021\021\022\022\023\022\022\021\020\020\017\017\016\016\r\r\r\f\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\f\r\r\r\016\016\017\017\020\020\021\022\023\024\025\027\031\034'&&%%$$$##\"\"\"!!!    \037\037\037\037\036\036\036\036\035\035\035\035\034\034\034\034\034\033\033\033\033\033\032\032\032\032\032\031\031\031\031\031\031\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\026\025\024\024\023\022\022\021\021\020\020\020\017\017\017\016\016\016\016\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\016\016\016\016\017\017\017\020\020\020\021\021\022\022\023\023\022\021\020\020\017\017\016\016\016\r\r\r\f\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\f\r\r\r\016\016\016\017\017\020\021\021\022\023\024\026\027\031\035(''&&%%$$###\"\"\"!!!    \037\037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\033\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\027\027\026\025\024\023\023\022\022\021\021\020\020\020\017\017\017\016\016\016\016\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\016\016\016\016\017\017\017\020\020\020\021\021\022\022\023\023\023\022\021\021\020\020\017\017\016\016\r\r\r\f\f\f\f\f\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\f\f\f\f\r\r\r\r\016\016\017\017\020\020\021\022\023\024\025\026\030\032\035((''&&%%$$$###\"\"\"!!!    \037\037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\033\033\033\033\033\032\032\032\032\032\031\031\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\027\027\027\027\030\030\030\030\030\030\030\030\030\030\027\026\025\024\024\023\023\022\022\021\021\020\020\020\017\017\017\016\016\016\016\016\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\016\016\016\016\017\017\017\017\020\020\021\021\021\022\022\023\024\023\022\022\021\020\020\017\017\016\016\016\r\r\r\f\f\f\f\f\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\f\f\f\f\f\r\r\r\016\016\017\017\017\020\021\021\022\023\024\025\026\030\032\036)((''&&%%%$$###\"\"\"\"!!!    \037\037\037\037\036\036\036\036\036\035\035\035\035\034\034\034\034\034\033\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\027\026\026\025\024\023\023\022\022\021\021\021\020\020\017\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\016\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\023\023\024\024\023\022\021\021\020\020\017\017\016\016\016\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\016\016\016\017\017\020\020\021\022\022\023\024\025\027\031\033\036*))('''&&%%$$$###\"\"\"\"!!!    \037\037\037\037\036\036\036\036\036\035\035\035\035\034\034\034\034\034\033\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\031\031\030\030\030\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\031\030\027\026\025\024\024\023\023\022\022\021\021\020\020\020\017\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\r\r\016\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\023\023\024\024\024\023\022\022\021\020\020\017\017\017\016\016\r\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\r\016\016\017\017\017\020\021\021\022\023\024\025\026\027\031\033\037**))((''&&%%%$$$###\"\"\"!!!!    \037\037\037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\033\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\030\027\026\026\025\024\024\023\022\022\022\021\021\020\020\020\017\017\017\017\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\017\017\017\017\020\020\020\021\021\021\022\022\023\023\024\025\024\023\023\022\021\021\020\020\017\017\016\016\016\r\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\r\016\016\016\017\017\020\020\021\021\022\023\024\025\026\030\031\034\037+**))((''&&&%%%$$$###\"\"\"!!!!    \037\037\037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\033\033\033\033\033\033\032\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\030\030\027\026\025\024\024\023\023\022\022\021\021\021\020\020\020\017\017\017\017\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\017\017\017\017\020\020\020\021\021\021\022\022\023\023\024\024\025\025\024\023\022\022\021\020\020\017\017\017\016\016\016\r\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\r\016\016\016\017\017\020\020\021\021\022\022\023\024\025\027\030\032\034 ,++*))(((''&&&%%$$$####\"\"\"!!!!     \037\037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\031\031\031\031\032\032\032\032\032\032\032\032\032\032\031\030\027\026\025\025\024\024\023\023\022\022\021\021\021\020\020\020\017\017\017\017\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\017\017\017\017\020\020\020\020\021\021\022\022\022\023\024\024\025\025\025\024\023\022\022\021\021\020\020\017\017\016\016\016\016\r\r\r\r\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\r\r\r\r\016\016\016\017\017\017\020\020\021\021\022\023\024\025\026\027\030\032\035 ,,++**))((''&&&%%%$$$####\"\"\"\"!!!     \037\037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\034\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\031\030\027\027\026\025\024\024\023\023\022\022\022\021\021\020\020\020\020\017\017\017\017\017\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\016\017\017\017\017\020\020\020\020\021\021\021\022\022\023\023\024\024\025\026\025\024\024\023\022\021\021\020\020\017\017\017\016\016\016\r\r\r\r\r\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\r\r\r\r\r\016\016\016\017\017\020\020\021\021\022\022\023\024\025\026\027\031\033\035!-,,++**))(('''&&&%%%$$$####\"\"\"\"!!!!    \037\037\037\037\036\036\036\036\036\035\035\035\035\035\034\034\034\034\034\033\033\033\033\033\033\033\033\032\032\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\033\032\031\030\027\026\025\025\024\024\023\023\022\022\021\021\021\020\020\020\020\017\017\017\017\017\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\016\017\017\017\017\017\020\020\020\020\021\021\021\022\022\023\023\024\024\025\025\026\026\025\024\023\022\022\021\021\020\020\017\017\017\016\016\016\r\r\r\r\r\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\017\017\017\020\020\021\021\022\023\023\024\025\026\030\031\033\036!.--,++**)))(('''&&&%%%$$$####\"\"\"\"!!!!    \037\037\037\037\036\036\036\036\036\035\035\035\035\035\034\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033").append("\033\033\033\033\033\033\033\033\033\033\033\033\033\033\032\031\030\027\026\026\025\025\024\023\023\022\022\022\021\021\021\020\020\020\020\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\020\020\020\020\021\021\021\022\022\022\023\023\024\024\025\026\026\026\025\024\023\023\022\021\021\020\020\020\017\017\016\016\016\016\r\r\r\r\r\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\016\017\017\020\020\021\021\022\022\023\024\025\026\027\030\032\033\036\"..--,,++**))(('''&&&%%%$$$$####\"\"\"\"!!!!    \037\037\037\037\036\036\036\036\036\035\035\035\035\035\034\034\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\032\031\030\030\027\026\025\025\024\024\023\023\022\022\022\021\021\021\020\020\020\020\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\020\020\020\020\021\021\021\022\022\022\023\023\024\024\025\025\026\027\026\025\024\024\023\022\022\021\021\020\020\017\017\017\016\016\016\016\r\r\r\r\r\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\016\017\017\017\020\020\021\021\022\022\023\024\025\026\027\030\032\034\036\"//.--,,++**))((('''&&&%%%$$$$####\"\"\"\"!!!!    \037\037\037\037\036\036\036\036\036\035\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\033\033\033\033\034\034\034\034\034\034\034\034\034\034\033\032\031\030\027\026\026\025\025\024\024\023\023\022\022\021\021\021\021\020\020\020\020\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\020\020\020\020\021\021\021\021\022\022\023\023\023\024\024\025\026\026\027\027\026\025\024\023\023\022\021\021\020\020\020\017\017\017\016\016\016\016\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\016\017\017\017\020\020\021\021\022\022\023\023\024\025\026\027\031\032\034\037#0//.--,,++**)))((('''&&&%%%$$$$####\"\"\"!!!!!    \037\037\037\037\036\036\036\036\036\036\035\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\034\033\032\031\030\027\027\026\025\025\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\020\020\020\020\021\021\021\021\022\022\022\023\023\024\024\025\025\026\027\027\027\026\025\024\024\023\022\022\021\021\020\020\017\017\017\017\016\016\016\016\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\016\016\016\016\017\017\017\020\020\020\021\021\022\022\023\024\025\025\027\030\031\033\035\037#10//.--,,+++**))((('''&&&&%%%$$$$###\"\"\"\"!!!!     \037\037\037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\034\034\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\035\034\033\032\031\030\027\026\026\025\025\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\020\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\017\017\020\020\020\020\021\021\021\021\022\022\022\023\023\024\024\025\025\026\026\027\030\027\026\025\025\024\023\023\022\021\021\020\020\020\017\017\017\016\016\016\016\016\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\016\016\016\016\016\017\017\017\020\020\021\021\022\022\023\023\024\025\026\027\030\031\033\035 $110//..--,,++**)))((('''&&&%%%%$$$$###\"\"\"\"!!!!     \037\037\037\037\037\036\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\034\033\032\031\030\027\027\026\025\025\024\024\023\023\023\022\022\022\021\021\021\021\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\021\022\022\022\023\023\023\024\024\025\025\026\027\027\030\030\027\026\025\024\023\023\022\022\021\021\020\020\020\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\016\016\016\016\016\017\017\017\020\020\020\021\021\022\022\023\024\024\025\026\027\030\032\033\036 $2110//..--,,++***)))((('''&&&%%%%$$$####\"\"\"\"!!!!     \037\037\037\037\037\036\036\036\036\036\036\036\035\035\035\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\034\033\032\031\031\030\027\026\026\025\025\024\024\023\023\023\022\022\022\021\021\021\021\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\021\022\022\022\022\023\023\024\024\025\025\026\026\027\030\030\030\027\026\025\024\024\023\022\022\021\021\021\020\020\017\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\016\016\016\016\016\017\017\017\017\020\020\021\021\021\022\023\023\024\025\025\026\027\031\032\034\036!%32110//..--,,+++**)))(((''''&&&%%%%$$$####\"\"\"\"!!!!     \037\037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\035\035\035\035\036\036\036\036\036\036\036\036\036\036\035\034\033\032\031\030\027\027\026\025\025\024\024\024\023\023\022\022\022\022\021\021\021\021\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\021\021\021\021\021\022\022\022\023\023\023\024\024\025\025\026\027\027\030\031\030\027\026\025\025\024\023\023\022\022\021\021\020\020\020\017\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\r\r\016\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\023\023\024\025\026\027\030\031\032\034\036!%3321100/..--,,,++***)))((('''&&&&%%%$$$$####\"\"\"\"!!!!     \037\037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\036\035\034\033\032\031\030\030\027\026\026\025\025\024\024\023\023\023\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\023\023\023\024\024\025\025\026\026\027\030\030\031\031\030\027\026\025\024\024\023\022\022\021\021\021\020\020\020\017\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\017\017\017\017\020\020\020\021\021\021\022\023\023\024\024\025\026\027\030\031\033\035\037\"&43321100//..--,,+++***)))((('''&&&&%%%$$$$####\"\"\"\"!!!!      \037\037\037\037\037\037\037\036\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037\037\036\034\033\032\032\031\030\027\027\026\026\025\025\024\024\023\023\023\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\023\023\023\024\024\024\025\025\026\027\027\030\031\031\031\030\027\026\025\024\024\023\023\022\022\021\021\020\020\020\017\017\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\023\023\024\025\025\026\027\030\032\033\035\037\"&543321100//..--,,,++***)))(((''''&&&%%%%$$$$####\"\"\"\"!!!!!     \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\036\035\034\033\032\031\030\030\027\026\026\025\025\024\024\024\023\023\023\022\022\022\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\022\023\023\023\024\024\025\025\026\026\027\030\030\031\032\031\030\027\026\025\025\024\023\023\022\022\021\021\021\020\020\020\017\017\017\017\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\022\023\024\024\025\026\027\030\031\032\034\035 \"'5543321100//..---,,+++***)))(((''''&&&%%%%$$$####\"\"\"\"\"!!!!!      \037\037\037 \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037    \036\035\034\033\032\031\031\030\027\027\026\026\025\025\024\024\023\023\023\022\022\022\022\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\022\022\022\022\023\023\023\024\024\025\025\025\026\027\027\030\031\031\032\032\030\027\027\026\025\024\024\023\023\022\022\021\021\021\020\020\020\017\017\017\017\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\017\017\017\017\020\020\020\021\021\021\022\022\023\023\024\025\025\026\027\030\031\032\034\036 #'65543321100//...--,,,++***))))((('''&&&&%%%$$$$####\"\"\"\"\"!!!!!               \037\037\037\037          \037\036\034\033\033\032\031\030\030\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\021\022\022\022\022\023\023\023\024\024\024\025\025\026\026\027\027\030\031\032\032\032\031\030\027\026\025\025\024\023\023\022\022\022\021\021\020\020\020\020\017\017\017\017\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\016\017\017\017\017\020\020\020\020\021\021\022\022\022\023\024\024\025\026\026\027\030\031\033\034\036 #(765543322100///..--,,,+++***)))(((('''&&&&%%%$$$$####\"\"\"\"\"!!!!!!                        ! \037\036\035\034\033\032\031\031\030\027\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\021\022\022\022\022\023\023\023\024\024\024\025\025\026\026\027\027\030\030\031\032\033\032\031\030\027\026\026\025\024\024\023\023\022\022\021\021\021\020\020\020\020\017\017\017\017\017\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\016\016\017\017\017\017\020\020\020\020\021\021\021\022\022\023\023\024\024\025\026\027\030\031\032\033\035\037!$(77655433221100//..---,,,+++***)))(((''''&&&%%%%$$$$####\"\"\"\"\"!!!!!!! !!!             !!!!!!\037\036\035\034\033\032\032\031\030\030\027\026\026\025\025\025\024\024\024\023\023\023\022\022\022\022\022\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\023\024\024\025\025\025\026\026\027\027\030\031\031\032\033\033\031\030\027\027\026\025\024\024\023\023\022\022\022\021\021\021\020\020\020\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\r\r\r\r\r\r\r\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\020\020\020\021\021\021\022\022\022\023\023\024\025\025\026\027\030\031\032\033\035\037!$)877655433221100//...--,,,+++***))))((('''&&&&%%%%$$$$####\"\"\"\"\"\"!!!!!!!!!!!!!!!!!!!!!!!!!!! \037\036\034\034\033\032\031\030\030\027\027\026\026\025\025\024\024\024\023\023\023\023\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\020\020\020\020\020\020\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\023\024\024\024\025\025\026\026\027\027\030\030\031\032\033\033\033\032\031\030\027\026\025\025\024\024\023\023\022\022\021\021\021\020\020\020\020\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\020\020\020\020\021\021\021\022\022\023\023\024\024\025\026\026\027\030\031\032\034\035\037\"%)9877655433221100///..---,,,+++***)))(((('''&&&&%%%$$$$$####\"\"\"\"\"\"\"!!\"!!!!!!!!!!!!!!!!!\"\"\"\" \037\036\035\034\033\032\031\031\030\030\027\026\026\026\025\025\024\024\024\023\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\023\024\024\024\025\025\025\026\026\027\027\030\031\031\032\033\034\033\032\031\030\027\026\026\025\024\024\023\023\022\022\022\021\021\021\020\020\020\020\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\020\020\020\020\021\021\021\022\022\022\023\023\024\025\025\026\027\027\030\032\033\034\036 \"%*:98776554332211000//...--,,,+++****)))(((''''&&&%%%%$$$$$#####\"\"\"\"\"\"\"\"\"\"\"\"\"\"!!!!\"\"\"\"\"\"\"\"\"\"!\037\036\035\034\033\033\032\031\030\030\027\027\026\026\025\025\025\024\024\024\023\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\023\023\023\023\024\024\024\025\025\025\026\026\027\027\030\030\031\032\032\033\034\034\032\031\030\027\027\026\025\025\024\024\023\023\022\022\021\021\021\021\020\020\020\020\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\020\020\020\020\021\021\021\021\022\022\023\023\024\024\025\025\026\027\030\031\032\033\034\036 \"&*:998776554432211100//...---,,,+++***)))(((('''&&&&%%%%$$$$$#####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"##\"! \037\036\035\034\033\032\031\031\030\030\027\026\026\026\025\025\024\024\024\024\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\022\023\023\023\023\024\024\024\024\025\025\026\026\026\027\027\030\031\031\032\033\034\034\034\033\032\031\030\027\026\026\025\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\022\022\022\023\023\024\024\025\026\026\027\030\031\032\033\035\036 #&+;:998776554433221100///...--,,,++++***)))(((''''&&&&%%%%$$$$$######\"####\"\"\"\"\"\"\"\"\"\"\"#######! \037\036\035\034\033\032\032\031\030\030\027\027\026\026\025\025\025\024\024\024\024\023\023\023\023\022\022\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\022\022\023\023\023\023\024\024\024\024\025\025\025\026\026\027\027\030\030\031\032\032\033\034\035\034\033\032\031\030\027\026\026\025\025\024\024\023\023\022\022\022\021\021\021\020\020\020\020\020\017\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\022\022\022\023\023\024\024\025\025\026\027\027\030\031\032\034\035\037!#&+<;:9987765544332211000//...---,,,+++***))))(((''''&&&%%%%%$$$$$###########################\"!\037\036\035\034\033\033\032\031\031\030\030\027\027\026\026\025\025\025\024\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\021\021\021\021\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\024\024\024\025\025\025\026\026\026\027\027\030\031\031\032\033\033\034\035\035\033\032\031\030\027\027\026\025\025\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\016\016\016\016\016\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\021\022\022\023\023\023\024\024\025\026\026\027\030\031\032\033\034\035\037!$',<;;:9887765544332211100///...---,,,+++***)))(((('''&&&&%%%%%$$$$$$##$#################$$$$\"! \037\036\035\034\033\032\032\031\030\030\027\027\026\026\026\025\025\025\024\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\024\024\024\025\025\025\026\026\026\027\027\030\030\031\031\032\033\034\035\035\035\034\033\032\031\030\027\026\026\025\025\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\021\022\022\022\023\023\024\024\025\025\026\026\027\030\031\032\033\034\036 \"$',=<;;:98877655443322211000//...---,,,+++***))))(((''''&&&&%%%%%$$$$$$$$$$$$$$####$$$$$$$$$$#! \037\036\035\034\033\033\032\031\031\030\030\027\027\026\026\025\025\025\025\024\024\024\024\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\023\024\024\024\024\025\025\025\026\026\027\027\027\030\031\031\032\032\033\034\035\036\035\034\033\032\031\030\027\027\026\025\025\024\024\023\023\023\022\022\022\021\021\021\021\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\021\021\021\021\022\022\022\023\023\023\024\024\025\025\026\027\027\030\031\032\033\035\036 \"%(->=<;;:98877655443332211000///...---,,,+++***)))((((''''&&&&%%%%%%$$$$$$$$$$$$$$$$$$$$$$%%$#\" \037\036\035\034\034\033\032\032\031\030\030\027\027\026\026\026\025\025\025\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\024\024\024\024\024\025\025\025\026\026\026\027\027\030\030\031\031\032\033\034\034\035\036\036\034\033\032\031\030\030\027\026\026\025\024\024\024\023\023\022\022\022\021\021\021\021\021\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\021\021\021\021\021\022\022\022\023\023\024\024\025\025\026\026\027\030\031\031\033\034\035\036 \"%(->>=<;::98877665544332211100///...---,,,+++***))))((((''''&&&&%%%%%%%%%%%$$$$$$$$$$$%%%%%%%#\"! \037\036\035\034\033\032\032\031\031\030\030\027\027\026\026\026\025\025\025\024\024\024\024\024\023\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\023\023\024\024\024\024\024\025\025\025\026\026\026\027\027\030\030\031\031\032\032\033\034\035\036\036\036\035\033\032\031\031\030\027\026\026\025\025\024\024\023\023\023\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\023\023\023\024\024\025\025\026\027\027\030\031\032\033\034\035\037!#%).?>==<;::988776655443322211000///...---,,,+++***)))((((''''&&&&&&%%%%%%%%%%%%%%%%%%%%%%%%&%$\"! \037\036\035\034\033\033\032\031\031\030\030\027\027\027\026\026\026\025\025\025\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\022\022\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\025\025\025\025\026\026\027\027\027\030\030\031\031\032\033\033\034\035\036\037\036\035\034\033\032\031\030\027\027\026\025\025\024\024\024\023\023\022\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\022\023\023\024\024\024\025\026\026\027\027\030\031\032\033\034\036\037!#&).@?>=<<;::988776655443322211100///...---,,,+++****)))((((''''&&&&&&%%&&%%%%%%%%%%%%%%%&&&&&$#\" \037\036\035\035\034\033\032\032\031\031\030\030\027\027\026\026\026\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\025\025\025\025\026\026\026\027\027\030\030\031\031\032\032\033\034\034\035\036\037\037\035\034\033\032\031\030\030\027\026\026\025\025\024\024\023\023\023\022\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\017\017\017\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\022\023\023\023\024\024\025\025\026\026\027\030\031\031\032\033\035\036 !#&*/@@?>=<<;::9887766554433322111000///..---,,,,+++***))))(((('''''&&&&&&&&&&&&&%%%%&&&&&&&&&&%#\"! \037\036\035\034\033\033\032\031\031\030\030\027\027\027\026\026\026\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\025\025\025\025\026\026\026\027\027\027\030\030\031\031\032\033\033\034\035\036\036\037\037\036\034\033\032\031\031\030\027\027\026\025\025\024\024\024\023\023\023\022\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\022\023\023\023\024\024\024\025\025\026\027\027\030\031\032\033\034\035\036 \"$'*/A@??>=<<;::9887766554443322211000///...---,,,+++****)))((((('''''&&&&&&&&&&&&&&&&&&&&&&'''%$\"! \037\036\035\034\034\033\032\032\031\031\030\030\027\027\027\026\026\026\025\025\025\025\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\024\025\025\025\025\026\026\026\027\027\027\030\030\031\031\032\032\033\034\034\035\036\037 \037\036\035\034\033\032\031\030\027\027\026\026\025\025\024\024\023\023\023\022\022\022\022\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\022\022\022\022\023\023\023\024\024\025\025\026\026\027\030\030\031\032\033\034\035\037 \"$'+0BA@?>>=<<;::99877665554433222111000//...---,,,++++***))))(((((''''''''''&&&&&&&&&&&'''''''%$#! \037\036\035\035\034\033\033\032\031\031\030\030\030\027\027\026\026\026\026\025\025\025\025\024\024\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\024\024\025\025\025\025\026\026\026\026\027\027\027\030\030\031\031\032\032\033\034\035\035\036\037  \036\035\034\033\032\031\030\030\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\021\022\022\022\022\023\023\023\024\024\024\025\025\026\026\027\030\030\031\032\033\034\036\037!\"%'+0CBA@?>>=<<;::99887766554433322111000///...---,,,+++****))))(((((''''''''''''''''''''''''('&$#\"! \037\036\035\034\034\033\032\032\031\031\030\030\027\027\027\026\026\026\026\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\026\026\026\026\027\027\027\030\030\031\031\032\032\033\033\034\035\036\037\037  \036\035\034\033\032\031\031\030\027\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\021\021\022\022\022\022\023\023\023\024\024\024\025\025\026\026\027\027\030\031\032\032\033\035\036\037!#%(+1CBAA@?>>=<;;::99887766554443322211100///...---,,,++++****))))(((((('(('''''''''''''''(((((&%#\"! \037\036\035\035\034\033\033\032\031\031\030\030\030\027\027\027\026\026\026\026\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\026\026\026\027\027\027\030\030\030\031\031\032\032\033\034\034\035\036\037 ! \037\036\034\033\032\032\031\030\027\027\026\026\025\025\024\024\024\023\023\023\023\022\022\022\022\021\021\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\021\021\021\022\022\022\022\023\023\023\023\024\024\024\025\025\026\026\027\030\030\031\032\033\034\035\036 !#%(,1DCBA@@?>==<;;::998877665554433322111000///...---,,,+++****)))))(((((((((((((''''(((((((((('%$\"! \037\036\036\035\034\033\033\032\032\031\031\030\030\030\027\027\027\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\026\026\026\026\027\027\027\030\030\031\031\032\032\033\033\034\035\035\036\037 !!\037\036\035\034\033\032\031\030\030\027\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\024\024\024\025\025\026\026\027\027\030\031\031\032\033\034\035\036 \"#&),2EDCBA@@?>==<;;::998877665554433322211000///...---,,,++++****)))))(((((((((((((((((((((()))'%$#\"! \037\036\035\034\034\033\032\032\031\031\031\030\030\027\027\027\026\026\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\025\026\026\026\026\027\027\027\030\030\030\031\031\032\032\033\034\034\035\036\037\037 !!\037\036\035\034\033\032\031\031\030\027\027\026\026\025\025\024\024\024\023\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\023\024\024\024\025\025\026\026\027\027\030\031\032\032\033\034\035\037 \"$&)-2EDCCBA@??>==<;;::998877666554443322211100///...---,,,,++++****))))))))))((((((((((()))))))'&$#\"! \037\036\035\035\034\033\033\032\032\031\031\030\030\030\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\025\025\026\026\026\026\026\027\027\027\030\030\030\031\031\032\032\033\033\034\035\035\036\037 !\"! \036\035\034\033\032\032\031\030\030\027\026\026\026\025\025\024\024\024\023\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\023\023\023\023\024\024\024\025\025\026\026\027\027\030\030\031\032\033\034\035\036\037!\"$')-3FEDCBBA@??>==<;;::9988777665544433322111000///...---,,,++++*****))))))))))))))))))))))))*)(&%#\"! \037\036\036\035\034\034\033\032\032\031\031\031\030\030\030\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\027\027\027\027\030\030\031\031\031\032\032\033\034\034\035\036\036\037 !\"\" \037\036\035\034\033\032\031\030\030\027\027\026\026\025\025\025\024\024\024\023\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\023\023\023\023\024\024\024\025\025\025\026\026\027\027\030\031\031\032\033\034\035\036\037!#%'*.3GFEDCBAA@??>==<<;::9988877665554433322211000///...---,,,,++++******)**)))))))))))))))*****('%$#\"! \037\036\035\035\034\033\033\032\032\031\031\030\030\030\027\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\027\027\027\027\030\030\030\031\031\032\032\033\033\034\034\035\036\037  !\"\" \037\036\035\034\033\032\031\031\030\027\027\026\026\026\025\025\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\022\023\023\023\023\023\024\024\024\025\025\026\026\026\027\030\030\031\032\032\033\034\035\036 !#%'*.4GFEEDCBAA@??>==<<;::9998877665554443322211100///....---,,,,++++*************))))**********('%$#\"! \037\036\036\035\034\034\033\032\032\032\031\031\030\030\030\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\027\027\027\027\030\030\030\031\031\031\032\032\033\033\034\035\035\036\037 !\"#\"!\037\036\035\034\033\032\032\031\030\030\027\027\026\026\025\025\025\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\022\022\023\023\023\023\023\024\024\024\025\025\025\026\026\027\027\030\030\031\032\033\033\034\035\037 \"#%(+/4HGFEDDCBA@@?>>==<<;;::9988776665544433222111000///...----,,,,+++++********************++++)'&%#\"! \037\037\036\035\034\034\033\033\032\032\031\031\031\030\030\030\027\027\027\027\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\026\027\027\027\027\030\030\030\031\031\031\032\032\033\033\034\034\035\036\036\037 !\"#\"! \036\035\034\033\033\032\031\031\030\027\027\026\026\026\025\025\024\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\024\024\024\024\025\025\026\026\026\027\027\030\031\031\032\033\034\035\036\037 \"$&(+/5IHGFEDCCBA@@?>>==<<;;::9988777665554433322111000///....---,,,,,+++++++++***********+++++++)(&%$#\"! \037\036\035\035\034\034\033\032\032\032\031\031\030\030\030\030\027\027\027\027\026\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\026\026\027\027\027\027\030\030\030\030\031\031\032\032\032\033\033\034\035\035\036\037  !\"$#! \037\036\035\034\033\032\031\031\030\030\027\027\026\026\025\025\025\024\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\024\024\024\024\025\025\025\026\026\027\027\030\030\031\032\032\033\034\035\036\037!\"$&(,/5IHGGFEDCBBA@@?>>==<<;;::9988777665554433322211100////...----,,,,,+++++++++++++++++++++++,+*('%$#\"! \037\036\036\035\034\034\033\033\032\032\031\031\031\030\030\030\030\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\030\030\030\031\031\031\032\032\033\033\034\034\035\036\036\037 !\"#$#\" \037\036\035\034\033\032\032\031\030\030\027\027\026\026\026\025\025\025\024\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\024\024\024\025\025\025\026\026\026\027\027\030\030\031\032\033\033\034\035\036 !\"$&),06JIHGFEEDCBBA@@?>>==<<;;::99888776665544433222111000///....----,,,,,+,,+++++++++++++++,,,,,*('&$#\"! \037\037\036\035\035\034\034\033\033\032\032\031\031\031\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\030\030\030\031\031\031\032\032\032\033\033\034\035\035\036\037\037 !\"#$#\"!\037\036\035\034\033\033\032\031\031\030\030\027\027\026\026\025\025\025\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\023\024\024\024\024\025\025\025\026\026\027\027\030\030\031\031\032\033\034\034\035\037 !#%'),06KJIHGFEDDCBBA@@?>>==<<;;::99988776665544433322111000////...-----,,,,,,,,,,,,++++,,,,,,,,,,*)'&%$\"!! \037\036\036\035\034\034\033\033\032\032\032\031\031\031\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\030\030\030\030\031\031\031\032\032\033\033\034\034\035\035\036\037  !\"#%$\"! \037\035\035\034\033\032\031\031\030\030\027\027\026\026\026\025\025\025\024\024\024\024\023\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\023\024\024\024\024\025\025\025\026\026\026\027\027\030\030\031\032\032\033\034\035\036\037 \"#%'*-17LJIIHGFEDDCBAA@@?>>==<<;;::999887776655544333222111000///....-----,,-,,,,,,,,,,,,,,,,,----+)(&%$#\"! \037\036\036\035\035\034\034\033\033\032\032\031\031\031\030\030\030\030\027\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\027\030\030\030\030\031\031\031\032\032\033\033\033\034\034\035\036\036\037 !\"#$%$#! \037\036\035\034\033\032\032\031\030\030\027\027\027\026\026\025\025\025\025\024\024\024\024\023\023\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\023\023\023\024\024\024\024\025\025\025\025\026\026\027\027\027\030\031\031\032\032\033\034\035\036\037 \"#%'*-17LKJIHGGFEDCCBAA@@?>>==<<;;:::99887776655544333222111000////....---------,,,,,,,,,,,-------+*('%$#\"!  \037\036\035\035\034\034\033\033\032\032\032\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\027\026\026\026\026\026\026\026\026\027\027\027\027\027\027\027\027\027\030\030\030\030\031\031\031\032\032\032\033\033\034\034\035\035\036\037\037 !\"#$%$#! \037\036\035\034\033\033\032\031\031\030\030\027\027\026\026\026\025\025\025\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\025\025\025\026\026\026\027\027\030\030\031\031\032\033\034\034\035\036\037!\"$&(*.28MLKJIHGFFEDCCBAA@@?>>==<<;;;::998887766555444332221110000///.....----------------------..-,*('&%#\"!! \037\036\036\035\035\034\034\033\033\032\032\032\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\031\032\032\033\033\033\034\034\035\036\036\037  !\"#$&%#\"!\037\036\035\034\034\033\032\032\031\030\030\027\027\027\026\026\026\025\025\025\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\025\025\025\025\026\026\027\027\027\030\030\031\032\032\033\034\035\036\037 !\"$&(+.28NMKKJIHGFEEDCCBAA@@??>==<<<;;::998887766655444333222111000////.....-..---------------.....,*)'&%$#\"! \037\037\036\035\035\034\034\033\033\032\032\032\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\031\032\032\032\033\033\034\034\035\035\036\037\037 !\"#$%&%$\"! \037\036\035\034\033\032\032\031\031\030\030\027\027\026\026\026\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\025\025\025\025\026\026\026\027\027\030\030\031\031\032\032\033\034\035\036\037 !#$&)+.39NMLKJIHHGFEEDCCBAA@@??>>==<<;;::9998877666554443332221110000////............----......../.,+)(&%$#\"!  \037\036\036\035\035\034\034\033\033\032\032\032\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\030\031\031\031\031\032\032\032\033\033\033\034\034\035\036\036\037  !\"#$%&%$\"! \037\036\035\034\033\033\032\031\031\030\030\027\027\027\026\026\026\025\025\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\025\025\025\025\026\026\026\027\027\027\030\030\031\031\032\033\033\034\035\036\037 \"#%'),/39ONMLKJIHGGFEDDCCBAA@@??>>==<<;;::9998877766555443332221111000/////../.................////-+)('%$#\"!! \037\037\036\035\035\034\034\033\033\033\032\032\032\031\031\031\031\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\030\031\031\031\031\032\032\032\033\033\033\034\034\035\035\036\036\037 !!\"#$%'&$#! \037\036\035\034\034\033\032\032\031\031\030\030\027\027\026\026\026\025\025\025\025\025\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\024\025\025\025\025\025\026\026\026\027\027\030\030\031\031\032\032\033\034\035\035\036\037!\"#%'),/3:OONMLKJIHGGFEDDCBBAA@@??>>==<<;;:::9988777665554443322221110000/////////...........///////-+*('&%$#\"! \037\037\036\036\035\035\034\034\033\033\032\032\032\032\031\031\031\031\030\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\030\030\030\030\030\030\030\030\031\031\031\031\031\032\032\032\033\033\034\034\034\035\035\036\037\037 !\"#$%&'&$#\" \037\036\035\035\034\033\032\032\031\031\030\030\027\027\027\026\026\026\025\025\025\025\025\024\024\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\024\024\024\024\024\024\024\024\025\025\025\025\025\026\026\026\027\027\027\030\030\031\031\032\033\033\034\035\036\037 !\"$%'*,04:OONMLKJJIHGFFEDDCBBAA@@??>>==<<;;:::99887776655544433322211110000//////////////////////00/.,*)'&%$#\"!  \037\036\036\035\035\034\034\033\033\033\032\032\032\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\032\032\032\033\033\033\034\034\035\035\036\036\037  !\"#$%&'&%#\"! \037\036\035\034\033\033\032\031\031\030\030\030\027\027\026\026\026\026\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\026\026\026\026\027\027\030\030\030\031\032\032\033\033\034\035\036\037 !#$&(*-04;NNNNMLKJIIHGFFEDDCBBAA@@??>>==<<;;;::998887766655444333222211100000000///////////////00000.,+)(&%$#\"\"! \037\037\036\036\035\035\034\034\033\033\033\032\032\032\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\032\032\032\033\033\033\034\034\034\035\035\036\037\037 !!\"#$%&('%$\"! \037\036\035\034\034\033\032\032\031\031\030\030\027\027\027\026\026\026\026\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\026\026\026\026\027\027\027\030\030\031\031\032\032\033\034\034\035\036\037 !#$&(*-05;MMMMNMLKJIHHGFEEDDCBBAA@@??>>==<<;;;::99888776665554433332221111000000000000////0000000010.-+)('&%$#\"!  \037\036\036\035\035\034\034\034\033\033\032\032\032\032\031\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\031\032\032\032\032\033\033\033\034\034\035\035\036\036\037\037 !\"##$%'('%$#! \037\036\035\035\034\033\033\032\031\031\030\030\030\027\027\027\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\026\026\026\027\027\027\030\030\030\031\031\032\033\033\034\035\036\036\037!\"#%&(+-15<MMMMMMLKKJIHGGFEEDDCBBAA@@??>>==<<<;;::999887766655544433322221111001000000000000000001111/-+*('&%$#\"!! \037\037\036\036\035\035\034\034\033\033\033\032\032\032\032\031\031\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\031\031\032\032\032\032\033\033\033\034\034\035\035\035\036\037\037  !\"#$%&'('&$#\" \037\036\036\035\034\033\033\032\032\031\031\030\030\027\027\027\026\026\026\026\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\025\026\026\026\026\027\027\027\030\030\031\031\032\032\033\033\034\035\036\037 !\"#%')+.16<LLLLLLMLKJJIHGGFEEDDCBBAA@@??>>==<<<;;::99988777665554443332222111111111000000000001111111/-,*)'&%$#\"\"! \037\037\036\036\035\035\034\034\034\033\033\033\032\032\032\032\031\031\031\031\031\031\031\031\031\030\030\030\030\030\030\031\031\031\031\031\031\031\031\031\032\032\032\032\033\033\033\034\034\034\035\035\036\036\037\037 !!\"#$%&')(&%#\"! \037\036\035\034\034\033\032\032\031\031\030\030\030\027\027\027\026\026\026\026\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\025\026\026\026\026\027\027\027\030\030\030\031\031\032\032\033\034\034\035\036\037 !\"$%')+.26=KKKKLLLLLKJIIHGGFEEDDCBBAA@@??>>===<<;;::9998877766555444333322221111111111111111111111222/.,*)('%$$#\"!  \037\037\036\036\035\035\034\034\033\033\033\033\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\033\033\033\033\034\034\035\035\035\036\036\037  !\"##$%&()(&%#\"! \037\036\035\035\034\033\033\032\032\031\031\030\030\027\027\027\027\026\026\026\026\025\025\025\025\025\025\025\025\025\024\024\024\024\024\024\024\025\025\025\025\025\025\025\025\025\026\026\026\026\027\027\027\027\030\030\031\031\032\032\033\033\034\035\035\036\037 !#$&'),/27=KKKKKKKKLLKJIIHGGFEEDDCBBAA@@??>>===<<;;:::998877766655544433332222222211111111111112222220.,+)('&%$#\"!! \037\037\036\036\035\035\034\034\034\033\033\033\033\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\033\033\033\033\034\034\034\035\035\036\036\037\037 !!\"#$%&'()('%$\"! \037\036\036\035\034\033\033\032\032\031\031\030\030\030\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\027\027\027\030\030\030\031\031\032\032\033\033\034\035\036\037\037 \"#$&(*,/27>JJJJJJJKKKKKJIHHGFFEEDCCBBAA@@??>>>==<<;;:::99888776665554443333322222222222111122222222320.-+*('&%$#\"\"!  \037\036\036\036\035\035\034\034\034\033\033\033\033\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\032\033\033\033\034\034\034\035\035\035\036\036\037  !\"\"#$%&'(*)'%$#\"  \037\036\035\034\034\033\032\032\031\031\031\030\030\030\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\027\027\027\027\030\030\031\031\031\032\032\033\034\034\035\036\037 !\"#%&(*,/38>IIIIJJJJJKKKJJIHHGFFEEDCCBBAA@@??>>>==<<;;:::9988877666555444433333232222222222222222233331/-,*)(&%$$#\"!! \037\037\036\036\035\035\035\034\034\034\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\032\032\033\033\033\033\034\034\034\035\035\036\036\037\037  !\"##$%&')*)'&$#\"! \037\036\035\035\034\033\033\032\032\031\031\030\030\030\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\027\027\027\027\030\030\030\031\031\032\032\033\033\034\035\035\036\037 !\"#%'(*-038?IIIIIIIIJJJKKJJIHHGFFEEDCCBBAA@@???>>==<<;;:::998887776665554444333333332222222222233333331/-,*)('&%$#\"!!  \037\036\036\036\035\035\034\034\034\033\033\033\033\033\032\032\032\032\032\032\032\032\031\031\031\031\031\031\032\032\032\032\032\032\032\032\032\033\033\033\033\034\034\034\035\035\035\036\036\037\037 !!\"#$%&'()*)(&%#\"! \037\036\035\035\034\033\033\032\032\031\031\031\030\030\030\027\027\027\027\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\027\027\027\027\030\030\030\031\031\031\032\032\033\034\034\035\036\036\037 !\"$%')+-048?HHHHHHHIIIJJJKJJIHHGFFEEDCCBBAA@@???>>==<<;;;::998887776665554444433333333333333333333344410.,+)('&%$#\"\"!  \037\037\036\036\035\035\035\034\034\034\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\034\034\035\035\035\036\036\037\037  !\"\"#$%&'()+*(&%$\"! \037\037\036\035\034\034\033\033\032\032\031\031\030\030\030\027\027\027\027\027\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\026\026\027\027\027\027\030\030\030\031\031\032\032\033\033\034\034\035\036\037  \"#$%')+.149@GGGGHHHHHIIIJJKJIIHGGFFEEDCCBBAA@@@??>>==<<;;;::99988777666555544444444333333333333344444420.-+*('&%$$#\"!! \037\037\036\036\036\035\035\035\034\034\034\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\034\034\034\035\035\036\036\036\037\037 !!\"##$%&'(*+*('%$#\"! \037\036\035\035\034\033\033\032\032\031\031\031\030\030\030\027\027\027\027\027\026\026\026\026\026\026\026\026\026\025\025\025\025\025\025\026\026\026\026\026\026\026\026\026\027\027\027\027\030\030\030\031\031\031\032\032\033\033\034\035\035\036\037 !\"#$&')+.159@GGGGGGGGHHHIIJJKJIIHGGFFEEDDCBBAA@@@??>>==<<;;;::9998877766665555444444444443333444444445420/-+*)('&%$#\"\"!  \037\037\036\036\035\035\035\034\034\034\034\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\033\034\034\034\034\035\035\035\036\036\037\037  !!\"#$%%&()*+*)'%$#\"! \037\036\035\035\034\034\033\033\032\032\031\031\030\030\030\030\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\030\030\030\030\031\031\032\032\033\033\034\034\035\036\036\037 !\"#%&(*,.15:AFFFFFFFGGGHHHIIJKJIIHGGFFEEDDCBBAAA@@??>>==<<;;;::999888777666555554544444444444444444555531/-,*)('&%$##\"!! \037\037\037\036\036\035\035\035\034\034\034\034\033\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\033\034\034\034\034\035\035\035\036\036\036\037\037  !\"\"#$%&'()*,+)'&$#\"! \037\036\036\035\034\034\033\033\032\032\031\031\031\030\030\030\030\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\030\030\030\031\031\031\032\032\033\033\034\034\035\036\037\037 !\"$%&(*,/25:AEEEEFFFFFGGGHHIIJJJIIHGGFFEEDDCBBBAA@@??>>==<<<;;::99988877766665555555554444444444555555531/.,+)('&%$$#\"!!  \037\037\036\036\036\035\035\035\034\034\034\034\033\033\033\033\033\033\033\033\033\032\032\032\032\033\033\033\033\033\033\033\033\033\034\034\034\034\035\035\035\035\036\036\037\037  !!\"##$%&'()+,+)(&%#\"! \037\037\036\035\035\034\033\033\032\032\032\031\031\031\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\030\030\030\031\031\031\032\032\032\033\033\034\035\035\036\037 !\"#$%'(*,/26;BEEEEEEEEFFFGGHHIIJJJIHHGGFFEEDDCCBBAA@@??>>==<<<;;:::9988877776666555555555555555555555666310.,+*)'&&%$#\"\"!  \037\037\037\036\036\035\035\035\035\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\035\035\035\036\036\036\037\037  !\"\"#$%%&'(*+,+*(&%$#\"! \037\036\035\035\034\034\033\033\032\032\031\031\031\030\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\030\030\030\030\031\031\031\032\032\033\033\034\034\035\035\036\037 !\"#$%')+-/26;BDDDDDDDEEEFFFGGHIIJJJIHHGGFFEEDDCCBBAA@@??>>==<<<;;:::999888777666666665555555555555666666420.-+*)('&%$##\"!!  \037\037\036\036\036\035\035\035\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\035\035\035\036\036\036\037\037  !!\"##$%&'()*+-,*('%$#\"! \037\036\036\035\034\034\033\033\032\032\032\031\031\031\030\030\030\030\027\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\027\030\030\030\030\031\031\031\032\032\032\033\033\034\034\035\036\036\037 !\"#$&')+-037<CDCCCDDDDDEEEFFGGHIIJJJIHHGGFFEEDDCCBBAA@@??>>==<<<;;:::99988877776666666666655556666666676420/-,*)('&%$$#\"\"!  \037\037\037\036\036\036\035\035\035\034\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\034\035\035\035\035\036\036\037\037\037  !!\"##$%&'()*,-,*('&$#\"! \037\037\036\035\035\034\034\033\033\032\032\031\031\031\031\030\030\030\030\027\027\027\027\027\027\027\027\027\026\026\026\026\026\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\032\032\033\033\034\034\035\035\036\037\037 !\"#%&()+-037<CCCCCCCCCDDDEEEFGGHIIJJJIHHGGFFEEDDCCBBAA@@??>>==<<<;;:::9998888777767666666666666666677777531/-,+*('&%%$#\"\"!!  \037\037\036\036\036\035\035\035\035\034\034\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037  !!\"\"#$%%&'()+,-,*)'&%#\"!  \037\036\035\035\034\034\033\033\032\032\032\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\032\032\032\033\033\034\034\035\035\036\037 !\"#$%&(*,.047<BBBBBBBCCCCDDDEEFFGHIIJJIIHHGGFFEEDDCCBBAA@@??>>===<<;;;::999988877777777766666666677777787531/.,+*)('&%$##\"!!  \037\037\037\036\036\036\035\035\035\035\034\034\034\034\034\034\034\034\034\034\033\033\034\034\034\034\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037\037  !!\"##$%&'')*+,.-+)(&%$#\"! \037\036\036\035\034\034\033\033\033\032\032\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\031\032\032\033\033\033\034\035\035\036\036\037 !\"#$%'(*,.148=BBBABBBBBBCCCDDEEFFGHIJKJIIHHGGFFEEDDCCBBAA@@??>>===<<;;;:::99988887777777777777777777778885310.-+*)('&%$$#\"\"!!  \037\037\037\036\036\036\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\036\036\036\036\037\037  !!\"\"#$$%&'()*+-.-+)(&%$#\"! \037\037\036\035\035\034\034\033\033\032\032\032\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\031\032\032\032\033\033\034\034\035\035\036\037\037 !\"#$%'(*,/148=AAAAAAAAABBBCCCDDEFFGHIJKJIIHHGGFFEEDDCCBBAA@@??>>===<<;;;:::9999888888877777777777778888886420.-,*)('&%%$##\"!!   \037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\036\036\036\036\037\037\037  !!\"\"#$%%&'()*,-.-+*('%$#\"!  \037\036\035\035\034\034\033\033\033\032\032\032\031\031\031\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\030\030\031\031\031\032\032\032\033\033\033\034\034\035\036\036\037  !\"#$&')+-/259>@@@@@@@AAAABBBCCDDEFFGHIJKJIIHHGGFFEEDCCCBBAA@@??>>===<<;;;:::999988888888888777788888889986420/-,+*)('&%$##\"\"!!  \037\037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\035\036\036\036\037\037\037  !!\"\"##$%&&'()+,-/.,*('&$#\"!! \037\036\036\035\035\034\034\033\033\032\032\032\031\031\031\031\030\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\030\030\031\031\031\031\032\032\032\033\033\034\034\035\035\036\036\037 !\"#$%&')+-/259>@@@@@@@@@@AAABBCCDDEFGGHIJJJIIHHGGFFEDDCCBBBAA@@??>>===<<<;;;:::9999899888888888888888999997431/.,+*)('&%$$#\"\"!!   \037\037\037\036\036\036\036\035\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\035\035\036\036\036\036\037\037   !!\"\"#$$%&'()*+,-/.,*)'&%$#\"! \037\037\036\035\035\034\034\033\033\033\032\032\032\031\031\031\031\030\030\030\030\030\030\030\030\030\030\027\027\027\030\030\030\030\030\030\030\030\030\030\031\031\031\031\032\032\032\033\033\033\034\034\035\035\036\037\037 !\"#$%&()+-0259??????????@@@AAABBCDDEFGHIJKJJIIHHGGFEEDDCCBBBAA@@??>>===<<<;;;::::99999999888888888999999:97531/.-+*)('&%%$##\"\"!!  \037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\037\037\037  !!\"\"##$%%&'()*+,./.,+)(&%$#\"! \037\037\036\036\035\034\034\034\033\033\032\032\032\032\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\032\032\032\032\033\033\034\034\034\035\036\036\037  !\"#$%'(*+.036:?>>>>>>>????@@@AABBCDDEFGHIJKJJIIHHGGFEEDDCCBBAAA@@??>>>==<<<;;;::::99999999999999999999::::75310.-,*)(''&%$$#\"\"!!   \037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\037\037\037   !!\"\"##$%&&'()*,-.0/-+)(&%$#\"!  \037\036\036\035\035\034\034\033\033\033\032\032\032\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\032\032\032\033\033\033\034\034\035\035\036\036\037 !!\"#$&'(*,.036:>>>>>>>>>>>???@@AABBCDDEFGHIKKJJIIHHGFFEEDDCCBBAAA@@??>>>==<<<;;;;:::::::9999999999999::::::86420/-,+*)('&%%$##\"\"!!   \037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\037\037\037\037  !!\"\"##$$%&'()*+,-.0/-+*('&$#\"!! \037\037\036\035\035\034\034\034\033\033\032\032\032\032\031\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\032\032\032\032\033\033\034\034\034\035\035\036\037\037 !\"#$%&')*,.137;=========>>>>???@@ABBCDEEFGIJKKJJIIHHGFFEEDDCCBBAAA@@??>>>===<<<;;;;::::::::::9999:::::::;;:86421/.,+*)('&%%$##\"\"!!   \037\037\037\037\036\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\037\037\037\037   !!\"\"##$%%&'()*+,-/0/-,*('&%$#\"! \037\037\036\036\035\035\034\034\033\033\033\032\032\032\032\031\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\031\032\032\032\032\033\033\033\034\034\035\035\036\036\037\037 !\"#$%&')+,.147;=<<<<<<=====>>>??@@ABBCDEFGHIJKKJJIIHGGFFEEDDCCBBAAA@@??>>>===<<<;;;;:;;:::::::::::::::;;;;;86431/.-+*)(''&%$$##\"\"!!   \037\037\037\037\036\036\036\036\036\036\036\035\035\035\035\035\035\035\035\036\036\036\036\036\036\036\037\037\037\037   !!\"\"\"#$$%&&'()*+,./10.,*)'&%$#\"!  \037\036\036\035\035\034\034\034\033\033\033\032\032\032\032\031\031\031\031\031\031\031\030\030\030\030\030\030\030\030\030\031\031\031\031\031\031\031\032\032\032\032\033\033\033\034\034\034\035\035\036\036\037  !\"#$%&()+-/147<<<<<<<<<<<<===>>??@@ABBCDEFGHIKKKJJIIHGGFFEEDDCCBBAAA@@??>>>===<<<<;;;;;;;;:::::::::;;;;;;<;975310.-,+*)('&%%$##\"\"!!!   \037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037   !!!\"\"##$%%&'(()*,-./10.,*)(&%$#\"!! \037\037\036\036\035\035\034\034\033\033\033\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\030\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\033\033\033\034\034\035\035\036\036\037\037 !!\"#$%'()+-/248;;;;;;;;;;<<<<===>>?@@ABBCDEFGIJKKKJJIHHGGFFEEDDCCBBAAA@@???>>====<<<<;<;;;;;;;;;;;;;;;;;<<<<975320/-,+*)('&&%$$##\"\"!!   \037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037   !!\"\"\"#$$%%&'()*+,-.010.,+)('%$#\"\"! \037\037\036\036\035\035\034\034\034\033\033\033\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\033\033\033\034\034\034\035\035\036\036\037\037 !\"##%&'(*+-/258;;;;:::;;;;;;<<<==>>??@ABCCDFGHIKLKKJJIHHGGFFEEDDCCBBAAA@@???>>>===<<<<<<<;;;;;;;;;;;;;<<<<<<:75420/.,+*)(''&%$$##\"\"!!!   \037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037   !!!\"\"##$$%&&'()*+,-/021/-+)('&%$#\"!  \037\036\036\035\035\035\034\034\033\033\033\033\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\033\033\033\033\034\034\035\035\035\036\036\037  !\"#$%&')*,.0259:::::::::::;;;;<<==>>??@ABCDEFGHJKLKKJIIHHGGFFEEDDCCBBAAA@@???>>>====<<<<<<<<<<;;;;<<<<<<<==<:86421/.-+*)(('&%%$$##\"\"!!!   \037\037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037\037    !!\"\"\"##$%%&''()*+,./021/-+*('&%$#\"!! \037\037\036\036\035\035\034\034\034\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\032\033\033\033\034\034\034\035\035\036\036\037\037 !!\"#$%&')*,.0359:999999999::::;;;<<==>??@ABCDEFHIJLLKKJIIHHGGFFEEDDCCBBAAA@@???>>>=======<<<<<<<<<<<<<<<=====:86431/.-,+*)('&&%$$##\"\"!!!    \037\037\037\037\037\037\037\036\036\036\036\036\036\036\036\037\037\037\037\037\037\037    !!!\"\"##$$%&&'()*+,-./121/-,*)'&%$#\"\"! \037\037\036\036\035\035\035\034\034\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\032\033\033\033\033\034\034\034\035\035\036\036\037\037 !\"\"#$%&()+,.03699999999999999:::;;<<==>?@@ABCDFGHJKLLKJJIIHHGGFFEEDDCCBBAAA@@???>>>>========<<<<<<<<<======>=;965310.-,+*)(''&%%$###\"\"!!!    \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037    !!!\"\"\"##$$%&&'()*+,-.01320.,*)(&%$##\"!  \037\037\036\036\035\035\034\034\034\033\033\033\033\032\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\032\032\032\032\032\032\032\033\033\033\033\034\034\034\035\035\036\036\037\037  !\"##$&'()+-/1369888888888889999::;;<<==>?@AACDEFGIJLLLKJJIIHHGGFFEEDDCCBBAAA@@@???>>>>=>=================>>>>;975320/-,+*)(('&%%$$##\"\"\"!!!    \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037    !!!!\"\"##$$%%&''()*+,-/01320.,+)('&%$#\"!! \037\037\036\036\035\035\035\034\034\034\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\034\034\034\034\035\035\036\036\037\037 !!\"#$%&'(*+-/147888777777788888999::;;<==>?@ABCDEGHJKMLKKJJIIHHGGFFEEDDCCBBAAA@@@???>>>>>>>=============>>>>>><975420/.-,**)('&&%$$###\"\"!!!!     \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037     !!!\"\"\"##$$%&&'())*+,./02320.,+)('&%$#\"!! \037\037\036\036\036\035\035\034\034\034\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\034\034\035\035\035\036\036\037\037 !!\"#$%&'(*+-/1477777777777777888899::;;<==>?@ABCDFGIJLMLKKJJIIHHGGFFEEDDCCBBBAA@@@????>>>>>>>>>>====>>>>>>>???<:86421/.-,+*)(''&%%$$##\"\"\"!!!      \037\037\037\037\037\037\037\037\037\037\037\037      !!!\"\"\"##$$%%&''()*+,-./12430/-+*('&%$#\"\"!  \037\037\036\036\035\035\035\034\034\034\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\034\034\035\035\035\036\036\037\037  !\"\"#$%&')*,./24776666666666777778899::;;<=>>?@ABDEFHIKMLLKKJJIIHHGGFFEEDDCCBBBAA@@@@??????>>>>>>>>>>>>>>>?????<:864310.-,+*)(('&&%$$###\"\"\"!!!       \037\037\037\037\037\037\037\037       !!!!\"\"###$$%%&''()*+,-.012431/-+*)'&%$##\"!! \037\037\036\036\035\035\035\034\034\034\034\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\034\034\034\035\035\035\036\036\037\037 !!\"#$$%'()*,.02566666555566666677788899:;;<=>?@ABCDFGIJLMLLKKJJIIHGGFFEEEDDCCBBBAAA@@@????????>>>>>>>>>??????@?=:865310/-,+*))('&&%%$$##\"\"\"!!!!                    !!!!\"\"\"##$$%%&&'())*+,-/013431/-,*)('&%$#\"!!  \037\037\036\036\035\035\035\034\034\034\033\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\033\033\034\034\034\035\035\035\036\036\037\037  !!\"#$%&'()+,.025655555555555556667778899:;;<=>?@ABCEFHIKMMLLKKJJIHHGGFFEEEDDCCBBBAAA@@@@?@?????????????????@@@@=;975320/.-,+*)(''&%%$$###\"\"\"!!!!!                 !!!!\"\"\"###$$%%&''()*++-./023541/.,+)('&%$#\"\"!  \037\037\036\036\035\035\035\034\034\034\034\033\033\033\033\033\033\033\033\032\032\032\032\032\032\032\033\033\033\033\033\033\033\033\034\034\034\034\035\035\035\036\036\037\037  !\"\"#$%&'(*+-.0355554444444445555666778899:;;<=>?@ACDEGIJLMMLLKKJIIHHGGFFEEEDDCCBBBAAAA@@@@@@?????????????@@@@A@>;975421/.-,+*)(('&&%%$$###\"\"\"!!!!!              !!!!!\"\"\"\"##$$%%&&'(()*+,-./0235420.,+)('&%$##\"!! \037\037\036\036\036\035\035\035\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\035\035\035\036\036\036\037\037 !!\"##$%&'(*+-/13544444444444444455566677899:;<<=>?ABCEFHIKMMMLLKJJIIHHGGFFEEEDDCCCBBBAAA@@@@@@@@@@????@@@@@@@AAA><9764210.-,+*))(''&%%$$###\"\"\"\"!!!!!            !!!!!\"\"\"\"###$$%%&&'())*+,-./1245420.-+*('&%$$#\"!!  \037\037\036\036\035\035\035\035\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\035\035\035\035\036\036\037\037  !!\"#$$%&()*,-/134443333333333344445556677899:;<=>?@ABDEGIJLNMMLLKJJIIHHGGFFEEEDDCCCBBBAAAAAA@@@@@@@@@@@@@@@AAAAA><:864310/.,++*)(''&&%%$$###\"\"\"\"!!!!!!!      !!!!!!!!\"\"\"###$$%%&&''()**+,-/01246520/-+*)(&&%$#\"\"!  \037\037\036\036\036\035\035\035\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\035\035\035\036\036\036\037\037  !\"\"#$%&'()*,-/1433333222222333333444556677899:;<=>?@BCDFHJLNNMMLKKJJIIHHGGFFEEEDDCCCBBBAAAAAAAA@@@@@@@@@A@@@@@").append("@@?<:865320/.-,+*)(('&&%%$$$###\"\"\"\"!!!!!!!!!!!!!!!!!!!\"\"\"\"###$$%%&&'(()*+,-./01346531/-,*)('&%$#\"\"!!  \037\037\036\036\036\035\035\035\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\035\035\035\035\036\036\037\037  !!\"\"#$%&'()+,.023322222222222222333344455677899:;<=>?ABDEGIKMNNMLLKKJJIIHHGGFFEEEDDCCCBBBBABAAAAAAAAA@@@@@????????=:875320/.-,+*))(''&&%%$$###\"\"\"\"\"!!!!!!!!!!!!!!!!\"\"\"\"\"###$$%%%&''())*+,-./02356531/-,+)('&%$##\"!!  \037\037\036\036\036\035\035\035\035\034\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037  !!\"##$%&'(*+,.0222222111111111222223334455677899:;<=?@ACDFHJLNNMMLLKKJJIIHHGGFFEEEDDCCCCBBBBBBAAAAA@@?????>>>>>>>>=;9754210.-,+**)(('&&%%$$$###\"\"\"\"\"!!!!!!!!!!!!!!\"\"\"\"\"###$$$%%&&''()**+,-./12357631/.,+)('&%$$#\"\"!  \037\037\037\036\036\036\035\035\035\035\034\034\034\034\034\034\034\033\033\033\033\033\033\033\034\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037\037  !\"\"#$$%&')*+-.0221111111111111111222233445566789:;<=>?@BCEGIKMONMMLLKKJJIIHHGGFFEEEDDDCCCBBBBBBA@@@??>>>>>=========;9764210/.-,+*)((''&&%%$$####\"\"\"\"\"\"!!!!!!!!!!\"\"\"\"\"\"####$$%%%&&'(()*++,-/0124576420.,+*)'&&%$#\"\"!!  \037\037\036\036\036\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037  !!\"\"#$%&'()*+-/01111000000000000011112233345567789:;<=>@ACDFHJLONNMMLLKKJJIIHHGGFFEEEDDDCCCCCBAA@???>>=====<<<<<<<<=<9864310/.-,+*))(''&&%%$$$####\"\"\"\"\"\"\"!!!!!!\"\"\"\"\"\"\"####$$$%%&&''())*+,-./0134676420.-+*)('&%$##\"!!  \037\037\037\036\036\036\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037\037  !!\"##$%&'()*,-/11000000///////000001112223344567789:;<>?@BCEGIKNONNMMLLKJJIIHHHGGFFEEEDDDDCCAA@@?>>>===<<<<;;;;;;;<<<:865320/.-,+**)(('&&%%%$$$####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"####$$$%%%&&'(()**+,-./0234687420/-,*)('&%$$#\"\"!!  \037\037\036\036\036\036\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\036\036\036\036\037\037   !\"\"#$$%&'()+,-/0000///////////////000111223344567789:<=>?ABDFHJMOONNMMLKKJJIIHHHGGFFFEEEDDCB@@?>>===<<<;;;;;::::::;;;:8753210.-,,+*)((''&&%%$$$$####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"#####$$$%%&&''(()*++,-./1235687521/-,+)('&%%$#\"\"!!  \037\037\037\036\036\036\035\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\035\036\036\036\037\037\037  !!\"\"#$%%&'(*+,./00////...........////0001122334456789:;<=?@BCEGILNOONNMLLKKJJIIHHHGGFFFEEDCBA??>==<<<;;;::::::9999:::::9754210/.-,+*))(''&&%%%$$$#####\"\"\"\"\"\"\"\"\"\"\"\"\"\"#####$$$%%%&&''())*+,-./01245787531/.,+*('&&%$##\"!!   \037\037\036\036\036\036\035\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\035\036\036\036\036\037\037   !!\"##$%&'()*+,.0///.................///000112234456789:;<>?ABDFHKMPOONMMLLKKJJIIHHHGGFFDCCBA@>>=<<;;;:::9999999999999999764310/.-,+**)((''&&%%%$$$######\"\"\"\"\"\"\"\"\"\"######$$$%%%&&''(()**+,-./01245798531/.,+*)('&%$##\"\"!!  \037\037\037\036\036\036\036\035\035\035\035\035\035\035\034\034\034\034\034\034\034\035\035\035\035\035\035\035\036\036\036\036\037\037\037  !!\"\"##$%&'()*+-.//....-------------....///00112234556789:<=>@BCEGJLOPOONMMLLKKJJIIHHHGEDCBAA@?==<;;:::9998888888888888889764320/.-,++*))(''&&&%%$$$$#######\"\"\"\"\"\"#######$$$$%%%&&''(()*++,-./013467986310.-+*)('&%$$#\"\"!!   \037\037\037\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\037\037\037   !!\"\"#$$%&'()*,-/...------,,,,,,,------...//0011223455678:;<>?ABDFIKNPPONNMMLLKKJJIIHGFDCBA@??><<;::99988877777777777777788653210.--,+*))((''&&%%%$$$$##################$$$$%%%&&''(())*+,,-./123468986420.-,*)('&%%$##\"\"!!  \037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\037\037\037  !!!\"##$%%&'()+,-..----,,,,,,,,,,,,,,,----..///001223456789:;=>@BCEHJMOPOONNMMLLKKJJHGFDCBA@?>>=;;:9998877776666666666666777654210/.-,+**)((''&&&%%%$$$$################$$$$%%%&&&''(()**+,-./0123568:96420/-,+)('&&%$##\"\"!!   \037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\037\037\037   !!\"\"##$%&''(*+,.---,,,,,+++++++++++,,,,----..//001223456789:<=?ABDGILNPPOONNMMLLKJHGFDCBA@?>==<::99887766665555555555555666654210/.-,++*))((''&&%%%%$$$$$#############$$$$$%%%&&''(())*++,-./0124578:97421/-,+*)('&%$$#\"\"!!   \037\037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\037\037\037\037   !!\"\"#$$%&'()*+,--,,,,+++++++++++++++++,,,---..//00123345678:;<>@BDFHJMPPPOONNMLLJIGFDCBA@?>=<<;9988776665555444444444445555664320/.-,,+**)((''&&&%%%$$$$$$##########$$$$$$%%%&&&''(())*+,,-./0134579:97531/.,+*)('&%%$##\"\"!!   \037\037\037\036\036\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\036\037\037\037   !!\"\"##$%%&'()*+--,,,++++*************++++,,,---.//00123345689:<=?ACEGILOQPPOONMMKIHFECBA@?>=<;;:88776655544443333333333344445543210/.-,+**))((''&&&%%%$$$$$$$$####$$$$$$$$%%%%&&'''(()**+,--./0234679;:7531/.-+*)('&%%$##\"\"!!   \037\037\037\037\036\036\036\036\036\036\036\036\035\035\035\035\035\036\036\036\036\036\036\036\036\037\037\037\037   !!\"\"##$%&&'()*,,,,+++******)))))))******+++,,,--../00123456789;<>@BDFHKNQQPPONMKJHFECBA@?>=<;::977665544433333222222222333334443210/.-,++*))((''&&&%%%%$$$$$$$$$$$$$$$$$$%%%%&&&''(())*++,-./01235689;:75310.-,*)('&&%$$#\"\"\"!!   \037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037   !!!\"\"#$$%&''()+,,+++****)))))))))))))))****+++,,--../0012345679:;=?ACEGJMPQQPONLJHGEDBA@?>=<;:99866554433332222221111122222233344210/.-,,+**)(((''&&&%%%%$$$$$$$$$$$$$$$$%%%%&&&'''(()**+,,-./0123568:;:86420.-,+*)('&%$$##\"\"!!    \037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037   !!\"\"##$$%&'()*+,++***))))))((((((((())))))***++,,--../0012345689;<>@BDFILORQPOLKIGEDBA@?>=<;:988755443332221111111111111111122233310/.--,+**))(('''&&&%%%%%$$$$$$$$$$$$%%%%%&&&&''(())**+,--./0124578:<;86420/-,+*)('&%%$##\"\"!!!   \037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037   !!!\"\"##$%%&'()*+++**))))((((((((((((((((())))**+++,,-../011235678:;=?ACEHKNQROMKIGFDCA@?><;;:98776443322211110000000000000001111223210/.-,++**)(((''&&&&%%%%%%$$$$$$$$$%%%%%&&&&'''(())*++,-.//1234578:<;86421/.,+*)('&&%$$##\"\"!!    \037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037    !!\"\"##$$%&&'()*+**))))(((('''''''''''''(((()))***++,,-../012345679:<>@BDGJMPPNLJHFDCA@?><;:998766533222110000//////////////00001112210/.-,,+**))(('''&&&&%%%%%%%%$$$%%%%%%%%&&&'''(())**+,,-./01234679;<;96431/.-+*)(''&%$$##\"\"!!!    \037\037\037\037\037\037\036\036\036\036\036\036\036\036\036\037\037\037\037\037\037    !!!\"\"##$$%&''()***)))(((''''''''&&&''''''''((()))**++,,-../01234578:;=?ACFHKOOMJIGECB@?><;:9887655422111000////............/////0001110/.--,++*))((('''&&&&%%%%%%%%%%%%%%%%%&&&&''((())**+,--./01235689;=<975310.-,*)(('&%%$##\"\"\"!!!   \037\037\037\037\037\037\037\037\036\036\036\036\036\037\037\037\037\037\037\037\037   !!!\"\"\"##$%%&'()**)))(((''''&&&&&&&&&&&&&&&''''((()))**+,,-../01235679:<>@BEGJMMKIGEDBA?>=;:98776544321100///.....----------.....///00010//.-,++**))(('''&&&&&%%%%%%%%%%%%%%&&&&&'''(())**++,-../01245689;=<975310.-,+*)('&&%$$##\"\"!!!    \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037    !!!\"\"##$$%&&'()*))((('''&&&&&&%%%%%%%%%&&&&&&'''((())**+,,-.//01345689;=?ADFILLJHFDBA?>=;:9876654332100//....------,,,,,,,------...//0000/.-,,+**))((('''&&&&&%%%%%%%%%%%%&&&&&'''((())**+,,-./01234578:<=<:75320/-,+*)('&&%$$##\"\"\"!!!    \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037    !!!\"\"\"##$$%&&'()))(('''&&&&%%%%%%%%%%%%%%%%%&&&&'''(())**+,,-./01234579:<>@CEHKKIGECA@>=<:987655432210//...---,,,,,,,,,,,,,,,,,,---...//00/.--,++**))((''''&&&&&&%%%%%%%%&&&&&&''''(())**++,--./01234678:<>=:86420/.,+*)(''&%%$$##\"\"!!!     \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037     !!!\"\"##$$%%&''())((''&&&&%%%%%$$$$$$$$$$$%%%%%&&&&''(())**+,,-./01235689;=?ADGJIGECB@>=<:987654432110/...--,,,,++++++++++++++++,,,,---..///..-,,+**))(((''''&&&&&&&&%%&&&&&&&&''''((())**++,-../01234679:<>=:86421/.-+*)(('&%%$$##\"\"\"!!!      \037\037\037\037\037\037\037\037\037\037\037\037     !!!\"\"\"##$$%%&'()(('''&&&%%%$$$$$$$$$$$$$$$$$$$%%%&&&'''(()**+,,-./0134578:<>@CFIHFDB@?=<;987654332110/.---,,,++++**************++++,,,---..//.-,,++**))(((''''&&&&&&&&&&&&&&&&''''((()))**+,,-.//01245689;<>=;86421/.-,+*)('&&%$$###\"\"!!!!      \037\037\037\037\037\037\037\037\037      !!!!\"\"###$$%&&'(((''&&&%%%$$$$$#############$$$$$%%%&&&''(()**+,--./1234679;=?BEHGECA?><;987654322100/.--,,+++******)))))))))))*****+++,,--../.--,++**))((((''''&&&&&&&&&&&&&&'''''((())**++,--./012345689;=?>;964310.-,+*)(''&%%$$##\"\"\"!!!!        \037\037\037        !!!!\"\"\"##$$%%&''((''&&%%%$$$$#######\"\"\"\"\"#######$$$$%%%&&''(()**+,-./0124578:<>ACFECA@><;:8765432110//..,,+++***))))))(((((((())))))***+++,,--...-,,+***))((('''''&&&&&&&&&&&&'''''((()))**+,,-../01234578:;=?>;975310/-,+*)(''&%%$$###\"\"!!!!!                  !!!!\"\"\"##$$%%&'((''&&%%$$$#####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"#####$$$%%&&&'(()**+,-./0134679;=@BEDB@>=;:8765432100/..--++***))))(((((((((((((((((())))**+++,,-..-,,++**)))(((''''''&&&&&&&&''''''((()))**++,,-.//01234678:<=?><975320/.,+*))('&&%%$$##\"\"\"!!!!                 !!!!\"\"\"##$$$%&&'('&&%%%$$####\"\"\"\"\"\"!!!!!!!!!\"\"\"\"\"\"####$$$%%&&''()**+,-./023568:<?ADCA?=<:9765432100/.--,,***)))((((''''''''''''''''(((()))**++,,----,++***))((((''''''''''''''''''(((()))**++,--./001235679:<>@?<975420/.-,+*)('&&%%$$###\"\"\"!!!!!              !!!!\"\"\"\"##$$%%&&''&&%%$$$###\"\"\"\"!!!!!!!!!!!!!!!!!\"\"\"\"####$$%%&&''()**+,-.0124579;>@CA?><:986543210//.--,++*))((((''''&&&&&&&&&&&&&'''''((()))**++,,--,,++**)))((((''''''''''''''''(((()))**++,,-../012345689;<>@?<:86421/.-,+*)(''&%%$$###\"\"\"!!!!!!           !!!!!!\"\"\"###$$%%&''&&%%$$###\"\"\"!!!!!!           !!!!!!\"\"\"###$$%%&&''()*+,-./013568:<?B@><;986543210/..-,,++*)((('''&&&&&&%%%%%%%%%&&&&&&''''((())**+,,--,++***)))((((''''''''''''''(((()))***++,,-../012345689;=>@?=:864210.-,+*)(('&&%%$$###\"\"\"!!!!!!         !!!!!!\"\"\"\"##$$%%&&'&&%$$$##\"\"\"!!!!                   !!!!\"\"\"###$$%%&''()*+,-./124579;>A?=;:87543210/.--,++**)((''&&&&%%%%%%%%%%%%%%%%%%%&&&&'''(())**++,-,,++**)))(((((('''''''''''((((()))**++,,--.//01234578:;=?A@=:864310.-,+*))('&&%%$$###\"\"\"\"!!!!!!!!!  !!!!!!!!\"\"\"\"###$$%%&&&&%$$##\"\"\"!!!!     \037\037\037\037\037\037\037\037\037\037\037\037\037      !!!\"\"\"##$$%%&''()*+,-.013468:=?=<:87643210/.--,++*))(''&&&%%%%$$$$$$$$$$$$$$$$$%%%%&&&'''(())*++,,,++***)))((((((''''''''(((((()))***++,,-../011235678:<=?A@=;865310/.,+**)(''&%%$$$###\"\"\"\"!!!!!!!!!!!!!!!!!\"\"\"\"###$$$%%&&&%$$##\"\"!!!    \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037    !!!\"\"##$$%%&'(()*+,./023579<><:97643210/.-,,+**))((&&&%%%$$$$$##############$$$$$%%%&&'''(()**+,,,++***)))(((((((((((((((((())))**++,,--../012345679:<>?A@=;975320/.-,+*)(('&&%%$$###\"\"\"\"\"!!!!!!!!!!!!!!!\"\"\"\"\"###$$%%&&&%$$##\"\"!!!   \037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037    !!\"\"\"#$$%%&'())*,-./12468;=;98653210/.-,++*))((''%%%$$$$######\"\"\"\"\"\"\"\"\"#######$$$%%%&&''(()**+,,++***))))(((((((((((((((())))***++,,--.//012345689;<>@BA>;975321/.-,+*)(('&&%%$$$###\"\"\"\"\"!!!!!!!!!!!!!\"\"\"\"\"###$$$%%&&%$$#\"\"!!!   \037\037\037\037\036\036\036\036\036\036\036\035\035\035\035\035\035\035\036\036\036\036\036\036\036\037\037\037\037   !!!\"\"##$%%&'()*+,-/023579<:8654210/.-,+**)((''&&%$$$####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"####$$$%%%&&''())*+,,++***))))(((((((((((((())))***+++,,-../0012345789;<>@BA><975421/.-,+*))(''&&%%$$####\"\"\"\"\"!!!!!!!!!!!\"\"\"\"\"####$$%%&&%$##\"\"!!   \037\037\037\036\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\036\037\037\037   !!\"\"##$%%&'()*+,./12468:9754210/.-,+**)(('&&&%$$###\"\"\"\"!!!!!!!!!!!!!!!!!\"\"\"\"\"###$$%%&&''(()*+,+++***)))))(((((((((()))))****++,,--.//012335678:;=>@BA><:864210.-,+**)(''&&%%$$$###\"\"\"\"\"\"\"!!!!!!!\"\"\"\"\"\"\"###$$$%%&%$##\"\"!!  \037\037\037\036\036\036\036\035\035\035\035\035\035\035\034\034\034\034\034\034\034\034\034\035\035\035\035\035\035\035\036\036\036\036\037\037\037  !!\"\"##$%%&'()*+-.013579764310/.-,+*))(''&&%%$##\"\"\"\"!!!!!             !!!!!!\"\"\"###$$%%&&'(()*+,++****))))))((((((())))))***+++,,--.//012345678:;=?ACB?<:864310/.-,+*)(('&&%%%$$####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"####$$%%%%$##\"\"!!  \037\037\036\036\036\036\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\036\036\036\037\037\037  !!\"##$%&&'()+,-/0246864320/.-,+*)(('&&%%$$#\"\"\"!!!!       \037\037\037\037\037\037\037       !!!!\"\"\"###$$%&&''()*++++***))))))))))))))))))***+++,,--../0012345679:<=?ACB?=:865320/.-,+*))(''&&%%$$$####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"####$$$%%%$##\"!!  \037\037\037\036\036\036\035\035\035\034\034\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037  !!\"##$%&'()*+,./13575320/.-,+*)(('&&%$$$##\"!!!    \037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037    !!!!\"\"##$$%%&''()*+++****))))))))))))))))****+++,,--.//0112345689:<>?ACB?=;875320/.-,+*))(''&&%%%$$$####\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"#####$$$%%$##\"!!  \037\037\036\036\036\035\035\035\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\035\035\035\036\036\036\037\037  !!\"##$%&'()*+-.0245421/.-,+*)(''&%%$$##\"\"!    \037\037\037\037\037\036\036\036\036\036\036\036\036\036\036\036\036\036\036\036\037\037\037\037\037    !!!\"\"##$$%&&'()*+++*****)))))))))))))****+++,,--..//0123456789;<>@BDC@=;975321/.-,+**)((''&&%%$$$#####\"\"\"\"\"\"\"\"\"\"\"\"\"#####$$$%%$$#\"!!  \037\037\036\036\035\035\035\034\034\034\034\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\033\034\034\034\034\035\035\035\036\036\036\037\037 !!\"##$%&'()+,./134310.-,+*)('&&%$$##\"\"!!  \037\037\037\037\036\036\036\036\036\036\036\035\035\035\035\035\035\035\035\035\036\036\036\036\036\036\036\037\037\037\037   !!\"\"##$$%&&'()*+++*****))))))))))*****+++,,,--../0012345678:;=>@BDC@=;9754210/-,,+*)((''&&%%%$$$#####\"\"\"\"\"\"\"\"\"\"\"#####$$$$%%$#\"!! \037\037\036\036\036\035\035\034\034\034\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\034\034\035\035\035\036\036\037\037  !\"##$%&'(*+-.02310.-,+*)('&&%$$##\"\"!! \037\037\037\036\036\036\036\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\035\036\036\036\036\037\037\037   !!\"\"##$%&&'()*+++******))))))******++++,,--..//0112345679:;=?@BDC@>;9764310/.-,+*))(''&&%%%$$$$######\"\"\"\"\"\"\"######$$$$%%$#\"!! \037\037\036\036\035\035\035\034\034\033\033\033\033\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\032\033\033\033\033\034\034\034\035\035\036\036\037\037  !\"##$%&()*,-/120/-,+*)('&%%$##\"\"!!   \036\036\036\036\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\036\036\036\037\037\037   !!\"##$%%&'()*+++*****************+++,,,--..//0122345689:<=?ACEDA><:864310/.-,+**)((''&&%%%$$$###################$$$%%$#\"!! \037\037\036\036\035\035\034\034\034\033\033\033\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\033\033\033\033\034\034\035\035\035\036\037\037  !\"#$%&'()+,.01/.,+*)('&%%$##\"!!   \037\037\036\035\035\035\035\034\034\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\034\034\035\035\035\035\036\036\036\037\037  !!\"\"#$%%&'()*+++***************+++,,,---.//00123456789:<>?ACEDA><:865320/.-,++*)((''&&%%%$$$$#################$$$$%$#\"!! \037\037\036\036\035\035\034\034\033\033\033\032\032\032\032\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\031\032\032\032\033\033\033\034\034\034\035\035\036\036\037  !\"#$%&'(*+-//.-+*)('&%$$#\"\"!!  \037\037\036\036\035\035\034\034\034\034\034\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\033\034\034\034\034\034\035\035\035\036\036\037\037\037  !\"\"#$$%&'()++++************+++++,,,--..//01123456789;<>@ACEDA?<:865321/.-,,+*))(''&&&%%%$$$$###############$$$$%$#\"\"! \037\037\036\035\035\034\034\033\033\033\032\032\032\031\031\031\031\031\030\030\030\030\030\030\030\030\030\027\027\027\027\027\027\030\030\030\030\030\030\030\030\030\031\031\031\031\032\032\032\033\033\033\034\034\035\035\036\036\037  !\"#$%&')*,..-+*)('&%$##\"!!  \037\037\036\036\036\035\034\034\034\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\034\034\034\035\035\035\036\036\037\037  !!\"#$$%&'(*++++**********+++++,,,---../00122345678:;=>@BDFDB?=:8754210/.-,+*))((''&&%%%$$$$$#############$$$$$%$#\"! \037\037\036\035\035\034\034\033\033\032\032\032\031\031\031\031\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\031\032\032\032\033\033\034\034\035\035\036\036\037  !\"#$%'()+--,*)('&%$##\"!! \037\037\036\036\036\035\035\035\034\033\033\033\033\032\032\032\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\032\032\033\033\033\033\034\034\034\035\035\035\036\036\037\037 !!\"#$$%&')*+++++******++++++,,,,--..//00123345679:;=>@BDFEB?=;9754210/.-,+**)((''&&&%%%$$$$$$##########$$$$$%$#\"! \037\036\036\035\035\034\034\033\033\032\032\031\031\031\031\030\030\030\030\027\027\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\032\032\032\033\033\034\034\035\036\036\037  !\"#$&'(*,,+)('&%$#\"\"!  \037\037\036\036\035\035\034\034\034\033\033\032\032\032\032\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\032\032\032\032\032\033\033\033\034\034\034\035\035\036\036\037\037  !\"#$$%'()*+++++++++++++++,,,,---..//01123456789:<=?@BDGEB@=;9764310/.-,++*))((''&&%%%%$$$$$$#######$$$$$$%$#\"! \037\036\036\035\035\034\033\033\032\032\032\031\031\031\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\030\030\030\030\031\031\031\032\032\033\033\034\034\035\036\036\037 !\"\"$%&')++)('&%$#\"\"! \037\037\036\036\035\035\035\034\034\033\033\032\032\032\031\031\031\031\031\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\030\031\031\031\031\031\031\032\032\032\033\033\033\034\034\034\035\035\036\036\037  !\"#$$&'()++++++++++++++,,,,---..//001223456789;<=?ACEGEC@=;9764320/.-,,+*))((''&&&%%%%$$$$$$$$$$$$$$$$$$$#\"! \037\036\036\035\034\034\033\033\032\032\031\031\031\030\030\030\027\027\027\027\027\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\026\026\027\027\027\027\030\030\030\030\031\031\032\032\033\033\034\034\035\035\036\037 !\"#$%&(**('&%$#\"!! \037\037\036\036\035\035\034\034\033\033\033\032\031\031\031\031\030\030\030\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\030\030\031\031\031\031\032\032\032\032\033\033\034\034\035\035\036\036\037\037 !\"#$%&'(*++++++++++++,,,,,---..//001233456789;<>?ACEGFC@><:865321/.--,+**)(('''&&%%%%$$$$$$$$$$$$$$$$$%#\"! \037\037\036\035\034\034\033\033\032\032\031\031\030\030\030\027\027\027\027\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\027\027\027\030\030\030\031\031\031\032\032\033\033\034\035\035\036\037 !\"#$&'))'&%$#\"!  \037\036\036\035\035\034\034\033\033\033\032\032\032\031\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\030\031\031\031\031\032\032\032\033\033\034\034\035\035\036\037\037 !\"#$%&'(*++++++++++,,,,,---..//001123445679:;<>@ACEHFC@><:8653210/.-,+**))((''&&&%%%%$$$$$$$$$$$$$$$%$#! \037\037\036\035\034\034\033\032\032\031\031\031\030\030\027\027\027\027\026\026\026\026\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\025\025\026\026\026\026\027\027\027\030\030\030\031\031\032\032\033\033\034\035\035\036\037 !\"#%&('&%$#\"!  \037\036\036\035\034\034\033\033\033\032\032\032\031\031\030\030\030\027\027\027\027\027\027\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\027\027\027\027\027\027\030\030\030\030\031\031\031\032\032\033\033\033\034\035\035\036\036\037 !\"#$%&')*,,+++++,,,,,,---...//001223456789:;=>@BDFHFCA><:8754210/.-,++*))(('''&&&%%%%$$$$$$$$$$$$$%$#\"! \037\036\035\034\034\033\032\032\031\031\030\030\030\027\027\027\026\026\026\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\026\026\026\026\027\027\027\030\030\031\031\032\032\033\033\034\035\035\036\037 !\"$%&&%$#\"! \037\037\036\035\035\034\034\033\033\032\032\031\031\031\031\030\027\027\027\027\026\026\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\026\026\027\027\027\027\027\030\030\030\031\031\031\032\032\033\033\034\034\035\036\036\037 !\"#$%&()+,,,,,,,,,,,----..///011233456789:<=?@BDFHGDA?<:9754210/.-,,+**)(((''&&&%%%%%%$$$$$$$$$%%%#\"! \037\036\035\034\034\033\032\032\031\031\030\030\027\027\027\026\026\026\025\025\025\025\024\024\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\024\025\025\025\025\025\026\026\026\027\027\027\030\030\031\031\032\033\033\034\035\035\036\037 !#$%%$#\"! \037\036\036\035\034\034\033\033\032\032\032\031\031\030\030\030\030\027\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\027\027\027\027\030\030\030\031\031\031\032\032\033\034\034\035\035\036\037 !\"#$%'(*,,,,,,,,,,----...//0011234456789;<=?@BDFIGDA?=;9754310/.--,+**))(('''&&&%%%%%%%$$$$$%%%%$\"! \037\036\035\034\033\033\032\032\031\030\030\027\027\027\026\026\026\025\025\025\025\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\025\025\025\025\026\026\026\027\027\030\030\031\031\032\032\033\034\035\036\036\037!\"#$$#\"! \037\036\036\035\034\034\033\033\032\032\031\031\030\030\030\027\027\027\026\026\025\025\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\025\025\026\026\026\026\027\027\027\030\030\030\031\031\032\032\033\033\034\035\035\036\037 !\"#$&')*,,,,,,,,----...///001223455678:;<>?ACEGIGDB?=;97643210/.-,++*))(('''&&&&%%%%%%%%%%%%%%$#! \037\036\035\034\033\033\032\031\031\030\030\027\027\026\026\026\025\025\025\024\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\023\023\024\024\024\024\025\025\025\025\026\026\027\027\030\030\031\031\032\032\033\034\035\036\037 !\"##\"! \037\036\035\035\034\033\033\032\032\031\031\030\030\030\027\027\027\026\026\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\025\025\025\026\026\026\027\027\027\030\030\030\031\031\032\033\033\034\034\035\036\037 !\"#$&')+,,,,,------...//0011233456789:;<>?ACEGIHEB?=;98653210/.-,++**))(('''&&&&%%%%%%%%%%%%%#\" \037\036\035\034\033\033\032\031\031\030\030\027\027\026\026\025\025\025\024\024\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\024\024\024\024\025\025\025\026\026\026\027\027\030\030\031\032\032\033\034\035\036\037 !\"\"! \037\036\035\035\034\033\033\032\031\031\030\030\030\027\027\027\026\026\026\025\025\024\024\024\024\024\024\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\023\024\024\024\024\024\024\025\025\025\025\026\026\026\027\027\027\030\030\031\031\032\032\033\034\034\035\036\037 !\"#%&(*,,,-------...///0011233456789:;=>@ACEGJHEB@>;:8653210/.-,,+**))(('''&&&&&%%%%%%%%%%%$\"! \036\035\034\034\033\032\031\031\030\027\027\026\026\026\025\025\024\024\024\024\023\023\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\022\023\023\023\023\023\024\024\024\025\025\025\026\026\027\027\030\030\031\032\032\033\034\035\036\037 !! \037\036\035\034\034\033\032\032\031\031\030\030\027\027\027\026\026\026\025\025\025\024\024\024\023\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\023\023\024\024\024\024\024\025\025\025\025\026\026\027\027\027\030\030\031\031\032\033\033\034\035\036\037 !\"$%')+--------....//00112234456789:<=>@BDEHJHEC@><:8654210/.--,++*))((('''&&&&&%%%%%%%%%$#! \037\036\034\034\033\032\031\030\030\027\027\026\026\025\025\025\024\024\024\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\023\024\024\024\025\025\026\026\026\027\030\030\031\031\032\033\034\035\036\037  \037\036\035\034\033\033\032\031\031\030\030\027\027\027\026\026\025\025\025\025\024\024\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\023\024\024\024\024\025\025\025\026\026\027\027\030\030\031\031\032\033\033\034\035\036\037 !#$&')+------....///00112334566789;<=?@BDFHJIFC@><:8754310/..-,++**))((''''&&&&&%%%%%%%%#\" \037\036\035\034\033\032\031\030\030\027\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\022\021\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\024\024\024\025\025\026\026\027\027\030\031\031\032\033\034\035\036\037\037\036\035\034\033\033\032\031\031\030\030\027\027\026\026\025\025\025\024\024\024\024\023\023\022\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\022\022\023\023\023\023\024\024\024\024\025\025\025\026\026\027\027\030\030\031\032\032\033\034\035\036\037 \"#$&(*,----....///00112233456789:;<>?ABDFHHFDCA><:97643210/.-,,+**))((('''&&&&&&&%%%%%$\"!\037\036\035\034\033\032\031\030\030\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\022\022\022\022\023\023\023\024\024\025\025\026\026\027\027\030\031\031\032\033\034\035\036\036\035\034\033\032\032\031\030\030\027\027\026\026\025\025\025\024\024\024\023\023\023\023\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\020\020\020\020\021\021\021\021\021\021\021\021\021\021\021\021\022\022\022\022\022\023\023\023\023\024\024\024\025\025\026\026\027\027\030\030\031\032\032\033\034\035\036\037 \"#%')+--.....////00112234456789:;<>?ACDFGECB@?=<;97643210/.-,,++*)))((''''&&&&&&&&&&%#! \036\035\034\033\032\031\030\030\027\026\026\025\025\024\024\023\023\023\022\022\022\021\021\021\021\021\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\020\020\021\021\021\021\022\022\022\022\023\023\024\024\024\025\025\026\027\027\030\031\031\032\033\034\035\035\034\033\032\031\031\030\030\027\026\026\026\025\025\024\024\024\023\023\023\023\022\022\021\021\021\021\021\021\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\020\021\021\021\021\021\021\022\022\022\022\022\023\023\023\024\024\024\025\025\026\026\027\027\030\031\031\032\033\034\035\036\037!\"$%'*,......///001112334556789:;=>@ACEGDBA?=<;:987653210/.--,++**))(((''''&&&&&&&&%#\" \036\035\034\033\032\031\030\027\027\026\026\025\024\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\021\022\022\022\022\023\023\024\024\025\025\026\026\027\030\031\031\032\033\034\034\033\032\031\031\030\027\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\021\021\020\020\020\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\020\020\020\021\021\021\021\021\022\022\022\022\023\023\023\024\024\024\025\025\026\027\027\030\031\031\032\033\034\035\036 !\"$&(+-....///0001122334567789;<=>@ACEDB@><;:97665433210/..-,,+**)))(('''''&&&&&&&$\" \037\035\034\033\032\031\030\027\027\026\025\025\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\022\022\022\023\023\023\024\024\025\026\026\027\030\031\031\032\033\033\032\031\030\030\027\026\026\025\025\024\024\024\023\023\023\022\022\022\021\021\021\021\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\020\020\021\021\021\021\022\022\022\023\023\023\024\024\025\025\026\026\027\030\030\031\032\033\034\035\036 !#%'),...////001112234456789:;<=?@BCCA?=;:976543321100///.-,,++**))((('''''&&&&&%#!\037\036\034\033\032\031\030\027\027\026\025\025\024\024\023\023\022\022\021\021\021\020\020\020\020\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\020\020\020\020\021\021\021\022\022\022\023\023\024\024\025\025\026\027\030\031\031\032\032\031\030\027\027\026\026\025\025\024\024\023\023\022\022\022\022\021\021\021\021\020\020\017\017\017\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\017\017\020\020\020\020\020\021\021\021\022\022\022\023\023\023\024\024\025\025\026\027\027\030\031\032\033\034\035\037 \"#%(*-.////0001122334556789:;<>?@BB@><:9765432110//..---,,,,++**)))((('''''&&&&$\" \036\035\033\032\031\030\027\026\026\025\024\024\023\023\022\022\022\021\021\020\020\020\020\017\017\017\017\017\016\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\016\017\017\017\017\017\020\020\020\021\021\021\022\022\023\023\023\024\025\025\026\027\030\031\032\031\030\027\027\026\025\025\024\024\023\023\022\022\022\021\021\021\021\020\020\020\020\020\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\017\017\017\017\017\017\020\020\020\020\021\021\021\021\022\022\023\023\024\024\025\025\026\027\027\030\031\032\033\034\035\037 \"$&),////00011122344566789:;=>?AB?=;986543210/..--,,++++*******)))((('''''''&%\" \037\035\034\032\031\030\027\026\026\025\024\024\023\023\022\022\021\021\020\020\020\020\017\017\017\017\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\017\017\017\017\020\020\020\021\021\021\022\022\023\023\024\024\025\026\027\030\031\030\027\026\026\025\024\024\023\023\022\022\022\021\021\021\020\020\020\020\017\017\017\017\016\016\016\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\016\017\017\017\017\017\020\020\020\020\021\021\021\022\022\023\023\024\024\025\026\026\027\030\031\032\033\034\036\037!#%'*-//000011223344567789:<=>@A><:8754310//.-,,++***)))((((((((((((((''''''&#!\037\035\034\033\031\030\027\026\026\025\024\023\023\022\022\021\021\021\020\020\020\017\017\017\016\016\016\016\016\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\r\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\023\023\024\024\025\026\027\030\027\026\025\025\024\024\023\023\022\022\021\021\021\020\020\020\020\017\017\017\017\016\016\016\r\r\r\r\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\r\r\r\r\r\016\016\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\022\023\024\024\025\025\026\027\030\031\032\033\034\036 !#&(+//00011122334556789:;<=>@>;9764310/.-,,+**))(((''''&&&&&&&&&&&''''''''$\" \036\034\033\031\030\027\026\025\025\024\023\023\022\022\021\021\020\020\020\017\017\017\016\016\016\016\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\016\016\016\016\017\017\017\020\020\020\021\021\022\022\023\023\024\025\026\027\026\025\024\024\023\023\022\022\021\021\021\020\020\020\017\017\017\017\016\016\016\016\016\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\r\016\016\016\016\017\017\017\017\020\020\020\021\021\022\022\023\023\024\025\025\026\027\030\031\032\033\035\036 \"$'*-000011223344566789:;<=?=:864310/.-,+**)(('''&&&%%%%%$$$$$$$%%%%%%&&&%# \036\035\033\032\030\027\026\025\025\024\023\022\022\021\021\020\020\020\017\017\017\016\016\016\r\r\r\r\r\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\016\017\017\017\020\020\021\021\022\022\023\023\024\025\026\025\024\024\023\022\022\021\021\021\020\020\020\017\017\017\016\016\016\016\016\r\r\r\f\f\f\f\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\f\f\f\r\r\r\r\r\r\016\016\016\016\017\017\017\020\020\020\021\021\022\022\023\024\024\025\026\027\030\031\032\033\035\037 #%(+/00111223344567789:;<><:75320/.-,+*)(('&&%%%$$$#################$$$%$!\037\035\033\032\031\027\026\025\024\024\023\022\022\021\021\020\020\017\017\017\016\016\016\r\r\r\r\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\r\r\r\r\r\016\016\016\017\017\017\020\020\021\021\022\022\023\024\025\024\023\023\022\022\021\021\020\020\017\017\017\016\016\016\016\r\r\r\r\r\r\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\f\f\r\r\r\r\r\016\016\016\017\017\017\020\020\020\021\022\022\023\023\024\025\026\027\030\031\032\034\035\037!#&)-01112223345567889:;=<96421/.,+*)(('&&%%$$##\"\"\"\"!!!!!!!!!!!!!!!\"\"\"\"#\" \036\034\032\031\027\026\025\024\023\023\022\021\021\020\020\017\017\017\016\016\016\r\r\r\f\f\f\f\f\f\013\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\r\016\016\016\017\017\017\020\020\021\022\022\023\024\023\022\022\021\021\020\020\017\017\017\016\016\016\016\r\r\r\r\f\f\f\f\f\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\013\013\013\f\f\f\f\f\r\r\r\r\016\016\016\016\017\017\020\020\021\021\022\022\023\024\025\026\027\030\031\032\034\036 \"$'+/111223344566789:;<;86310.,+*)('&&%$$##\"\"!!!     \037\037\037\037\037\037\037\037\037\037\037\037     ! \036\034\032\031\027\026\025\024\023\023\022\021\021\020\020\017\017\016\016\016\r\r\r\f\f\f\f\013\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\f\f\f\f\f\r\r\r\016\016\016\017\017\020\020\021\021\022\023\022\021\021\020\020\017\017\017\016\016\016\r\r\r\r\f\f\f\f\f\f\013\013\013\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\013\f\f\f\f\r\r\r\r\016\016\016\017\017\020\020\021\021\022\023\024\024\025\027\030\031\032\034\036 #&)-112223344566789:;:7520.-+*)('&%$##\"\"!!   \037\037\037\036\036\036\036\036\036\036\035\035\035\035\035\035\036\036\036\036\036\036\036\037\037\037\035\033\031\030\026\025\024\023\022\022\021\020\020\017\017\016\016\016\r\r\r\f\f\f\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\f\r\r\r\016\016\016\017\017\020\020\021\022\021\020\020\017\017\017\016\016\016\r\r\r\f\f\f\f\f\013\013\013\013\013\013\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\n\n\013\013\013\013\013\013\f\f\f\f\r\r\r\016\016\016\017\017\020\021\021\022\023\023\024\025\026\030\031\033\035\037!$'+022233445567789::741/-,*)'&%$$#\"!!  \037\037\036\036\036\035\035\035\035\035\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\034\035\035\035\035\035\033\031\030\026\025\024\023\022\021\021\020\017\017\016\016\016\r\r\f\f\f\f\013\013\013\013\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\r\016\016\017\017\020\020\021\020\020\017\017\016\016\r\r\r\f\f\f\f\013\013\013\013\013\013\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\n\n\013\013\013\013\013\f\f\f\r\r\r\016\016\017\017\020\020\021\022\022\023\024\025\026\030\031\033\035\037\"%)-222334456678999630.,*)'&%$#\"!! \037\037\036\036\035\035\035\034\034\034\033\033\033\033\033\033\032\032\032\032\032\032\032\032\032\032\032\032\032\033\033\033\033\033\034\032\030\026\025\024\023\022\021\020\020\017\017\016\016\r\r\f\f\f\013\013\013\013\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\f\r\r\r\016\016\017\017\020\017\017\016\016\r\r\r\f\f\f\013\013\013\013\013\n\n\n\n\n\n\n\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\f\f\r\r\016\016\017\017\020\021\021\022\023\024\025\026\030\031\033\036 #'+0233445566789952/-+)'&%$#\"! \037\037\036\035\035\034\034\034\033\033\033\032\032\032\032\031\031\031\031\031\031\031\031\030\030\030\030\031\031\031\031\031\031\031\031\031\032\032\030\027\025\024\023\022\021\020\020\017\016\016\r\r\f\f\f\013\013\013\013\n\n\n\n\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\n\n\n\n\n\013\013\013\013\f\f\r\r\r\016\016\017\016\016\r\r\r\f\f\f\013\013\013\013\n\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\t\n\n\n\n\013\013\013\013\f\f\f\r\r\016\016\017\017\020\021\022\023\024\025\026\030\032\034\036!%).33344556778841.,*(&%#\"! \037\037\036\035\035\034\033\033\033\032\032\031\031\031\031\030\030\030\030\030\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\027\030\030\030\030\027\025\024\023\022\021\020\017\017\016\r\r\f\f\f\013\013\013\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\t\n\n\n\n\013\013\013\f\f\r\r\016\016\r\r\f\f\f\013\013\013\013\n\n\n\n\t\t\t\t\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\n\013\013\013\f\f\f\r\r\016\016\017\020\021\022\023\024\025\026\030\032\034\037\"&+1344456678830-*(&%#\"! \037\036\035\034\034\033\033\032\032\031\031\030\030\030\027\027\027\027\026\026\026\026\026\026\026\025\025\025\025\025\025\025\025\025\025\025\026\026\026\026\026\026\026\025\024\023\021\021\020\017\016\016\r\r\f\f\013\013\013\n\n\n\t\t\t\t\t\b\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\b\t\t\t\t\t\n\n\n\013\013\013\f\f\r\r\f\f\f\013\013\013\n\n\n\n\t\t\t\t\t\t\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\b\t\t\t\t\n\n\n\n\013\013\013\f\f\r\r\016\017\017\020\021\022\024\025\026\030\032\035 $)/3445566772/,)'%#\" \037\036\035\034\034\033\032\032\031\031\030\030\027\027\027\026\026\026\025\025\025\025\025\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\024\025\025\024\022\021\020\017\017\016\r\r\f\f\013\013\n\n\n\n\t\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\t\t\t\t\n\n\n\013\013\013\f\f\f\013\013\n\n\n\n\t\t\t\t\b\b\b\b\b\b\b\b\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\007\b\b\b\b\b\b\t\t\t\t\n\n\n\013\013\013\f\f\r\016\016\017\020\021\022\023\025\027\031\033\036!&,344556771-*(%#\" \037\036\035\034\033\032\031\031\030\030\027\027\026\026\025\025\025\024\024\024\024\023\023\023\023\023\023\023\022\022\022\022\022\022\022\022\022\022\022\022\022\022\022\023\023\023\023\023\022\021\020\017\016\r\r\f\f\013\013\n\n\n\t\t\t\t\b\b\b\b\b\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\b\b\b\b\b\t\t\t\t\n\n\n\013\013\013\n\n\n\t\t\t\t\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\007\b\b\b\b\t\t\t\t\n\n\n\013\013\f\r\r\016\017\020\021\022\023\025\027\031\034\037#)04556660,)&$\" \037\035\034\033\032\031\031\030\027\027\026\026\025\025\024\024\024\023\023\023\022\022\022\022\022\022\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\020\017\016\r\f\f\013\013\n\n\n\t\t\t\b\b\b\b\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\007\007\b\b\b\b\t\t\t\n\n\n\n\t\t\t\t\b\b\b\b\007\007\007\007\007\007\007\007\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\b\t\t\t\n\n\n\013\013\f\r\r\016\017\020\022\023\025\027\031\035!&,45566/+'$\" \036\035\034\033\031\031\030\027\026\026\025\025\024\024\023\023\022\022\022\022\021\021\021\021\020\020\020\020\020\020\020\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\020\020\020\020\017\016\r\r\f\013\013\n\n\t\t\t\b\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\b\t\t\t\t\t\b\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\007\007\007\007\007\b\b\b\t\t\t\n\n\013\013\f\r\016\017\020\021\023\025\027\032\036\")1565.)%# \036\035\033\032\031\030\027\026\025\025\024\023\023\022\022\022\021\021\021\020\020\020\020\017\017\017\017\017\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\016\r\f\013\013\n\n\t\t\b\b\b\b\007\007\007\007\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\006\007\007\007\007\b\b\b\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\006\006\006\006\006\006\007\007\007\007\b\b\b\t\t\n\n\013\f\f\r\016\020\021\023\025\030\033\037%-54,'# \036\034\033\031\030\027\026\025\024\024\023\022\022\021\021\020\020\020\017\017\017\017\016\016\016\016\r\r\r\r\r\r\r\r\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\r\r\r\r\f\013\n\n\t\t\b\b\b\007\007\007\007\006\006\006\006\006\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\006\006\006\006\006\007\007\007\007\007\007\007\007\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\006\006\006\006\007\007\007\007\b\b\t\t\n\n\013\f\r\016\017\021\023\025\030\034!)3*%!\036\034\032\031\027\026\025\024\023\022\022\021\021\020\020\017\017\016\016\016\016\r\r\r\r\f\f\f\f\f\f\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\n\n\t\t\b\b\007\007\007\006\006\006\006\006\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\005\006\006\006\006\007\007\007\b\b\t\n\n\013\f\r\017\020\022\025\031\036%(\"\037\034\032\030\026\025\024\023\022\021\021\020\017\017\016\016\r\r\r\f\f\f\f\013\013\013\013\013\013\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\n\n\t\b\b\007\007\007\006\006\006\006\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\004\004\004\005\005\005\005\005\006\006\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\004\005\005\005\005\005\006\006\006\007\007\b\b\t\t\n\013\f\016\020\022\026\032 \037\034\031\027\025\024\023\022\021\020\017\016\016\r\r\f\f\f\013\013\013\013\n\n\n\n\t\t\t\t\t\t\t\t\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\007\007\006\006\006\005\005\005\005\004\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\004\005\005\005\005\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\005\005\005\005\006\006\007\007\b\b\t\n\f\r\017\022\026\034\030\026\024\022\021\020\017\016\016\r\f\f\013\013\013\n\n\n\t\t\t\t\b\b\b\b\b\b\b\007\007\007\007\007\007\007\007\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\006\007\007\007\007\007\006\006\005\005\005\005\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\003\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\004\004\004\004\005\005\005\006\006\007\007\b\t\013\f\017\022\024\022\021\017\016\r\f\f\013\013\n\n\t\t\t\b\b\b\b\007\007\007\007\007\006\006\006\006\006\006\006\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\004\004\004\004\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\003\003\003\003\003\003\004\004\004\005\005\006\007\b\t\013\016\016\r\f\013\n\n\t\b\b\b\007\007\007\006\006\006\006\006\005\005\005\005\005\005\005\005\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\003\003\003\003\004\004\005\006\007\t\t\b\007\007\006\006\006\005\005\005\005\004\004\004\004\004\004\004\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\002\002\002\003\003\004\004\004\003\003\003\003\003\002\002\002\002\002\002\002\002\002\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000").toString()).getBytes("ISO-8859-1");
        +1013                } catch (UnsupportedEncodingException e) {
        +1014                        e.printStackTrace();
        +1015                        GAMUT_DATA = new byte[65536];
        +1016                }
        +1017        }
        +1018
        +1019        /**
        +1020         * Given a 1D int index between 0 and 65535 (both inclusive), this treats the 1D index as two parts (lightness and
        +1021         * hue angle, both from 0 to 255) and gets the distance from grayscale to the edge of the gamut at that lightness
        +1022         * and hue. The index can be constructed from a lightness value {@code L} from 0 to 255, and a hue value {@code H}
        +1023         * from 0 to 255 with: {@code (L << 8 | H)} or the simpler equivalent {@code (L * 256 + H)}. These assume L and H
        +1024         * have been limited to the 0 to 255 range already. This does not bounds-check index. Because hue is not typically
        +1025         * measured between 0 and 255, getting that value is a bit different; you can use
        +1026         * {@link TrigTools#atan2_(float, float)} (with an Oklab color's B for y, then its A for x) and multiply it by 256
        +1027         * to get H.
        +1028         * <br>
        +1029         * The distance this returns is a byte between 0 and 82 (both inclusive), as the Euclidean distance from the center
        +1030         * grayscale value at the lightness in the index, to the edge of the gamut at the same lightness, along the hue in
        +1031         * the index. This is measured in a space from -1 to 1 for both A and B, with the 0 in the center meaning grayscale,
        +1032         * and multiplied by 256 to get a meaningful byte value. To return to the A and B values Oklab uses here, you would
        +1033         * need to use some trigonometry on the hue (if it's in the 0 to 1 range, you can call
        +1034         * {@link TrigTools#cos_(float)} on the hue to almost get A, and {@link TrigTools#sin_(float)} to almost get B),
        +1035         * then multiply each of those by the distance, divide each by 256.0, and add 0.5.
        +1036         * <br>
        +1037         * Only intended for the narrow cases where external code needs read-only access to the internal Oklab gamut data.
        +1038         * The gamut data is quite large (the Oklab ColorTools file is 236 KB at the time of writing, while the IPT_HQ
        +1039         * ColorTools file is just 56 KB, with the main difference being the sizable exact gamut), so it's better to have
        +1040         * direct read access to it without being able to accidentally rewrite it.
        +1041         * @param index must be between 0 and 65535; the upper 8 bits are lightness and the lower 8 are hue angle.
        +1042         * @return a byte (always between 0 and 82, inclusive) representing the Euclidean distance between a grayscale value and the most saturated value possible, using the above measurements
        +1043         */
        +1044        public static byte getRawGamutValue(int index){
        +1045                return GAMUT_DATA[index];
        +1046        }
        +1047
        +1048        /**
        +1049         * Returns true if the given packed float color, as Oklab, is valid to convert losslessly back to RGBA.
        +1050         * @param packed a packed float color as Oklab
        +1051         * @return true if the given packed float color can be converted back and forth to RGBA
        +1052         */
        +1053        public static boolean inGamut(final float packed)
        +1054        {
        +1055                final int decoded = NumberUtils.floatToRawIntBits(packed);
        +1056                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 255f;
        +1057                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 255f;
        +1058                final byte g = GAMUT_DATA[(decoded & 0xff) << 8 | (int)(256f * TrigTools.atan2_(B, A))];
        +1059                return g * g * 0x1p-18 >= (A * A + B * B);
        +1060        }
        +1061
        +1062        /**
        +1063         * Returns true if the given Oklab values are valid to convert losslessly back to RGBA.
        +1064         * @param L lightness channel, as a float from 0 to 1
        +1065         * @param A green-to-red chromatic channel, as a float from 0 to 1
        +1066         * @param B blue-to-yellow chromatic channel, as a float from 0 to 1
        +1067         * @return true if the given Oklab channels can be converted back and forth to RGBA
        +1068         */
        +1069        public static boolean inGamut(float L, float A, float B)
        +1070        {
        +1071                A = (A - 0.5f);
        +1072                B = (B - 0.5f);
        +1073                final byte g = GAMUT_DATA[((int)(L * 255.999f) << 8) | (int)(256f * TrigTools.atan2_(B, A))];
        +1074                return g * g * 0x1p-18 >= (A * A + B * B);
        +1075        }
        +1076
        +1077        /**
        +1078         * Gets the color with the same L as the Oklab color stored in the given packed float, but the furthest A
        +1079         * B from gray possible for that lightness while keeping the same hue as the given color. This is very
        +1080         * similar to calling {@link #enrich(float, float)} with a very large {@code change} value.
        +1081         * @param packed a packed float color in Oklab format; does not need to be in-gamut
        +1082         * @return the color that is as far from grayscale as this can get while keeping the L and hue of packed
        +1083         * @see #limitToGamut(float) You can use limitToGamut() if you only want max saturation for out-of-gamut colors.
        +1084         */
        +1085        public static float maximizeSaturation(final float packed) {
        +1086                final int decoded = NumberUtils.floatToRawIntBits(packed);
        +1087                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        +1088                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        +1089                final float hue = TrigTools.atan2_(B, A);
        +1090                final int idx = (decoded & 0xff) << 8 | (int) (256f * hue);
        +1091                final float dist = GAMUT_DATA[idx];
        +1092                return NumberUtils.intBitsToFloat(
        +1093                                (decoded & 0xFE0000FF) |
        +1094                                                (int) (TrigTools.cos_(hue) * dist + 128f) << 8 |
        +1095                                                (int) (TrigTools.sin_(hue) * dist + 128f) << 16);
        +1096        }
        +1097        /**
        +1098         * Gets the color with the same L as the Oklab color stored in the given packed float, but the furthest A
        +1099         * B from gray possible for that lightness while keeping the same hue as the given color. This is very
        +1100         * similar to calling {@link #enrich(float, float)} with a very large {@code change} value.
        +1101         * @param L lightness component; will be clamped between 0 and 1 if it isn't already
        +1102         * @param A green-to-red chromatic component; will be clamped between 0 and 1 if it isn't already
        +1103         * @param B blue-to-yellow chromatic component; will be clamped between 0 and 1 if it isn't already
        +1104         * @param alpha alpha component; will be clamped between 0 and 1 if it isn't already
        +1105         * @return the color that is as far from grayscale as this can get while keeping the L and hue of packed
        +1106         * @see #limitToGamut(float, float, float, float) You can use limitToGamut() if you only want max saturation
        +1107         * for out-of-gamut colors.
         1108         */
        -1109        public static float limitToGamut(final float packed) {
        -1110                final int decoded = NumberUtils.floatToRawIntBits(packed);
        -1111                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        -1112                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        -1113                final float hue = TrigTools.atan2_(B, A);
        -1114                final int idx = (decoded & 0xff) << 8 | (int) (256f * hue);
        -1115                final float dist = GAMUT_DATA[idx] * 0x1p-8f;
        -1116                if (dist >= (float) Math.sqrt(A * A + B * B))
        -1117                        return packed;
        -1118                return NumberUtils.intBitsToFloat(
        -1119                                (decoded & 0xFE0000FF) |
        -1120                                                (int) (TrigTools.cos_(hue) * dist * 127.999f + 127.999f) << 8 |
        -1121                                                (int) (TrigTools.sin_(hue) * dist * 127.999f + 127.999f) << 16);
        -1122        }
        -1123//  public static float limitToGamut(final float packed) {
        -1124//              final int decoded = NumberUtils.floatToRawIntBits(packed);
        -1125//              final float L = (decoded & 0xff) / 255f;
        -1126//              final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        -1127//              final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        -1128//              float L2 = L, A2 = A, B2 = B;
        -1129//              for (int attempt = 31; attempt >= 0; attempt--) {
        -1130//                      final float l = cube(L2 + 0.3963377774f * A2 + 0.2158037573f * B2);
        -1131//                      final float m = cube(L2 - 0.1055613458f * A2 - 0.0638541728f * B2);
        -1132//                      final float s = cube(L2 - 0.0894841775f * A2 - 1.2914855480f * B2);
        -1133//
        -1134//                      final float r = +4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s;
        -1135//                      final float g = -1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s;
        -1136//                      final float b = -0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s;
        -1137//                      if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f)
        -1138//                              break;
        -1139//                      final float progress = attempt * 0x1p-5f;
        -1140//                      L2 = MathUtils.lerp(0.63f, L, progress);
        -1141//                      A2 = MathUtils.lerp(0, A, progress);
        -1142//                      B2 = MathUtils.lerp(0, B, progress);
        -1143//              }
        -1144//              return oklab(L2, A2 * 0.5f + 0.5f, B2 * 0.5f + 0.5f, (decoded >>> 25) / 127f);
        -1145//  }
        -1146        /**
        -1147         * Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside
        -1148         * the gamut at the same lightness, or if it is already in-gamut, returns the color as-is. This always produces
        -1149         * an opaque color.
        -1150         * @param L lightness component; will be clamped between 0 and 1 if it isn't already
        -1151         * @param A green-to-red chromatic component; will be clamped between 0 and 1 if it isn't already
        -1152         * @param B blue-to-yellow chromatic component; will be clamped between 0 and 1 if it isn't already
        -1153         * @return the first color this finds that is in-gamut, as if it was moving toward a grayscale color with the same L
        -1154         * @see #inGamut(float, float, float)  You can use inGamut() if you just want to check whether a color is in-gamut.
        -1155         */
        -1156        public static float limitToGamut(float L, float A, float B) {
        -1157                return limitToGamut(L, A, B, 1f);
        -1158        }
        -1159        /**
        -1160         * Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside
        -1161         * the gamut at the same lightness, or if it is already in-gamut, returns the color as-is.
        -1162         * @param L lightness component; will be clamped between 0 and 1 if it isn't already
        -1163         * @param A green-to-red chromatic component; will be clamped between 0 and 1 if it isn't already
        -1164         * @param B blue-to-yellow chromatic component; will be clamped between 0 and 1 if it isn't already
        -1165         * @param alpha alpha component; will be clamped between 0 and 1 if it isn't already
        -1166         * @return the first color this finds that is in-gamut, as if it was moving toward a grayscale color with the same L
        -1167         * @see #inGamut(float, float, float)  You can use inGamut() if you just want to check whether a color is in-gamut.
        -1168         */
        -1169        public static float limitToGamut(float L, float A, float B, float alpha) {
        -1170                L = Math.min(Math.max(L, 0f), 1f);
        -1171                A = Math.min(Math.max(A, 0f), 1f);
        -1172                B = Math.min(Math.max(B, 0f), 1f);
        -1173                alpha = Math.min(Math.max(alpha, 0f), 1f);
        -1174                final float A2 = (A - 0.5f);
        -1175                final float B2 = (B - 0.5f);
        -1176                final float hue = TrigTools.atan2_(B2, A2);
        -1177                final int idx = (int) (L * 255.999f) << 8 | (int)(256f * hue);
        -1178                final float dist = GAMUT_DATA[idx] * 0x1p-8f;
        -1179                if(dist >= (float) Math.sqrt(A2 * A2 + B2 * B2))
        -1180                        return oklab(L, A, B, alpha);
        -1181                return NumberUtils.intBitsToFloat(
        -1182                                (int) (alpha * 127.999f) << 25 |
        -1183                                                (int) (TrigTools.sin_(hue) * dist * 127.999f + 127.999f) << 16 |
        -1184                                                (int) (TrigTools.cos_(hue) * dist * 127.999f + 127.999f) << 8 |
        -1185                                                (int) (L * 255.999f));
        -1186        }
        -1187
        -1188//      public static float limitToGamut(float L, float A, float B, float alpha) {
        -1189//              float L2 = L = Math.min(Math.max(L, 0f), 1f);
        -1190//              float A2 = A = Math.min(Math.max((A - 0.5f) * 2f, -1f), 1f);
        -1191//              float B2 = B = Math.min(Math.max((B - 0.5f) * 2f, -1f), 1f);
        -1192//              alpha = Math.min(Math.max(alpha, 0f), 1f);
        -1193//              for (int attempt = 31; attempt >= 0; attempt--) {
        -1194//                      final float l = cube(L2 + 0.3963377774f * A2 + 0.2158037573f * B2);
        -1195//                      final float m = cube(L2 - 0.1055613458f * A2 - 0.0638541728f * B2);
        -1196//                      final float s = cube(L2 - 0.0894841775f * A2 - 1.2914855480f * B2);
        -1197//
        -1198//                      final float r = +4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s;
        -1199//                      final float g = -1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s;
        -1200//                      final float b = -0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s;
        -1201//                      if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f)
        -1202//                              break;
        -1203//                      final float progress = attempt * 0x1p-5f;
        -1204//                      L2 = MathUtils.lerp(0.63f, L, progress);
        -1205//                      A2 = MathUtils.lerp(0, A, progress);
        -1206//                      B2 = MathUtils.lerp(0, B, progress);
        -1207//              }
        -1208//              return oklab(L2, A2 * 0.5f + 0.5f, B2 * 0.5f + 0.5f, alpha);
        -1209//  }
        -1210        
        -1211        /**
        -1212         * Produces a random packed float color that is always in-gamut (and opaque) and should be uniformly distributed.
        -1213         * @param random a Random object (preferably a subclass of Random, like {@link com.badlogic.gdx.math.RandomXS128})
        -1214         * @return a packed float color that is always in-gamut
        -1215         */
        -1216        public static float randomColor(Random random) {
        -1217                float L = random.nextFloat();
        -1218                float A = random.nextFloat();
        -1219                float B = random.nextFloat();
        -1220                while (!inGamut(L, A, B)) {
        -1221                        L = random.nextFloat();
        -1222                        A = random.nextFloat();
        -1223                        B = random.nextFloat();
        -1224                }
        -1225                return oklab(L, A, B, 1f);
        -1226        }
        -1227}
        +1109        public static float maximizeSaturation(float L, float A, float B, float alpha) {
        +1110                L = Math.min(Math.max(L, 0f), 1f);
        +1111                A = Math.min(Math.max(A, 0f), 1f);
        +1112                B = Math.min(Math.max(B, 0f), 1f);
        +1113                alpha = Math.min(Math.max(alpha, 0f), 1f);
        +1114                final float A2 = (A - 0.5f);
        +1115                final float B2 = (B - 0.5f);
        +1116                final float hue = TrigTools.atan2_(B2, A2);
        +1117                final int idx = (int) (L * 255.999f) << 8 | (int) (256f * hue);
        +1118                final float dist = GAMUT_DATA[idx];
        +1119                return NumberUtils.intBitsToFloat(
        +1120                                (int) (alpha * 127.999f) << 25 |
        +1121                                                (int) (TrigTools.sin_(hue) * dist + 128f) << 16 |
        +1122                                                (int) (TrigTools.cos_(hue) * dist + 128f) << 8 |
        +1123                                                (int) (L * 255.999f));
        +1124        }
        +1125
        +1126        /**
        +1127         * Gets the hue of the given Oklab float color, but as Oklab understands hue rather than how HSL does.
        +1128         * This is different from {@link #hue(float)}, which uses HSL. This gives a float between 0 (inclusive)
        +1129         * and 1 (exclusive).
        +1130         *
        +1131         * @param packed a packed Oklab float color
        +1132         * @return a float between 0 (inclusive) and 1 (exclusive) that represents hue in the Oklab color space
        +1133         */
        +1134        public static float oklabHue(final float packed) {
        +1135                final int decoded = NumberUtils.floatToRawIntBits(packed);
        +1136                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        +1137                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        +1138                return TrigTools.atan2_(B, A);
        +1139        }
        +1140
        +1141        /**
        +1142         * Gets the saturation of the given Oklab float color, but as Oklab understands saturation rather than how HSL does.
        +1143         * Saturation here is a fraction of the chroma limit (see {@link #chromaLimit(float, float)}) for a given hue and
        +1144         * lightness, and is between 0 and 1. This gives a float between 0 (inclusive) and 1 (inclusive).
        +1145         *
        +1146         * @param packed a packed Oklab float color
        +1147         * @return a float between 0 (inclusive) and 1 (inclusive) that represents saturation in the Oklab color space
        +1148         */
        +1149        public static float oklabSaturation(final float packed) {
        +1150                final int decoded = NumberUtils.floatToRawIntBits(packed);
        +1151                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        +1152                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        +1153                final float hue = TrigTools.atan2_(B, A);
        +1154                final int idx = (decoded & 0xff) << 8 | (int) (256f * hue);
        +1155                final float dist = GAMUT_DATA[idx];
        +1156                return (float) Math.sqrt(A * A + B * B) * 256f / dist;
        +1157        }
        +1158        /**
        +1159         * Gets the lightness of the given Oklab float color, but as Oklab understands lightness rather than how HSL does.
        +1160         * This is different from {@link #lightness(float)}, which uses HSL. This gives a float between 0 (inclusive)
        +1161         * and 1 (inclusive).
        +1162         * <br>
        +1163         * This is the same as {@link #channelL(float)}.
        +1164         *
        +1165         * @param packed a packed Oklab float color
        +1166         * @return a float between 0 (inclusive) and 1 (inclusive) that represents lightness in the Oklab color space
        +1167         */
        +1168        public static float oklabLightness(final float packed){
        +1169                return (NumberUtils.floatToRawIntBits(packed) & 0xff) / 255f;
        +1170        }
        +1171
        +1172        /**
        +1173         * A different way to specify an Oklab color, using hue, saturation, lightness, and alpha like a normal HSL(A) color
        +1174         * but calculating them directly in the Oklab color space. This is more efficient than
        +1175         * {@link #floatGetHSL(float, float, float, float)}, but for colors with less than 0.5f lightness, it can be very
        +1176         * unpredictable in how it handles saturation. Most colors between 0.5 and 0.75 hue that also have less than 0.5
        +1177         * lightness are extremely desaturated and close to gray, regardless of what you give for saturation, and these
        +1178         * colors suddenly jump to very saturated around 0.75 hue and higher. To avoid this issue, you may prefer using
        +1179         * {@link #oklabByHCL(float, float, float, float)}, which takes an absolute chroma as opposed to the saturation here
        +1180         * (which is a fraction of the maximum chroma).
        +1181         * <br>
        +1182         * Note that this takes a different value for its {@code hue} that the method {@link #hue(float)} produces, just
        +1183         * like its {@code saturation} and the method {@link #saturation(float)}, and {@code lightness} and the method
        +1184         * {@link #lightness(float)}. The hue is just distributed differently, and the lightness should be equivalent to
        +1185         * {@link #channelL(float)}, but the saturation here refers to what fraction the chroma should be of the maximum
        +1186         * chroma for the given hue and lightness. You can use {@link #oklabHue(float)}, {@link #oklabSaturation(float)},
        +1187         * and {@link #oklabLightness(float)} to get the hue, saturation, and lightness values from an existing color that
        +1188         * this will understand ({@link #alpha(float)} too).
        +1189         * @param hue between 0 and 1, usually, but this will automatically wrap if too high or too low
        +1190         * @param saturation will be clamped between 0 and 1
        +1191         * @param lightness will be clamped between 0 and 1
        +1192         * @param alpha will be clamped between 0 and 1
        +1193         * @return a packed Oklab float color that tries to match the requested hue, saturation, and lightness
        +1194         */
        +1195        public static float oklabByHSL(float hue, float saturation, float lightness, float alpha) {
        +1196                lightness = Math.min(Math.max(lightness, 0f), 1f);
        +1197                saturation = Math.min(Math.max(saturation, 0f), 1f);
        +1198                hue -= MathUtils.floor(hue);
        +1199                alpha = Math.min(Math.max(alpha, 0f), 1f);
        +1200                final int idx = (int) (lightness * 255.999f) << 8 | (int) (256f * hue);
        +1201                final float dist = GAMUT_DATA[idx] * saturation;
        +1202                return NumberUtils.intBitsToFloat(
        +1203                                (int) (alpha * 127.999f) << 25 |
        +1204                                                (int) (TrigTools.sin_(hue) * dist + 128f) << 16 |
        +1205                                                (int) (TrigTools.cos_(hue) * dist + 128f) << 8 |
        +1206                                                (int) (lightness * 255.999f));
        +1207        }
        +1208
        +1209        /**
        +1210         * A different way to specify an Oklab color, using hue, chroma, lightness, and alpha something like a normal HSL(A)
        +1211         * color but calculating them directly in the Oklab color space. This has you specify the desired chroma directly,
        +1212         * as obtainable with {@link #chroma(float)}, rather than the saturation, which is a fraction of the maximum chroma
        +1213         * (saturation is what {@link #oklabByHSL(float, float, float, float)} uses). Note that this takes a different value
        +1214         * for its {@code hue} that the method {@link #hue(float)} produces, just like {@code lightness} and the method
        +1215         * {@link #lightness(float)}. The hue is just distributed differently, and the lightness should be equivalent to
        +1216         * {@link #channelL(float)}. If you use this to get two colors with the same chroma and lightness, but different
        +1217         * hue, then the resulting colors should have similar colorfulness unless one or both chroma values exceeded the
        +1218         * gamut limit (you can get this limit with {@link #chromaLimit(float, float)}). If a chroma value given is greater
        +1219         * than the chroma limit, this clamps chroma to that limit. You can use {@link #oklabHue(float)},
        +1220         * {@link #chroma(float)}, and {@link #oklabLightness(float)} to get the hue, chroma, and lightness values from an
        +1221         * existing color that this will understand ({@link #alpha(float)} too).
        +1222         * @param hue between 0 and 1, usually, but this will automatically wrap if too high or too low
        +1223         * @param chroma will be clamped between 0 and the maximum chroma possible for the given hue and lightness
        +1224         * @param lightness will be clamped between 0 and 1
        +1225         * @param alpha will be clamped between 0 and 1
        +1226         * @return a packed Oklab float color that tries to match the requested hue, chroma, and lightness
        +1227         */
        +1228        public static float oklabByHCL(float hue, float chroma, float lightness, float alpha) {
        +1229                lightness = Math.min(Math.max(lightness, 0f), 1f);
        +1230                chroma = Math.max(chroma, 0f);
        +1231                hue -= MathUtils.floor(hue);
        +1232                alpha = Math.min(Math.max(alpha, 0f), 1f);
        +1233                final int idx = (int) (lightness * 255.999f) << 8 | (int) (256f * hue);
        +1234                final float dist = Math.min(chroma * 128f, GAMUT_DATA[idx]);
        +1235                return NumberUtils.intBitsToFloat(
        +1236                                (int) (alpha * 127.999f) << 25 |
        +1237                                                (int) (TrigTools.sin_(hue) * dist + 128f) << 16 |
        +1238                                                (int) (TrigTools.cos_(hue) * dist + 128f) << 8 |
        +1239                                                (int) (lightness * 255.999f));
        +1240        }
        +1241
        +1242        /**
        +1243         * Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside
        +1244         * the gamut at the same lightness, or if it is already in-gamut, returns the color as-is.
        +1245         * @param packed a packed float color in Oklab format; often this color is not in-gamut
        +1246         * @return the first color this finds that is in-gamut, as if it was moving toward a grayscale color with the same L
        +1247         * @see #inGamut(float) You can use inGamut() if you just want to check whether a color is in-gamut.
        +1248         */
        +1249        public static float limitToGamut(final float packed) {
        +1250                final int decoded = NumberUtils.floatToRawIntBits(packed);
        +1251                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        +1252                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        +1253                final float hue = TrigTools.atan2_(B, A);
        +1254                final int idx = (decoded & 0xff) << 8 | (int) (256f * hue);
        +1255                final float dist = GAMUT_DATA[idx];
        +1256                if (dist * 0x1p-8f >= (float) Math.sqrt(A * A + B * B))
        +1257                        return packed;
        +1258                return NumberUtils.intBitsToFloat(
        +1259                                (decoded & 0xFE0000FF) |
        +1260                                                (int) (TrigTools.cos_(hue) * dist + 128f) << 8 |
        +1261                                                (int) (TrigTools.sin_(hue) * dist + 128f) << 16);
        +1262        }
        +1263
        +1264        /**
        +1265         * Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside
        +1266         * the gamut at the same lightness, or if it is already in-gamut, returns the color as-is. This always produces
        +1267         * an opaque color.
        +1268         * @param L lightness component; will be clamped between 0 and 1 if it isn't already
        +1269         * @param A green-to-red chromatic component; will be clamped between 0 and 1 if it isn't already
        +1270         * @param B blue-to-yellow chromatic component; will be clamped between 0 and 1 if it isn't already
        +1271         * @return the first color this finds that is in-gamut, as if it was moving toward a grayscale color with the same L
        +1272         * @see #inGamut(float, float, float)  You can use inGamut() if you just want to check whether a color is in-gamut.
        +1273         */
        +1274        public static float limitToGamut(float L, float A, float B) {
        +1275                return limitToGamut(L, A, B, 1f);
        +1276        }
        +1277        /**
        +1278         * Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside
        +1279         * the gamut at the same lightness, or if it is already in-gamut, returns the color as-is.
        +1280         * @param L lightness component; will be clamped between 0 and 1 if it isn't already
        +1281         * @param A green-to-red chromatic component; will be clamped between 0 and 1 if it isn't already
        +1282         * @param B blue-to-yellow chromatic component; will be clamped between 0 and 1 if it isn't already
        +1283         * @param alpha alpha component; will be clamped between 0 and 1 if it isn't already
        +1284         * @return the first color this finds that is in-gamut, as if it was moving toward a grayscale color with the same L
        +1285         * @see #inGamut(float, float, float)  You can use inGamut() if you just want to check whether a color is in-gamut.
        +1286         */
        +1287        public static float limitToGamut(float L, float A, float B, float alpha) {
        +1288                L = Math.min(Math.max(L, 0f), 1f);
        +1289                A = Math.min(Math.max(A, 0f), 1f);
        +1290                B = Math.min(Math.max(B, 0f), 1f);
        +1291                alpha = Math.min(Math.max(alpha, 0f), 1f);
        +1292                final float A2 = (A - 0.5f);
        +1293                final float B2 = (B - 0.5f);
        +1294                final float hue = TrigTools.atan2_(B2, A2);
        +1295                final int idx = (int) (L * 255.999f) << 8 | (int)(256f * hue);
        +1296                final float dist = GAMUT_DATA[idx];
        +1297                if(dist * 0x1p-9F >= (float) Math.sqrt(A2 * A2 + B2 * B2))
        +1298                        return oklab(L, A, B, alpha);
        +1299                return NumberUtils.intBitsToFloat(
        +1300                                (int) (alpha * 127.999f) << 25 |
        +1301                                                (int) (TrigTools.sin_(hue) * dist + 128f) << 16 |
        +1302                                                (int) (TrigTools.cos_(hue) * dist + 128f) << 8 |
        +1303                                                (int) (L * 255.999f));
        +1304        }
        +1305
        +1306        /**
        +1307         * Given a packed float Oklab color, this edits its L, A, B, and alpha channels by adding the corresponding "add"
        +1308         * parameter and then clamping. This returns a different float value (of course, the given float can't be edited
        +1309         * in-place). You can give a value of 0 for any "add" parameter you want to stay unchanged. This clamps the
        +1310         * resulting color to remain in-gamut, so it should be safe to convert it back to RGBA.
        +1311         * @param encoded a packed float Oklab color
        +1312         * @param addL how much to add to the L channel; typically in the -1 to 1 range
        +1313         * @param addA how much to add to the A channel; typically in the -1 to 1 range
        +1314         * @param addB how much to add to the B channel; typically in the -1 to 1 range
        +1315         * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range
        +1316         * @return a packed float Oklab color with the requested edits applied to {@code encoded}
        +1317         */
        +1318        public static float editOklab(float encoded, float addL, float addA, float addB, float addAlpha) {
        +1319                return editOklab(encoded, addL, addA, addB, addAlpha, 1f, 1f, 1f, 1f);
        +1320        }
        +1321        /**
        +1322         * Given a packed float Oklab color, this edits its L, A, B, and alpha channels by first multiplying each channel by
        +1323         * the corresponding "mul" parameter and then adding the corresponding "add" parameter, before clamping. This means
        +1324         * the lightness value {@code L} is multiplied by {@code mulL}, then has {@code addL} added, and then is clamped to
        +1325         * the normal range for L (0 to 1). This returns a different float value (of course, the given float can't be edited
        +1326         * in-place). You can give a value of 0 for any "add" parameter you want to stay unchanged, or a value of 1 for any
        +1327         * "mul" parameter that shouldn't change. Note that this manipulates A and B in the -0.5 to 0.5 range, so if you
        +1328         * multiply by a small number like {@code 0.25f}, then this will produce a less-saturated color, and if you multiply
        +1329         * by a larger number like {@code 4f}, then you will get a much more-saturated color. This clamps the resulting
        +1330         * color to remain in-gamut, so it should be safe to convert it back to RGBA.
        +1331         * @param encoded a packed float Oklab color
        +1332         * @param addL how much to add to the L channel; typically in the -1 to 1 range
        +1333         * @param addA how much to add to the A channel; typically in the -1 to 1 range
        +1334         * @param addB how much to add to the B channel; typically in the -1 to 1 range
        +1335         * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range
        +1336         * @param mulL how much to multiply the L channel by; should be non-negative
        +1337         * @param mulA how much to multiply the A channel by; usually non-negative (not always)
        +1338         * @param mulB how much to multiply the B channel by; usually non-negative (not always)
        +1339         * @param mulAlpha how much to multiply the alpha channel by; should be non-negative
        +1340         * @return a packed float Oklab color with the requested edits applied to {@code encoded}
        +1341         */
        +1342        public static float editOklab(float encoded, float addL, float addA, float addB, float addAlpha,
        +1343                                                                  float mulL, float mulA, float mulB, float mulAlpha) {
        +1344                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        +1345                float L = (decoded & 0xff) / 255f;
        +1346                float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        +1347                float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        +1348                float alpha = (decoded >>> 25) / 127f;
        +1349
        +1350                L = Math.min(Math.max(L * mulL + addL, 0f), 1f);
        +1351                A = Math.min(Math.max(A * mulA + addA * 2f, -1f), 1f) * 0.5f;
        +1352                B = Math.min(Math.max(B * mulB + addB * 2f, -1f), 1f) * 0.5f;
        +1353                alpha = Math.min(Math.max(alpha * mulAlpha + addAlpha, 0f), 1f);
        +1354                final float hue = TrigTools.atan2_(B, A);
        +1355                final int idx = (int) (L * 255.999f) << 8 | (int)(256f * hue);
        +1356                final float dist = GAMUT_DATA[idx] ;
        +1357                if(dist * 0x1p-9f >= (float) Math.sqrt(A * A + B * B))
        +1358                        return oklab(L, A + 0.5f, B + 0.5f, alpha);
        +1359                return NumberUtils.intBitsToFloat(
        +1360                                (int) (alpha * 127.999f) << 25 |
        +1361                                                (int) (TrigTools.sin_(hue) * dist + 128f) << 16 |
        +1362                                                (int) (TrigTools.cos_(hue) * dist + 128f) << 8 |
        +1363                                                (int) (L * 255.999f));
        +1364        }
        +1365
        +1366        /**
        +1367         * Produces a random packed float color that is always in-gamut (and opaque) and should be uniformly distributed.
        +1368         * @param random a Random object (preferably a subclass of Random, like {@link com.badlogic.gdx.math.RandomXS128})
        +1369         * @return a packed float color that is always in-gamut
        +1370         */
        +1371        public static float randomColor(Random random) {
        +1372                float L = random.nextFloat();
        +1373                float A = random.nextFloat();
        +1374                float B = random.nextFloat();
        +1375                while (!inGamut(L, A, B)) {
        +1376                        L = random.nextFloat();
        +1377                        A = random.nextFloat();
        +1378                        B = random.nextFloat();
        +1379                }
        +1380                return oklab(L, A, B, 1f);
        +1381        }
        +1382}
         
         
         
        diff --git a/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/rgb/ColorTools.html b/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/rgb/ColorTools.html
        index 78016205..4b2c3e5d 100644
        --- a/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/rgb/ColorTools.html
        +++ b/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/rgb/ColorTools.html
        @@ -14,572 +14,717 @@
         
        001package com.github.tommyettinger.colorful.rgb;
         002
         003import com.badlogic.gdx.graphics.Color;
        -004import com.badlogic.gdx.math.MathUtils;
        -005import com.badlogic.gdx.utils.NumberUtils;
        -006import com.github.tommyettinger.colorful.FloatColors;
        -007import com.github.tommyettinger.colorful.Shaders;
        -008import com.github.tommyettinger.colorful.ycwcm.Palette;
        -009
        -010import java.util.Random;
        -011
        -012/**
        -013 * Contains code for manipulating colors as {@code int}, packed {@code float}, and {@link Color} values in the RGB
        -014 * color space. All of these colors have an alpha channel as well as red, green, and blue; the package name isn't
        -015 * "rgba" because "ycwcm" and "ipt" don't mention alpha either and they also have that channel. RGB is the standard mode
        -016 * for colors in libGDX, and conversions to and from RGB are in the ColorTools classes for each other color space (like
        -017 * {@link com.github.tommyettinger.colorful.ipt.ColorTools#fromRGBA(float, float, float, float)} and
        -018 * {@link com.github.tommyettinger.colorful.ycwcm.ColorTools#toRGBA(float)}).
        -019 */
        -020public class ColorTools {
        -021        /**
        -022         * Gets a packed float representation of a color given as 4 float components, here, R (red), G (green), B (blue),
        -023         * and A (alpha or opacity). As long as you use a batch with {@link Shaders#fragmentShaderRGBA} or
        -024         * {@link Shaders#fragmentShaderGammaRGBA} as its shader, colors passed with
        -025         * {@link com.badlogic.gdx.graphics.g2d.Batch#setPackedColor(float)} will be interpreted as RGB. All channels range
        -026         * from 0.0 to 1.0, inclusive. Alpha is the multiplicative opacity of the color.
        -027         * <br>
        -028         * This method bit-masks the resulting color's byte values, so any values can technically be given to this as red,
        -029         * green, and blue, but they will only be reversible from the returned float color to the original R, G, and B
        -030         * values if the original values were in the range that {@link #red(float)}, {@link #green(float)}, and
        -031         * {@link #blue(float)} return.
        -032         *
        -033         * @param red       0f to 1f, red channel
        -034         * @param green     0f to 1f, green channel
        -035         * @param blue      0f to 1f, blue channel
        -036         * @param alpha     0f to 1f, 0f makes the color transparent and 1f makes it opaque
        -037         * @return a float encoding a color with the given properties
        -038         */
        -039        public static float rgb(float red, float green, float blue, float alpha) {
        -040                return NumberUtils.intBitsToFloat(((int) (alpha * 255) << 24 & 0xFE000000) | ((int) (blue * 255) << 16 & 0xFF0000)
        -041                                | ((int) (green * 255) << 8 & 0xFF00) | ((int) (red * 255) & 0xFF));
        -042        }
        -043
        -044        /**
        -045         * Writes an RGB-format packed float color (the format produced by {@link ColorTools#rgb(float, float, float, float)})
        -046         * into an RGBA8888 Color as used by libGDX (called {@code editing}).
        -047         * @param editing a libGDX color that will be filled in-place with an RGBA conversion of {@code packed}
        -048         * @param packed a packed float color, as produced by {@link ColorTools#rgb(float, float, float, float)}
        -049         * @return an RGBA8888 int color
        -050         */
        -051        public static Color toColor(Color editing, final float packed)
        -052        {
        -053                Color.rgba8888ToColor(editing, Integer.reverseBytes(NumberUtils.floatToRawIntBits(packed)));
        -054                return editing;
        -055        }
        -056        /**
        -057         * Converts a packed float color in the format produced by {@link #rgb(float, float, float, float)} to an
        -058         * RGBA8888 int. This format of int can be used with Pixmap and in some other places in libGDX.
        -059         * @param packed a packed float color, as produced by {@link #rgb(float, float, float, float)}
        -060         * @return an RGBA8888 int color
        -061         */
        -062        public static int toRGBA8888(final float packed) {
        -063                return Integer.reverseBytes(NumberUtils.floatToIntColor(packed));
        -064        }
        -065
        -066        /**
        -067         * Takes a color encoded as an RGBA8888 int and converts to a packed float in the RGB format this uses.
        -068         * @param rgba an int with the channels (in order) red, green, blue, alpha; should have 8 bits per channel
        -069         * @return a packed float as RGB, which this class can use
        -070         */
        -071        public static float fromRGBA8888(final int rgba) {
        -072                return NumberUtils.intBitsToFloat(Integer.reverseBytes(rgba) & 0xFEFFFFFF);
        -073        }
        -074
        -075        /**
        -076         * Takes a libGDX Color that uses RGBA8888 channels and converts to a packed float in the RGB format this uses.
        -077         * @param color a libGDX RGBA8888 Color
        -078         * @return a packed float as RGB, which this class can use
        -079         */
        -080        public static float fromColor(final Color color) {
        -081                return color.toFloatBits();
        -082        }
        -083
        -084        /**
        -085         * Takes RGBA components from 0.0 to 1.0 each and converts to a packed float in the RGBA format this uses.
        -086         * @param r red, from 0.0 to 1.0 (both inclusive)
        -087         * @param g green, from 0.0 to 1.0 (both inclusive)
        -088         * @param b blue, from 0.0 to 1.0 (both inclusive)
        -089         * @param a alpha, from 0.0 to 1.0 (both inclusive)
        -090         * @return a packed float as RGBA, which this class can use
        -091         */
        -092        public static float fromRGBA(final float r, final float g, final float b, final float a) {
        -093                return NumberUtils.intBitsToFloat(
        -094                                          Math.min(Math.max((int)(r * 255.999f), 0), 255)
        -095                                                | Math.min(Math.max((int)(g * 255.999f), 0), 255) << 8
        -096                                                | Math.min(Math.max((int)(b * 255.999f), 0), 255) << 16
        -097                                                | ((int)(a * 255f) << 24 & 0xFE000000));
        -098        }
        -099
        -100        /**
        -101         * Gets the red channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
        -102         * @param encoded a color as a packed float that can be obtained by {@link #rgb(float, float, float, float)}
        -103         * @return an int from 0 to 255, inclusive, representing the red channel value of the given encoded color
        -104         */
        -105        public static int redInt(final float encoded) {
        -106                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        -107                return (decoded & 0xff);
        -108        }
        -109
        -110        /**
        -111         * Gets the green channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
        -112         * @param encoded a color as a packed float that can be obtained by {@link #rgb(float, float, float, float)}
        -113         * @return an int from 0 to 255, inclusive, representing the green channel value of the given encoded color
        -114         */
        -115        public static int greenInt(final float encoded) {
        -116                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        -117                return (decoded >>> 8 & 0xff);
        -118        }
        -119
        -120        /**
        -121         * Gets the blue channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
        -122         * @param encoded a color as a packed float that can be obtained by {@link #rgb(float, float, float, float)}
        -123         * @return an int from 0 to 255, inclusive, representing the blue channel value of the given encoded color
        -124         */
        -125        public static int blueInt(final float encoded) {
        -126                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        -127                return  (decoded >>> 16 & 0xff);
        -128        }
        -129
        -130        /**
        -131         * Gets the alpha channel value of the given encoded color, as an even int ranging from 0 to 254, inclusive. Because
        -132         * of how alpha is stored in libGDX, no odd-number values are possible for alpha.
        -133         * @param encoded a color as a packed float that can be obtained by {@link #rgb(float, float, float, float)}
        -134         * @return an even int from 0 to 254, inclusive, representing the alpha channel value of the given encoded color
        -135         */
        -136        public static int alphaInt(final float encoded) {
        -137                return (NumberUtils.floatToRawIntBits(encoded) & 0xfe000000) >>> 24;
        -138        }
        -139
        -140        /**
        -141         * Gets the red channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
        -142         * @param encoded a color as a packed float that can be obtained by {@link #rgb(float, float, float, float)}
        -143         * @return a float from 0.0f to 1.0f, inclusive, representing the red channel value of the given encoded color
        -144         */
        -145        public static float red(final float encoded) {
        -146                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        -147                return  (decoded & 0xff) / 255f;
        -148        }
        -149
        -150        /**
        -151         * Gets the green channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
        -152         * @param encoded a color as a packed float that can be obtained by {@link #rgb(float, float, float, float)}
        -153         * @return a float from 0.0f to 1.0f, inclusive, representing the green channel value of the given encoded color
        -154         */
        -155        public static float green(final float encoded) {
        -156                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        -157                return  (decoded >>> 8 & 0xff) / 255f;
        -158        }
        -159
        -160        /**
        -161         * Gets the blue channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
        -162         * @param encoded a color as a packed float that can be obtained by {@link #rgb(float, float, float, float)}
        -163         * @return a float from 0.0f to 1.0f, inclusive, representing the blue channel value of the given encoded color
        -164         */
        -165        public static float blue(final float encoded) {
        -166                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        -167                return  (decoded >>> 16 & 0xff) / 255f;
        -168        }
        -169
        -170        /**
        -171         * Gets the alpha channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
        -172         * @param encoded a color as a packed float that can be obtained by {@link #rgb(float, float, float, float)}
        -173         * @return a float from 0.0f to 1.0f, inclusive, representing the alpha channel value of the given encoded color
        -174         */
        -175        public static float alpha(final float encoded) {
        -176                return ((NumberUtils.floatToRawIntBits(encoded) & 0xfe000000) >>> 24) * 0x1.020408p-8f;
        -177        }
        -178
        -179        /**
        -180         * Gets a color as an RGBA packed float given floats representing hue, saturation, lightness, and opacity.
        -181         * All parameters should normally be between 0 and 1 inclusive, though any hue is tolerated (precision loss may
        -182         * affect the color if the hue is too large). A hue of 0 is red, progressively higher hue values go to orange,
        -183         * yellow, green, blue, and purple before wrapping around to red as it approaches 1. A saturation of 0 is grayscale,
        -184         * a saturation of 1 is brightly colored, and values close to 1 will usually appear more distinct than values close
        -185         * to 0, especially if the hue is different. A lightness of 0.001f or less is always black (also using a shortcut if
        -186         * this is the case, respecting opacity), while a lightness of 1f is white. Very bright colors are mostly in a band
        -187         * of high-saturation where lightness is 0.5f.
        -188         *
        -189         * @param hue        0f to 1f, color wheel position
        -190         * @param saturation 0f to 1f, 0f is grayscale and 1f is brightly colored
        -191         * @param lightness  0f to 1f, 0f is black and 1f is white
        -192         * @param opacity    0f to 1f, 0f is fully transparent and 1f is opaque
        -193         * @return a float encoding a color with the given properties
        -194         */
        -195        public static float floatGetHSL(float hue, float saturation, float lightness, float opacity) {
        -196                if (lightness <= 0.001f) {
        -197                        return NumberUtils.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x7F7F00);
        -198                } else {
        -199                        return FloatColors.hsl2rgb(hue, saturation, lightness, opacity);
        -200                }
        -201        }
        -202
        -203        /**
        -204         * Gets the saturation of the given encoded color, as a float ranging from 0.0f to 1.0f, inclusive.
        -205         * @param encoded a color as a packed float that can be obtained by {@link #rgb(float, float, float, float)}
        -206         * @return the saturation of the color from 0.0 (a grayscale color; inclusive) to 1.0 (a bright color, inclusive)
        -207         */
        -208        public static float saturation(final float encoded) {
        -209                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        -210                final float r = (decoded & 0xff) / 255f;
        -211                final float g = (decoded >>> 8 & 0xff) / 255f;
        -212                final float b = (decoded >>> 16 & 0xff) / 255f;
        -213                float x, y, w;
        -214                if(g < b) {
        -215                        x = b;
        -216                        y = g;
        -217                }
        -218                else {
        -219                        x = g;
        -220                        y = b;
        -221                }
        -222                if(r < x) {
        -223                        w = r;
        -224                }
        -225                else {
        -226                        w = x;
        -227                        x = r;
        -228                }
        -229                return x - Math.min(w, y);
        -230//              float d = x - Math.min(w, y);
        -231//              float li = x * (1f - 0.5f * d / (x + 1e-10f));
        -232//              return (x - li); // (Math.min(li, 1f - li) + 1e-10f);
        -233        }
        -234
        -235        public static float lightness(final float encoded) {
        -236                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        -237                final float r = (decoded & 0xff) / 255f;
        -238                final float g = (decoded >>> 8 & 0xff) / 255f;
        -239                final float b = (decoded >>> 16 & 0xff) / 255f;
        -240                float x, y, w;
        -241                if(g < b) {
        -242                        x = b;
        -243                        y = g;
        -244                }
        -245                else {
        -246                        x = g;
        -247                        y = b;
        -248                }
        -249                if(r < x) {
        -250                        w = r;
        -251                }
        -252                else {
        -253                        w = x;
        -254                        x = r;
        -255                }
        -256                float d = x - Math.min(w, y);
        -257                return x * (1f - 0.5f * d / (x + 1e-10f));
        -258        }
        -259
        -260        /**
        -261         * Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased)
        -262         * to 1f (exclusive, red and approaching purple if decreased).
        -263         * @param encoded a color as a packed float that can be obtained by {@link #rgb(float, float, float, float)}
        -264         * @return The hue of the color from 0.0 (red, inclusive) towards orange, then yellow, and
        -265         * eventually to purple before looping back to almost the same red (1.0, exclusive)
        -266         */
        -267        public static float hue(final float encoded) {
        -268                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        -269                final float r = (decoded & 0xff) / 255f;
        -270                final float g = (decoded >>> 8 & 0xff) / 255f;
        -271                final float b = (decoded >>> 16 & 0xff) / 255f;
        -272                float x, y, z, w;
        -273                if(g < b) {
        -274                        x = b;
        -275                        y = g;
        -276                        z = -1f;
        -277                        w = 2f / 3f;
        -278                }
        -279                else {
        -280                        x = g;
        -281                        y = b;
        -282                        z = 0f;
        -283                        w = -1f / 3f;
        -284                }
        -285                if(r < x) {
        -286                        z = w;
        -287                        w = r;
        -288                }
        -289                else {
        -290                        w = x;
        -291                        x = r;
        -292                }
        -293                float d = x - Math.min(w, y);
        -294                return Math.abs(z + (w - y) / (6f * d + 1e-10f));
        -295        }
        -296
        -297        /**
        -298         * Gets a variation on the packed float color basis as another packed float that has its hue, saturation, lightness,
        -299         * and opacity adjusted by the specified amounts. Note that this edits the color in HSL space, not RGB! Takes
        -300         * floats representing the amounts of change to apply to hue, saturation, lightness, and opacity; these can be
        -301         * between -1f and 1f. Returns a float that can be used as a packed or encoded color with methods like
        -302         * {@link com.badlogic.gdx.graphics.g2d.Batch#setPackedColor(float)}. The float is likely to be different than the
        -303         * result of {@link #rgb(float, float, float, float)} unless hue, saturation, lightness, and opacity are all 0. This
        -304         * won't allocate any objects.
        -305         * <br>
        -306         * The parameters this takes all specify additive changes for a color component, clamping the final values so they
        -307         * can't go above 1 or below 0, with an exception for hue, which can rotate around if lower or higher hues would be
        -308         * used. As an example, if you give this 0.4f for saturation, and the current color has saturation 0.7f, then the
        -309         * resulting color will have 1f for saturation. If you gave this -0.1f for saturation and the current color again
        -310         * has saturation 0.7f, then resulting color will have 0.6f for saturation.
        -311         *
        -312         * @param basis      a packed float color that will be used as the starting point to make the next color
        -313         * @param hue        -1f to 1f, the hue change that can be applied to the new float color (not clamped, wraps)
        -314         * @param saturation -1f to 1f, the saturation change that can be applied to the new float color
        -315         * @param light      -1f to 1f, the light/brightness change that can be applied to the new float color
        -316         * @param opacity    -1f to 1f, the opacity/alpha change that can be applied to the new float color
        -317         * @return a float encoding a variation of basis with the given changes
        -318         */
        -319        public static float toEditedFloat(float basis, float hue, float saturation, float light, float opacity) {
        -320                final int decoded = NumberUtils.floatToRawIntBits(basis);
        -321                opacity = Math.min(Math.max(opacity + (decoded >>> 24 & 0xfe) * 0x1.020408p-8f, 0f), 1f);
        -322                final float r = (decoded & 0xff) / 255f;
        -323                final float g = (decoded >>> 8 & 0xff) / 255f;
        -324                final float b = (decoded >>> 16 & 0xff) / 255f;
        -325                float x, y, z, w;
        -326                if(g < b) {
        -327                        x = b;
        -328                        y = g;
        -329                        z = -1f;
        -330                        w = 2f / 3f;
        -331                }
        -332                else {
        -333                        x = g;
        -334                        y = b;
        -335                        z = 0f;
        -336                        w = -1f / 3f;
        -337                }
        -338                if(r < x) {
        -339                        z = w;
        -340                        w = r;
        -341                }
        -342                else {
        -343                        w = x;
        -344                        x = r;
        -345                }
        -346                final float d = x - Math.min(w, y);
        -347                light = Math.min(Math.max(x * (1f - 0.5f * d / (x + 1e-10f)) + light, 0f), 1f);
        -348                hue += Math.abs(z + (w - y) / (6f * d + 1e-10f)) + 1f;
        -349                saturation += (x - light) / (Math.min(light, 1f - light) + 1e-10f);
        -350                return FloatColors.hsl2rgb(hue - (int)hue, Math.min(Math.max(saturation, 0f), 1f), light, opacity);
        -351        }
        -352
        -353        /**
        -354         * Interpolates from the packed float color start towards white by change. While change should be between 0f (return
        -355         * start as-is) and 1f (return white), start should be a packed color, as from
        -356         * {@link #rgb(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
        -357         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
        -358         * white. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is.
        -359         * @see #darken(float, float) the counterpart method that darkens a float color
        -360         * @param start the starting color as a packed float
        -361         * @param change how much to go from start toward white, as a float between 0 and 1; higher means closer to white
        -362         * @return a packed float that represents a color between start and white
        -363         */
        -364        public static float lighten(final float start, final float change) {
        -365                final int s = NumberUtils.floatToRawIntBits(start), r = s & 0xFF, g = s >>> 8 & 0xFF, b = s >>> 16 & 0xFF,
        -366                                a = s & 0xFE000000;
        -367                return NumberUtils.intBitsToFloat(
        -368                                ((int) (r + (0xFF - r) * change) & 0xFF) |
        -369                                ((int) (g + (0xFF - g) * change) & 0xFF) << 8 |
        -370                                ((int) (b + (0xFF - b) * change) & 0xFF) << 16 |
        -371                                a);
        -372        }
        -373
        -374        /**
        -375         * Interpolates from the packed float color start towards black by change. While change should be between 0f (return
        -376         * start as-is) and 1f (return black), start should be a packed color, as from
        -377         * {@link #rgb(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
        -378         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
        -379         * black. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is.
        -380         * @see #lighten(float, float) the counterpart method that lightens a float color
        -381         * @param start the starting color as a packed float
        -382         * @param change how much to go from start toward black, as a float between 0 and 1; higher means closer to black
        -383         * @return a packed float that represents a color between start and black
        -384         */
        -385        public static float darken(final float start, final float change) {
        -386                final int s = NumberUtils.floatToRawIntBits(start), r = s & 0xFF, g = s >>> 8 & 0xFF, b = s >>> 16 & 0xFF,
        -387                                a = s & 0xFE000000;
        -388                return NumberUtils.intBitsToFloat(
        -389                                ((int) (r * (1f - change)) & 0xFF) |
        -390                                ((int) (g * (1f - change)) & 0xFF) << 8 |
        -391                                ((int) (b * (1f - change)) & 0xFF) << 16 |
        -392                                a);
        -393        }
        -394
        -395        /**
        -396         * Interpolates from the packed float color start towards that color made opaque by change. While change should be
        -397         * between 0f (return start as-is) and 1f (return start with full alpha), start should be a packed color, as from
        -398         * {@link #rgb(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
        -399         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
        -400         * transparent. This won't change the red, green, or blue of the color.
        -401         * @see #fade(float, float) the counterpart method that makes a float color more translucent
        -402         * @param start the starting color as a packed float
        -403         * @param change how much to go from start toward opaque, as a float between 0 and 1; higher means closer to opaque
        -404         * @return a packed float that represents a color between start and its opaque version
        -405         */
        -406        public static float blot(final float start, final float change) {
        -407                final int s = NumberUtils.floatToRawIntBits(start), opacity = s >>> 24 & 0xFE, other = s & 0x00FFFFFF;
        -408                return NumberUtils.intBitsToFloat(((int) (opacity + (0xFE - opacity) * change) & 0xFE) << 24 | other);
        -409        }
        -410
        -411        /**
        -412         * Interpolates from the packed float color start towards transparent by change. While change should be between 0
        -413         * (return start as-is) and 1f (return the color with 0 alpha), start should be a packed color, as from
        -414         * {@link #rgb(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors,
        -415         * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
        -416         * transparent. This won't change the red, green, or blue of the color.
        -417         * @see #blot(float, float) the counterpart method that makes a float color more opaque
        +004import com.badlogic.gdx.utils.NumberUtils;
        +005import com.github.tommyettinger.colorful.FloatColors;
        +006import com.github.tommyettinger.colorful.Shaders;
        +007import com.github.tommyettinger.colorful.ycwcm.Palette;
        +008
        +009import java.util.Random;
        +010
        +011/**
        +012 * Contains code for manipulating colors as {@code int}, packed {@code float}, and {@link Color} values in the RGB
        +013 * color space. All of these colors have an alpha channel as well as red, green, and blue; the package name isn't
        +014 * "rgba" because "ycwcm" and "ipt" don't mention alpha either and they also have that channel. RGB is the standard mode
        +015 * for colors in libGDX, and conversions to and from RGB are in the ColorTools classes for each other color space (like
        +016 * {@link com.github.tommyettinger.colorful.ipt.ColorTools#fromRGBA(float, float, float, float)} and
        +017 * {@link com.github.tommyettinger.colorful.ycwcm.ColorTools#toRGBA(float)}).
        +018 */
        +019public class ColorTools {
        +020        /**
        +021         * Gets a packed float representation of a color given as 4 float components, here, R (red), G (green), B (blue),
        +022         * and A (alpha or opacity). As long as you use a batch with {@link Shaders#fragmentShaderRGBA} or
        +023         * {@link Shaders#fragmentShaderGammaRGBA} as its shader, colors passed with
        +024         * {@link com.badlogic.gdx.graphics.g2d.Batch#setPackedColor(float)} will be interpreted as RGB. All channels range
        +025         * from 0.0 to 1.0, inclusive. Alpha is the multiplicative opacity of the color.
        +026         * <br>
        +027         * This method bit-masks the resulting color's byte values, so any values can technically be given to this as red,
        +028         * green, and blue, but they will only be reversible from the returned float color to the original R, G, and B
        +029         * values if the original values were in the range that {@link #red(float)}, {@link #green(float)}, and
        +030         * {@link #blue(float)} return.
        +031         *
        +032         * @param red       0f to 1f, red channel
        +033         * @param green     0f to 1f, green channel
        +034         * @param blue      0f to 1f, blue channel
        +035         * @param alpha     0f to 1f, 0f makes the color transparent and 1f makes it opaque
        +036         * @return a float encoding a color with the given properties
        +037         */
        +038        public static float rgb(float red, float green, float blue, float alpha) {
        +039                return NumberUtils.intBitsToFloat(((int) (alpha * 255) << 24 & 0xFE000000) | ((int) (blue * 255) << 16 & 0xFF0000)
        +040                                | ((int) (green * 255) << 8 & 0xFF00) | ((int) (red * 255) & 0xFF));
        +041        }
        +042
        +043        /**
        +044         * Writes an RGB-format packed float color (the format produced by {@link ColorTools#rgb(float, float, float, float)})
        +045         * into an RGBA8888 Color as used by libGDX (called {@code editing}).
        +046         * @param editing a libGDX color that will be filled in-place with an RGBA conversion of {@code packed}
        +047         * @param packed a packed float color, as produced by {@link ColorTools#rgb(float, float, float, float)}
        +048         * @return an RGBA8888 int color
        +049         */
        +050        public static Color toColor(Color editing, final float packed)
        +051        {
        +052                Color.rgba8888ToColor(editing, Integer.reverseBytes(NumberUtils.floatToRawIntBits(packed)));
        +053                return editing;
        +054        }
        +055        /**
        +056         * Converts a packed float color in the format produced by {@link #rgb(float, float, float, float)} to an
        +057         * RGBA8888 int. This format of int can be used with Pixmap and in some other places in libGDX.
        +058         * @param packed a packed float color, as produced by {@link #rgb(float, float, float, float)}
        +059         * @return an RGBA8888 int color
        +060         */
        +061        public static int toRGBA8888(final float packed) {
        +062                return Integer.reverseBytes(NumberUtils.floatToIntColor(packed));
        +063        }
        +064
        +065        /**
        +066         * Takes a color encoded as an RGBA8888 int and converts to a packed float in the RGB format this uses.
        +067         * @param rgba an int with the channels (in order) red, green, blue, alpha; should have 8 bits per channel
        +068         * @return a packed float as RGB, which this class can use
        +069         */
        +070        public static float fromRGBA8888(final int rgba) {
        +071                return NumberUtils.intBitsToFloat(Integer.reverseBytes(rgba) & 0xFEFFFFFF);
        +072        }
        +073
        +074        /**
        +075         * Takes a libGDX Color that uses RGBA8888 channels and converts to a packed float in the RGB format this uses.
        +076         * @param color a libGDX RGBA8888 Color
        +077         * @return a packed float as RGB, which this class can use
        +078         */
        +079        public static float fromColor(final Color color) {
        +080                return color.toFloatBits();
        +081        }
        +082
        +083        /**
        +084         * Takes RGBA components from 0.0 to 1.0 each and converts to a packed float in the RGBA format this uses.
        +085         * @param r red, from 0.0 to 1.0 (both inclusive)
        +086         * @param g green, from 0.0 to 1.0 (both inclusive)
        +087         * @param b blue, from 0.0 to 1.0 (both inclusive)
        +088         * @param a alpha, from 0.0 to 1.0 (both inclusive)
        +089         * @return a packed float as RGBA, which this class can use
        +090         */
        +091        public static float fromRGBA(final float r, final float g, final float b, final float a) {
        +092                return NumberUtils.intBitsToFloat(
        +093                                          Math.min(Math.max((int)(r * 255.999f), 0), 255)
        +094                                                | Math.min(Math.max((int)(g * 255.999f), 0), 255) << 8
        +095                                                | Math.min(Math.max((int)(b * 255.999f), 0), 255) << 16
        +096                                                | ((int)(a * 255f) << 24 & 0xFE000000));
        +097        }
        +098
        +099        /**
        +100         * Gets the red channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
        +101         * @param encoded a color as a packed float that can be obtained by {@link #rgb(float, float, float, float)}
        +102         * @return an int from 0 to 255, inclusive, representing the red channel value of the given encoded color
        +103         */
        +104        public static int redInt(final float encoded) {
        +105                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        +106                return (decoded & 0xff);
        +107        }
        +108
        +109        /**
        +110         * Gets the green channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
        +111         * @param encoded a color as a packed float that can be obtained by {@link #rgb(float, float, float, float)}
        +112         * @return an int from 0 to 255, inclusive, representing the green channel value of the given encoded color
        +113         */
        +114        public static int greenInt(final float encoded) {
        +115                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        +116                return (decoded >>> 8 & 0xff);
        +117        }
        +118
        +119        /**
        +120         * Gets the blue channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
        +121         * @param encoded a color as a packed float that can be obtained by {@link #rgb(float, float, float, float)}
        +122         * @return an int from 0 to 255, inclusive, representing the blue channel value of the given encoded color
        +123         */
        +124        public static int blueInt(final float encoded) {
        +125                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        +126                return  (decoded >>> 16 & 0xff);
        +127        }
        +128
        +129        /**
        +130         * Gets the alpha channel value of the given encoded color, as an even int ranging from 0 to 254, inclusive. Because
        +131         * of how alpha is stored in libGDX, no odd-number values are possible for alpha.
        +132         * @param encoded a color as a packed float that can be obtained by {@link #rgb(float, float, float, float)}
        +133         * @return an even int from 0 to 254, inclusive, representing the alpha channel value of the given encoded color
        +134         */
        +135        public static int alphaInt(final float encoded) {
        +136                return (NumberUtils.floatToRawIntBits(encoded) & 0xfe000000) >>> 24;
        +137        }
        +138
        +139        /**
        +140         * Gets the red channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
        +141         * @param encoded a color as a packed float that can be obtained by {@link #rgb(float, float, float, float)}
        +142         * @return a float from 0.0f to 1.0f, inclusive, representing the red channel value of the given encoded color
        +143         */
        +144        public static float red(final float encoded) {
        +145                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        +146                return  (decoded & 0xff) / 255f;
        +147        }
        +148
        +149        /**
        +150         * Gets the green channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
        +151         * @param encoded a color as a packed float that can be obtained by {@link #rgb(float, float, float, float)}
        +152         * @return a float from 0.0f to 1.0f, inclusive, representing the green channel value of the given encoded color
        +153         */
        +154        public static float green(final float encoded) {
        +155                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        +156                return  (decoded >>> 8 & 0xff) / 255f;
        +157        }
        +158
        +159        /**
        +160         * Gets the blue channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
        +161         * @param encoded a color as a packed float that can be obtained by {@link #rgb(float, float, float, float)}
        +162         * @return a float from 0.0f to 1.0f, inclusive, representing the blue channel value of the given encoded color
        +163         */
        +164        public static float blue(final float encoded) {
        +165                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        +166                return  (decoded >>> 16 & 0xff) / 255f;
        +167        }
        +168
        +169        /**
        +170         * Gets the alpha channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
        +171         * @param encoded a color as a packed float that can be obtained by {@link #rgb(float, float, float, float)}
        +172         * @return a float from 0.0f to 1.0f, inclusive, representing the alpha channel value of the given encoded color
        +173         */
        +174        public static float alpha(final float encoded) {
        +175                return ((NumberUtils.floatToRawIntBits(encoded) & 0xfe000000) >>> 24) * 0x1.020408p-8f;
        +176        }
        +177
        +178        /**
        +179         * Gets a color as an RGBA packed float given floats representing hue, saturation, lightness, and opacity.
        +180         * All parameters should normally be between 0 and 1 inclusive, though any hue is tolerated (precision loss may
        +181         * affect the color if the hue is too large). A hue of 0 is red, progressively higher hue values go to orange,
        +182         * yellow, green, blue, and purple before wrapping around to red as it approaches 1. A saturation of 0 is grayscale,
        +183         * a saturation of 1 is brightly colored, and values close to 1 will usually appear more distinct than values close
        +184         * to 0, especially if the hue is different. A lightness of 0.001f or less is always black (also using a shortcut if
        +185         * this is the case, respecting opacity), while a lightness of 1f is white. Very bright colors are mostly in a band
        +186         * of high-saturation where lightness is 0.5f.
        +187         *
        +188         * @param hue        0f to 1f, color wheel position
        +189         * @param saturation 0f to 1f, 0f is grayscale and 1f is brightly colored
        +190         * @param lightness  0f to 1f, 0f is black and 1f is white
        +191         * @param opacity    0f to 1f, 0f is fully transparent and 1f is opaque
        +192         * @return a float encoding a color with the given properties
        +193         */
        +194        public static float floatGetHSL(float hue, float saturation, float lightness, float opacity) {
        +195                if (lightness <= 0.001f) {
        +196                        return NumberUtils.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x7F7F00);
        +197                } else {
        +198                        return FloatColors.hsl2rgb(hue, saturation, lightness, opacity);
        +199                }
        +200        }
        +201
        +202        /**
        +203         * Gets the saturation of the given encoded color, as a float ranging from 0.0f to 1.0f, inclusive.
        +204         * @param encoded a color as a packed float that can be obtained by {@link #rgb(float, float, float, float)}
        +205         * @return the saturation of the color from 0.0 (a grayscale color; inclusive) to 1.0 (a bright color, inclusive)
        +206         */
        +207        public static float saturation(final float encoded) {
        +208                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        +209                final float r = (decoded & 0xff) / 255f;
        +210                final float g = (decoded >>> 8 & 0xff) / 255f;
        +211                final float b = (decoded >>> 16 & 0xff) / 255f;
        +212                float x, y, w;
        +213                if(g < b) {
        +214                        x = b;
        +215                        y = g;
        +216                }
        +217                else {
        +218                        x = g;
        +219                        y = b;
        +220                }
        +221                if(r < x) {
        +222                        w = r;
        +223                }
        +224                else {
        +225                        w = x;
        +226                        x = r;
        +227                }
        +228                return x - Math.min(w, y);
        +229//              float d = x - Math.min(w, y);
        +230//              float li = x * (1f - 0.5f * d / (x + 1e-10f));
        +231//              return (x - li); // (Math.min(li, 1f - li) + 1e-10f);
        +232        }
        +233
        +234        public static float lightness(final float encoded) {
        +235                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        +236                final float r = (decoded & 0xff) / 255f;
        +237                final float g = (decoded >>> 8 & 0xff) / 255f;
        +238                final float b = (decoded >>> 16 & 0xff) / 255f;
        +239                float x, y, w;
        +240                if(g < b) {
        +241                        x = b;
        +242                        y = g;
        +243                }
        +244                else {
        +245                        x = g;
        +246                        y = b;
        +247                }
        +248                if(r < x) {
        +249                        w = r;
        +250                }
        +251                else {
        +252                        w = x;
        +253                        x = r;
        +254                }
        +255                float d = x - Math.min(w, y);
        +256                return x * (1f - 0.5f * d / (x + 1e-10f));
        +257        }
        +258
        +259        /**
        +260         * Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased)
        +261         * to 1f (exclusive, red and approaching purple if decreased).
        +262         * @param encoded a color as a packed float that can be obtained by {@link #rgb(float, float, float, float)}
        +263         * @return The hue of the color from 0.0 (red, inclusive) towards orange, then yellow, and
        +264         * eventually to purple before looping back to almost the same red (1.0, exclusive)
        +265         */
        +266        public static float hue(final float encoded) {
        +267                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        +268                final float r = (decoded & 0xff) / 255f;
        +269                final float g = (decoded >>> 8 & 0xff) / 255f;
        +270                final float b = (decoded >>> 16 & 0xff) / 255f;
        +271                float x, y, z, w;
        +272                if(g < b) {
        +273                        x = b;
        +274                        y = g;
        +275                        z = -1f;
        +276                        w = 2f / 3f;
        +277                }
        +278                else {
        +279                        x = g;
        +280                        y = b;
        +281                        z = 0f;
        +282                        w = -1f / 3f;
        +283                }
        +284                if(r < x) {
        +285                        z = w;
        +286                        w = r;
        +287                }
        +288                else {
        +289                        w = x;
        +290                        x = r;
        +291                }
        +292                float d = x - Math.min(w, y);
        +293                return Math.abs(z + (w - y) / (6f * d + 1e-10f));
        +294        }
        +295
        +296        /**
        +297         * Gets a variation on the packed float color basis as another packed float that has its hue, saturation, lightness,
        +298         * and opacity adjusted by the specified amounts. Note that this edits the color in HSL space, not RGB! Takes
        +299         * floats representing the amounts of change to apply to hue, saturation, lightness, and opacity; these can be
        +300         * between -1f and 1f. Returns a float that can be used as a packed or encoded color with methods like
        +301         * {@link com.badlogic.gdx.graphics.g2d.Batch#setPackedColor(float)}. The float is likely to be different than the
        +302         * result of {@link #rgb(float, float, float, float)} unless hue, saturation, lightness, and opacity are all 0. This
        +303         * won't allocate any objects.
        +304         * <br>
        +305         * The parameters this takes all specify additive changes for a color component, clamping the final values so they
        +306         * can't go above 1 or below 0, with an exception for hue, which can rotate around if lower or higher hues would be
        +307         * used. As an example, if you give this 0.4f for saturation, and the current color has saturation 0.7f, then the
        +308         * resulting color will have 1f for saturation. If you gave this -0.1f for saturation and the current color again
        +309         * has saturation 0.7f, then resulting color will have 0.6f for saturation.
        +310         *
        +311         * @param basis      a packed float color that will be used as the starting point to make the next color
        +312         * @param hue        -1f to 1f, the hue change that can be applied to the new float color (not clamped, wraps)
        +313         * @param saturation -1f to 1f, the saturation change that can be applied to the new float color
        +314         * @param light      -1f to 1f, the light/brightness change that can be applied to the new float color
        +315         * @param opacity    -1f to 1f, the opacity/alpha change that can be applied to the new float color
        +316         * @return a float encoding a variation of basis with the given changes
        +317         */
        +318        public static float toEditedFloat(float basis, float hue, float saturation, float light, float opacity) {
        +319                final int decoded = NumberUtils.floatToRawIntBits(basis);
        +320                opacity = Math.min(Math.max(opacity + (decoded >>> 24 & 0xfe) * 0x1.020408p-8f, 0f), 1f);
        +321                final float r = (decoded & 0xff) / 255f;
        +322                final float g = (decoded >>> 8 & 0xff) / 255f;
        +323                final float b = (decoded >>> 16 & 0xff) / 255f;
        +324                float x, y, z, w;
        +325                if(g < b) {
        +326                        x = b;
        +327                        y = g;
        +328                        z = -1f;
        +329                        w = 2f / 3f;
        +330                }
        +331                else {
        +332                        x = g;
        +333                        y = b;
        +334                        z = 0f;
        +335                        w = -1f / 3f;
        +336                }
        +337                if(r < x) {
        +338                        z = w;
        +339                        w = r;
        +340                }
        +341                else {
        +342                        w = x;
        +343                        x = r;
        +344                }
        +345                final float d = x - Math.min(w, y);
        +346                light = Math.min(Math.max(x * (1f - 0.5f * d / (x + 1e-10f)) + light, 0f), 1f);
        +347                hue += Math.abs(z + (w - y) / (6f * d + 1e-10f)) + 1f;
        +348                saturation += (x - light) / (Math.min(light, 1f - light) + 1e-10f);
        +349                return FloatColors.hsl2rgb(hue - (int)hue, Math.min(Math.max(saturation, 0f), 1f), light, opacity);
        +350        }
        +351
        +352        /**
        +353         * Interpolates from the packed float color start towards white by change. While change should be between 0f (return
        +354         * start as-is) and 1f (return white), start should be a packed color, as from
        +355         * {@link #rgb(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
        +356         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
        +357         * white. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is.
        +358         * @see #darken(float, float) the counterpart method that darkens a float color
        +359         * @param start the starting color as a packed float
        +360         * @param change how much to go from start toward white, as a float between 0 and 1; higher means closer to white
        +361         * @return a packed float that represents a color between start and white
        +362         */
        +363        public static float lighten(final float start, final float change) {
        +364                final int s = NumberUtils.floatToRawIntBits(start), r = s & 0xFF, g = s >>> 8 & 0xFF, b = s >>> 16 & 0xFF,
        +365                                a = s & 0xFE000000;
        +366                return NumberUtils.intBitsToFloat(
        +367                                ((int) (r + (0xFF - r) * change) & 0xFF) |
        +368                                ((int) (g + (0xFF - g) * change) & 0xFF) << 8 |
        +369                                ((int) (b + (0xFF - b) * change) & 0xFF) << 16 |
        +370                                a);
        +371        }
        +372
        +373        /**
        +374         * Interpolates from the packed float color start towards black by change. While change should be between 0f (return
        +375         * start as-is) and 1f (return black), start should be a packed color, as from
        +376         * {@link #rgb(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
        +377         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
        +378         * black. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is.
        +379         * @see #lighten(float, float) the counterpart method that lightens a float color
        +380         * @param start the starting color as a packed float
        +381         * @param change how much to go from start toward black, as a float between 0 and 1; higher means closer to black
        +382         * @return a packed float that represents a color between start and black
        +383         */
        +384        public static float darken(final float start, final float change) {
        +385                final int s = NumberUtils.floatToRawIntBits(start), r = s & 0xFF, g = s >>> 8 & 0xFF, b = s >>> 16 & 0xFF,
        +386                                a = s & 0xFE000000;
        +387                return NumberUtils.intBitsToFloat(
        +388                                ((int) (r * (1f - change)) & 0xFF) |
        +389                                ((int) (g * (1f - change)) & 0xFF) << 8 |
        +390                                ((int) (b * (1f - change)) & 0xFF) << 16 |
        +391                                a);
        +392        }
        +393        /**
        +394         * Interpolates from the packed float color start to increase its red channel by change.
        +395         * While change must be between 0f (return start as-is) and 1f (return maximum red), start should be a packed
        +396         * color, as from {@link #rgb(float, float, float, float)}. This is a good way to reduce allocations of temporary
        +397         * Colors, and is a little more efficient and clear than using
        +398         * {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards a more-red color. Unlike
        +399         * {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the other channels of start as-is.
        +400         * @see #lowerB(float, float) the counterpart method that makes a float color less red
        +401         * @param start the starting color as a packed float
        +402         * @param change how much to change start to a more-red color, as a float between 0 and 1; higher means more red
        +403         * @return a packed float that represents a color between start and a more red color
        +404         */
        +405        public static float raiseR(final float start, final float change) {
        +406                final int s = NumberUtils.floatToRawIntBits(start), t = s & 0xFF, other = s & 0xFEFFFF00;
        +407                return NumberUtils.intBitsToFloat(((int) (t + (0xFF - t) * change) & 0xFF) | other);
        +408        }
        +409
        +410        /**
        +411         * Interpolates from the packed float color start to decrease its red channel by change.
        +412         * While change must be between 0f (return start as-is) and 1f (return minimum red), start should be a packed
        +413         * color, as from {@link #rgb(float, float, float, float)}. This is a good way to reduce allocations of temporary
        +414         * Colors, and is a little more efficient and clear than using
        +415         * {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards a less-red color. Unlike
        +416         * {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the other channels of start as-is.
        +417         * @see #raiseB(float, float) the counterpart method that makes a float color more red
         418         * @param start the starting color as a packed float
        -419         * @param change how much to go from start toward transparent, as a float between 0 and 1; higher means closer to transparent
        -420         * @return a packed float that represents a color between start and transparent
        +419         * @param change how much to change start to a less-red color, as a float between 0 and 1; higher means less red
        +420         * @return a packed float that represents a color between start and a less red color
         421         */
        -422        public static float fade(final float start, final float change) {
        -423                final int s = NumberUtils.floatToRawIntBits(start), opacity = s & 0xFE, other = s & 0x00FFFFFF;
        -424                return NumberUtils.intBitsToFloat(((int) (opacity * (1f - change)) & 0xFE) << 24 | other);
        +422        public static float lowerR(final float start, final float change) {
        +423                final int s = NumberUtils.floatToRawIntBits(start), t = s & 0xFF, other = s & 0xFEFFFF00;
        +424                return NumberUtils.intBitsToFloat(((int) (t * (1f - change)) & 0xFF) | other);
         425        }
         426
         427        /**
        -428         * Given a packed float RGBA color {@code mainColor} and another RGBA color that it should be made to contrast with,
        -429         * gets a packed float RGBA color with roughly inverted lightness (how the Oklab color space interprets it), but the
        -430         * same general hue and saturation unless the lightness gets too close to white or black. This won't ever produce
        -431         * black or other very dark colors, and also has a gap in the range it produces for lightness values between 0.5 and
        -432         * 0.55. That allows most of the colors this method produces to contrast well as a foreground when displayed on a
        -433         * background of {@code contrastingColor}, or vice versa. This will leave the lightness unchanged if the
        -434         * hue/saturation of the contrastingColor and those of the mainColor are already very different. This has nothing to
        -435         * do with the contrast channel of the tweak in ColorfulBatch; where that part of the tweak can make too-similar
        -436         * lightness values further apart by just a little, this makes a modification on {@code mainColor} to maximize its
        -437         * lightness difference from {@code contrastingColor} without losing its other qualities.
        -438         * @param mainColor a packed float color, as produced by {@link #rgb(float, float, float, float)}; this is the color that will be adjusted
        -439         * @param contrastingColor a packed float color, as produced by {@link #rgb(float, float, float, float)}; the adjusted mainColor will contrast with this
        -440         * @return a different RGBA packed float color, based on mainColor but with potentially very different lightness
        -441         */
        -442        public static float inverseLightness(final float mainColor, final float contrastingColor)
        -443        {
        -444                return com.github.tommyettinger.colorful.oklab.ColorTools.toRGBA(
        -445                                com.github.tommyettinger.colorful.oklab.ColorTools.inverseLightness(
        -446                                                com.github.tommyettinger.colorful.oklab.ColorTools.fromRGBA(mainColor),
        -447                                                com.github.tommyettinger.colorful.oklab.ColorTools.fromRGBA(contrastingColor)));
        -448        }
        -449
        -450        /**
        -451         * Given a packed float RGBA color {@code mainColor} and another RGBA color that it should be made to contrast
        -452         * with, gets a packed float RGBA color with lightness that should be quite different from
        -453         * {@code contrastingColor}'s lightness, but the same chromatic channels and opacity. This allows most of the colors
        -454         * this method produces to contrast well as a foreground when displayed on a background of {@code contrastingColor},
        -455         * or vice versa. This goes through Oklab as an intermediate step, so lightness is in terms of Oklab's L channel.
        -456         * <br>
        -457         * This is similar to {@link #inverseLightness(float, float)}, but is considerably simpler, and this method will
        -458         * change the lightness of mainColor when the two given colors have close lightness but distant chroma. Because it
        -459         * averages the original lightness of mainColor with the modified one, this tends to produce softer color changes.
        -460         * @param mainColor a packed RGBA float color; this is the color that will be adjusted
        -461         * @param contrastingColor a packed RGBA float color; the adjusted mainColor will contrast with the lightness of this
        -462         * @return a different packed RGBA float color, based on mainColor but typically with different lightness
        -463         */
        -464        public static float differentiateLightness(final float mainColor, final float contrastingColor)
        -465        {
        -466                final int main = NumberUtils.floatToRawIntBits(com.github.tommyettinger.colorful.oklab.ColorTools.fromRGBA(mainColor)),
        -467                                contrast = NumberUtils.floatToRawIntBits(com.github.tommyettinger.colorful.oklab.ColorTools.fromRGBA(contrastingColor));
        -468                return com.github.tommyettinger.colorful.oklab.ColorTools.toRGBA(NumberUtils.intBitsToFloat((main & 0xFEFFFF00) | (contrast + 128 & 0xFF) + (main & 0xFF) >>> 1));
        -469        }
        -470
        -471        /**
        -472         * Pretty simple; adds 0.5 to the given color's lightness (calculated by converting it to Oklab internally) and
        -473         * wraps it around if it would go above 1.0, then averages that with the original lightness. This means light colors
        -474         * become darker, and dark colors become lighter, with almost all results in the middle-range of possible lightness.
        -475         * @param mainColor a packed RGBA float color
        -476         * @return a different packed RGBA float color, with its lightness channel changed and limited to the correct gamut
        -477         */
        -478        public static float offsetLightness(final float mainColor) {
        -479                final int oklab = NumberUtils.floatToRawIntBits(mainColor);
        -480                return com.github.tommyettinger.colorful.oklab.ColorTools.toRGBA(NumberUtils.intBitsToFloat((oklab & 0xFEFFFF00) | (oklab + 128 & 0xFF) + (oklab & 0xFF) >>> 1));
        -481        }
        -482
        -483        /**
        -484         * Makes the additive RGBA color stored in {@code color} cause less of a change when used as a tint, as if it were
        -485         * mixed with neutral gray. When {@code fraction} is 1.0, this returns color unchanged; when fraction is 0.0, it
        -486         * returns {@link Palette#GRAY}, and when it is in-between 0.0 and 1.0 it returns something between the two. This is
        -487         * meant for things like area of effect abilities that make smaller color changes toward their periphery.
        -488         * @param color a color that should have its tinting effect potentially weakened
        -489         * @param fraction how much of {@code color} should be kept, from 0.0 to 1.0
        -490         * @return an RGBA float color between gray and {@code color}
        -491         */
        -492        public static float lessenChange(final float color, float fraction) {
        -493                final int e = NumberUtils.floatToRawIntBits(color),
        -494                                rs = 0x80, gs = 0x80, bs = 0x80, as = 0xFE,
        -495                                re = (e & 0xFF), ge = (e >>> 8) & 0xFF, be = (e >>> 16) & 0xFF, ae = e >>> 24 & 0xFE;
        -496                return NumberUtils.intBitsToFloat(
        -497                                  ((int) (rs + fraction * (re - rs)) & 0xFF)
        -498                                | ((int) (gs + fraction * (ge - gs)) & 0xFF) << 8
        -499                                | ((int) (bs + fraction * (be - bs)) & 0xFF) << 16
        -500                                | ((int) (as + fraction * (ae - as)) & 0xFE) << 24);
        -501        }
        -502
        -503        /**
        -504         * Makes a quasi-randomly-edited variant on the given {@code color}, allowing typically a small amount of
        -505         * {@code variance} (such as 0.05 to 0.25) between the given color and what this can return. The {@code seed} should
        -506         * be different each time this is called, and can be obtained from a random number generator to make the colors more
        -507         * random, or can be incremented on each call. If the seed is only incremented or decremented, then this shouldn't
        -508         * produce two similar colors in a row unless variance is very small. The variance affects the R, G, and B of the
        -509         * generated color equally, and each of those channels can go up or down by the given variance as long as the total
        -510         * distance isn't greater than the variance.
        -511         * @param color a packed float color, as produced by {@link #rgb(float, float, float, float)}
        -512         * @param seed a long seed that should be different on each call; should not be 0
        -513         * @param variance max amount of difference between the given color and the generated color; always less than 1
        -514         * @return a generated packed float color that should be at least somewhat different from {@code color}
        -515         */
        -516        public static float randomEdit(final float color, long seed, final float variance) {
        -517                final int decoded = NumberUtils.floatToRawIntBits(color);
        -518                final float r = (decoded & 0xff) / 255f;
        -519                final float g = (decoded >>> 8 & 0xff) / 255f;
        -520                final float b = (decoded >>> 16 & 0xff) / 255f;
        -521                final float limit = variance * variance;
        -522                float dist, x, y, z;
        -523                for (int j = 0; j < 50; j++) {
        -524                        x = (((seed * 0xD1B54A32D192ED03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
        -525                        y = (((seed * 0xABC98388FB8FAC03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
        -526                        z = (((seed * 0x8CB92BA72F3D8DD7L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
        -527                        seed += 0x9E3779B97F4A7C15L;
        -528                        dist = x * x + y * y + z * z;
        -529                        x += r;
        -530                        y += g;
        -531                        z += b;
        -532                        if(dist <= limit)
        -533                                return NumberUtils.intBitsToFloat((decoded & 0xFE000000) | ((int)(z * 255.999f) << 16 & 0xFF0000)
        -534                                        | ((int)(y * 255.999f) << 8 & 0xFF00) | (int)(x * 255.999f));
        -535                }
        -536                return color;
        -537        }
        -538
        -539        /**
        -540         * Produces a random packed float color that is always opaque and should be uniformly distributed.
        -541         * @param random a Random object (or preferably a subclass of Random, like {@link com.badlogic.gdx.math.RandomXS128})
        -542         * @return a packed float color that is always opaque
        -543         */
        -544        public static float randomColor(Random random) {
        -545                final float r = random.nextFloat(), g = random.nextFloat(), b = random.nextFloat();
        -546                return NumberUtils.intBitsToFloat(0xFE000000
        -547                                | ((int) (b * 256f) << 16 & 0xFF0000)
        -548                                | ((int) (g * 256f) << 8 & 0xFF00)
        -549                                | ((int) (r * 256f) & 0xFF));
        -550        }
        -551
        -552        /**
        -553         * Limited-use; like {@link #randomColor(Random)} but for cases where you already have three floats (r, g, and b)
        -554         * distributed how you want. This can be somewhat useful if you are using a "subrandom" or "quasi-random" sequence,
        -555         * like the Halton, Sobol, or R3 sequences, to get 3D points and map them to colors. It can also be useful if you
        -556         * want to randomly generate the RGB channels yourself and track the values produced, as you would if you wanted to
        -557         * avoid generating too many colors with high blue, for instance.
        -558         * @param r red value to use; will be clamped between 0 and 1
        -559         * @param g green value to use; will be clamped between 0 and 1
        -560         * @param b blue value to use; will be clamped between 0 and 1
        -561         * @return a packed float color that is always opaque
        -562         */
        -563        public static float subrandomColor(float r, float g, float b) {
        -564                return NumberUtils.intBitsToFloat(0xFE000000
        -565                                | ((int) Math.min(Math.max(b * 256f, 0), 255.999f) << 16 & 0xFF0000)
        -566                                | ((int) Math.min(Math.max(g * 256f, 0), 255.999f) << 8 & 0xFF00)
        -567                                | ((int) Math.min(Math.max(r * 256f, 0), 255.999f) & 0xFF));
        -568        }
        -569}
        +428         * Interpolates from the packed float color start to increase its green channel by change.
        +429         * While change must be between 0f (return start as-is) and 1f (return maximum green), start should be a packed
        +430         * color, as from {@link #rgb(float, float, float, float)}. This is a good way to reduce allocations of temporary
        +431         * Colors, and is a little more efficient and clear than using
        +432         * {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards a more-green color. Unlike
        +433         * {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the other channels of start as-is.
        +434         * @see #lowerB(float, float) the counterpart method that makes a float color less green
        +435         * @param start the starting color as a packed float
        +436         * @param change how much to change start to a more-green color, as a float between 0 and 1; higher means more green
        +437         * @return a packed float that represents a color between start and a more green color
        +438         */
        +439        public static float raiseG(final float start, final float change) {
        +440                final int s = NumberUtils.floatToRawIntBits(start), t = s >>> 8 & 0xFF, other = s & 0xFEFF00FF;
        +441                return NumberUtils.intBitsToFloat(((int) (t + (0xFF - t) * change) << 8 & 0xFF00) | other);
        +442        }
        +443
        +444        /**
        +445         * Interpolates from the packed float color start to decrease its green channel by change.
        +446         * While change must be between 0f (return start as-is) and 1f (return minimum green), start should be a packed
        +447         * color, as from {@link #rgb(float, float, float, float)}. This is a good way to reduce allocations of temporary
        +448         * Colors, and is a little more efficient and clear than using
        +449         * {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards a less-green color. Unlike
        +450         * {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the other channels of start as-is.
        +451         * @see #raiseB(float, float) the counterpart method that makes a float color more green
        +452         * @param start the starting color as a packed float
        +453         * @param change how much to change start to a less-green color, as a float between 0 and 1; higher means less green
        +454         * @return a packed float that represents a color between start and a less green color
        +455         */
        +456        public static float lowerG(final float start, final float change) {
        +457                final int s = NumberUtils.floatToRawIntBits(start), t = s >>> 8 & 0xFF, other = s & 0xFEFF00FF;
        +458                return NumberUtils.intBitsToFloat(((int) (t * (1f - change)) & 0xFF) << 8 | other);
        +459        }
        +460
        +461        /**
        +462         * Interpolates from the packed float color start to increase its blue channel by change.
        +463         * While change must be between 0f (return start as-is) and 1f (return maximum blue), start should be a packed
        +464         * color, as from {@link #rgb(float, float, float, float)}. This is a good way to reduce allocations of temporary
        +465         * Colors, and is a little more efficient and clear than using
        +466         * {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards a more-blue color. Unlike
        +467         * {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the other channels of start as-is.
        +468         * @see #lowerB(float, float) the counterpart method that makes a float color less blue
        +469         * @param start the starting color as a packed float
        +470         * @param change how much to change start to a more-blue color, as a float between 0 and 1; higher means more blue
        +471         * @return a packed float that represents a color between start and a more blue color
        +472         */
        +473        public static float raiseB(final float start, final float change) {
        +474                final int s = NumberUtils.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF;
        +475                return NumberUtils.intBitsToFloat(((int) (t + (0xFF - t) * change) << 16 & 0xFF0000) | other);
        +476        }
        +477
        +478        /**
        +479         * Interpolates from the packed float color start to decrease its blue channel by change.
        +480         * While change must be between 0f (return start as-is) and 1f (return minimum blue), start should be a packed
        +481         * color, as from {@link #rgb(float, float, float, float)}. This is a good way to reduce allocations of temporary
        +482         * Colors, and is a little more efficient and clear than using
        +483         * {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards a less-blue color. Unlike
        +484         * {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the other channels of start as-is.
        +485         * @see #raiseB(float, float) the counterpart method that makes a float color more blue
        +486         * @param start the starting color as a packed float
        +487         * @param change how much to change start to a less-blue color, as a float between 0 and 1; higher means less blue
        +488         * @return a packed float that represents a color between start and a less blue color
        +489         */
        +490        public static float lowerB(final float start, final float change) {
        +491                final int s = NumberUtils.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF;
        +492                return NumberUtils.intBitsToFloat(((int) (t * (1f - change)) & 0xFF) << 16 | other);
        +493        }
        +494
        +495        /**
        +496         * Interpolates from the packed float color start towards that color made opaque by change. While change should be
        +497         * between 0f (return start as-is) and 1f (return start with full alpha), start should be a packed color, as from
        +498         * {@link #rgb(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
        +499         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
        +500         * transparent. This won't change the red, green, or blue of the color.
        +501         * @see #fade(float, float) the counterpart method that makes a float color more translucent
        +502         * @param start the starting color as a packed float
        +503         * @param change how much to go from start toward opaque, as a float between 0 and 1; higher means closer to opaque
        +504         * @return a packed float that represents a color between start and its opaque version
        +505         */
        +506        public static float blot(final float start, final float change) {
        +507                final int s = NumberUtils.floatToRawIntBits(start), opacity = s >>> 24 & 0xFE, other = s & 0x00FFFFFF;
        +508                return NumberUtils.intBitsToFloat(((int) (opacity + (0xFE - opacity) * change) & 0xFE) << 24 | other);
        +509        }
        +510
        +511        /**
        +512         * Interpolates from the packed float color start towards transparent by change. While change should be between 0
        +513         * (return start as-is) and 1f (return the color with 0 alpha), start should be a packed color, as from
        +514         * {@link #rgb(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors,
        +515         * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
        +516         * transparent. This won't change the red, green, or blue of the color.
        +517         * @see #blot(float, float) the counterpart method that makes a float color more opaque
        +518         * @param start the starting color as a packed float
        +519         * @param change how much to go from start toward transparent, as a float between 0 and 1; higher means closer to transparent
        +520         * @return a packed float that represents a color between start and transparent
        +521         */
        +522        public static float fade(final float start, final float change) {
        +523                final int s = NumberUtils.floatToRawIntBits(start), opacity = s & 0xFE, other = s & 0x00FFFFFF;
        +524                return NumberUtils.intBitsToFloat(((int) (opacity * (1f - change)) & 0xFE) << 24 | other);
        +525        }
        +526
        +527        /**
        +528         * Given a packed float RGBA color {@code mainColor} and another RGBA color that it should be made to contrast with,
        +529         * gets a packed float RGBA color with roughly inverted lightness (how the Oklab color space interprets it), but the
        +530         * same general hue and saturation unless the lightness gets too close to white or black. This won't ever produce
        +531         * black or other very dark colors, and also has a gap in the range it produces for lightness values between 0.5 and
        +532         * 0.55. That allows most of the colors this method produces to contrast well as a foreground when displayed on a
        +533         * background of {@code contrastingColor}, or vice versa. This will leave the lightness unchanged if the
        +534         * hue/saturation of the contrastingColor and those of the mainColor are already very different. This has nothing to
        +535         * do with the contrast channel of the tweak in ColorfulBatch; where that part of the tweak can make too-similar
        +536         * lightness values further apart by just a little, this makes a modification on {@code mainColor} to maximize its
        +537         * lightness difference from {@code contrastingColor} without losing its other qualities.
        +538         * @param mainColor a packed float color, as produced by {@link #rgb(float, float, float, float)}; this is the color that will be adjusted
        +539         * @param contrastingColor a packed float color, as produced by {@link #rgb(float, float, float, float)}; the adjusted mainColor will contrast with this
        +540         * @return a different RGBA packed float color, based on mainColor but with potentially very different lightness
        +541         */
        +542        public static float inverseLightness(final float mainColor, final float contrastingColor)
        +543        {
        +544                return com.github.tommyettinger.colorful.oklab.ColorTools.toRGBA(
        +545                                com.github.tommyettinger.colorful.oklab.ColorTools.inverseLightness(
        +546                                                com.github.tommyettinger.colorful.oklab.ColorTools.fromRGBA(mainColor),
        +547                                                com.github.tommyettinger.colorful.oklab.ColorTools.fromRGBA(contrastingColor)));
        +548        }
        +549
        +550        /**
        +551         * Given a packed float RGBA color {@code mainColor} and another RGBA color that it should be made to contrast
        +552         * with, gets a packed float RGBA color with lightness that should be quite different from
        +553         * {@code contrastingColor}'s lightness, but the same chromatic channels and opacity. This allows most of the colors
        +554         * this method produces to contrast well as a foreground when displayed on a background of {@code contrastingColor},
        +555         * or vice versa. This goes through Oklab as an intermediate step, so lightness is in terms of Oklab's L channel.
        +556         * <br>
        +557         * This is similar to {@link #inverseLightness(float, float)}, but is considerably simpler, and this method will
        +558         * change the lightness of mainColor when the two given colors have close lightness but distant chroma. Because it
        +559         * averages the original lightness of mainColor with the modified one, this tends to produce softer color changes.
        +560         * @param mainColor a packed RGBA float color; this is the color that will be adjusted
        +561         * @param contrastingColor a packed RGBA float color; the adjusted mainColor will contrast with the lightness of this
        +562         * @return a different packed RGBA float color, based on mainColor but typically with different lightness
        +563         */
        +564        public static float differentiateLightness(final float mainColor, final float contrastingColor)
        +565        {
        +566                final int main = NumberUtils.floatToRawIntBits(com.github.tommyettinger.colorful.oklab.ColorTools.fromRGBA(mainColor)),
        +567                                contrast = NumberUtils.floatToRawIntBits(com.github.tommyettinger.colorful.oklab.ColorTools.fromRGBA(contrastingColor));
        +568                return com.github.tommyettinger.colorful.oklab.ColorTools.toRGBA(NumberUtils.intBitsToFloat((main & 0xFEFFFF00) | (contrast + 128 & 0xFF) + (main & 0xFF) >>> 1));
        +569        }
        +570
        +571        /**
        +572         * Pretty simple; adds 0.5 to the given color's lightness (calculated by converting it to Oklab internally) and
        +573         * wraps it around if it would go above 1.0, then averages that with the original lightness. This means light colors
        +574         * become darker, and dark colors become lighter, with almost all results in the middle-range of possible lightness.
        +575         * @param mainColor a packed RGBA float color
        +576         * @return a different packed RGBA float color, with its lightness channel changed and limited to the correct gamut
        +577         */
        +578        public static float offsetLightness(final float mainColor) {
        +579                final int oklab = NumberUtils.floatToRawIntBits(mainColor);
        +580                return com.github.tommyettinger.colorful.oklab.ColorTools.toRGBA(NumberUtils.intBitsToFloat((oklab & 0xFEFFFF00) | (oklab + 128 & 0xFF) + (oklab & 0xFF) >>> 1));
        +581        }
        +582
        +583        /**
        +584         * Makes the additive RGBA color stored in {@code color} cause less of a change when used as a tint, as if it were
        +585         * mixed with neutral gray. When {@code fraction} is 1.0, this returns color unchanged; when fraction is 0.0, it
        +586         * returns {@link Palette#GRAY}, and when it is in-between 0.0 and 1.0 it returns something between the two. This is
        +587         * meant for things like area of effect abilities that make smaller color changes toward their periphery.
        +588         * @param color a color that should have its tinting effect potentially weakened
        +589         * @param fraction how much of {@code color} should be kept, from 0.0 to 1.0
        +590         * @return an RGBA float color between gray and {@code color}
        +591         */
        +592        public static float lessenChange(final float color, float fraction) {
        +593                final int e = NumberUtils.floatToRawIntBits(color),
        +594                                rs = 0x80, gs = 0x80, bs = 0x80, as = 0xFE,
        +595                                re = (e & 0xFF), ge = (e >>> 8) & 0xFF, be = (e >>> 16) & 0xFF, ae = e >>> 24 & 0xFE;
        +596                return NumberUtils.intBitsToFloat(
        +597                                  ((int) (rs + fraction * (re - rs)) & 0xFF)
        +598                                | ((int) (gs + fraction * (ge - gs)) & 0xFF) << 8
        +599                                | ((int) (bs + fraction * (be - bs)) & 0xFF) << 16
        +600                                | ((int) (as + fraction * (ae - as)) & 0xFE) << 24);
        +601        }
        +602
        +603        /**
        +604         * Given a packed float RGB color, this edits its red, green, blue, and alpha channels by adding the corresponding
        +605         * "add" parameter and then clamping. Each value is considered in the 0 to 1 range. This returns a different float
        +606         * value (of course, the given float can't be edited in-place). You can give a value of 0 for any "add" parameter
        +607         * you want to stay unchanged.
        +608         * @param encoded a packed float RGB color
        +609         * @param addR how much to add to the R channel; typically in the -1 to 1 range
        +610         * @param addG how much to add to the G channel; typically in the -1 to 1 range
        +611         * @param addB how much to add to the B channel; typically in the -1 to 1 range
        +612         * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range
        +613         * @return a packed float RGB color with the requested edits applied to {@code encoded}
        +614         */
        +615        public static float editRGB(float encoded, float addR, float addG, float addB, float addAlpha){
        +616                return editRGB(encoded, addR, addG, addB, addAlpha, 1f, 1f, 1f, 1f);
        +617        }
        +618
        +619        /**
        +620         * Given a packed float RGB color, this edits its red, green, blue, and alpha channels by first multiplying each
        +621         * channel by the corresponding "mul" parameter and then adding the corresponding "add" parameter, before clamping.
        +622         * This means the red value {@code R} (which is considered in the 0 to 1 range) is multiplied by {@code mulR}, then
        +623         * has {@code addR} added, and then is clamped to the normal range for R (0 to 1). This returns a different float
        +624         * value (of course, the given float can't be edited in-place). You can give a value of 0 for any "add" parameter
        +625         * you want to stay unchanged, or a value of 1 for any "mul" parameter that shouldn't change.
        +626         * @param encoded a packed float RGB color
        +627         * @param addR how much to add to the R channel; typically in the -1 to 1 range
        +628         * @param addG how much to add to the G channel; typically in the -1 to 1 range
        +629         * @param addB how much to add to the B channel; typically in the -1 to 1 range
        +630         * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range
        +631         * @param mulR how much to multiply the R channel by; should be non-negative
        +632         * @param mulG how much to multiply the G channel by; should be non-negative
        +633         * @param mulB how much to multiply the B channel by; should be non-negative
        +634         * @param mulAlpha how much to multiply the alpha channel by; should be non-negative
        +635         * @return a packed float RGB color with the requested edits applied to {@code encoded}
        +636         */
        +637        public static float editRGB(float encoded, float addR, float addG, float addB, float addAlpha,
        +638                                                                float mulR, float mulG, float mulB, float mulAlpha){
        +639                final int s = NumberUtils.floatToRawIntBits(encoded), r = s & 0xFF, g = s >>> 8 & 0xFF, b = s >>> 16 & 0xFF,
        +640                                a = s >>> 25;
        +641                return NumberUtils.intBitsToFloat(
        +642                                Math.max(0, Math.min(255, (int) (r * mulR + addR * 255.999f))) |
        +643                                Math.max(0, Math.min(255, (int) (g * mulG + addG * 255.999f))) << 8 |
        +644                                Math.max(0, Math.min(255, (int) (b * mulB + addB * 255.999f))) << 16 |
        +645                                Math.max(0, Math.min(127, (int) (a * mulAlpha + addAlpha * 127.999f))) << 25);
        +646        }
        +647
        +648        /**
        +649         * Makes a quasi-randomly-edited variant on the given {@code color}, allowing typically a small amount of
        +650         * {@code variance} (such as 0.05 to 0.25) between the given color and what this can return. The {@code seed} should
        +651         * be different each time this is called, and can be obtained from a random number generator to make the colors more
        +652         * random, or can be incremented on each call. If the seed is only incremented or decremented, then this shouldn't
        +653         * produce two similar colors in a row unless variance is very small. The variance affects the R, G, and B of the
        +654         * generated color equally, and each of those channels can go up or down by the given variance as long as the total
        +655         * distance isn't greater than the variance.
        +656         * @param color a packed float color, as produced by {@link #rgb(float, float, float, float)}
        +657         * @param seed a long seed that should be different on each call; should not be 0
        +658         * @param variance max amount of difference between the given color and the generated color; always less than 1
        +659         * @return a generated packed float color that should be at least somewhat different from {@code color}
        +660         */
        +661        public static float randomEdit(final float color, long seed, final float variance) {
        +662                final int decoded = NumberUtils.floatToRawIntBits(color);
        +663                final float r = (decoded & 0xff) / 255f;
        +664                final float g = (decoded >>> 8 & 0xff) / 255f;
        +665                final float b = (decoded >>> 16 & 0xff) / 255f;
        +666                final float limit = variance * variance;
        +667                float dist, x, y, z;
        +668                for (int j = 0; j < 50; j++) {
        +669                        x = (((seed * 0xD1B54A32D192ED03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
        +670                        y = (((seed * 0xABC98388FB8FAC03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
        +671                        z = (((seed * 0x8CB92BA72F3D8DD7L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
        +672                        seed += 0x9E3779B97F4A7C15L;
        +673                        dist = x * x + y * y + z * z;
        +674                        x += r;
        +675                        y += g;
        +676                        z += b;
        +677                        if(dist <= limit)
        +678                                return NumberUtils.intBitsToFloat((decoded & 0xFE000000) | ((int)(z * 255.999f) << 16 & 0xFF0000)
        +679                                        | ((int)(y * 255.999f) << 8 & 0xFF00) | (int)(x * 255.999f));
        +680                }
        +681                return color;
        +682        }
        +683
        +684        /**
        +685         * Produces a random packed float color that is always opaque and should be uniformly distributed.
        +686         * @param random a Random object (or preferably a subclass of Random, like {@link com.badlogic.gdx.math.RandomXS128})
        +687         * @return a packed float color that is always opaque
        +688         */
        +689        public static float randomColor(Random random) {
        +690                final float r = random.nextFloat(), g = random.nextFloat(), b = random.nextFloat();
        +691                return NumberUtils.intBitsToFloat(0xFE000000
        +692                                | ((int) (b * 256f) << 16 & 0xFF0000)
        +693                                | ((int) (g * 256f) << 8 & 0xFF00)
        +694                                | ((int) (r * 256f) & 0xFF));
        +695        }
        +696
        +697        /**
        +698         * Limited-use; like {@link #randomColor(Random)} but for cases where you already have three floats (r, g, and b)
        +699         * distributed how you want. This can be somewhat useful if you are using a "subrandom" or "quasi-random" sequence,
        +700         * like the Halton, Sobol, or R3 sequences, to get 3D points and map them to colors. It can also be useful if you
        +701         * want to randomly generate the RGB channels yourself and track the values produced, as you would if you wanted to
        +702         * avoid generating too many colors with high blue, for instance.
        +703         * @param r red value to use; will be clamped between 0 and 1
        +704         * @param g green value to use; will be clamped between 0 and 1
        +705         * @param b blue value to use; will be clamped between 0 and 1
        +706         * @return a packed float color that is always opaque
        +707         */
        +708        public static float subrandomColor(float r, float g, float b) {
        +709                return NumberUtils.intBitsToFloat(0xFE000000
        +710                                | ((int) Math.min(Math.max(b * 256f, 0), 255.999f) << 16 & 0xFF0000)
        +711                                | ((int) Math.min(Math.max(g * 256f, 0), 255.999f) << 8 & 0xFF00)
        +712                                | ((int) Math.min(Math.max(r * 256f, 0), 255.999f) & 0xFF));
        +713        }
        +714}
         
         
         
        diff --git a/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/rgb/SimplePalette.html b/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/rgb/SimplePalette.html
        index 726f34dc..c5ab3213 100644
        --- a/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/rgb/SimplePalette.html
        +++ b/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/rgb/SimplePalette.html
        @@ -762,11 +762,11 @@
         749                                intensity += 0.085f;
         750                                break;
         751                            default:
        -752                                mixing.add(TRANSPARENT);
        +752                                mixing.add(0f);
         753                                break;
         754                        }
         755                    } else {
        -756                        mixing.add(NAMED.get(term, TRANSPARENT));
        +756                        mixing.add(NAMED.get(term, 0f));
         757                    }
         758                    break;
         759                case 'r':
        diff --git a/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/ycwcm/ColorTools.html b/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/ycwcm/ColorTools.html
        index 0be84442..1d438dc6 100644
        --- a/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/ycwcm/ColorTools.html
        +++ b/docs/colorful/apidocs/src-html/com/github/tommyettinger/colorful/ycwcm/ColorTools.html
        @@ -18,869 +18,962 @@
         005import com.badlogic.gdx.utils.NumberUtils;
         006import com.github.tommyettinger.colorful.FloatColors;
         007import com.github.tommyettinger.colorful.Shaders;
        -008
        -009import java.util.Random;
        -010
        -011/**
        -012 * Contains code for manipulating colors as {@code int}, packed {@code float}, and {@link Color} values in the YCwCm
        -013 * color space.
        -014 */
        -015public class ColorTools {
        -016        /**
        -017         * Gets a packed float representation of a color given as 4 float components, here, Y (luma or lightness), Cw
        -018         * (chromatic warmth), Cm (chromatic mildness), and A (alpha or opacity). As long as you use a shader with
        -019         * {@link Shaders#fragmentShader} as its shader, colors passed with
        -020         * {@link com.badlogic.gdx.graphics.g2d.Batch#setPackedColor(float)} will be interpreted as YCwCm.
        -021         * Luma should be between 0 and 1, inclusive, with 0 used for very dark colors (almost only black), and 1 used for
        -022         * very light colors (almost only white). The two chroma values range from 0.0 to 1.0, and there's some aesthetic
        -023         * value in changing just one chroma value. When warm is high and mild is low, the color is more reddish, when both
        -024         * are low it is more bluish, when mild is high and warm is low, the color tends to be greenish, and when both are
        -025         * high it tends to be brown or yellow. When warm and mild are both near 0.5f, the color is closer to gray.  Alpha
        -026         * is the multiplicative opacity of the color, and acts like RGBA's alpha.
        -027         * <br>
        -028         * This method bit-masks the resulting color's byte values, so any values can technically be given to this as luma,
        -029         * warm, and mild, but they will only be reversible from the returned float color to the original Y, Cw, and Cm
        -030         * values if the original values were a valid YCwCm color and not an "imaginary color." {@link #fromRGBA(float)}
        -031         * should always produce a valid YCwCm color.
        -032         *
        -033         * @param luma       0f to 1f, luma or Y component of YCwCm, with 0.5f meaning "no change" and 1f brightening
        -034         * @param warm       0f to 1f, "chroma warm" or Cw component of YCwCm, with 1f more red or yellow
        -035         * @param mild       0f to 1f, "chroma mild" or Cm component of YCwCm, with 1f more green or yellow
        -036         * @param alpha      0f to 1f, 0f makes the color transparent and 1f makes it opaque 
        -037         * @return a float encoding a color with the given properties
        -038         */
        -039        public static float ycwcm(float luma, float warm, float mild, float alpha) {
        -040                return NumberUtils.intBitsToFloat(((int) (alpha * 255) << 24 & 0xFE000000) | ((int) (mild * 255) << 16 & 0xFF0000)
        -041                                | ((int) (warm * 255) << 8 & 0xFF00) | ((int) (luma * 255) & 0xFF));
        -042        }
        -043
        -044        /**
        -045         * Converts a packed float color in the format produced by {@link ColorTools#ycwcm(float, float, float, float)} to an RGBA8888 int.
        -046         * This format of int can be used with Pixmap and in some other places in libGDX.
        -047         * @param packed a packed float color, as produced by {@link ColorTools#ycwcm(float, float, float, float)}
        -048         * @return an RGBA8888 int color
        -049         */
        -050        public static int toRGBA8888(final float packed)
        -051        {
        -052                final int decoded = NumberUtils.floatToRawIntBits(packed), y = (decoded & 0xff),
        -053                                cw = ((decoded >>> 7 & 0x1fe) - 0xff),
        -054                                cm = (((decoded >>> 15 & 0x1fe) - 0xff) >> 1);
        -055                return Math.min(Math.max(y + (cw * 5 >> 3) - cm, 0), 0xFF) << 24
        -056                                | Math.min(Math.max(y - (cw * 3 >> 3) + cm, 0), 0xFF) << 16
        -057                                | Math.min(Math.max(y - (cw * 3 >> 3) - cm, 0), 0xFF) << 8
        -058                                | (decoded & 0xfe000000) >>> 24 | decoded >>> 31;
        -059        }
        -060
        -061        /**
        -062         * Converts a packed float color in the format produced by {@link ColorTools#ycwcm(float, float, float, float)}
        -063         * to a packed float in RGBA format.
        -064         * This format of float can be used with the standard SpriteBatch and in some other places in libGDX.
        -065         * @param packed a packed float color, as produced by {@link ColorTools#ycwcm(float, float, float, float)}
        -066         * @return a packed float color as RGBA
        -067         */
        -068        public static float toRGBA(final float packed)
        -069        {
        -070                final int decoded = NumberUtils.floatToRawIntBits(packed), y = (decoded & 0xff),
        -071                                cw = ((decoded >>> 7 & 0x1fe) - 0xff),
        -072                                cm = (((decoded >>> 15 & 0x1fe) - 0xff) >> 1);
        -073                return NumberUtils.intBitsToFloat(Math.min(Math.max(y + (cw * 5 >> 3) - cm, 0), 0xFF)
        -074                                | Math.min(Math.max(y - (cw * 3 >> 3) + cm, 0), 0xFF) << 8
        -075                                | Math.min(Math.max(y - (cw * 3 >> 3) - cm, 0), 0xFF) << 16
        -076                                | (decoded & 0xfe000000));
        -077        }
        -078
        -079        /**
        -080         * Takes a color encoded as an RGBA8888 int and converts to a packed float in the YCwCm this uses.
        -081         * @param rgba an int with the channels (in order) red, green, blue, alpha; should have 8 bits per channel
        -082         * @return a packed float as YCwCm, which this class can use
        -083         */
        -084        public static float fromRGBA8888(final int rgba) {
        -085                return NumberUtils.intBitsToFloat(((rgba >>> 24) * 3 + (rgba >>> 16 & 0xFF) * 4 + (rgba >>> 8 & 0xFF) >> 3)
        -086                                | (0xFF + (rgba >>> 24) - (rgba >>> 8 & 0xFF) & 0x1FE) << 7
        -087                                | (0xFF + (rgba >>> 16 & 0xFF) - (rgba >>> 8 & 0xFF) & 0x1FE) << 15
        -088                                | (rgba & 0xFE) << 24);
        -089        }
        -090
        -091        /**
        -092         * Takes a color encoded as an RGBA8888 packed float and converts to a packed float in the YCwCm this uses.
        -093         * @param packed a packed float in RGBA8888 format, with A in the MSB and R in the LSB
        -094         * @return a packed float as YCwCm, which this class can use
        -095         */
        -096        public static float fromRGBA(final float packed) {
        -097                final int rgba = NumberUtils.floatToRawIntBits(packed);
        -098                return NumberUtils.intBitsToFloat(((rgba & 0xFF) * 3 + (rgba >>> 8 & 0xFF) * 4 + (rgba >>> 16 & 0xFF) >> 3)
        -099                                | (0xFF + (rgba & 0xFF) - (rgba >>> 16 & 0xFF) & 0x1FE) << 7
        -100                                | (0xFF + (rgba >>> 8 & 0xFF) - (rgba >>> 16 & 0xFF) & 0x1FE) << 15
        -101                                | (rgba >>> 24 & 0xFE) << 24);
        -102        }
        -103
        -104        /**
        -105         * Takes a libGDX Color that uses RGBA8888 channels and converts to a packed float in the YCwCm this uses.
        -106         * @param color a libGDX RGBA8888 Color
        -107         * @return a packed float as YCwCm, which this class can use
        -108         */
        -109        public static float fromColor(final Color color) {
        -110                return NumberUtils.intBitsToFloat((int) (255 * (color.r * 0x3p-3f + color.g * 0x4p-3f + color.b * 0x1p-3f)) & 0xFF
        -111                                                | (int)((color.r - color.b + 1f) * 127.5f) << 8 & 0xFF00
        -112                                                | (int)((color.g - color.b + 1f) * 127.5f) << 16 & 0xFF0000
        -113                                                | ((int)(color.a * 255f) << 24 & 0xFE000000));
        -114        }
        -115
        -116        /**
        -117         * Takes RGBA components from 0.0 to 1.0 each and converts to a packed float in the YCwCm this uses.
        -118         * @param r red, from 0.0 to 1.0 (both inclusive)
        -119         * @param g green, from 0.0 to 1.0 (both inclusive)
        -120         * @param b blue, from 0.0 to 1.0 (both inclusive)
        -121         * @param a alpha, from 0.0 to 1.0 (both inclusive)
        -122         * @return a packed float as YCwCm, which this class can use
        -123         */
        -124        public static float fromRGBA(final float r, final float g, final float b, final float a) {
        -125                return NumberUtils.intBitsToFloat((int) (255 * (r * 0.375f + g * 0.5f + b * 0.125f)) & 0xFF
        -126                                                | (int)((r - b + 1f) * 127.5f) << 8 & 0xFF00
        -127                                                | (int)((g - b + 1f) * 127.5f) << 16 & 0xFF0000
        -128                                                | ((int)(a * 255f) << 24 & 0xFE000000));
        -129        }
        -130
        -131        /**
        -132         * Gets the red channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
        -133         * @param encoded a color as a packed float that can be obtained by {@link #ycwcm(float, float, float, float)}
        -134         * @return an int from 0 to 255, inclusive, representing the red channel value of the given encoded color
        -135         */
        -136        public static int redInt(final float encoded)
        -137        {
        -138                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        -139                return (decoded & 0xff) + (((decoded >>> 7 & 0x1fe) - 0xff) * 5 >>> 4) - (((decoded >>> 15 & 0x1fe) - 0xff) >>> 2);
        -140        }
        -141
        -142        /**
        -143         * Gets the green channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
        -144         * @param encoded a color as a packed float that can be obtained by {@link #ycwcm(float, float, float, float)}
        -145         * @return an int from 0 to 255, inclusive, representing the green channel value of the given encoded color
        -146         */
        -147        public static int greenInt(final float encoded)
        -148        {
        -149                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        -150                return (decoded & 0xff) - (((decoded >>> 7 & 0x1fe) - 0xff) * 3 >> 4) + (((decoded >>> 15 & 0x1fe) - 0xff) >> 2);
        -151        }
        -152
        -153        /**
        -154         * Gets the blue channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
        -155         * @param encoded a color as a packed float that can be obtained by {@link #ycwcm(float, float, float, float)}
        -156         * @return an int from 0 to 255, inclusive, representing the blue channel value of the given encoded color
        +008import com.github.tommyettinger.colorful.oklab.ColorfulBatch;
        +009
        +010import java.util.Random;
        +011
        +012/**
        +013 * Contains code for manipulating colors as {@code int}, packed {@code float}, and {@link Color} values in the YCwCm
        +014 * color space.
        +015 */
        +016public class ColorTools {
        +017        /**
        +018         * Gets a packed float representation of a color given as 4 float components, here, Y (luma or lightness), Cw
        +019         * (chromatic warmth), Cm (chromatic mildness), and A (alpha or opacity). As long as you use a shader with
        +020         * {@link Shaders#fragmentShader} as its shader, colors passed with
        +021         * {@link com.badlogic.gdx.graphics.g2d.Batch#setPackedColor(float)} will be interpreted as YCwCm.
        +022         * Luma should be between 0 and 1, inclusive, with 0 used for very dark colors (almost only black), and 1 used for
        +023         * very light colors (almost only white). The two chroma values range from 0.0 to 1.0, and there's some aesthetic
        +024         * value in changing just one chroma value. When warm is high and mild is low, the color is more reddish, when both
        +025         * are low it is more bluish, when mild is high and warm is low, the color tends to be greenish, and when both are
        +026         * high it tends to be brown or yellow. When warm and mild are both near 0.5f, the color is closer to gray.  Alpha
        +027         * is the multiplicative opacity of the color, and acts like RGBA's alpha.
        +028         * <br>
        +029         * This method bit-masks the resulting color's byte values, so any values can technically be given to this as luma,
        +030         * warm, and mild, but they will only be reversible from the returned float color to the original Y, Cw, and Cm
        +031         * values if the original values were a valid YCwCm color and not an "imaginary color." {@link #fromRGBA(float)}
        +032         * should always produce a valid YCwCm color.
        +033         *
        +034         * @param luma       0f to 1f, luma or Y component of YCwCm, with 0.5f meaning "no change" and 1f brightening
        +035         * @param warm       0f to 1f, "chroma warm" or Cw component of YCwCm, with 1f more red or yellow
        +036         * @param mild       0f to 1f, "chroma mild" or Cm component of YCwCm, with 1f more green or yellow
        +037         * @param alpha      0f to 1f, 0f makes the color transparent and 1f makes it opaque 
        +038         * @return a float encoding a color with the given properties
        +039         */
        +040        public static float ycwcm(float luma, float warm, float mild, float alpha) {
        +041                return NumberUtils.intBitsToFloat(((int) (alpha * 255) << 24 & 0xFE000000) | ((int) (mild * 255) << 16 & 0xFF0000)
        +042                                | ((int) (warm * 255) << 8 & 0xFF00) | ((int) (luma * 255) & 0xFF));
        +043        }
        +044
        +045        /**
        +046         * Converts a packed float color in the format produced by {@link ColorTools#ycwcm(float, float, float, float)} to an RGBA8888 int.
        +047         * This format of int can be used with Pixmap and in some other places in libGDX.
        +048         * @param packed a packed float color, as produced by {@link ColorTools#ycwcm(float, float, float, float)}
        +049         * @return an RGBA8888 int color
        +050         */
        +051        public static int toRGBA8888(final float packed)
        +052        {
        +053                final int decoded = NumberUtils.floatToRawIntBits(packed), y = (decoded & 0xff),
        +054                                cw = ((decoded >>> 7 & 0x1fe) - 0xff),
        +055                                cm = (((decoded >>> 15 & 0x1fe) - 0xff) >> 1);
        +056                return Math.min(Math.max(y + (cw * 5 >> 3) - cm, 0), 0xFF) << 24
        +057                                | Math.min(Math.max(y - (cw * 3 >> 3) + cm, 0), 0xFF) << 16
        +058                                | Math.min(Math.max(y - (cw * 3 >> 3) - cm, 0), 0xFF) << 8
        +059                                | (decoded & 0xfe000000) >>> 24 | decoded >>> 31;
        +060        }
        +061
        +062        /**
        +063         * Writes a YCwCm-format packed float color (the format produced by {@link ColorTools#ycwcm(float, float, float, float)})
        +064         * into an RGBA8888 Color as used by libGDX (called {@code editing}).
        +065         * @param editing a libGDX color that will be filled in-place with an RGBA conversion of {@code packed}
        +066         * @param packed a packed float color, as produced by {@link ColorTools#ycwcm(float, float, float, float)}
        +067         * @return an RGBA8888 int color
        +068         */
        +069        public static Color toColor(Color editing, final float packed)
        +070        {
        +071                final int decoded = NumberUtils.floatToRawIntBits(packed);
        +072                editing.set(
        +073                                Math.min(Math.max((decoded & 0xff) * 0x1.010102p-8f + ((decoded >>> 8 & 0xff) - 127.5f) * (0x1.414142p-9f) - ((decoded >>> 16 & 0xff) - 127.5f) * 0x1.010102p-9f, 0f), 1f),
        +074                                Math.min(Math.max((decoded & 0xff) * 0x1.010102p-8f - (((decoded >>> 8 & 0xff) - 127.5f) * 0x1.818184p-10f) + ((decoded >>> 16 & 0xff) - 127.5f) * 0x1.010102p-9f, 0f), 1f),
        +075                                Math.min(Math.max((decoded & 0xff) * 0x1.010102p-8f - (((decoded >>> 8 & 0xff) - 127.5f) * 0x1.818184p-10f) - ((decoded >>> 16 & 0xff) - 127.5f) * 0x1.010102p-9f, 0f), 1f),
        +076                                ((decoded & 0xfe000000) >>> 24) * 0.003937008f);
        +077                return editing;
        +078        }
        +079
        +080        /**
        +081         * Writes a YCwCm-format packed float color (the format produced by {@link ColorTools#ycwcm(float, float, float, float)})
        +082         * into a YCwCm-format Color called {@code editing}. This is mostly useful if the rest of your application expects
        +083         * colors in YCwCm format, such as because you use {@link Shaders#fragmentShaderOklab} or {@link ColorfulBatch}.
        +084         * <br>
        +085         * Internally, this simply calls {@link Color#abgr8888ToColor(Color, float)} and returns the edited Color.
        +086         * @param editing a libGDX Color that will be filled in-place with the color {@code ycwcm}, unchanged from its color space
        +087         * @param ycwcm a packed float color, as produced by {@link ColorTools#ycwcm(float, float, float, float)}
        +088         * @return an RGBA8888 int color
        +089         */
        +090        public static Color toYCwCmColor(Color editing, final float ycwcm){
        +091                Color.abgr8888ToColor(editing, ycwcm);
        +092                return editing;
        +093        }
        +094
        +095        /**
        +096         * Converts a packed float color in the format produced by {@link ColorTools#ycwcm(float, float, float, float)}
        +097         * to a packed float in RGBA format.
        +098         * This format of float can be used with the standard SpriteBatch and in some other places in libGDX.
        +099         * @param packed a packed float color, as produced by {@link ColorTools#ycwcm(float, float, float, float)}
        +100         * @return a packed float color as RGBA
        +101         */
        +102        public static float toRGBA(final float packed)
        +103        {
        +104                final int decoded = NumberUtils.floatToRawIntBits(packed), y = (decoded & 0xff),
        +105                                cw = ((decoded >>> 7 & 0x1fe) - 0xff),
        +106                                cm = (((decoded >>> 15 & 0x1fe) - 0xff) >> 1);
        +107                return NumberUtils.intBitsToFloat(Math.min(Math.max(y + (cw * 5 >> 3) - cm, 0), 0xFF)
        +108                                | Math.min(Math.max(y - (cw * 3 >> 3) + cm, 0), 0xFF) << 8
        +109                                | Math.min(Math.max(y - (cw * 3 >> 3) - cm, 0), 0xFF) << 16
        +110                                | (decoded & 0xfe000000));
        +111        }
        +112
        +113        /**
        +114         * Takes a color encoded as an RGBA8888 int and converts to a packed float in the YCwCm this uses.
        +115         * @param rgba an int with the channels (in order) red, green, blue, alpha; should have 8 bits per channel
        +116         * @return a packed float as YCwCm, which this class can use
        +117         */
        +118        public static float fromRGBA8888(final int rgba) {
        +119                return NumberUtils.intBitsToFloat(((rgba >>> 24) * 3 + (rgba >>> 16 & 0xFF) * 4 + (rgba >>> 8 & 0xFF) >> 3)
        +120                                | (0xFF + (rgba >>> 24) - (rgba >>> 8 & 0xFF) & 0x1FE) << 7
        +121                                | (0xFF + (rgba >>> 16 & 0xFF) - (rgba >>> 8 & 0xFF) & 0x1FE) << 15
        +122                                | (rgba & 0xFE) << 24);
        +123        }
        +124
        +125        /**
        +126         * Takes a color encoded as an RGBA8888 packed float and converts to a packed float in the YCwCm this uses.
        +127         * @param packed a packed float in RGBA8888 format, with A in the MSB and R in the LSB
        +128         * @return a packed float as YCwCm, which this class can use
        +129         */
        +130        public static float fromRGBA(final float packed) {
        +131                final int rgba = NumberUtils.floatToRawIntBits(packed);
        +132                return NumberUtils.intBitsToFloat(((rgba & 0xFF) * 3 + (rgba >>> 8 & 0xFF) * 4 + (rgba >>> 16 & 0xFF) >> 3)
        +133                                | (0xFF + (rgba & 0xFF) - (rgba >>> 16 & 0xFF) & 0x1FE) << 7
        +134                                | (0xFF + (rgba >>> 8 & 0xFF) - (rgba >>> 16 & 0xFF) & 0x1FE) << 15
        +135                                | (rgba >>> 24 & 0xFE) << 24);
        +136        }
        +137
        +138        /**
        +139         * Takes a libGDX Color that uses RGBA8888 channels and converts to a packed float in the YCwCm this uses.
        +140         * @param color a libGDX RGBA8888 Color
        +141         * @return a packed float as YCwCm, which this class can use
        +142         */
        +143        public static float fromColor(final Color color) {
        +144                return NumberUtils.intBitsToFloat((int) (255 * (color.r * 0x3p-3f + color.g * 0x4p-3f + color.b * 0x1p-3f)) & 0xFF
        +145                                                | (int)((color.r - color.b + 1f) * 127.5f) << 8 & 0xFF00
        +146                                                | (int)((color.g - color.b + 1f) * 127.5f) << 16 & 0xFF0000
        +147                                                | ((int)(color.a * 255f) << 24 & 0xFE000000));
        +148        }
        +149
        +150        /**
        +151         * Takes RGBA components from 0.0 to 1.0 each and converts to a packed float in the YCwCm this uses.
        +152         * @param r red, from 0.0 to 1.0 (both inclusive)
        +153         * @param g green, from 0.0 to 1.0 (both inclusive)
        +154         * @param b blue, from 0.0 to 1.0 (both inclusive)
        +155         * @param a alpha, from 0.0 to 1.0 (both inclusive)
        +156         * @return a packed float as YCwCm, which this class can use
         157         */
        -158        public static int blueInt(final float encoded)
        -159        {
        -160                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        -161                return (decoded & 0xff) - (((decoded >>> 7 & 0x1fe) - 0xff) * 3 >> 4) - (((decoded >>> 15 & 0x1fe) - 0xff) >> 2);
        -162        }
        -163
        -164        /**
        -165         * Gets the alpha channel value of the given encoded color, as an even int ranging from 0 to 254, inclusive. Because
        -166         * of how alpha is stored in libGDX, no odd-number values are possible for alpha.
        +158        public static float fromRGBA(final float r, final float g, final float b, final float a) {
        +159                return NumberUtils.intBitsToFloat((int) (255 * (r * 0.375f + g * 0.5f + b * 0.125f)) & 0xFF
        +160                                                | (int)((r - b + 1f) * 127.5f) << 8 & 0xFF00
        +161                                                | (int)((g - b + 1f) * 127.5f) << 16 & 0xFF0000
        +162                                                | ((int)(a * 255f) << 24 & 0xFE000000));
        +163        }
        +164
        +165        /**
        +166         * Gets the red channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
         167         * @param encoded a color as a packed float that can be obtained by {@link #ycwcm(float, float, float, float)}
        -168         * @return an even int from 0 to 254, inclusive, representing the alpha channel value of the given encoded color
        +168         * @return an int from 0 to 255, inclusive, representing the red channel value of the given encoded color
         169         */
        -170        public static int alphaInt(final float encoded)
        +170        public static int redInt(final float encoded)
         171        {
        -172                return (NumberUtils.floatToRawIntBits(encoded) & 0xfe000000) >>> 24;
        -173        }
        -174
        -175        /**
        -176         * Gets the red channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
        -177         * @param encoded a color as a packed float that can be obtained by {@link #ycwcm(float, float, float, float)}
        -178         * @return a float from 0.0f to 1.0f, inclusive, representing the red channel value of the given encoded color
        -179         */
        -180        public static float red(final float encoded)
        -181        {
        -182                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        -183                return Math.min(Math.max((decoded & 0xff) * 0x1.010102p-8f + ((decoded >>> 8 & 0xff) - 127.5f) * (0x1.414142p-9f) - ((decoded >>> 16 & 0xff) - 127.5f) * 0x1.010102p-9f, 0f), 1f);
        -184        }
        -185
        -186        /**
        -187         * Gets the green channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
        -188         * @param encoded a color as a packed float that can be obtained by {@link #ycwcm(float, float, float, float)}
        -189         * @return a float from 0.0f to 1.0f, inclusive, representing the green channel value of the given encoded color
        -190         */
        -191        public static float green(final float encoded)
        -192        {
        -193                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        -194                return Math.min(Math.max((decoded & 0xff) * 0x1.010102p-8f - (((decoded >>> 8 & 0xff) - 127.5f) * 0x1.818184p-10f) + ((decoded >>> 16 & 0xff) - 127.5f) * 0x1.010102p-9f, 0f), 1f);
        -195        }
        -196
        -197        /**
        -198         * Gets the blue channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
        -199         * @param encoded a color as a packed float that can be obtained by {@link #ycwcm(float, float, float, float)}
        -200         * @return a float from 0.0f to 1.0f, inclusive, representing the blue channel value of the given encoded color
        -201         */
        -202        public static float blue(final float encoded)
        -203        {
        -204                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        -205                return Math.min(Math.max((decoded & 0xff) * 0x1.010102p-8f - (((decoded >>> 8 & 0xff) - 127.5f) * 0x1.818184p-10f) - ((decoded >>> 16 & 0xff) - 127.5f) * 0x1.010102p-9f, 0f), 1f);
        -206        }
        -207
        -208        /**
        -209         * Gets the alpha channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
        -210         * @param encoded a color as a packed float that can be obtained by {@link #ycwcm(float, float, float, float)}
        -211         * @return a float from 0.0f to 1.0f, inclusive, representing the alpha channel value of the given encoded color
        -212         */
        -213        public static float alpha(final float encoded)
        -214        {
        -215                return ((NumberUtils.floatToRawIntBits(encoded) & 0xfe000000) >>> 24) * 0.003937008f;
        -216        }
        -217
        -218
        -219        /**
        -220         * Gets a color as a YCwCm packed float given floats representing hue, saturation, lightness, and opacity.
        -221         * All parameters should normally be between 0 and 1 inclusive, though any hue is tolerated (precision loss may
        -222         * affect the color if the hue is too large). A hue of 0 is red, progressively higher hue values go to orange,
        -223         * yellow, green, blue, and purple before wrapping around to red as it approaches 1. A saturation of 0 is grayscale,
        -224         * a saturation of 1 is brightly colored, and values close to 1 will usually appear more distinct than values close
        -225         * to 0, especially if the hue is different. A lightness of 0.001f or less is always black (also using a shortcut if
        -226         * this is the case, respecting opacity), while a lightness of 1f is white. Very bright colors are mostly in a band
        -227         * of high-saturation where lightness is 0.5f.
        -228         *
        -229         * @param hue        0f to 1f, color wheel position
        -230         * @param saturation 0f to 1f, 0f is grayscale and 1f is brightly colored
        -231         * @param lightness  0f to 1f, 0f is black and 1f is white
        -232         * @param opacity    0f to 1f, 0f is fully transparent and 1f is opaque
        -233         * @return a float encoding a color with the given properties
        -234         */
        -235        public static float floatGetHSL(float hue, float saturation, float lightness, float opacity) {
        -236                if (lightness <= 0.001f) {
        -237                        return NumberUtils.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x7F7F00);
        -238                } else {
        -239                        return fromRGBA(FloatColors.hsl2rgb(hue, saturation, lightness, opacity));
        -240                }
        -241        }
        -242
        -243        /**
        -244         * Gets the saturation of the given encoded color, as a float ranging from 0.0f to 1.0f, inclusive.
        -245         * @param encoded a color as a packed float that can be obtained by {@link #ycwcm(float, float, float, float)}
        -246         * @return the saturation of the color from 0.0 (a grayscale color; inclusive) to 1.0 (a bright color, inclusive)
        -247         */
        -248        public static float saturation(final float encoded) {
        -249                final int decoded = NumberUtils.floatToRawIntBits(encoded), lu = (decoded & 0xff),
        -250                                cw = ((decoded >>> 7 & 0x1fe) - 0xff),
        -251                                cm = (((decoded >>> 15 & 0x1fe) - 0xff) >> 1);
        -252                final float r = Math.min(Math.max(lu + (cw * 5 >> 3) - cm, 0), 0xFF) * 0x1.010102p-8f;
        -253                final float g = Math.min(Math.max(lu - (cw * 3 >> 3) + cm, 0), 0xFF) * 0x1.010102p-8f;
        -254                final float b =  Math.min(Math.max(lu - (cw * 3 >> 3) - cm, 0), 0xFF) * 0x1.010102p-8f;
        -255                float x, y, w;
        -256                if(g < b) {
        -257                        x = b;
        -258                        y = g;
        -259                }
        -260                else {
        -261                        x = g;
        -262                        y = b;
        -263                }
        -264                if(r < x) {
        -265                        w = r;
        -266                }
        -267                else {
        -268                        w = x;
        -269                        x = r;
        -270                }
        -271                float d = x - Math.min(w, y);
        -272                float li = x * (1f - 0.5f * d / (x + 1e-10f));
        -273                return (x - li) / (Math.min(li, 1f - li) + 1e-10f);
        -274        }
        -275
        -276        public static float lightness(final float encoded) {
        -277                final int decoded = NumberUtils.floatToRawIntBits(encoded), lu = (decoded & 0xff),
        -278                                cw = ((decoded >>> 7 & 0x1fe) - 0xff),
        -279                                cm = (((decoded >>> 15 & 0x1fe) - 0xff) >> 1);
        -280                final float r = Math.min(Math.max(lu + (cw * 5 >> 3) - cm, 0), 0xFF) * 0x1.010102p-8f;
        -281                final float g = Math.min(Math.max(lu - (cw * 3 >> 3) + cm, 0), 0xFF) * 0x1.010102p-8f;
        -282                final float b =  Math.min(Math.max(lu - (cw * 3 >> 3) - cm, 0), 0xFF) * 0x1.010102p-8f;
        -283                float x, y, w;
        -284                if(g < b) {
        -285                        x = b;
        -286                        y = g;
        -287                }
        -288                else {
        -289                        x = g;
        -290                        y = b;
        -291                }
        -292                if(r < x) {
        -293                        w = r;
        -294                }
        -295                else {
        -296                        w = x;
        -297                        x = r;
        -298                }
        -299                float d = x - Math.min(w, y);
        -300                return x * (1f - 0.5f * d / (x + 1e-10f));
        -301        }
        -302
        -303        /**
        -304         * Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased)
        -305         * to 1f (exclusive, red and approaching purple if decreased).
        -306         * @param encoded a color as a packed float that can be obtained by {@link #ycwcm(float, float, float, float)}
        -307         * @return The hue of the color from 0.0 (red, inclusive) towards orange, then yellow, and
        -308         * eventually to purple before looping back to almost the same red (1.0, exclusive)
        -309         */
        -310        public static float hue(final float encoded) {
        +172                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        +173                return (decoded & 0xff) + (((decoded >>> 7 & 0x1fe) - 0xff) * 5 >>> 4) - (((decoded >>> 15 & 0x1fe) - 0xff) >>> 2);
        +174        }
        +175
        +176        /**
        +177         * Gets the green channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
        +178         * @param encoded a color as a packed float that can be obtained by {@link #ycwcm(float, float, float, float)}
        +179         * @return an int from 0 to 255, inclusive, representing the green channel value of the given encoded color
        +180         */
        +181        public static int greenInt(final float encoded)
        +182        {
        +183                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        +184                return (decoded & 0xff) - (((decoded >>> 7 & 0x1fe) - 0xff) * 3 >> 4) + (((decoded >>> 15 & 0x1fe) - 0xff) >> 2);
        +185        }
        +186
        +187        /**
        +188         * Gets the blue channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
        +189         * @param encoded a color as a packed float that can be obtained by {@link #ycwcm(float, float, float, float)}
        +190         * @return an int from 0 to 255, inclusive, representing the blue channel value of the given encoded color
        +191         */
        +192        public static int blueInt(final float encoded)
        +193        {
        +194                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        +195                return (decoded & 0xff) - (((decoded >>> 7 & 0x1fe) - 0xff) * 3 >> 4) - (((decoded >>> 15 & 0x1fe) - 0xff) >> 2);
        +196        }
        +197
        +198        /**
        +199         * Gets the alpha channel value of the given encoded color, as an even int ranging from 0 to 254, inclusive. Because
        +200         * of how alpha is stored in libGDX, no odd-number values are possible for alpha.
        +201         * @param encoded a color as a packed float that can be obtained by {@link #ycwcm(float, float, float, float)}
        +202         * @return an even int from 0 to 254, inclusive, representing the alpha channel value of the given encoded color
        +203         */
        +204        public static int alphaInt(final float encoded)
        +205        {
        +206                return (NumberUtils.floatToRawIntBits(encoded) & 0xfe000000) >>> 24;
        +207        }
        +208
        +209        /**
        +210         * Gets the red channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
        +211         * @param encoded a color as a packed float that can be obtained by {@link #ycwcm(float, float, float, float)}
        +212         * @return a float from 0.0f to 1.0f, inclusive, representing the red channel value of the given encoded color
        +213         */
        +214        public static float red(final float encoded)
        +215        {
        +216                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        +217                return Math.min(Math.max((decoded & 0xff) * 0x1.010102p-8f + ((decoded >>> 8 & 0xff) - 127.5f) * (0x1.414142p-9f) - ((decoded >>> 16 & 0xff) - 127.5f) * 0x1.010102p-9f, 0f), 1f);
        +218        }
        +219
        +220        /**
        +221         * Gets the green channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
        +222         * @param encoded a color as a packed float that can be obtained by {@link #ycwcm(float, float, float, float)}
        +223         * @return a float from 0.0f to 1.0f, inclusive, representing the green channel value of the given encoded color
        +224         */
        +225        public static float green(final float encoded)
        +226        {
        +227                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        +228                return Math.min(Math.max((decoded & 0xff) * 0x1.010102p-8f - (((decoded >>> 8 & 0xff) - 127.5f) * 0x1.818184p-10f) + ((decoded >>> 16 & 0xff) - 127.5f) * 0x1.010102p-9f, 0f), 1f);
        +229        }
        +230
        +231        /**
        +232         * Gets the blue channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
        +233         * @param encoded a color as a packed float that can be obtained by {@link #ycwcm(float, float, float, float)}
        +234         * @return a float from 0.0f to 1.0f, inclusive, representing the blue channel value of the given encoded color
        +235         */
        +236        public static float blue(final float encoded)
        +237        {
        +238                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        +239                return Math.min(Math.max((decoded & 0xff) * 0x1.010102p-8f - (((decoded >>> 8 & 0xff) - 127.5f) * 0x1.818184p-10f) - ((decoded >>> 16 & 0xff) - 127.5f) * 0x1.010102p-9f, 0f), 1f);
        +240        }
        +241
        +242        /**
        +243         * Gets the alpha channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
        +244         * @param encoded a color as a packed float that can be obtained by {@link #ycwcm(float, float, float, float)}
        +245         * @return a float from 0.0f to 1.0f, inclusive, representing the alpha channel value of the given encoded color
        +246         */
        +247        public static float alpha(final float encoded)
        +248        {
        +249                return ((NumberUtils.floatToRawIntBits(encoded) & 0xfe000000) >>> 24) * 0.003937008f;
        +250        }
        +251
        +252
        +253        /**
        +254         * Gets a color as a YCwCm packed float given floats representing hue, saturation, lightness, and opacity.
        +255         * All parameters should normally be between 0 and 1 inclusive, though any hue is tolerated (precision loss may
        +256         * affect the color if the hue is too large). A hue of 0 is red, progressively higher hue values go to orange,
        +257         * yellow, green, blue, and purple before wrapping around to red as it approaches 1. A saturation of 0 is grayscale,
        +258         * a saturation of 1 is brightly colored, and values close to 1 will usually appear more distinct than values close
        +259         * to 0, especially if the hue is different. A lightness of 0.001f or less is always black (also using a shortcut if
        +260         * this is the case, respecting opacity), while a lightness of 1f is white. Very bright colors are mostly in a band
        +261         * of high-saturation where lightness is 0.5f.
        +262         *
        +263         * @param hue        0f to 1f, color wheel position
        +264         * @param saturation 0f to 1f, 0f is grayscale and 1f is brightly colored
        +265         * @param lightness  0f to 1f, 0f is black and 1f is white
        +266         * @param opacity    0f to 1f, 0f is fully transparent and 1f is opaque
        +267         * @return a float encoding a color with the given properties
        +268         */
        +269        public static float floatGetHSL(float hue, float saturation, float lightness, float opacity) {
        +270                if (lightness <= 0.001f) {
        +271                        return NumberUtils.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x7F7F00);
        +272                } else {
        +273                        return fromRGBA(FloatColors.hsl2rgb(hue, saturation, lightness, opacity));
        +274                }
        +275        }
        +276
        +277        /**
        +278         * Gets the saturation of the given encoded color, as a float ranging from 0.0f to 1.0f, inclusive.
        +279         * @param encoded a color as a packed float that can be obtained by {@link #ycwcm(float, float, float, float)}
        +280         * @return the saturation of the color from 0.0 (a grayscale color; inclusive) to 1.0 (a bright color, inclusive)
        +281         */
        +282        public static float saturation(final float encoded) {
        +283                final int decoded = NumberUtils.floatToRawIntBits(encoded), lu = (decoded & 0xff),
        +284                                cw = ((decoded >>> 7 & 0x1fe) - 0xff),
        +285                                cm = (((decoded >>> 15 & 0x1fe) - 0xff) >> 1);
        +286                final float r = Math.min(Math.max(lu + (cw * 5 >> 3) - cm, 0), 0xFF) * 0x1.010102p-8f;
        +287                final float g = Math.min(Math.max(lu - (cw * 3 >> 3) + cm, 0), 0xFF) * 0x1.010102p-8f;
        +288                final float b =  Math.min(Math.max(lu - (cw * 3 >> 3) - cm, 0), 0xFF) * 0x1.010102p-8f;
        +289                float x, y, w;
        +290                if(g < b) {
        +291                        x = b;
        +292                        y = g;
        +293                }
        +294                else {
        +295                        x = g;
        +296                        y = b;
        +297                }
        +298                if(r < x) {
        +299                        w = r;
        +300                }
        +301                else {
        +302                        w = x;
        +303                        x = r;
        +304                }
        +305                float d = x - Math.min(w, y);
        +306                float li = x * (1f - 0.5f * d / (x + 1e-10f));
        +307                return (x - li) / (Math.min(li, 1f - li) + 1e-10f);
        +308        }
        +309
        +310        public static float lightness(final float encoded) {
         311                final int decoded = NumberUtils.floatToRawIntBits(encoded), lu = (decoded & 0xff),
         312                                cw = ((decoded >>> 7 & 0x1fe) - 0xff),
         313                                cm = (((decoded >>> 15 & 0x1fe) - 0xff) >> 1);
         314                final float r = Math.min(Math.max(lu + (cw * 5 >> 3) - cm, 0), 0xFF) * 0x1.010102p-8f;
         315                final float g = Math.min(Math.max(lu - (cw * 3 >> 3) + cm, 0), 0xFF) * 0x1.010102p-8f;
         316                final float b =  Math.min(Math.max(lu - (cw * 3 >> 3) - cm, 0), 0xFF) * 0x1.010102p-8f;
        -317                float x, y, z, w;
        +317                float x, y, w;
         318                if(g < b) {
         319                        x = b;
         320                        y = g;
        -321                        z = -1f;
        -322                        w = 2f / 3f;
        -323                }
        -324                else {
        -325                        x = g;
        -326                        y = b;
        -327                        z = 0f;
        -328                        w = -1f / 3f;
        -329                }
        -330                if(r < x) {
        -331                        z = w;
        -332                        w = r;
        -333                }
        -334                else {
        -335                        w = x;
        -336                        x = r;
        -337                }
        -338                float d = x - Math.min(w, y);
        -339                return Math.abs(z + (w - y) / (6f * d + 1e-10f));
        -340        }
        -341
        -342        /**
        -343         * The "luma" of the given packed float in YCwCm format, which is like its lightness; ranges from 0.0f to
        -344         * 1.0f . YCwCm is useful for modifications to colors:
        -345         * <ul>
        -346         *     <li>You can get a grayscale version of a color by setting Cw and Cm to 0.5,</li>
        -347         *     <li>You can desaturate by subtracting 0.5, multiplying Cw and Cm by a number between 0 and 1, and adding 0.5
        -348         *     afterwards,</li>
        -349         *     <li>you can oversaturate by subtracting 0.5, multiplying Cw and Cm by a number greater than 1, and adding 0.5
        -350         *     afterwards,</li>
        -351         *     <li>you can lighten or darken by increasing or decreasing luma,</li>
        -352         *     <li>and so on and so forth.</li>
        -353         * </ul>
        -354         * @param encoded a packed float
        -355         * @return the luma as a float from 0.0f to 1.0f
        -356         */
        -357        public static float luma(final float encoded)
        -358        {
        -359                return (NumberUtils.floatToRawIntBits(encoded) & 0xff) * 0x1.010102p-8f;
        -360//        final int bits = NumberUtils.floatToRawIntBits(encoded);
        -361//        return (bits & 0xFF) * 0x3p-11f + (bits >>> 8 & 0xFF) * 0x1p-9f + (bits >>> 16 & 0xFF) * 0x1p-11f;
        -362        }
        -363
        -364        /**
        -365         * The "chroma warm" of the given packed float in YCwCm format, which when combined with chroma mild describes the
        -366         * shade and saturation of a color; ranges from 0f to 1f . YCwCm is useful for modifications to colors:
        -367         * <ul>
        -368         *     <li>You can get a grayscale version of a color by setting Cw and Cm to 0.5,</li>
        -369         *     <li>You can desaturate by subtracting 0.5, multiplying Cw and Cm by a number between 0 and 1, and adding 0.5
        -370         *     afterwards,</li>
        -371         *     <li>you can oversaturate by subtracting 0.5, multiplying Cw and Cm by a number greater than 1, and adding 0.5
        -372         *     afterwards,</li>
        -373         *     <li>you can lighten or darken by increasing or decreasing luma,</li>
        -374         *     <li>and so on and so forth.</li>
        -375         * </ul>
        -376         * @param encoded a color encoded as a packed float, as by {@link #ycwcm(float, float, float, float)}
        -377         * @return the chroma warm as a float from 0f to 1f
        -378         */
        -379        public static float chromaWarm(final float encoded)
        -380        {
        -381                return ((NumberUtils.floatToRawIntBits(encoded) >>> 8 & 0xff)) * 0x1.010102p-8f;
        -382        }
        -383
        -384        /**
        -385         * The "chroma mild" of the given packed float in YCwCm format, which when combined with chroma warm describes the
        -386         * shade and saturation of a color; ranges from 0f to 1f .
        -387         * YCwCm is useful for modifications to colors:
        -388         * <ul>
        -389         *     <li>You can get a grayscale version of a color by setting Cw and Cm to 0.5,</li>
        -390         *     <li>You can desaturate by subtracting 0.5, multiplying Cw and Cm by a number between 0 and 1, and adding 0.5
        -391         *     afterwards,</li>
        -392         *     <li>you can oversaturate by subtracting 0.5, multiplying Cw and Cm by a number greater than 1, and adding 0.5
        -393         *     afterwards,</li>
        -394         *     <li>you can lighten or darken by increasing or decreasing luma,</li>
        -395         *     <li>and so on and so forth.</li>
        -396         * </ul>
        -397         * @param encoded a color encoded as a packed float, as by {@link #ycwcm(float, float, float, float)}
        -398         * @return the chroma mild as a float from 0f to 1f
        -399         */
        -400        public static float chromaMild(final float encoded)
        -401        {
        -402                return ((NumberUtils.floatToRawIntBits(encoded) >>> 16 & 0xff)) * 0x1.010102p-8f;
        -403        }
        -404
        -405        /**
        -406         * Gets a variation on the packed float color basis as another packed float that has its hue, saturation, lightness,
        -407         * and opacity adjusted by the specified amounts. Note that this edits the color in HSL space, not YCwCm! Takes
        -408         * floats representing the amounts of change to apply to hue, saturation, lightness, and opacity; these can be
        -409         * between -1f and 1f. Returns a float that can be used as a packed or encoded color with methods like
        -410         * {@link com.badlogic.gdx.graphics.g2d.Batch#setPackedColor(float)}. The float is likely to be different than the
        -411         * result of {@link #ycwcm(float, float, float, float)} unless hue, saturation, lightness, and opacity are all 0.
        -412         * This won't allocate any objects.
        -413         * <br>
        -414         * The parameters this takes all specify additive changes for a color component, clamping the final values so they
        -415         * can't go above 1 or below 0, with an exception for hue, which can rotate around if lower or higher hues would be
        -416         * used. As an example, if you give this 0.4f for saturation, and the current color has saturation 0.7f, then the
        -417         * resulting color will have 1f for saturation. If you gave this -0.1f for saturation and the current color again
        -418         * has saturation 0.7f, then resulting color will have 0.6f for saturation.
        -419         *
        -420         * @param basis      a packed float color that will be used as the starting point to make the next color
        -421         * @param hue        -1f to 1f, the hue change that can be applied to the new float color (not clamped, wraps)
        -422         * @param saturation -1f to 1f, the saturation change that can be applied to the new float color
        -423         * @param light      -1f to 1f, the light/brightness change that can be applied to the new float color
        -424         * @param opacity    -1f to 1f, the opacity/alpha change that can be applied to the new float color
        -425         * @return a float encoding a variation of basis with the given changes
        -426         */
        -427        public static float toEditedFloat(float basis, float hue, float saturation, float light, float opacity) {
        -428                final int e = NumberUtils.floatToRawIntBits(basis);
        -429                opacity = Math.min(Math.max(opacity + (e >>> 24 & 0xfe) * 0x1.020408p-8f, 0f), 1f);
        -430                if (light + (e & 0xff) * 0x1.010102p-8f <= 0.001f)
        -431                        return NumberUtils.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x7F7F00);
        -432                final int lu = (e & 0xff);
        -433                final int cw = ((e >>> 7 & 0x1fe) - 0xff);
        -434                final int cm = (((e >>> 15 & 0x1fe) - 0xff) >> 1);
        -435                final float r = Math.min(Math.max(lu + light + (cw * 0.625f) - cm, 0), 255f) * 0x1.010102p-8f;
        -436                final float g = Math.min(Math.max(lu + light - (cw * 0.375f) + cm, 0), 255f) * 0x1.010102p-8f;
        -437                final float b = Math.min(Math.max(lu + light - (cw * 0.375f) - cm, 0), 255f) * 0x1.010102p-8f;
        -438                float x, y, z, w;
        -439                if(g < b) {
        -440                        x = b;
        -441                        y = g;
        -442                        z = -1f;
        -443                        w = 2f / 3f;
        -444                }
        -445                else {
        -446                        x = g;
        -447                        y = b;
        -448                        z = 0f;
        -449                        w = -1f / 3f;
        -450                }
        -451                if(r < x) {
        -452                        z = w;
        -453                        w = r;
        -454                }
        -455                else {
        -456                        w = x;
        -457                        x = r;
        -458                }
        -459                final float d = x - Math.min(w, y);
        -460                final float lum = x * (1f - 0.5f * d / (x + 1e-10f));
        -461                hue += Math.abs(z + (w - y) / (6f * d + 1e-10f)) + 1f;
        -462                saturation += (x - lum) / (Math.min(lum, 1f - lum) + 1e-10f);
        -463                return fromRGBA(FloatColors.hsl2rgb(hue - (int)hue, Math.min(Math.max(saturation, 0f), 1f), lum, opacity));
        -464        }
        -465
        -466        /**
        -467         * Interpolates from the packed float color start towards white by change. While change should be between 0f (return
        -468         * start as-is) and 1f (return white), start should be a packed color, as from
        -469         * {@link #ycwcm(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
        -470         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
        -471         * white. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is.
        -472         * @see #darken(float, float) the counterpart method that darkens a float color
        -473         * @param start the starting color as a packed float
        -474         * @param change how much to go from start toward white, as a float between 0 and 1; higher means closer to white
        -475         * @return a packed float that represents a color between start and white
        -476         */
        -477        public static float lighten(final float start, final float change) {
        -478                final int s = NumberUtils.floatToRawIntBits(start), luma = s & 0xFF, other = s & 0xFEFFFF00;
        -479                return NumberUtils.intBitsToFloat(((int) (luma + (0xFF - luma) * change) & 0xFF) | other);
        -480        }
        -481
        -482        /**
        -483         * Interpolates from the packed float color start towards black by change. While change should be between 0f (return
        -484         * start as-is) and 1f (return black), start should be a packed color, as from
        -485         * {@link #ycwcm(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
        -486         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
        -487         * black. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is.
        -488         * @see #lighten(float, float) the counterpart method that lightens a float color
        -489         * @param start the starting color as a packed float
        -490         * @param change how much to go from start toward black, as a float between 0 and 1; higher means closer to black
        -491         * @return a packed float that represents a color between start and black
        -492         */
        -493        public static float darken(final float start, final float change) {
        -494                final int s = NumberUtils.floatToRawIntBits(start), luma = s & 0xFF, other = s & 0xFEFFFF00;
        -495                return NumberUtils.intBitsToFloat(((int) (luma * (1f - change)) & 0xFF) | other);
        -496        }
        -497
        -498        /**
        -499         * Interpolates from the packed float color start towards a warmer color (yellow to red) by change. While change
        -500         * should be between 0f (returnstart as-is) and 1f (return fully warmed), start should be a packed color, as from
        -501         * {@link #ycwcm(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors,
        -502         * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
        -503         * a warmer color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and luma of start
        -504         * as-is.
        -505         * @see #cool(float, float) the counterpart method that cools a float color
        -506         * @param start the starting color as a packed float
        -507         * @param change how much to warm start, as a float between 0 and 1; higher means a warmer result
        -508         * @return a packed float that represents a color between start and a warmer color
        -509         */
        -510        public static float warm(final float start, final float change) {
        -511                final int s = NumberUtils.floatToRawIntBits(start), warmth = s >>> 8 & 0xFF, other = s & 0xFEFF00FF;
        -512                return NumberUtils.intBitsToFloat(((int) (warmth + (0xFF - warmth) * change) << 8 & 0xFF) | other);
        -513        }
        -514
        -515        /**
        -516         * Interpolates from the packed float color start towards a cooler color (green to blue) by change. While change
        -517         * should be between 0f (return start as-is) and 1f (return fully cooled), start should be a packed color, as from
        -518         * {@link #ycwcm(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
        -519         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
        -520         * a cooler color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and luma of start
        -521         * as-is.
        -522         * @see #warm(float, float) the counterpart method that warms a float color
        +321                }
        +322                else {
        +323                        x = g;
        +324                        y = b;
        +325                }
        +326                if(r < x) {
        +327                        w = r;
        +328                }
        +329                else {
        +330                        w = x;
        +331                        x = r;
        +332                }
        +333                float d = x - Math.min(w, y);
        +334                return x * (1f - 0.5f * d / (x + 1e-10f));
        +335        }
        +336
        +337        /**
        +338         * Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased)
        +339         * to 1f (exclusive, red and approaching purple if decreased).
        +340         * @param encoded a color as a packed float that can be obtained by {@link #ycwcm(float, float, float, float)}
        +341         * @return The hue of the color from 0.0 (red, inclusive) towards orange, then yellow, and
        +342         * eventually to purple before looping back to almost the same red (1.0, exclusive)
        +343         */
        +344        public static float hue(final float encoded) {
        +345                final int decoded = NumberUtils.floatToRawIntBits(encoded), lu = (decoded & 0xff),
        +346                                cw = ((decoded >>> 7 & 0x1fe) - 0xff),
        +347                                cm = (((decoded >>> 15 & 0x1fe) - 0xff) >> 1);
        +348                final float r = Math.min(Math.max(lu + (cw * 5 >> 3) - cm, 0), 0xFF) * 0x1.010102p-8f;
        +349                final float g = Math.min(Math.max(lu - (cw * 3 >> 3) + cm, 0), 0xFF) * 0x1.010102p-8f;
        +350                final float b =  Math.min(Math.max(lu - (cw * 3 >> 3) - cm, 0), 0xFF) * 0x1.010102p-8f;
        +351                float x, y, z, w;
        +352                if(g < b) {
        +353                        x = b;
        +354                        y = g;
        +355                        z = -1f;
        +356                        w = 2f / 3f;
        +357                }
        +358                else {
        +359                        x = g;
        +360                        y = b;
        +361                        z = 0f;
        +362                        w = -1f / 3f;
        +363                }
        +364                if(r < x) {
        +365                        z = w;
        +366                        w = r;
        +367                }
        +368                else {
        +369                        w = x;
        +370                        x = r;
        +371                }
        +372                float d = x - Math.min(w, y);
        +373                return Math.abs(z + (w - y) / (6f * d + 1e-10f));
        +374        }
        +375
        +376        /**
        +377         * The "luma" of the given packed float in YCwCm format, which is like its lightness; ranges from 0.0f to
        +378         * 1.0f . YCwCm is useful for modifications to colors:
        +379         * <ul>
        +380         *     <li>You can get a grayscale version of a color by setting Cw and Cm to 0.5,</li>
        +381         *     <li>You can desaturate by subtracting 0.5, multiplying Cw and Cm by a number between 0 and 1, and adding 0.5
        +382         *     afterwards,</li>
        +383         *     <li>you can oversaturate by subtracting 0.5, multiplying Cw and Cm by a number greater than 1, and adding 0.5
        +384         *     afterwards,</li>
        +385         *     <li>you can lighten or darken by increasing or decreasing luma,</li>
        +386         *     <li>and so on and so forth.</li>
        +387         * </ul>
        +388         * @param encoded a packed float
        +389         * @return the luma as a float from 0.0f to 1.0f
        +390         */
        +391        public static float luma(final float encoded)
        +392        {
        +393                return (NumberUtils.floatToRawIntBits(encoded) & 0xff) * 0x1.010102p-8f;
        +394//        final int bits = NumberUtils.floatToRawIntBits(encoded);
        +395//        return (bits & 0xFF) * 0x3p-11f + (bits >>> 8 & 0xFF) * 0x1p-9f + (bits >>> 16 & 0xFF) * 0x1p-11f;
        +396        }
        +397
        +398        /**
        +399         * The "chroma warm" of the given packed float in YCwCm format, which when combined with chroma mild describes the
        +400         * shade and saturation of a color; ranges from 0f to 1f . YCwCm is useful for modifications to colors:
        +401         * <ul>
        +402         *     <li>You can get a grayscale version of a color by setting Cw and Cm to 0.5,</li>
        +403         *     <li>You can desaturate by subtracting 0.5, multiplying Cw and Cm by a number between 0 and 1, and adding 0.5
        +404         *     afterwards,</li>
        +405         *     <li>you can oversaturate by subtracting 0.5, multiplying Cw and Cm by a number greater than 1, and adding 0.5
        +406         *     afterwards,</li>
        +407         *     <li>you can lighten or darken by increasing or decreasing luma,</li>
        +408         *     <li>and so on and so forth.</li>
        +409         * </ul>
        +410         * @param encoded a color encoded as a packed float, as by {@link #ycwcm(float, float, float, float)}
        +411         * @return the chroma warm as a float from 0f to 1f
        +412         */
        +413        public static float chromaWarm(final float encoded)
        +414        {
        +415                return ((NumberUtils.floatToRawIntBits(encoded) >>> 8 & 0xff)) * 0x1.010102p-8f;
        +416        }
        +417
        +418        /**
        +419         * The "chroma mild" of the given packed float in YCwCm format, which when combined with chroma warm describes the
        +420         * shade and saturation of a color; ranges from 0f to 1f .
        +421         * YCwCm is useful for modifications to colors:
        +422         * <ul>
        +423         *     <li>You can get a grayscale version of a color by setting Cw and Cm to 0.5,</li>
        +424         *     <li>You can desaturate by subtracting 0.5, multiplying Cw and Cm by a number between 0 and 1, and adding 0.5
        +425         *     afterwards,</li>
        +426         *     <li>you can oversaturate by subtracting 0.5, multiplying Cw and Cm by a number greater than 1, and adding 0.5
        +427         *     afterwards,</li>
        +428         *     <li>you can lighten or darken by increasing or decreasing luma,</li>
        +429         *     <li>and so on and so forth.</li>
        +430         * </ul>
        +431         * @param encoded a color encoded as a packed float, as by {@link #ycwcm(float, float, float, float)}
        +432         * @return the chroma mild as a float from 0f to 1f
        +433         */
        +434        public static float chromaMild(final float encoded)
        +435        {
        +436                return ((NumberUtils.floatToRawIntBits(encoded) >>> 16 & 0xff)) * 0x1.010102p-8f;
        +437        }
        +438
        +439        /**
        +440         * Gets a variation on the packed float color basis as another packed float that has its hue, saturation, lightness,
        +441         * and opacity adjusted by the specified amounts. Note that this edits the color in HSL space, not YCwCm! Takes
        +442         * floats representing the amounts of change to apply to hue, saturation, lightness, and opacity; these can be
        +443         * between -1f and 1f. Returns a float that can be used as a packed or encoded color with methods like
        +444         * {@link com.badlogic.gdx.graphics.g2d.Batch#setPackedColor(float)}. The float is likely to be different than the
        +445         * result of {@link #ycwcm(float, float, float, float)} unless hue, saturation, lightness, and opacity are all 0.
        +446         * This won't allocate any objects.
        +447         * <br>
        +448         * The parameters this takes all specify additive changes for a color component, clamping the final values so they
        +449         * can't go above 1 or below 0, with an exception for hue, which can rotate around if lower or higher hues would be
        +450         * used. As an example, if you give this 0.4f for saturation, and the current color has saturation 0.7f, then the
        +451         * resulting color will have 1f for saturation. If you gave this -0.1f for saturation and the current color again
        +452         * has saturation 0.7f, then resulting color will have 0.6f for saturation.
        +453         *
        +454         * @param basis      a packed float color that will be used as the starting point to make the next color
        +455         * @param hue        -1f to 1f, the hue change that can be applied to the new float color (not clamped, wraps)
        +456         * @param saturation -1f to 1f, the saturation change that can be applied to the new float color
        +457         * @param light      -1f to 1f, the light/brightness change that can be applied to the new float color
        +458         * @param opacity    -1f to 1f, the opacity/alpha change that can be applied to the new float color
        +459         * @return a float encoding a variation of basis with the given changes
        +460         */
        +461        public static float toEditedFloat(float basis, float hue, float saturation, float light, float opacity) {
        +462                final int e = NumberUtils.floatToRawIntBits(basis);
        +463                opacity = Math.min(Math.max(opacity + (e >>> 24 & 0xfe) * 0x1.020408p-8f, 0f), 1f);
        +464                if (light + (e & 0xff) * 0x1.010102p-8f <= 0.001f)
        +465                        return NumberUtils.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x7F7F00);
        +466                final int lu = (e & 0xff);
        +467                final int cw = ((e >>> 7 & 0x1fe) - 0xff);
        +468                final int cm = (((e >>> 15 & 0x1fe) - 0xff) >> 1);
        +469                final float r = Math.min(Math.max(lu + light + (cw * 0.625f) - cm, 0), 255f) * 0x1.010102p-8f;
        +470                final float g = Math.min(Math.max(lu + light - (cw * 0.375f) + cm, 0), 255f) * 0x1.010102p-8f;
        +471                final float b = Math.min(Math.max(lu + light - (cw * 0.375f) - cm, 0), 255f) * 0x1.010102p-8f;
        +472                float x, y, z, w;
        +473                if(g < b) {
        +474                        x = b;
        +475                        y = g;
        +476                        z = -1f;
        +477                        w = 2f / 3f;
        +478                }
        +479                else {
        +480                        x = g;
        +481                        y = b;
        +482                        z = 0f;
        +483                        w = -1f / 3f;
        +484                }
        +485                if(r < x) {
        +486                        z = w;
        +487                        w = r;
        +488                }
        +489                else {
        +490                        w = x;
        +491                        x = r;
        +492                }
        +493                final float d = x - Math.min(w, y);
        +494                final float lum = x * (1f - 0.5f * d / (x + 1e-10f));
        +495                hue += Math.abs(z + (w - y) / (6f * d + 1e-10f)) + 1f;
        +496                saturation += (x - lum) / (Math.min(lum, 1f - lum) + 1e-10f);
        +497                return fromRGBA(FloatColors.hsl2rgb(hue - (int)hue, Math.min(Math.max(saturation, 0f), 1f), lum, opacity));
        +498        }
        +499
        +500        /**
        +501         * Interpolates from the packed float color start towards white by change. While change should be between 0f (return
        +502         * start as-is) and 1f (return white), start should be a packed color, as from
        +503         * {@link #ycwcm(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
        +504         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
        +505         * white. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is.
        +506         * @see #darken(float, float) the counterpart method that darkens a float color
        +507         * @param start the starting color as a packed float
        +508         * @param change how much to go from start toward white, as a float between 0 and 1; higher means closer to white
        +509         * @return a packed float that represents a color between start and white
        +510         */
        +511        public static float lighten(final float start, final float change) {
        +512                final int s = NumberUtils.floatToRawIntBits(start), luma = s & 0xFF, other = s & 0xFEFFFF00;
        +513                return NumberUtils.intBitsToFloat(((int) (luma + (0xFF - luma) * change) & 0xFF) | other);
        +514        }
        +515
        +516        /**
        +517         * Interpolates from the packed float color start towards black by change. While change should be between 0f (return
        +518         * start as-is) and 1f (return black), start should be a packed color, as from
        +519         * {@link #ycwcm(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
        +520         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
        +521         * black. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is.
        +522         * @see #lighten(float, float) the counterpart method that lightens a float color
         523         * @param start the starting color as a packed float
        -524         * @param change how much to cool start, as a float between 0 and 1; higher means a cooler result
        -525         * @return a packed float that represents a color between start and a cooler color
        +524         * @param change how much to go from start toward black, as a float between 0 and 1; higher means closer to black
        +525         * @return a packed float that represents a color between start and black
         526         */
        -527        public static float cool(final float start, final float change) {
        -528                final int s = NumberUtils.floatToRawIntBits(start), warmth = s >>> 8 & 0xFF, other = s & 0xFEFF00FF;
        -529                return NumberUtils.intBitsToFloat(((int) (warmth * (1f - change)) & 0xFF) << 8 | other);
        +527        public static float darken(final float start, final float change) {
        +528                final int s = NumberUtils.floatToRawIntBits(start), luma = s & 0xFF, other = s & 0xFEFFFF00;
        +529                return NumberUtils.intBitsToFloat(((int) (luma * (1f - change)) & 0xFF) | other);
         530        }
         531
         532        /**
        -533         * Interpolates from the packed float color start towards a milder color (between green and yellow) by change. While
        -534         * change should be between 0f (return start as-is) and 1f (return fully mild), start should be a packed color, as
        -535         * from {@link #ycwcm(float, float, float, float)}. This is a good way to reduce allocations of temporary
        -536         * Colors, and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp
        -537         * towards a milder color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and luma of
        -538         * start as-is.
        -539         * @see #strengthen(float, float) the counterpart method that makes a float color more bold
        +533         * Interpolates from the packed float color start towards a warmer color (yellow to red) by change. While change
        +534         * should be between 0f (returnstart as-is) and 1f (return fully warmed), start should be a packed color, as from
        +535         * {@link #ycwcm(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors,
        +536         * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
        +537         * a warmer color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and luma of start
        +538         * as-is.
        +539         * @see #cool(float, float) the counterpart method that cools a float color
         540         * @param start the starting color as a packed float
        -541         * @param change how much to change start to a milder color, as a float between 0 and 1; higher means a milder result
        -542         * @return a packed float that represents a color between start and a milder color
        +541         * @param change how much to warm start, as a float between 0 and 1; higher means a warmer result
        +542         * @return a packed float that represents a color between start and a warmer color
         543         */
        -544        public static float weaken(final float start, final float change) {
        +544        public static float warm(final float start, final float change) {
         545                final int s = NumberUtils.floatToRawIntBits(start), warmth = s >>> 8 & 0xFF, other = s & 0xFEFF00FF;
         546                return NumberUtils.intBitsToFloat(((int) (warmth + (0xFF - warmth) * change) << 8 & 0xFF) | other);
         547        }
         548
         549        /**
        -550         * Interpolates from the packed float color start towards a bolder color (between blue and red) by change. While
        -551         * change should be between 0f (return start as-is) and 1f (return fully cooled), start should be a packed color, as
        -552         * from {@link #ycwcm(float, float, float, float)}. This is a good way to reduce allocations of temporary
        -553         * Colors, and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp
        -554         * towards a bolder color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and luma of
        -555         * start as-is.
        -556         * @see #weaken(float, float) the counterpart method that makes a float color more mild
        +550         * Interpolates from the packed float color start towards a cooler color (green to blue) by change. While change
        +551         * should be between 0f (return start as-is) and 1f (return fully cooled), start should be a packed color, as from
        +552         * {@link #ycwcm(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
        +553         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
        +554         * a cooler color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and luma of start
        +555         * as-is.
        +556         * @see #warm(float, float) the counterpart method that warms a float color
         557         * @param start the starting color as a packed float
        -558         * @param change how much to change start to a bolder color, as a float between 0 and 1; higher means a bolder result
        -559         * @return a packed float that represents a color between start and a bolder color
        +558         * @param change how much to cool start, as a float between 0 and 1; higher means a cooler result
        +559         * @return a packed float that represents a color between start and a cooler color
         560         */
        -561        public static float strengthen(final float start, final float change) {
        +561        public static float cool(final float start, final float change) {
         562                final int s = NumberUtils.floatToRawIntBits(start), warmth = s >>> 8 & 0xFF, other = s & 0xFEFF00FF;
         563                return NumberUtils.intBitsToFloat(((int) (warmth * (1f - change)) & 0xFF) << 8 | other);
         564        }
         565
         566        /**
        -567         * Interpolates from the packed float color start towards that color made opaque by change. While change should be
        -568         * between 0f (return start as-is) and 1f (return start with full alpha), start should be a packed color, as from
        -569         * {@link #ycwcm(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
        -570         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
        -571         * transparent. This won't change the luma, chroma warm, or chroma mild of the color.
        -572         * @see #fade(float, float) the counterpart method that makes a float color more translucent
        -573         * @param start the starting color as a packed float
        -574         * @param change how much to go from start toward opaque, as a float between 0 and 1; higher means closer to opaque
        -575         * @return a packed float that represents a color between start and its opaque version
        -576         */
        -577        public static float blot(final float start, final float change) {
        -578                final int s = NumberUtils.floatToRawIntBits(start), opacity = s >>> 24 & 0xFE, other = s & 0x00FFFFFF;
        -579                return NumberUtils.intBitsToFloat(((int) (opacity + (0xFE - opacity) * change) & 0xFE) << 24 | other);
        -580        }
        -581
        -582        /**
        -583         * Interpolates from the packed float color start towards transparent by change. While change should be between 0
        -584         * (return start as-is) and 1f (return the color with 0 alpha), start should be a packed color, as from
        -585         * {@link #ycwcm(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors,
        -586         * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
        -587         * transparent. This won't change the luma, chroma warm, or chroma mild of the color.
        -588         * @see #blot(float, float) the counterpart method that makes a float color more opaque
        -589         * @param start the starting color as a packed float
        -590         * @param change how much to go from start toward transparent, as a float between 0 and 1; higher means closer to transparent
        -591         * @return a packed float that represents a color between start and transparent
        -592         */
        -593        public static float fade(final float start, final float change) {
        -594                final int s = NumberUtils.floatToRawIntBits(start), opacity = s & 0xFE, other = s & 0x00FFFFFF;
        -595                return NumberUtils.intBitsToFloat(((int) (opacity * (1f - change)) & 0xFE) << 24 | other);
        -596        }
        -597
        -598        /**
        -599         * Brings the chromatic components of {@code start} closer to grayscale by {@code change} (desaturating them). While
        -600         * change should be between 0f (return start as-is) and 1f (return fully gray), start should be a packed color, as
        -601         * from {@link #ycwcm(float, float, float, float)}. This only changes Cw and Cm; it leaves Y and alpha alone, unlike
        -602         * {@link #lessenChange(float, float)}, which usually changes Y.
        -603         * @see #enrich(float, float) the counterpart method that makes a float color more saturated
        -604         * @param start the starting color as a packed float
        -605         * @param change how much to change start to a desaturated color, as a float between 0 and 1; higher means a less saturated result
        -606         * @return a packed float that represents a color between start and a desaturated color
        -607         */
        -608        public static float dullen(final float start, final float change) {
        -609                final int s = NumberUtils.floatToRawIntBits(start);
        -610                return ycwcm((s & 0xFF) / 255f,
        -611                                ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f,
        -612                                ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f,
        -613                                (s >>> 25) / 127f);
        +567         * Interpolates from the packed float color start towards a milder color (between green and yellow) by change. While
        +568         * change should be between 0f (return start as-is) and 1f (return fully mild), start should be a packed color, as
        +569         * from {@link #ycwcm(float, float, float, float)}. This is a good way to reduce allocations of temporary
        +570         * Colors, and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp
        +571         * towards a milder color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and luma of
        +572         * start as-is.
        +573         * @see #strengthen(float, float) the counterpart method that makes a float color more bold
        +574         * @param start the starting color as a packed float
        +575         * @param change how much to change start to a milder color, as a float between 0 and 1; higher means a milder result
        +576         * @return a packed float that represents a color between start and a milder color
        +577         */
        +578        public static float weaken(final float start, final float change) {
        +579                final int s = NumberUtils.floatToRawIntBits(start), warmth = s >>> 8 & 0xFF, other = s & 0xFEFF00FF;
        +580                return NumberUtils.intBitsToFloat(((int) (warmth + (0xFF - warmth) * change) << 8 & 0xFF) | other);
        +581        }
        +582
        +583        /**
        +584         * Interpolates from the packed float color start towards a bolder color (between blue and red) by change. While
        +585         * change should be between 0f (return start as-is) and 1f (return fully cooled), start should be a packed color, as
        +586         * from {@link #ycwcm(float, float, float, float)}. This is a good way to reduce allocations of temporary
        +587         * Colors, and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp
        +588         * towards a bolder color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and luma of
        +589         * start as-is.
        +590         * @see #weaken(float, float) the counterpart method that makes a float color more mild
        +591         * @param start the starting color as a packed float
        +592         * @param change how much to change start to a bolder color, as a float between 0 and 1; higher means a bolder result
        +593         * @return a packed float that represents a color between start and a bolder color
        +594         */
        +595        public static float strengthen(final float start, final float change) {
        +596                final int s = NumberUtils.floatToRawIntBits(start), warmth = s >>> 8 & 0xFF, other = s & 0xFEFF00FF;
        +597                return NumberUtils.intBitsToFloat(((int) (warmth * (1f - change)) & 0xFF) << 8 | other);
        +598        }
        +599
        +600        /**
        +601         * Interpolates from the packed float color start towards that color made opaque by change. While change should be
        +602         * between 0f (return start as-is) and 1f (return start with full alpha), start should be a packed color, as from
        +603         * {@link #ycwcm(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
        +604         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
        +605         * transparent. This won't change the luma, chroma warm, or chroma mild of the color.
        +606         * @see #fade(float, float) the counterpart method that makes a float color more translucent
        +607         * @param start the starting color as a packed float
        +608         * @param change how much to go from start toward opaque, as a float between 0 and 1; higher means closer to opaque
        +609         * @return a packed float that represents a color between start and its opaque version
        +610         */
        +611        public static float blot(final float start, final float change) {
        +612                final int s = NumberUtils.floatToRawIntBits(start), opacity = s >>> 24 & 0xFE, other = s & 0x00FFFFFF;
        +613                return NumberUtils.intBitsToFloat(((int) (opacity + (0xFE - opacity) * change) & 0xFE) << 24 | other);
         614        }
         615
         616        /**
        -617         * Pushes the chromatic components of {@code start} away from grayscale by change (saturating them). While change
        -618         * should be between 0f (return start as-is) and 1f (return maximally saturated), start should be a packed color, as
        -619         * from {@link #ycwcm(float, float, float, float)}. This usually changes only Cw and Cm, but higher values for
        -620         * {@code change} can force the color out of the gamut, which this corrects using
        -621         * {@link #limitToGamut(float, float, float, float)} (and that can change Y somewhat). If the color stays in-gamut,
        -622         * then Y won't change; alpha never changes.
        -623         * @see #dullen(float, float) the counterpart method that makes a float color less saturated
        -624         * @param start the starting color as a packed float
        -625         * @param change how much to change start to a saturated color, as a float between 0 and 1; higher means a more saturated result
        -626         * @return a packed float that represents a color between start and a saturated color
        -627         */
        -628        public static float enrich(final float start, final float change) {
        -629                final int s = NumberUtils.floatToRawIntBits(start);
        -630                return limitToGamut((s & 0xFF) / 255f,
        -631                                ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f,
        -632                                ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f,
        -633                                (s >>> 25) / 127f);
        -634        }
        -635
        -636        /**
        -637         * Given a packed float YCwCm color {@code mainColor} and another YCwCm color that it should be made to contrast
        -638         * with, gets a packed float YCwCm color with roughly inverted luma but the same chromatic channels and opacity (Cw
        -639         * and Cm are likely to be clamped if the result gets close to white or black). This won't ever produce black or
        -640         * other very dark colors, and also has a gap in the range it produces for luma values between 0.5 and 0.55. That
        -641         * allows most of the colors this method produces to contrast well as a foreground when displayed on a background of
        -642         * {@code contrastingColor}, or vice versa. This will leave the luma unchanged if the chromatic channels of the
        -643         * contrastingColor and those of the mainColor are already very different. This has nothing to do with the contrast
        -644         * channel of the tweak in ColorfulBatch; where that part of the tweak can make too-similar lightness values further
        -645         * apart by just a little, this makes a modification on {@code mainColor} to maximize its lightness difference from
        -646         * {@code contrastingColor} without losing its other qualities.
        -647         * @param mainColor a packed float color, as produced by {@link #ycwcm(float, float, float, float)}; this is the color that will be adjusted
        -648         * @param contrastingColor a packed float color, as produced by {@link #ycwcm(float, float, float, float)}; the adjusted mainColor will contrast with this
        -649         * @return a different packed float color, based on mainColor but with potentially very different lightness
        -650         */
        -651        public static float inverseLightness(final float mainColor, final float contrastingColor)
        -652        {
        -653                final int bits = NumberUtils.floatToRawIntBits(mainColor),
        -654                                contrastBits = NumberUtils.floatToRawIntBits(contrastingColor),
        -655                                luma = (bits & 0xff),
        -656                                warm = (bits >>> 8 & 0xff),
        -657                                mild = (bits >>> 16 & 0xff),
        -658                                cLuma = (contrastBits & 0xff),
        -659                                cWarm = (contrastBits >>> 8 & 0xff),
        -660                                cMild = (contrastBits >>> 16 & 0xff);
        -661                if((warm - cWarm) * (warm - cWarm) + (mild - cMild) * (mild - cMild) >= 0x10000)
        -662                        return mainColor;
        -663                return ycwcm(cLuma < 128 ? luma * (0.45f / 255f) + 0.55f : 0.5f - luma * (0.45f / 255f), warm / 255f, mild / 255f, 0x1.010102p-8f * (bits >>> 24));
        -664        }
        -665
        -666        /**
        -667         * Given a packed float YCwCm color {@code mainColor} and another YCwCm color that it should be made to contrast
        -668         * with, gets a packed float YCwCm color with Y that should be quite different from {@code contrastingColor}'s Y,
        -669         * but the same chromatic channels and opacity (Cw and Cm are likely to be clamped if the result gets close to white
        -670         * or black). This allows most of the colors this method produces to contrast well as a foreground when displayed on
        -671         * a background of {@code contrastingColor}, or vice versa.
        -672         * <br>
        -673         * This is similar to {@link #inverseLightness(float, float)}, but is considerably simpler, and this method will
        -674         * change the lightness of mainColor when the two given colors have close lightness but distant chroma. Because it
        -675         * averages the original Y of mainColor with the modified one, this tends to not produce harsh color changes.
        -676         * @param mainColor a packed YCwCm float color; this is the color that will be adjusted
        -677         * @param contrastingColor a packed YCwCm float color; the adjusted mainColor will contrast with the Y of this
        -678         * @return a different packed YCwCm float color, based on mainColor but typically with different lightness
        -679         */
        -680        public static float differentiateLightness(final float mainColor, final float contrastingColor)
        -681        {
        -682                final int main = NumberUtils.floatToRawIntBits(mainColor), contrast = NumberUtils.floatToRawIntBits(contrastingColor);
        -683                return limitToGamut(NumberUtils.intBitsToFloat((main & 0xFEFFFF00) | (contrast + 128 & 0xFF) + (main & 0xFF) >>> 1));
        -684        }
        -685
        -686        /**
        -687         * Pretty simple; adds 0.5 to the given color's Y and wraps it around if it would go above 1.0, then averages that
        -688         * with the original Y. This means light colors become darker, and dark colors become lighter, with almost all
        -689         * results in the middle-range of possible lightness.
        -690         * @param mainColor a packed YCwCm float color
        -691         * @return a different packed YCwCm float color, with its Y channel changed and limited to the correct gamut
        -692         */
        -693        public static float offsetLightness(final float mainColor) {
        -694                final int decoded = NumberUtils.floatToRawIntBits(mainColor);
        -695                return limitToGamut(NumberUtils.intBitsToFloat((decoded & 0xFEFFFF00) | (decoded + 128 & 0xFF) + (decoded & 0xFF) >>> 1));
        -696        }
        -697
        -698        /**
        -699         * Makes the additive YCwCm color stored in {@code color} cause less of a change when used as a tint, as if it were
        -700         * mixed with neutral gray. When {@code fraction} is 1.0, this returns color unchanged; when fraction is 0.0, it
        -701         * returns {@link Palette#GRAY}, and when it is in-between 0.0 and 1.0 it returns something between the two. This is
        -702         * meant for things like area of effect abilities that make smaller color changes toward their periphery.
        -703         * @param color a color that should have its tinting effect potentially weakened
        -704         * @param fraction how much of {@code color} should be kept, from 0.0 to 1.0
        -705         * @return a YCwCm float color between gray and {@code color}
        -706         */
        -707        public static float lessenChange(final float color, float fraction) {
        -708                final int e = NumberUtils.floatToRawIntBits(color),
        -709                                ys = 0x7F, cws = 0x7F, cms = 0x7F, as = 0xFE,
        -710                                ye = (e & 0xFF), cwe = (e >>> 8) & 0xFF, cme = (e >>> 16) & 0xFF, ae = e >>> 24 & 0xFE;
        -711                return NumberUtils.intBitsToFloat(((int) (ys + fraction * (ye - ys)) & 0xFF)
        -712                                | (((int) (cws + fraction * (cwe - cws)) & 0xFF) << 8)
        -713                                | (((int) (cms + fraction * (cme - cms)) & 0xFF) << 16)
        -714                                | (((int) (as + fraction * (ae - as)) & 0xFE) << 24));
        -715        }
        -716        /**
        -717         * Makes a quasi-randomly-edited variant on the given {@code color}, allowing typically a small amount of
        -718         * {@code variance} (such as 0.05 to 0.25) between the given color and what this can return. The {@code seed} should
        -719         * be different each time this is called, and can be obtained from a random number generator to make the colors more
        -720         * random, or can be incremented on each call. If the seed is only incremented or decremented, then this shouldn't
        -721         * produce two similar colors in a row unless variance is very small. The variance affects the Y, Cw, and Cm of the
        -722         * generated color, and each of those channels can go up or down by the given variance as long as the total distance
        -723         * isn't greater than the variance (this considers Cw and Cm extra-wide, going from -1 to 1, while I goes from 0 to
        -724         * 1, but only internally for measuring distance).
        -725         * @param color a packed float color, as produced by {@link #ycwcm(float, float, float, float)}
        -726         * @param seed a long seed that should be different on each call; should not be 0
        -727         * @param variance max amount of difference between the given color and the generated color; always less than 1
        -728         * @return a generated packed float color that should be at least somewhat different from {@code color}
        -729         */
        -730        public static float randomEdit(final float color, long seed, final float variance) {
        -731                final int decoded = NumberUtils.floatToRawIntBits(color);
        -732                final float y = (decoded & 0xff) / 255f;
        -733                final float cw = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        -734                final float cm = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        -735                final float limit = variance * variance;
        -736                float dist = limit + 1f, a = 0, b = 0, c = 0;
        -737                while (dist > limit){
        -738                        a = (((seed * 0xD1B54A32D192ED03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
        -739                        b = (((seed * 0xABC98388FB8FAC03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
        -740                        c = (((seed * 0x8CB92BA72F3D8DD7L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
        -741                        seed += 0x9E3779B97F4A7C15L;
        -742                        dist = a * a + b * b + c * c;
        -743                }
        -744                return NumberUtils.intBitsToFloat((decoded & 0xFE000000) | ((int)(Math.min(Math.max(cm + c, -1), 1) * 127.5f + 128f) << 16 & 0xFF0000)
        -745                                | ((int)(Math.min(Math.max(cw + b, -1), 1) * 127.5f + 128f) << 8 & 0xFF00) | (int)(Math.min(Math.max(y + a, 0), 1) * 255f));
        -746        }
        -747
        -748        /**
        -749         * Returns true if the given packed float color, as YCwCm, is valid to convert losslessly back to RGBA. 
        -750         * @param packed a packed float color as YCwCm
        -751         * @return true if the given packed float color can be converted back and forth to RGBA
        -752         */
        -753        public static boolean inGamut(final float packed)
        -754        {
        -755                final int decoded = NumberUtils.floatToRawIntBits(packed), y = (decoded & 0xff),
        -756                                cw = ((decoded >>> 7 & 0x1fe) - 0xff),
        -757                                cm = (((decoded >>> 15 & 0x1fe) - 0xff) / 2);
        -758                final int r = y + (cw * 5 / 8) - cm;
        -759                if(r < 0 || r > 255) return false;
        -760                final int g = y - (cw * 3 / 8) + cm;
        -761                if(g < 0 || g > 255) return false;
        -762                final int b = y - (cw * 3 / 8) - cm;
        -763                return (b >= 0) && (b <= 255);
        -764        }
        -765        /**
        -766         * Returns true if the given YCwCm values are valid to convert losslessly back to RGBA. 
        -767         * @param y luma channel, as a float from 0 to 1
        -768         * @param cw chromatic warmth channel, as a float from 0 to 1
        -769         * @param cm chromatic mildness channel, as a float from 0 to 1
        -770         * @return true if the given packed float color can be converted back and forth to RGBA
        -771         */
        -772        public static boolean inGamut(float y, float cw, float cm)
        -773        {
        -774                final int yi = (int)(y * 255.999f), cwi = (int) ((cw - 0.5f) * 511.999f), cmi = (int) ((cm - 0.5f) * 255.999f);
        -775                final int r = yi + (cwi * 5 / 8) - cmi;
        -776                if(r < 0 || r > 255) return false;
        -777                final int g = yi - (cwi * 3 / 8) + cmi;
        -778                if(g < 0 || g > 255) return false;
        -779                final int b = yi - (cwi * 3 / 8) - cmi;
        -780                return (b >= 0) && (b <= 255);
        -781        }
        -782
        -783        /**
        -784         * Iteratively checks whether the given YCwCm color is in-gamut, and either brings the color closer to 50% gray if
        -785         * it isn't in-gamut, or returns it as soon as it is in-gamut.
        -786         * @param packed a packed float color in YCwCm format; often this color is not in-gamut
        -787         * @return the first color this finds that is between the given YCwCm color and 50% gray, and is in-gamut
        -788         * @see #inGamut(float) You can use inGamut() if you just want to check whether a color is in-gamut.
        -789         */
        -790        public static float limitToGamut(final float packed) {
        -791                final int decoded = NumberUtils.floatToRawIntBits(packed);
        -792                final float y = (decoded & 0xff) / 255f;
        -793                final float cw = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        -794                final float cm = ((decoded >>> 16 & 0xff) - 127.5f) / 255f;
        -795                float y2 = y, cw2 = cw, cm2 = cm;
        -796                for (int attempt = 31; attempt >= 0; attempt--) {
        -797                        final float r = y2 + 0.625f * cw2 - cm2;
        -798                        final float g = y2 - 0.375f * cw2 + cm2;
        -799                        final float b = y2 - 0.375f * cw2 - cm2;
        -800                        if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f)
        -801                                break;
        -802                        final float progress = attempt * 0x1p-5f;
        -803                        y2 = MathUtils.lerp(0.5f, y, progress);
        -804                        cw2 = MathUtils.lerp(0, cw, progress);
        -805                        cm2 = MathUtils.lerp(0, cm, progress);
        -806                }
        -807                return ycwcm(y2, cw2 * 0.5f + 0.5f, cm2 * 0.5f + 0.5f, (decoded >>> 25) / 127f);
        -808        }
        -809
        -810        /**
        -811         * Iteratively checks whether the given YCwCm color is in-gamut, and either brings the color closer to 50% gray if
        -812         * it isn't in-gamut, or returns it as soon as it is in-gamut. This always produces an opaque color.
        -813         * @param y luma component; will be clamped between 0 and 1 if it isn't already
        -814         * @param cw chromatic warmth component; will be clamped between 0 and 1 if it isn't already
        -815         * @param cm chromatic mildness component; will be clamped between 0 and 1 if it isn't already
        -816         * @return the first color this finds that is between the given YCwCm color and 50% gray, and is in-gamut
        -817         * @see #inGamut(float, float, float)  You can use inGamut() if you just want to check whether a color is in-gamut.
        -818         */
        -819        public static float limitToGamut(float y, float cw, float cm) {
        -820                return limitToGamut(y, cw, cm, 1f);
        -821        }
        -822
        -823        /**
        -824         * Iteratively checks whether the given YCwCm color is in-gamut, and either brings the color closer to 50% gray if
        -825         * it isn't in-gamut, or returns it as soon as it is in-gamut.
        -826         * @param y luma component; will be clamped between 0 and 1 if it isn't already
        -827         * @param cw chromatic warmth component; will be clamped between 0 and 1 if it isn't already
        -828         * @param cm chromatic mildness component; will be clamped between 0 and 1 if it isn't already
        -829         * @param a alpha component; will be clamped between 0 and 1 if it isn't already
        -830         * @return the first color this finds that is between the given YCwCm color and 50% gray, and is in-gamut
        -831         * @see #inGamut(float, float, float)  You can use inGamut() if you just want to check whether a color is in-gamut.
        -832         */
        -833        public static float limitToGamut(float y, float cw, float cm, float a)
        -834        {
        -835                float y2 = y = Math.min(Math.max(y, 0f), 1f);
        -836                float cw2 = cw = Math.min(Math.max((cw - 0.5f) * 2f, -1f), 1f);
        -837                float cm2 = cm = Math.min(Math.max((cm - 0.5f) * 2f, -1f), 1f);
        -838                for (int attempt = 31; attempt >= 0; attempt--) {
        -839                        final float r = y2 + 0.625f * cw2 - cm2;
        -840                        final float g = y2 - 0.375f * cw2 + cm2;
        -841                        final float b = y2 - 0.375f * cw2 - cm2;
        -842                        if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f)
        -843                                break;
        -844                        final float progress = attempt * 0x1p-5f;
        -845                        y2 = MathUtils.lerp(0.5f, y, progress);
        -846                        cw2 = MathUtils.lerp(0, cw, progress);
        -847                        cm2 = MathUtils.lerp(0, cm, progress);
        -848                }
        -849                return ycwcm(y2, cw2 * 0.5f + 0.5f, cm2 * 0.5f + 0.5f, Math.min(Math.max(a, 0f), 1f));
        -850        }
        -851
        -852
        -853
        -854        /**
        -855         * Produces a random packed float color that is always in-gamut and should be uniformly distributed.
        -856         * @param random a Random object (or preferably a subclass of Random, like {@link com.badlogic.gdx.math.RandomXS128})
        -857         * @return a random opaque packed float color that is always in-gamut
        -858         */
        -859        public static float randomColor(Random random) {
        -860                final float yr = +0.375f, wr = +0.5f, mr = +0.0f;
        -861                final float yg = +0.500f, wg = +0.0f, mg = +0.5f;
        -862                final float yb = +0.125f, wb = -0.5f, mb = -0.5f;
        -863                final float r = random.nextFloat(), g = random.nextFloat(), b = random.nextFloat();
        -864                return NumberUtils.intBitsToFloat(0xFE000000
        -865                                | ((int) ((mr * r + mg * g + mb * b) * 128f + 128f) << 16 & 0xFF0000)
        -866                                | ((int) ((wr * r + wg * g + wb * b) * 128f + 128f) << 8 & 0xFF00)
        -867                                | ((int) ((yr * r + yg * g + yb * b) * 256f) & 0xFF));
        -868        }
        -869
        -870}
        +617         * Interpolates from the packed float color start towards transparent by change. While change should be between 0
        +618         * (return start as-is) and 1f (return the color with 0 alpha), start should be a packed color, as from
        +619         * {@link #ycwcm(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors,
        +620         * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
        +621         * transparent. This won't change the luma, chroma warm, or chroma mild of the color.
        +622         * @see #blot(float, float) the counterpart method that makes a float color more opaque
        +623         * @param start the starting color as a packed float
        +624         * @param change how much to go from start toward transparent, as a float between 0 and 1; higher means closer to transparent
        +625         * @return a packed float that represents a color between start and transparent
        +626         */
        +627        public static float fade(final float start, final float change) {
        +628                final int s = NumberUtils.floatToRawIntBits(start), opacity = s & 0xFE, other = s & 0x00FFFFFF;
        +629                return NumberUtils.intBitsToFloat(((int) (opacity * (1f - change)) & 0xFE) << 24 | other);
        +630        }
        +631
        +632        /**
        +633         * Brings the chromatic components of {@code start} closer to grayscale by {@code change} (desaturating them). While
        +634         * change should be between 0f (return start as-is) and 1f (return fully gray), start should be a packed color, as
        +635         * from {@link #ycwcm(float, float, float, float)}. This only changes Cw and Cm; it leaves Y and alpha alone, unlike
        +636         * {@link #lessenChange(float, float)}, which usually changes Y.
        +637         * @see #enrich(float, float) the counterpart method that makes a float color more saturated
        +638         * @param start the starting color as a packed float
        +639         * @param change how much to change start to a desaturated color, as a float between 0 and 1; higher means a less saturated result
        +640         * @return a packed float that represents a color between start and a desaturated color
        +641         */
        +642        public static float dullen(final float start, final float change) {
        +643                final int s = NumberUtils.floatToRawIntBits(start);
        +644                return ycwcm((s & 0xFF) / 255f,
        +645                                ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f,
        +646                                ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f,
        +647                                (s >>> 25) / 127f);
        +648        }
        +649
        +650        /**
        +651         * Pushes the chromatic components of {@code start} away from grayscale by change (saturating them). While change
        +652         * should be between 0f (return start as-is) and 1f (return maximally saturated), start should be a packed color, as
        +653         * from {@link #ycwcm(float, float, float, float)}. This usually changes only Cw and Cm, but higher values for
        +654         * {@code change} can force the color out of the gamut, which this corrects using
        +655         * {@link #limitToGamut(float, float, float, float)} (and that can change Y somewhat). If the color stays in-gamut,
        +656         * then Y won't change; alpha never changes.
        +657         * @see #dullen(float, float) the counterpart method that makes a float color less saturated
        +658         * @param start the starting color as a packed float
        +659         * @param change how much to change start to a saturated color, as a float between 0 and 1; higher means a more saturated result
        +660         * @return a packed float that represents a color between start and a saturated color
        +661         */
        +662        public static float enrich(final float start, final float change) {
        +663                final int s = NumberUtils.floatToRawIntBits(start);
        +664                return limitToGamut((s & 0xFF) / 255f,
        +665                                ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f,
        +666                                ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f,
        +667                                (s >>> 25) / 127f);
        +668        }
        +669
        +670        /**
        +671         * Given a packed float YCwCm color {@code mainColor} and another YCwCm color that it should be made to contrast
        +672         * with, gets a packed float YCwCm color with roughly inverted luma but the same chromatic channels and opacity (Cw
        +673         * and Cm are likely to be clamped if the result gets close to white or black). This won't ever produce black or
        +674         * other very dark colors, and also has a gap in the range it produces for luma values between 0.5 and 0.55. That
        +675         * allows most of the colors this method produces to contrast well as a foreground when displayed on a background of
        +676         * {@code contrastingColor}, or vice versa. This will leave the luma unchanged if the chromatic channels of the
        +677         * contrastingColor and those of the mainColor are already very different. This has nothing to do with the contrast
        +678         * channel of the tweak in ColorfulBatch; where that part of the tweak can make too-similar lightness values further
        +679         * apart by just a little, this makes a modification on {@code mainColor} to maximize its lightness difference from
        +680         * {@code contrastingColor} without losing its other qualities.
        +681         * @param mainColor a packed float color, as produced by {@link #ycwcm(float, float, float, float)}; this is the color that will be adjusted
        +682         * @param contrastingColor a packed float color, as produced by {@link #ycwcm(float, float, float, float)}; the adjusted mainColor will contrast with this
        +683         * @return a different packed float color, based on mainColor but with potentially very different lightness
        +684         */
        +685        public static float inverseLightness(final float mainColor, final float contrastingColor)
        +686        {
        +687                final int bits = NumberUtils.floatToRawIntBits(mainColor),
        +688                                contrastBits = NumberUtils.floatToRawIntBits(contrastingColor),
        +689                                luma = (bits & 0xff),
        +690                                warm = (bits >>> 8 & 0xff),
        +691                                mild = (bits >>> 16 & 0xff),
        +692                                cLuma = (contrastBits & 0xff),
        +693                                cWarm = (contrastBits >>> 8 & 0xff),
        +694                                cMild = (contrastBits >>> 16 & 0xff);
        +695                if((warm - cWarm) * (warm - cWarm) + (mild - cMild) * (mild - cMild) >= 0x10000)
        +696                        return mainColor;
        +697                return ycwcm(cLuma < 128 ? luma * (0.45f / 255f) + 0.55f : 0.5f - luma * (0.45f / 255f), warm / 255f, mild / 255f, 0x1.010102p-8f * (bits >>> 24));
        +698        }
        +699
        +700        /**
        +701         * Given a packed float YCwCm color {@code mainColor} and another YCwCm color that it should be made to contrast
        +702         * with, gets a packed float YCwCm color with Y that should be quite different from {@code contrastingColor}'s Y,
        +703         * but the same chromatic channels and opacity (Cw and Cm are likely to be clamped if the result gets close to white
        +704         * or black). This allows most of the colors this method produces to contrast well as a foreground when displayed on
        +705         * a background of {@code contrastingColor}, or vice versa.
        +706         * <br>
        +707         * This is similar to {@link #inverseLightness(float, float)}, but is considerably simpler, and this method will
        +708         * change the lightness of mainColor when the two given colors have close lightness but distant chroma. Because it
        +709         * averages the original Y of mainColor with the modified one, this tends to not produce harsh color changes.
        +710         * @param mainColor a packed YCwCm float color; this is the color that will be adjusted
        +711         * @param contrastingColor a packed YCwCm float color; the adjusted mainColor will contrast with the Y of this
        +712         * @return a different packed YCwCm float color, based on mainColor but typically with different lightness
        +713         */
        +714        public static float differentiateLightness(final float mainColor, final float contrastingColor)
        +715        {
        +716                final int main = NumberUtils.floatToRawIntBits(mainColor), contrast = NumberUtils.floatToRawIntBits(contrastingColor);
        +717                return limitToGamut(NumberUtils.intBitsToFloat((main & 0xFEFFFF00) | (contrast + 128 & 0xFF) + (main & 0xFF) >>> 1));
        +718        }
        +719
        +720        /**
        +721         * Pretty simple; adds 0.5 to the given color's Y and wraps it around if it would go above 1.0, then averages that
        +722         * with the original Y. This means light colors become darker, and dark colors become lighter, with almost all
        +723         * results in the middle-range of possible lightness.
        +724         * @param mainColor a packed YCwCm float color
        +725         * @return a different packed YCwCm float color, with its Y channel changed and limited to the correct gamut
        +726         */
        +727        public static float offsetLightness(final float mainColor) {
        +728                final int decoded = NumberUtils.floatToRawIntBits(mainColor);
        +729                return limitToGamut(NumberUtils.intBitsToFloat((decoded & 0xFEFFFF00) | (decoded + 128 & 0xFF) + (decoded & 0xFF) >>> 1));
        +730        }
        +731
        +732        /**
        +733         * Makes the additive YCwCm color stored in {@code color} cause less of a change when used as a tint, as if it were
        +734         * mixed with neutral gray. When {@code fraction} is 1.0, this returns color unchanged; when fraction is 0.0, it
        +735         * returns {@link Palette#GRAY}, and when it is in-between 0.0 and 1.0 it returns something between the two. This is
        +736         * meant for things like area of effect abilities that make smaller color changes toward their periphery.
        +737         * @param color a color that should have its tinting effect potentially weakened
        +738         * @param fraction how much of {@code color} should be kept, from 0.0 to 1.0
        +739         * @return a YCwCm float color between gray and {@code color}
        +740         */
        +741        public static float lessenChange(final float color, float fraction) {
        +742                final int e = NumberUtils.floatToRawIntBits(color),
        +743                                ys = 0x7F, cws = 0x7F, cms = 0x7F, as = 0xFE,
        +744                                ye = (e & 0xFF), cwe = (e >>> 8) & 0xFF, cme = (e >>> 16) & 0xFF, ae = e >>> 24 & 0xFE;
        +745                return NumberUtils.intBitsToFloat(((int) (ys + fraction * (ye - ys)) & 0xFF)
        +746                                | (((int) (cws + fraction * (cwe - cws)) & 0xFF) << 8)
        +747                                | (((int) (cms + fraction * (cme - cms)) & 0xFF) << 16)
        +748                                | (((int) (as + fraction * (ae - as)) & 0xFE) << 24));
        +749        }
        +750        /**
        +751         * Makes a quasi-randomly-edited variant on the given {@code color}, allowing typically a small amount of
        +752         * {@code variance} (such as 0.05 to 0.25) between the given color and what this can return. The {@code seed} should
        +753         * be different each time this is called, and can be obtained from a random number generator to make the colors more
        +754         * random, or can be incremented on each call. If the seed is only incremented or decremented, then this shouldn't
        +755         * produce two similar colors in a row unless variance is very small. The variance affects the Y, Cw, and Cm of the
        +756         * generated color, and each of those channels can go up or down by the given variance as long as the total distance
        +757         * isn't greater than the variance (this considers Cw and Cm extra-wide, going from -1 to 1, while I goes from 0 to
        +758         * 1, but only internally for measuring distance).
        +759         * @param color a packed float color, as produced by {@link #ycwcm(float, float, float, float)}
        +760         * @param seed a long seed that should be different on each call; should not be 0
        +761         * @param variance max amount of difference between the given color and the generated color; always less than 1
        +762         * @return a generated packed float color that should be at least somewhat different from {@code color}
        +763         */
        +764        public static float randomEdit(final float color, long seed, final float variance) {
        +765                final int decoded = NumberUtils.floatToRawIntBits(color);
        +766                final float y = (decoded & 0xff) / 255f;
        +767                final float cw = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        +768                final float cm = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        +769                final float limit = variance * variance;
        +770                float dist = limit + 1f, a = 0, b = 0, c = 0;
        +771                while (dist > limit){
        +772                        a = (((seed * 0xD1B54A32D192ED03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
        +773                        b = (((seed * 0xABC98388FB8FAC03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
        +774                        c = (((seed * 0x8CB92BA72F3D8DD7L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
        +775                        seed += 0x9E3779B97F4A7C15L;
        +776                        dist = a * a + b * b + c * c;
        +777                }
        +778                return NumberUtils.intBitsToFloat((decoded & 0xFE000000) | ((int)(Math.min(Math.max(cm + c, -1), 1) * 127.5f + 128f) << 16 & 0xFF0000)
        +779                                | ((int)(Math.min(Math.max(cw + b, -1), 1) * 127.5f + 128f) << 8 & 0xFF00) | (int)(Math.min(Math.max(y + a, 0), 1) * 255f));
        +780        }
        +781
        +782        /**
        +783         * Returns true if the given packed float color, as YCwCm, is valid to convert losslessly back to RGBA. 
        +784         * @param packed a packed float color as YCwCm
        +785         * @return true if the given packed float color can be converted back and forth to RGBA
        +786         */
        +787        public static boolean inGamut(final float packed)
        +788        {
        +789                final int decoded = NumberUtils.floatToRawIntBits(packed), y = (decoded & 0xff),
        +790                                cw = ((decoded >>> 7 & 0x1fe) - 0xff),
        +791                                cm = (((decoded >>> 15 & 0x1fe) - 0xff) / 2);
        +792                final int r = y + (cw * 5 / 8) - cm;
        +793                if(r < 0 || r > 255) return false;
        +794                final int g = y - (cw * 3 / 8) + cm;
        +795                if(g < 0 || g > 255) return false;
        +796                final int b = y - (cw * 3 / 8) - cm;
        +797                return (b >= 0) && (b <= 255);
        +798        }
        +799        /**
        +800         * Returns true if the given YCwCm values are valid to convert losslessly back to RGBA. 
        +801         * @param y luma channel, as a float from 0 to 1
        +802         * @param cw chromatic warmth channel, as a float from 0 to 1
        +803         * @param cm chromatic mildness channel, as a float from 0 to 1
        +804         * @return true if the given packed float color can be converted back and forth to RGBA
        +805         */
        +806        public static boolean inGamut(float y, float cw, float cm)
        +807        {
        +808                final int yi = (int)(y * 255.999f), cwi = (int) ((cw - 0.5f) * 511.999f), cmi = (int) ((cm - 0.5f) * 255.999f);
        +809                final int r = yi + (cwi * 5 / 8) - cmi;
        +810                if(r < 0 || r > 255) return false;
        +811                final int g = yi - (cwi * 3 / 8) + cmi;
        +812                if(g < 0 || g > 255) return false;
        +813                final int b = yi - (cwi * 3 / 8) - cmi;
        +814                return (b >= 0) && (b <= 255);
        +815        }
        +816
        +817        /**
        +818         * Iteratively checks whether the given YCwCm color is in-gamut, and either brings the color closer to 50% gray if
        +819         * it isn't in-gamut, or returns it as soon as it is in-gamut.
        +820         * @param packed a packed float color in YCwCm format; often this color is not in-gamut
        +821         * @return the first color this finds that is between the given YCwCm color and 50% gray, and is in-gamut
        +822         * @see #inGamut(float) You can use inGamut() if you just want to check whether a color is in-gamut.
        +823         */
        +824        public static float limitToGamut(final float packed) {
        +825                final int decoded = NumberUtils.floatToRawIntBits(packed);
        +826                final float y = (decoded & 0xff) / 255f;
        +827                final float cw = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        +828                final float cm = ((decoded >>> 16 & 0xff) - 127.5f) / 255f;
        +829                float cw2 = cw, cm2 = cm;
        +830                for (int attempt = 31; attempt >= 0; attempt--) {
        +831                        final float r = y + 0.625f * cw2 - cm2;
        +832                        final float g = y - 0.375f * cw2 + cm2;
        +833                        final float b = y - 0.375f * cw2 - cm2;
        +834                        if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f)
        +835                                break;
        +836                        final float progress = attempt * 0x1p-5f;
        +837                        cw2 = MathUtils.lerp(0, cw, progress);
        +838                        cm2 = MathUtils.lerp(0, cm, progress);
        +839                }
        +840                return ycwcm(y, cw2 * 0.5f + 0.5f, cm2 * 0.5f + 0.5f, (decoded >>> 25) / 127f);
        +841        }
        +842
        +843        /**
        +844         * Iteratively checks whether the given YCwCm color is in-gamut, and either brings the color closer to 50% gray if
        +845         * it isn't in-gamut, or returns it as soon as it is in-gamut. This always produces an opaque color.
        +846         * @param y luma component; will be clamped between 0 and 1 if it isn't already
        +847         * @param cw chromatic warmth component; will be clamped between 0 and 1 if it isn't already
        +848         * @param cm chromatic mildness component; will be clamped between 0 and 1 if it isn't already
        +849         * @return the first color this finds that is between the given YCwCm color and 50% gray, and is in-gamut
        +850         * @see #inGamut(float, float, float)  You can use inGamut() if you just want to check whether a color is in-gamut.
        +851         */
        +852        public static float limitToGamut(float y, float cw, float cm) {
        +853                return limitToGamut(y, cw, cm, 1f);
        +854        }
        +855
        +856        /**
        +857         * Iteratively checks whether the given YCwCm color is in-gamut, and either brings the color closer to 50% gray if
        +858         * it isn't in-gamut, or returns it as soon as it is in-gamut.
        +859         * @param y luma component; will be clamped between 0 and 1 if it isn't already
        +860         * @param cw chromatic warmth component; will be clamped between 0 and 1 if it isn't already
        +861         * @param cm chromatic mildness component; will be clamped between 0 and 1 if it isn't already
        +862         * @param a alpha component; will be clamped between 0 and 1 if it isn't already
        +863         * @return the first color this finds that is between the given YCwCm color and 50% gray, and is in-gamut
        +864         * @see #inGamut(float, float, float)  You can use inGamut() if you just want to check whether a color is in-gamut.
        +865         */
        +866        public static float limitToGamut(float y, float cw, float cm, float a)
        +867        {
        +868                float y2 = Math.min(Math.max(y, 0f), 1f);
        +869                float cw2 = cw = Math.min(Math.max((cw - 0.5f) * 2f, -1f), 1f);
        +870                float cm2 = cm = Math.min(Math.max((cm - 0.5f) * 2f, -1f), 1f);
        +871                for (int attempt = 31; attempt >= 0; attempt--) {
        +872                        final float r = y2 + 0.625f * cw2 - cm2;
        +873                        final float g = y2 - 0.375f * cw2 + cm2;
        +874                        final float b = y2 - 0.375f * cw2 - cm2;
        +875                        if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f)
        +876                                break;
        +877                        final float progress = attempt * 0x1p-5f;
        +878                        cw2 = MathUtils.lerp(0, cw, progress);
        +879                        cm2 = MathUtils.lerp(0, cm, progress);
        +880                }
        +881                return ycwcm(y2, cw2 * 0.5f + 0.5f, cm2 * 0.5f + 0.5f, Math.min(Math.max(a, 0f), 1f));
        +882        }
        +883
        +884        /**
        +885         * Given a packed float YCwCm color, this edits its luma (Y), chromatic warmth (Cw), chromatic mildness (Cm), and
        +886         * alpha channels by adding the corresponding "add" parameter and then clamping. This returns a different float
        +887         * value (of course, the given float can't be edited in-place). You can give a value of 0 for any "add" parameter
        +888         * you want to stay unchanged. This clamps the resulting color to remain in-gamut, so it should be safe to convert
        +889         * it back to RGBA.
        +890         * @param encoded a packed float YCwCm color
        +891         * @param addY how much to add to the luma channel; typically in the -1 to 1 range
        +892         * @param addCw how much to add to the chromatic warmth channel; typically in the -2 to 2 range
        +893         * @param addCm how much to add to the chromatic mildness channel; typically in the -2 to 2 range
        +894         * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range
        +895         * @return a packed float YCwCm color with the requested edits applied to {@code encoded}
        +896         */
        +897        public static float editYCwCm(float encoded, float addY, float addCw, float addCm, float addAlpha) {
        +898                return editYCwCm(encoded, addY, addCw, addCm, addAlpha, 1f, 1f, 1f, 1f);
        +899        }
        +900        /**
        +901         * Given a packed float YCwCm color, this edits its luma (Y), chromatic warmth (Cw), chromatic mildness (Cm), and
        +902         * alpha channels by first multiplying each channel by the corresponding "mul" parameter and then adding the
        +903         * corresponding "add" parameter, before clamping. This means the luma value is multiplied by {@code mulY}, then has
        +904         * {@code addY} added, and then is clamped to the normal range for luma (0 to 1). This returns a different float
        +905         * value (of course, the given float can't be edited in-place). You can give a value of 0 for any "add" parameter
        +906         * you want to stay unchanged, or a value of 1 for any "mul" parameter that shouldn't change. Note that this
        +907         * manipulates chromatic warmth and mildness in the -1 to 1 range, so if you multiply by a small number like
        +908         * {@code 0.25f}, then this will produce a less-saturated color, and if you multiply by a larger number like
        +909         * {@code 4f}, then you will get a much more-saturated color. This clamps the resulting color to remain in-gamut,
        +910         * so it should be safe to convert it back to RGBA.
        +911         * @param encoded a packed float YCwCm color
        +912         * @param addY how much to add to the luma channel; typically in the -1 to 1 range
        +913         * @param addCw how much to add to the chromatic warmth channel; typically in the -2 to 2 range
        +914         * @param addCm how much to add to the chromatic mildness channel; typically in the -2 to 2 range
        +915         * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range
        +916         * @param mulY how much to multiply the luma channel by; should be non-negative
        +917         * @param mulCw how much to multiply the chromatic warmth channel by; usually non-negative (not always)
        +918         * @param mulCm how much to multiply the chromatic mildness channel by; usually non-negative (not always)
        +919         * @param mulAlpha how much to multiply the alpha channel by; should be non-negative
        +920         * @return a packed float YCwCm color with the requested edits applied to {@code encoded}
        +921         */
        +922        public static float editYCwCm(float encoded, float addY, float addCw, float addCm, float addAlpha,
        +923                                                                  float mulY, float mulCw, float mulCm, float mulAlpha) {
        +924                final int decoded = NumberUtils.floatToRawIntBits(encoded);
        +925                float y = (decoded & 0xff) / 255f;
        +926                float cw = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
        +927                float cm = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
        +928                float alpha = (decoded >>> 25) / 127f;
        +929
        +930                float y2 = Math.min(Math.max(y * mulY + addY, 0f), 1f);
        +931                float cw2 = cw = Math.min(Math.max(cw * mulCw + addCw, -1f), 1f);
        +932                float cm2 = cm = Math.min(Math.max(cm * mulCm + addCm, -1f), 1f);
        +933                alpha = Math.min(Math.max(alpha * mulAlpha + addAlpha, 0f), 1f);
        +934                for (int attempt = 31; attempt >= 0; attempt--) {
        +935                        final float r = y2 + 0.625f * cw2 - cm2;
        +936                        final float g = y2 - 0.375f * cw2 + cm2;
        +937                        final float b = y2 - 0.375f * cw2 - cm2;
        +938                        if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f)
        +939                                break;
        +940                        final float progress = attempt * 0x1p-5f;
        +941                        cw2 = MathUtils.lerp(0, cw, progress);
        +942                        cm2 = MathUtils.lerp(0, cm, progress);
        +943                }
        +944                return ycwcm(y2, cw2 * 0.5f + 0.5f, cm2 * 0.5f + 0.5f, alpha);
        +945        }
        +946
        +947        /**
        +948         * Produces a random packed float color that is always in-gamut and should be uniformly distributed.
        +949         * @param random a Random object (or preferably a subclass of Random, like {@link com.badlogic.gdx.math.RandomXS128})
        +950         * @return a random opaque packed float color that is always in-gamut
        +951         */
        +952        public static float randomColor(Random random) {
        +953                final float yr = +0.375f, wr = +0.5f, mr = +0.0f;
        +954                final float yg = +0.500f, wg = +0.0f, mg = +0.5f;
        +955                final float yb = +0.125f, wb = -0.5f, mb = -0.5f;
        +956                final float r = random.nextFloat(), g = random.nextFloat(), b = random.nextFloat();
        +957                return NumberUtils.intBitsToFloat(0xFE000000
        +958                                | ((int) ((mr * r + mg * g + mb * b) * 128f + 128f) << 16 & 0xFF0000)
        +959                                | ((int) ((wr * r + wg * g + wb * b) * 128f + 128f) << 8 & 0xFF00)
        +960                                | ((int) ((yr * r + yg * g + yb * b) * 256f) & 0xFF));
        +961        }
        +962
        +963}
         
         
         
        diff --git a/gradle.properties b/gradle.properties
        index 871d7064..d4832b0c 100644
        --- a/gradle.properties
        +++ b/gradle.properties
        @@ -8,7 +8,7 @@ anim8Version=0.2.10
         
         GROUP=com.github.tommyettinger
         POM_ARTIFACT_ID=colorful-gdx
        -VERSION_NAME=0.5.2-SNAPSHOT
        +VERSION_NAME=0.6.0
         
         POM_NAME=colorful-gdx
         POM_DESCRIPTION=Code for handling color spaces and otherwise manipulating color in powerful ways.
        diff --git a/jitpack.yml b/jitpack.yml
        index 9a3732a4..f360b0a1 100644
        --- a/jitpack.yml
        +++ b/jitpack.yml
        @@ -3,4 +3,4 @@ jdk:
         install:
           - echo "Installing with Gradle"
           - chmod 755 gradlew
        -  - ./gradlew clean publishToMavenLocal
        +  - ./gradlew clean publishToMavenLocal -x signMavenPublication